1
0
Fork 0
mirror of https://forgejo.ellis.link/continuwuation/continuwuity.git synced 2025-07-28 18:58:30 +00:00
continuwuity/src/api/client_server/voip.rs

49 lines
1.6 KiB
Rust
Raw Normal View History

2022-10-05 20:34:31 +02:00
use crate::{services, Result, Ruma};
use base64::{engine::general_purpose, Engine as _};
2022-10-09 15:34:36 +02:00
use hmac::{Hmac, Mac};
2022-02-18 15:33:14 +01:00
use ruma::{api::client::voip::get_turn_server_info, SecondsSinceUnixEpoch};
use sha1::Sha1;
use std::time::{Duration, SystemTime};
type HmacSha1 = Hmac<Sha1>;
2020-07-30 18:14:47 +02:00
2021-08-31 19:14:37 +02:00
/// # `GET /_matrix/client/r0/voip/turnServer`
///
/// TODO: Returns information about the recommended turn server.
pub async fn turn_server_route(
2022-12-14 13:09:10 +01:00
body: Ruma<get_turn_server_info::v3::Request>,
2022-02-18 15:33:14 +01:00
) -> Result<get_turn_server_info::v3::Response> {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
2022-10-05 09:34:25 +02:00
let turn_secret = services().globals.turn_secret().clone();
2021-11-26 20:36:40 +01:00
let (username, password) = if !turn_secret.is_empty() {
let expiry = SecondsSinceUnixEpoch::from_system_time(
SystemTime::now() + Duration::from_secs(services().globals.turn_ttl()),
)
.expect("time is valid");
let username: String = format!("{}:{}", expiry.get(), sender_user);
let mut mac = HmacSha1::new_from_slice(turn_secret.as_bytes())
.expect("HMAC can take key of any size");
mac.update(username.as_bytes());
let password: String = general_purpose::STANDARD.encode(mac.finalize().into_bytes());
(username, password)
} else {
(
services().globals.turn_username().clone(),
services().globals.turn_password().clone(),
)
};
2022-02-18 15:33:14 +01:00
Ok(get_turn_server_info::v3::Response {
2021-11-26 19:28:47 +01:00
username,
password,
uris: services().globals.turn_uris().to_vec(),
ttl: Duration::from_secs(services().globals.turn_ttl()),
})
2020-07-30 18:14:47 +02:00
}