Skip to content

Commit cab4685

Browse files
authored
Override admin in users.toml (#526)
1 parent e153e2c commit cab4685

File tree

6 files changed

+114
-13
lines changed

6 files changed

+114
-13
lines changed

Cargo.lock

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pgdog/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,6 @@ tikv-jemallocator = "0.6"
6868

6969
[build-dependencies]
7070
cc = "1"
71+
72+
[dev-dependencies]
73+
tempfile = "3.23.0"

pgdog/src/backend/databases.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,7 @@ mod tests {
607607
..Default::default()
608608
},
609609
],
610+
..Default::default()
610611
};
611612

612613
let databases = from_config(&ConfigAndUsers {
@@ -681,6 +682,7 @@ mod tests {
681682
},
682683
// Note: user2 missing for dest_db - this should disable mirroring
683684
],
685+
..Default::default()
684686
};
685687

686688
let databases = from_config(&ConfigAndUsers {
@@ -750,6 +752,7 @@ mod tests {
750752
..Default::default()
751753
},
752754
],
755+
..Default::default()
753756
};
754757

755758
let databases = from_config(&ConfigAndUsers {
@@ -827,6 +830,7 @@ mod tests {
827830
..Default::default()
828831
},
829832
],
833+
..Default::default()
830834
};
831835

832836
let databases = from_config(&ConfigAndUsers {
@@ -919,6 +923,7 @@ mod tests {
919923
..Default::default()
920924
},
921925
],
926+
..Default::default()
922927
};
923928

924929
let databases = from_config(&ConfigAndUsers {
@@ -996,6 +1001,7 @@ mod tests {
9961001
..Default::default()
9971002
},
9981003
],
1004+
..Default::default()
9991005
};
10001006

