Microservice to bring 2FA to self hosted PDSes
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="utf-8"/>
5 <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, viewport-fit=cover"/>
6 <meta name="referrer" content="origin-when-cross-origin"/>
7 <title>Create Account - {{pds_hostname}}</title>
8 <link rel="stylesheet" href="/admin/static/css/admin.css">
9</head>
10<body>
11<div class="layout">
12 {{> admin/partials/sidebar.hbs}}
13
14 <main class="main">
15 {{> admin/partials/flash.hbs}}
16
17 <h1 class="page-title">Create Account</h1>
18
19 {{#if created}}
20 <div class="success-card">
21 <h3>Account Created Successfully</h3>
22 <div class="detail-row">
23 <span class="label">DID</span>
24 <span class="value">{{created.did}}
25 <button class="copy-btn" onclick="copyToClipboard('{{created.did}}', this)">Copy</button></span>
26 </div>
27 <div class="detail-row">
28 <span class="label">Handle</span>
29 <span class="value">{{created.handle}}
30 <button class="copy-btn"
31 onclick="copyToClipboard('{{created.handle}}', this)">Copy</button></span>
32 </div>
33 <div class="detail-row">
34 <span class="label">Email</span>
35 <span class="value">{{created.email}}
36 <button class="copy-btn"
37 onclick="copyToClipboard('{{created.email}}', this)">Copy</button></span>
38 </div>
39 <div class="detail-row">
40 <span class="label">Password</span>
41 <span class="value"><span class="password-highlight">{{created.password}}</span> <button
42 class="copy-btn"
43 onclick="copyToClipboard('{{created.password}}', this)">Copy</button></span>
44 </div>
45 {{#if created.inviteCode}}
46 <div class="detail-row">
47 <span class="label">Invite Code Used</span>
48 <span class="value">{{created.inviteCode}}
49 <button class="copy-btn"
50 onclick="copyToClipboard('{{created.inviteCode}}', this)">Copy</button></span>
51 </div>
52 {{/if}}
53 </div>
54 {{else}}
55 <div class="form-card">
56 <form method="POST" action="/admin/create-account">
57 <div class="form-group">
58 <label for="email">Email</label>
59 <input type="email" id="email" name="email" placeholder="user@example.com" required/>
60 </div>
61 <div class="form-group">
62 <label for="handle">Handle</label>
63 <input type="text" id="handle" name="handle" placeholder="user.example.com" required/>
64 <div class="hint">Must be a valid handle for this PDS</div>
65 </div>
66 <button type="submit" class="btn btn-primary">Create Account</button>
67 </form>
68 </div>
69 {{/if}}
70 </main>
71</div>
72
73<script>
74 function copyToClipboard(text, btn) {
75 if (navigator.clipboard && navigator.clipboard.writeText) {
76 navigator.clipboard.writeText(text).then(function () {
77 var orig = btn.textContent;
78 btn.textContent = 'Copied';
79 setTimeout(function () {
80 btn.textContent = orig;
81 }, 1500);
82 });
83 } else {
84 var el = document.createElement('textarea');
85 el.value = text;
86 el.style.position = 'fixed';
87 el.style.opacity = '0';
88 document.body.appendChild(el);
89 el.select();
90 document.execCommand('copy');
91 document.body.removeChild(el);
92 var orig = btn.textContent;
93 btn.textContent = 'Copied';
94 setTimeout(function () {
95 btn.textContent = orig;
96 }, 1500);
97 }
98 }
99</script>
100</body>
101</html>