Skip to content
This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Commit 6f080a7

Browse files
committed
feat: impl get_idcert_by for HomeServerCert
1 parent ced80a3 commit 6f080a7

File tree

3 files changed

+131
-1
lines changed

3 files changed

+131
-1
lines changed

.sqlx/query-5dbb343f1e3975a7a7099d66e16f19e4fc79c87c51b8a19a52d1ca49af007366.json

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

.sqlx/query-66c0d6bdea50276e5538d7f5160c2f4b8f50da10b44e0c341ea69acc0c9a980b.json

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

src/database/idcert.rs

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,80 @@
1-
// TODO
1+
use std::time::UNIX_EPOCH;
2+
3+
use chrono::NaiveDateTime;
4+
use log::error;
5+
use polyproto::{
6+
certs::{PublicKeyInfo, idcert::IdCert},
7+
key::PublicKey,
8+
signature::Signature,
9+
types::DomainName,
10+
};
11+
use sqlx::query;
12+
13+
use crate::{database::Database, errors::Error};
14+
15+
pub(crate) struct HomeServerCert;
16+
17+
impl HomeServerCert {
18+
/// TODO documentme
19+
pub(crate) async fn get_idcert_by<S: Signature, P: PublicKey<S>>(
20+
db: &Database,
21+
issuer_domain_name: &DomainName,
22+
timestamp: &NaiveDateTime,
23+
) -> Result<Option<IdCert<S, P>>, Error> {
24+
let issuer_components =
25+
issuer_domain_name.to_string().split('.').map(|s| s.to_owned()).collect::<Vec<_>>();
26+
let Some(idcert_table_record) = query!(
27+
r#"
28+
WITH issuer AS (
29+
SELECT id
30+
FROM issuers
31+
WHERE domain_components = $1
32+
)
33+
SELECT idcert.pem_encoded, idcert.home_server_public_key_id
34+
FROM idcert
35+
JOIN issuer i ON idcert.issuer_info_id = i.id
36+
WHERE (
37+
$2 >= valid_not_before AND $2 <= valid_not_after
38+
)
39+
"#,
40+
issuer_components.as_slice(),
41+
timestamp
42+
)
43+
.fetch_optional(&db.pool)
44+
.await?
45+
else {
46+
return Ok(None);
47+
};
48+
49+
let pem_encoded_pubkey_info = query!(
50+
r#"
51+
SELECT pubkey
52+
FROM public_keys
53+
WHERE id = $1
54+
"#,
55+
idcert_table_record.home_server_public_key_id
56+
)
57+
.fetch_one(&db.pool)
58+
.await?;
59+
IdCert::from_pem(
60+
&idcert_table_record.pem_encoded,
61+
polyproto::certs::Target::HomeServer,
62+
timestamp.and_utc().timestamp() as u64,
63+
&P::try_from_public_key_info(
64+
PublicKeyInfo::from_pem(&pem_encoded_pubkey_info.pubkey).map_err(|e| {
65+
error!("Error parsing public key info: {e}");
66+
Error::new_internal_error(None)
67+
})?,
68+
)
69+
.map_err(|e| {
70+
error!("Error creating public key from public key info: {e}");
71+
Error::new_internal_error(None)
72+
})?,
73+
)
74+
.map_err(|e| {
75+
error!("Error parsing home server certificate: {e}");
76+
Error::new_internal_error(None)
77+
})
78+
.map(Some)
79+
}
80+
}

0 commit comments

Comments
 (0)