Skip to main content

tuwunel_api/oidc/account/
profile.rs

1use const_str::format as const_format;
2use ruma::UserId;
3use tuwunel_core::{Result, utils::html::escape as html_escape};
4use tuwunel_service::Services;
5
6use super::ACCOUNT_HEAD;
7
8pub(super) async fn profile_html(
9	services: &Services,
10	user_id: &UserId,
11	login_token: &str,
12) -> Result<String> {
13	let server = services.config.server_name.as_str();
14
15	let displayname = services
16		.users
17		.displayname(user_id)
18		.await
19		.unwrap_or_default();
20
21	let avatar_url = services
22		.users
23		.avatar_url(user_id)
24		.await
25		.ok()
26		.as_ref()
27		.map(ToString::to_string)
28		.as_deref()
29		.map(html_escape);
30
31	let avatar_field = avatar_url
32		.as_deref()
33		.map(|avatar_url| {
34			format!(
35				r#"<p class="meta">
36					Avatar: <code>{avatar_url}</code> (use your Matrix client to change)
37				</p>"#
38			)
39		})
40		.unwrap_or_default();
41
42	Ok(PAGE_HTML
43		.replace("{server}", &html_escape(server))
44		.replace("{uid}", &html_escape(user_id.as_str()))
45		.replace("{tok}", &html_escape(login_token))
46		.replace("{dn}", &html_escape(&displayname))
47		.replace("{avatar_field}", &avatar_field))
48}
49
50static PAGE_HTML: &str = const_format!(
51	r#"
52<!DOCTYPE html>
53<html lang="en">
54	<head>
55		{ACCOUNT_HEAD}
56		<title>Profile</title>
57	</head>
58	<body>
59		<h1>Profile</h1>
60		<p>
61			Signed in as <strong>{{uid}}</strong> on <strong>{{server}}</strong>.
62		</p>
63		<form method="POST" action="/_tuwunel/oidc/account_callback">
64			<input type="hidden" name="action" value="org.matrix.profile" />
65			<input type="hidden" name="loginToken" value="{{tok}}" />
66			<label for="dn">Display name</label>
67			<input
68				type="text"
69				id="dn"
70				name="displayname"
71				value="{{dn}}"
72				maxlength="255"
73				autocomplete="name"
74			/>
75				{{avatar_field}}
76			<p class="submit-row">
77				<button type="submit">Save</button>
78			</p>
79		</form>
80		<div class="nav">
81			<a href="/_tuwunel/oidc/account?action=org.matrix.sessions_list">
82				Back to sessions
83			</a>
84		</div>
85	</body>
86</html>
87"#
88);