2024-10-11 18:57:59 +00:00
|
|
|
use std::{collections::BTreeMap, time::Duration};
|
2024-06-05 04:32:58 +00:00
|
|
|
|
2024-07-16 08:05:25 +00:00
|
|
|
use axum::{extract::State, response::IntoResponse, Json};
|
2024-10-11 18:57:59 +00:00
|
|
|
use conduit::{utils::timepoint_from_now, Result};
|
2024-06-05 04:32:58 +00:00
|
|
|
use ruma::{
|
|
|
|
api::{
|
2024-10-11 18:57:59 +00:00
|
|
|
federation::discovery::{get_server_keys, ServerSigningKeys},
|
2024-06-05 04:32:58 +00:00
|
|
|
OutgoingResponse,
|
|
|
|
},
|
2024-10-11 18:57:59 +00:00
|
|
|
serde::Raw,
|
|
|
|
MilliSecondsSinceUnixEpoch,
|
2024-06-05 04:32:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/// # `GET /_matrix/key/v2/server`
|
|
|
|
///
|
|
|
|
/// Gets the public signing keys of this server.
|
|
|
|
///
|
|
|
|
/// - Matrix does not support invalidating public keys, so the key returned by
|
2024-06-16 00:36:49 +00:00
|
|
|
/// this will be valid forever.
|
2024-06-05 04:32:58 +00:00
|
|
|
// Response type for this endpoint is Json because we need to calculate a
|
|
|
|
// signature for the response
|
2024-07-16 08:05:25 +00:00
|
|
|
pub(crate) async fn get_server_keys_route(State(services): State<crate::State>) -> Result<impl IntoResponse> {
|
2024-10-11 18:57:59 +00:00
|
|
|
let server_name = services.globals.server_name();
|
|
|
|
let verify_keys = services.server_keys.verify_keys_for(server_name).await;
|
|
|
|
let server_key = ServerSigningKeys {
|
|
|
|
verify_keys,
|
|
|
|
server_name: server_name.to_owned(),
|
|
|
|
valid_until_ts: valid_until_ts(),
|
|
|
|
old_verify_keys: BTreeMap::new(),
|
|
|
|
signatures: BTreeMap::new(),
|
|
|
|
};
|
2024-06-05 04:32:58 +00:00
|
|
|
|
2024-10-11 18:57:59 +00:00
|
|
|
let response = get_server_keys::v2::Response {
|
|
|
|
server_key: Raw::new(&server_key)?,
|
|
|
|
}
|
|
|
|
.try_into_http_response::<Vec<u8>>()?;
|
2024-06-05 04:32:58 +00:00
|
|
|
|
2024-10-11 18:57:59 +00:00
|
|
|
let mut response = serde_json::from_slice(response.body())?;
|
|
|
|
services.server_keys.sign_json(&mut response)?;
|
2024-06-05 04:32:58 +00:00
|
|
|
|
|
|
|
Ok(Json(response))
|
|
|
|
}
|
|
|
|
|
2024-10-11 18:57:59 +00:00
|
|
|
fn valid_until_ts() -> MilliSecondsSinceUnixEpoch {
|
|
|
|
let dur = Duration::from_secs(86400 * 7);
|
|
|
|
let timepoint = timepoint_from_now(dur).expect("SystemTime should not overflow");
|
|
|
|
MilliSecondsSinceUnixEpoch::from_system_time(timepoint).expect("UInt should not overflow")
|
|
|
|
}
|
|
|
|
|
2024-06-05 04:32:58 +00:00
|
|
|
/// # `GET /_matrix/key/v2/server/{keyId}`
|
|
|
|
///
|
|
|
|
/// Gets the public signing keys of this server.
|
|
|
|
///
|
|
|
|
/// - Matrix does not support invalidating public keys, so the key returned by
|
2024-06-16 00:36:49 +00:00
|
|
|
/// this will be valid forever.
|
2024-07-16 08:05:25 +00:00
|
|
|
pub(crate) async fn get_server_keys_deprecated_route(State(services): State<crate::State>) -> impl IntoResponse {
|
|
|
|
get_server_keys_route(State(services)).await
|
|
|
|
}
|