diff options
Diffstat (limited to '')
| -rw-r--r-- | tests/server_setup.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/server_setup.rs b/tests/server_setup.rs new file mode 100644 index 0000000..d527cd9 --- /dev/null +++ b/tests/server_setup.rs | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | use std::path::PathBuf; | ||
| 2 | |||
| 3 | use zagan_bet::server::setup::init_identity; | ||
| 4 | |||
| 5 | #[test] | ||
| 6 | fn creates_a_usable_pkcs12_identity_and_refuses_to_overwrite() { | ||
| 7 | let dir = PathBuf::from(env!("CARGO_TARGET_TMPDIR")).join("server-setup"); | ||
| 8 | let _ = std::fs::remove_dir_all(&dir); | ||
| 9 | std::fs::create_dir_all(&dir).unwrap(); | ||
| 10 | |||
| 11 | init_identity(&dir, "localhost").expect("openssl must be available for this test"); | ||
| 12 | |||
| 13 | for name in ["identity.p12", "key.pem", "cert.pem"] { | ||
| 14 | let path = dir.join(name); | ||
| 15 | assert!(path.exists(), "{name} was not created"); | ||
| 16 | assert!( | ||
| 17 | std::fs::metadata(&path).unwrap().len() > 0, | ||
| 18 | "{name} is empty" | ||
| 19 | ); | ||
| 20 | } | ||
| 21 | |||
| 22 | let p12 = std::fs::read(dir.join("identity.p12")).unwrap(); | ||
| 23 | native_tls::Identity::from_pkcs12(&p12, "").expect("generated identity must load"); | ||
| 24 | |||
| 25 | let second = init_identity(&dir, "localhost"); | ||
| 26 | assert!(second.is_err(), "setup must not overwrite existing keys"); | ||
| 27 | |||
| 28 | #[cfg(unix)] | ||
| 29 | { | ||
| 30 | use std::os::unix::fs::PermissionsExt; | ||
| 31 | let mode = std::fs::metadata(dir.join("key.pem")) | ||
| 32 | .unwrap() | ||
| 33 | .permissions() | ||
| 34 | .mode() | ||
| 35 | & 0o777; | ||
| 36 | assert_eq!(mode, 0o600, "private key should not be world-readable"); | ||
| 37 | } | ||
| 38 | } | ||
