Skip to main content

postgres_ssl/
postgres_ssl.rs

1//! Example showing `PostgreSQL` DSN with different SSL modes
2
3#![allow(clippy::unwrap_used)]
4
5use dsn::{DSNBuilder, parse};
6
7fn main() {
8    println!("=== PostgreSQL SSL Mode Examples ===\n");
9
10    // Building DSNs with different SSL modes
11    println!("1. Building PostgreSQL DSNs:\n");
12
13    let ssl_require = DSNBuilder::postgres()
14        .username("app")
15        .password("secret")
16        .host("prod.postgres.com")
17        .database("app_db")
18        .param("sslmode", "require")
19        .build();
20    println!("   Production (SSL required):");
21    println!("   {ssl_require}\n");
22
23    let ssl_prefer = DSNBuilder::postgres()
24        .username("app")
25        .password("secret")
26        .host("staging.postgres.com")
27        .database("app_db")
28        .param("sslmode", "prefer")
29        .build();
30    println!("   Staging (SSL preferred):");
31    println!("   {ssl_prefer}\n");
32
33    let ssl_disable = DSNBuilder::postgres()
34        .username("dev")
35        .password("dev123")
36        .host("localhost")
37        .database("dev_db")
38        .param("sslmode", "disable")
39        .build();
40    println!("   Development (SSL disabled):");
41    println!("   {ssl_disable}\n");
42
43    // Parsing and checking SSL mode
44    println!("2. Parsing PostgreSQL DSN and checking SSL mode:\n");
45
46    let examples = [
47        "postgres://user:pass@tcp(localhost:5432)/mydb?sslmode=disable",
48        "postgres://user:pass@tcp(prod.db.com:5432)/mydb?sslmode=require",
49        "postgres://user:pass@tcp(stage.db.com:5432)/mydb?sslmode=prefer&connect_timeout=10",
50    ];
51
52    for dsn_str in examples {
53        match parse(dsn_str) {
54            Ok(dsn) => {
55                println!("   DSN: {dsn_str}");
56                println!("   Host: {}", dsn.host.as_ref().unwrap());
57                println!("   Database: {}", dsn.database.as_ref().unwrap());
58
59                if let Some(sslmode) = dsn.params.get("sslmode") {
60                    println!("   SSL Mode: {sslmode}");
61
62                    match sslmode.as_str() {
63                        "disable" => {
64                            println!(
65                                "   [WARNING] SSL is disabled - not recommended for production!"
66                            );
67                        }
68                        "require" => println!("   [OK] SSL is required - secure connection"),
69                        "prefer" => println!("   [INFO] SSL is preferred - will use if available"),
70                        "verify-ca" => println!("   [SECURE] SSL with CA verification"),
71                        "verify-full" => println!("   [SECURE] SSL with full verification"),
72                        _ => println!("   [UNKNOWN] Unknown SSL mode: {sslmode}"),
73                    }
74                } else {
75                    println!("   [INFO] No SSL mode specified (will use PostgreSQL default)");
76                }
77
78                // Check for other connection parameters
79                if let Some(timeout) = dsn.params.get("connect_timeout") {
80                    println!("   Connection timeout: {timeout}s");
81                }
82
83                println!();
84            }
85            Err(e) => {
86                eprintln!("   [ERROR] Failed to parse: {e}");
87            }
88        }
89    }
90
91    // Practical usage example
92    println!("3. Practical usage - connection string selection:\n");
93
94    let environment = std::env::var("ENVIRONMENT").unwrap_or_else(|_| "development".to_string());
95
96    let dsn = match environment.as_str() {
97        "production" => DSNBuilder::postgres()
98            .username("prod_user")
99            .password("prod_pass")
100            .host("prod.postgres.com")
101            .database("prod_db")
102            .param("sslmode", "require")
103            .param("connect_timeout", "30")
104            .build(),
105
106        "staging" => DSNBuilder::postgres()
107            .username("stage_user")
108            .password("stage_pass")
109            .host("staging.postgres.com")
110            .database("stage_db")
111            .param("sslmode", "prefer")
112            .param("connect_timeout", "10")
113            .build(),
114
115        _ => DSNBuilder::postgres()
116            .username("dev")
117            .password("dev")
118            .host("localhost")
119            .database("dev_db")
120            .param("sslmode", "disable")
121            .build(),
122    };
123
124    println!("   Environment: {environment}");
125    println!("   Connection string: {dsn}");
126}