10011007
let databases = from_config(&ConfigAndUsers {
@@ -1046,7 +1052,10 @@ mod tests {
10461052
}];
10471053

10481054
// No users at all
1049-
let users = crate::config::Users { users: vec![] };
1055+
let users = crate::config::Users {
1056+
users: vec![],
1057+
..Default::default()
1058+
};
10501059

10511060
let databases = from_config(&ConfigAndUsers {
10521061
config: config.clone(),
@@ -1073,6 +1082,7 @@ mod tests {
10731082
},
10741083
// No user for dest_db!
10751084
],
1085+
..Default::default()
10761086
};
10771087

10781088
let databases_partial = from_config(&ConfigAndUsers {
@@ -1100,6 +1110,7 @@ mod tests {
11001110
},
11011111
// No user for source_db!
11021112
],
1113+
..Default::default()
11031114
};
11041115

11051116
let databases_dest_only = from_config(&ConfigAndUsers {

pgdog/src/config/core.rs

Lines changed: 94 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub struct ConfigAndUsers {
2828
impl ConfigAndUsers {
2929
/// Load configuration from disk or use defaults.
3030
pub fn load(config_path: &PathBuf, users_path: &PathBuf) -> Result<Self, Error> {
31-
let config: Config = if let Ok(config) = read_to_string(config_path) {
31+
let mut config: Config = if let Ok(config) = read_to_string(config_path) {
3232
let config = match toml::from_str(&config) {
3333
Ok(config) => config,
3434
Err(err) => return Err(Error::config(&config, err)),
@@ -43,18 +43,11 @@ impl ConfigAndUsers {
4343
Config::default()
4444
};
4545

46-
if config.admin.random() {
47-
#[cfg(debug_assertions)]
48-
info!("[debug only] admin password: {}", config.admin.password);
49-
#[cfg(not(debug_assertions))]
50-
warn!("admin password has been randomly generated");
51-
}
52-
5346
if config.multi_tenant.is_some() {
5447
info!("multi-tenant protection enabled");
5548
}
5649

57-
let users: Users = if let Ok(users) = read_to_string(users_path) {
50+
let mut users: Users = if let Ok(users) = read_to_string(users_path) {
5851
let mut users: Users = toml::from_str(&users)?;
5952
users.check(&config);
6053
info!("loaded \"{}\"", users_path.display());
@@ -67,6 +60,19 @@ impl ConfigAndUsers {
6760
Users::default()
6861
};
6962

63+
// Override admin set in pgdog.toml
64+
// with what's in users.toml.
65+
if let Some(admin) = users.admin.take() {
66+
config.admin = admin;
67+
}
68+
69+
if config.admin.random() {
70+
#[cfg(debug_assertions)]
71+
info!("[debug only] admin password: {}", config.admin.password);
72+
#[cfg(not(debug_assertions))]
73+
warn!("admin password has been randomly generated");
74+
}
75+
7076
Ok(ConfigAndUsers {
7177
config,
7278
users,
@@ -473,4 +479,83 @@ exposure = 0.75
473479
.get_mirroring_config("source_db", "non_existent")
474480
.is_none());
475481
}
482+
483+
#[test]
484+
fn test_admin_override_from_users_toml() {
485+
use std::io::Write;
486+
use tempfile::NamedTempFile;
487+
488+
let pgdog_config = r#"
489+
[admin]
490+
name = "pgdog_admin"
491+
user = "pgdog_admin_user"
492+
password = "pgdog_admin_password"
493+
"#;
494+
495+
let users_config = r#"
496+
[admin]
497+
name = "users_admin"
498+
user = "users_admin_user"
499+
password = "users_admin_password"
500+
"#;
501+
502+
let mut pgdog_file = NamedTempFile::new().unwrap();
503+
let mut users_file = NamedTempFile::new().unwrap();
504+
505+
pgdog_file.write_all(pgdog_config.as_bytes()).unwrap();
506+
users_file.write_all(users_config.as_bytes()).unwrap();
507+
508+
pgdog_file.flush().unwrap();
509+
users_file.flush().unwrap();
510+
511+
let config_and_users =
512+
ConfigAndUsers::load(&pgdog_file.path().into(), &users_file.path().into()).unwrap();
513+
514+
assert_eq!(config_and_users.config.admin.name, "users_admin");
515+
assert_eq!(config_and_users.config.admin.user, "users_admin_user");
516+
assert_eq!(
517+
config_and_users.config.admin.password,
518+
"users_admin_password"
519+
);
520+
assert!(config_and_users.users.admin.is_none());
521+
}
522+
523+
#[test]
524+
fn test_admin_override_with_default_config() {
525+
use std::io::Write;
526+
use tempfile::NamedTempFile;
527+
528+
let pgdog_config = r#"
529+
[general]
530+
host = "0.0.0.0"
531+
port = 6432
532+
"#;
533+
534+
let users_config = r#"
535+
[admin]
536+
name = "users_admin"
537+
user = "users_admin_user"
538+
password = "users_admin_password"
539+
"#;
540+
541+
let mut pgdog_file = NamedTempFile::new().unwrap();
542+
let mut users_file = NamedTempFile::new().unwrap();
543+
544+
pgdog_file.write_all(pgdog_config.as_bytes()).unwrap();
545+
users_file.write_all(users_config.as_bytes()).unwrap();
546+
547+
pgdog_file.flush().unwrap();
548+
users_file.flush().unwrap();
549+
550+
let config_and_users =
551+
ConfigAndUsers::load(&pgdog_file.path().into(), &users_file.path().into()).unwrap();
552+
553+
assert_eq!(config_and_users.config.admin.name, "users_admin");
554+
assert_eq!(config_and_users.config.admin.user, "users_admin_user");
555+
assert_eq!(
556+
config_and_users.config.admin.password,
557+
"users_admin_password"
558+
);
559+
assert!(config_and_users.users.admin.is_none());
560+
}
476561
}

pgdog/src/config/url.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ impl ConfigAndUsers {
6969
.into_iter()
7070
.collect::<Vec<_>>();
7171

72-
self.users = Users { users };
72+
self.users = Users { users, admin: None };
7373
self.config.databases = databases;
7474

7575
Ok(self)

pgdog/src/config/users.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub struct Plugin {
1818
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
1919
#[serde(deny_unknown_fields)]
2020
pub struct Users {
21+
pub admin: Option<Admin>,
2122
/// Users and passwords.
2223
#[serde(default)]
2324
pub users: Vec<User>,

0 commit comments

Comments
 (0)