mirror of https://github.com/breard-r/acmed.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.9 KiB
147 lines
4.9 KiB
use acme_common::error::Error;
|
|
use serde::Deserialize;
|
|
use std::str::FromStr;
|
|
|
|
#[derive(Clone, Debug, Deserialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct DirectoryMeta {
|
|
pub terms_of_service: Option<String>,
|
|
pub website: Option<String>,
|
|
pub caa_identities: Option<Vec<String>>,
|
|
pub external_account_required: Option<bool>,
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct Directory {
|
|
pub meta: Option<DirectoryMeta>,
|
|
pub new_nonce: String,
|
|
pub new_account: String,
|
|
pub new_order: String,
|
|
pub new_authz: Option<String>,
|
|
pub revoke_cert: String,
|
|
pub key_change: String,
|
|
}
|
|
|
|
deserialize_from_str!(Directory);
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::Directory;
|
|
use std::str::FromStr;
|
|
|
|
#[test]
|
|
fn test_directory() {
|
|
let data = "{
|
|
\"newAccount\": \"https://example.org/acme/new-acct\",
|
|
\"newNonce\": \"https://example.org/acme/new-nonce\",
|
|
\"newOrder\": \"https://example.org/acme/new-order\",
|
|
\"revokeCert\": \"https://example.org/acme/revoke-cert\",
|
|
\"newAuthz\": \"https://example.org/acme/new-authz\",
|
|
\"keyChange\": \"https://example.org/acme/key-change\"
|
|
}";
|
|
let parsed_dir = Directory::from_str(data);
|
|
assert!(parsed_dir.is_ok());
|
|
let parsed_dir = parsed_dir.unwrap();
|
|
assert_eq!(parsed_dir.new_nonce, "https://example.org/acme/new-nonce");
|
|
assert_eq!(parsed_dir.new_account, "https://example.org/acme/new-acct");
|
|
assert_eq!(parsed_dir.new_order, "https://example.org/acme/new-order");
|
|
assert_eq!(
|
|
parsed_dir.new_authz,
|
|
Some("https://example.org/acme/new-authz".to_string())
|
|
);
|
|
assert_eq!(
|
|
parsed_dir.revoke_cert,
|
|
"https://example.org/acme/revoke-cert"
|
|
);
|
|
assert_eq!(parsed_dir.key_change, "https://example.org/acme/key-change");
|
|
assert!(parsed_dir.meta.is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn test_directory_no_authz() {
|
|
let data = "{
|
|
\"newAccount\": \"https://example.org/acme/new-acct\",
|
|
\"newNonce\": \"https://example.org/acme/new-nonce\",
|
|
\"newOrder\": \"https://example.org/acme/new-order\",
|
|
\"revokeCert\": \"https://example.org/acme/revoke-cert\",
|
|
\"keyChange\": \"https://example.org/acme/key-change\"
|
|
}";
|
|
let parsed_dir = Directory::from_str(data);
|
|
assert!(parsed_dir.is_ok());
|
|
let parsed_dir = parsed_dir.unwrap();
|
|
assert_eq!(parsed_dir.new_nonce, "https://example.org/acme/new-nonce");
|
|
assert_eq!(parsed_dir.new_account, "https://example.org/acme/new-acct");
|
|
assert_eq!(parsed_dir.new_order, "https://example.org/acme/new-order");
|
|
assert!(parsed_dir.new_authz.is_none());
|
|
assert_eq!(
|
|
parsed_dir.revoke_cert,
|
|
"https://example.org/acme/revoke-cert"
|
|
);
|
|
assert_eq!(parsed_dir.key_change, "https://example.org/acme/key-change");
|
|
assert!(parsed_dir.meta.is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn test_directory_meta() {
|
|
let data = "{
|
|
\"keyChange\": \"https://example.org/acme/key-change\",
|
|
\"meta\": {
|
|
\"caaIdentities\": [
|
|
\"example.org\"
|
|
],
|
|
\"termsOfService\": \"https://example.org/documents/tos.pdf\",
|
|
\"website\": \"https://example.org/\"
|
|
},
|
|
\"newAccount\": \"https://example.org/acme/new-acct\",
|
|
\"newNonce\": \"https://example.org/acme/new-nonce\",
|
|
\"newOrder\": \"https://example.org/acme/new-order\",
|
|
\"revokeCert\": \"https://example.org/acme/revoke-cert\"
|
|
}";
|
|
let parsed_dir = Directory::from_str(&data);
|
|
assert!(parsed_dir.is_ok());
|
|
let parsed_dir = parsed_dir.unwrap();
|
|
assert!(parsed_dir.meta.is_some());
|
|
let meta = parsed_dir.meta.unwrap();
|
|
assert_eq!(
|
|
meta.terms_of_service,
|
|
Some("https://example.org/documents/tos.pdf".to_string())
|
|
);
|
|
assert_eq!(meta.website, Some("https://example.org/".to_string()));
|
|
assert!(meta.caa_identities.is_some());
|
|
let caa_identities = meta.caa_identities.unwrap();
|
|
assert_eq!(caa_identities.len(), 1);
|
|
assert_eq!(caa_identities.first(), Some(&"example.org".to_string()));
|
|
assert!(meta.external_account_required.is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn test_directory_extra_fields() {
|
|
let data = "{
|
|
\"foo\": \"bar\",
|
|
\"keyChange\": \"https://example.org/acme/key-change\",
|
|
\"newAccount\": \"https://example.org/acme/new-acct\",
|
|
\"baz\": \"quz\",
|
|
\"newNonce\": \"https://example.org/acme/new-nonce\",
|
|
\"newAuthz\": \"https://example.org/acme/new-authz\",
|
|
\"newOrder\": \"https://example.org/acme/new-order\",
|
|
\"revokeCert\": \"https://example.org/acme/revoke-cert\"
|
|
}";
|
|
let parsed_dir = Directory::from_str(&data);
|
|
assert!(parsed_dir.is_ok());
|
|
let parsed_dir = parsed_dir.unwrap();
|
|
assert_eq!(parsed_dir.new_nonce, "https://example.org/acme/new-nonce");
|
|
assert_eq!(parsed_dir.new_account, "https://example.org/acme/new-acct");
|
|
assert_eq!(parsed_dir.new_order, "https://example.org/acme/new-order");
|
|
assert_eq!(
|
|
parsed_dir.new_authz,
|
|
Some("https://example.org/acme/new-authz".to_string())
|
|
);
|
|
assert_eq!(
|
|
parsed_dir.revoke_cert,
|
|
"https://example.org/acme/revoke-cert"
|
|
);
|
|
assert_eq!(parsed_dir.key_change, "https://example.org/acme/key-change");
|
|
assert!(parsed_dir.meta.is_none());
|
|
}
|
|
}
|