Skip to main content

tuwunel_api_federation/
routes.rs

1use axum::{
2	Router,
3	response::IntoResponse,
4	routing::{any, get},
5};
6use tuwunel_api::router::RouterExt;
7use tuwunel_core::{Server, err};
8
9use crate::{self as federation, State};
10
11/// Builds the server endpoint routes.
12///
13/// Federation settings select the enabled handlers or disabled responses.
14pub fn build(server: &Server) -> Router<State> {
15	let router = Router::new();
16	let router = register_server_misc_routes(router);
17
18	register_federation_routes(router, server.config.federation.enable)
19}
20
21fn register_server_misc_routes(router: Router<State>) -> Router<State> {
22	// SS endpoints not related to federation
23	router
24		.ruma_route(&federation::well_known_server)
25		.ruma_route(&federation::get_openid_userinfo_route)
26}
27
28fn register_federation_routes(router: Router<State>, allow_federation: bool) -> Router<State> {
29	if allow_federation {
30		router
31			.ruma_route(&federation::get_server_version_route)
32			.route("/_matrix/key/v2/server", get(federation::get_server_keys_route))
33			.ruma_route(&federation::get_public_rooms_route)
34			.ruma_route(&federation::get_public_rooms_filtered_route)
35			.ruma_route(&federation::send_transaction_message_route)
36			.ruma_route(&federation::get_event_route)
37			.ruma_route(&federation::get_event_by_timestamp_route)
38			.ruma_route(&federation::get_backfill_route)
39			.ruma_route(&federation::get_missing_events_route)
40			.ruma_route(&federation::get_event_authorization_route)
41			.ruma_route(&federation::get_room_state_route)
42			.ruma_route(&federation::get_room_state_ids_route)
43			.ruma_route(&federation::create_leave_event_template_route)
44			.ruma_route(&federation::create_knock_event_template_route)
45			.ruma_route(&federation::create_leave_event_v2_route)
46			.ruma_route(&federation::create_knock_event_v1_route)
47			.ruma_route(&federation::create_join_event_template_route)
48			.ruma_route(&federation::create_join_event_v2_route)
49			.ruma_route(&federation::create_invite_route)
50			.ruma_route(&federation::get_devices_route)
51			.ruma_route(&federation::get_room_information_route)
52			.ruma_route(&federation::get_profile_information_route)
53			.ruma_route(&federation::get_keys_route)
54			.ruma_route(&federation::claim_keys_route)
55			.ruma_route(&federation::get_hierarchy_route)
56			.ruma_route(&federation::get_content_route)
57			.ruma_route(&federation::get_content_thumbnail_route)
58	} else {
59		router
60			.route("/_matrix/federation/{*path}", any(federation_disabled))
61			.route("/_matrix/key/{*path}", any(federation_disabled))
62			.route("/_tuwunel/local_user_count", any(federation_disabled))
63	}
64}
65
66async fn federation_disabled() -> impl IntoResponse {
67	err!(Request(Forbidden("Federation is disabled.")))
68}