tuwunel_api/oidc/account/
profile.rs1use 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);