vole
Clone
Read only, no credentials:
https://rodent.software/vole.git
Write over SSH with a registered key:
git clone ssh://git@rodent.software:2222/vole.git
A free and open-source forge that lives in your Git repo.
Refresh the web surface with Everforest, readable type, and clearer navigation
796ac8c0ce77461174cf520d5fad4dea37744662 · Keenan Nemetz · 12d ago · parent ac00929f
server/web/templates/account.html +77−41
| @@ -7,49 +7,81 @@ | |||
| 7 | 7 | </div> | |
| 8 | 8 | </div> | |
| 9 | 9 | ||
| 10 | <h2>Appearance</h2> | ||
| 11 | <div class="card form-card"> | ||
| 12 | <label>Theme | ||
| 13 | <select data-theme-select aria-label="Theme"> | ||
| 14 | <option value="system" selected>System</option> | ||
| 15 | <option value="everforest-dark-hard">Everforest Dark · Hard</option> | ||
| 16 | <option value="everforest-dark-medium">Everforest Dark · Medium</option> | ||
| 17 | <option value="everforest-dark-soft">Everforest Dark · Soft</option> | ||
| 18 | <option value="everforest-light-hard">Everforest Light · Hard</option> | ||
| 19 | <option value="everforest-light-medium">Everforest Light · Medium</option> | ||
| 20 | <option value="everforest-light-soft">Everforest Light · Soft</option> | ||
| 21 | </select> | ||
| 22 | </label> | ||
| 23 | <label>Text size | ||
| 24 | <select data-font-scale-select aria-label="Text size"> | ||
| 25 | <option value="small">Small · 90%</option> | ||
| 26 | <option value="medium" selected>Medium · 100%</option> | ||
| 27 | <option value="large">Large · 110%</option> | ||
| 28 | </select> | ||
| 29 | </label> | ||
| 30 | <p class="muted">Both are stored in this browser, not on your account. System follows your operating system and uses the medium contrast. Text size scales labels, prose, and code.</p> | ||
| 31 | </div> | ||
| 32 | |||
| 10 | 33 | <h2>SSH keys</h2> | |
| 11 | 34 | {{if .Account.Keys}} | |
| 12 | <table> | ||
| 13 | <tr><th>Fingerprint</th><th>Type</th><th>Comment</th><th></th></tr> | ||
| 14 | {{range .Account.Keys}} | ||
| 15 | <tr> | ||
| 16 | <td class="sha">{{.Fingerprint}}</td> | ||
| 17 | <td class="muted">{{.Type}}</td> | ||
| 18 | <td class="muted">{{.Comment}}</td> | ||
| 19 | <td> | ||
| 20 | <form method="post" action="/account/keys/remove"> | ||
| 21 | <input type="hidden" name="csrf" value="{{$.CSRF}}"> | ||
| 22 | <input type="hidden" name="fingerprint" value="{{.Fingerprint}}"> | ||
| 23 | <button class="link" type="submit">remove</button> | ||
| 24 | </form> | ||
| 25 | </td> | ||
| 26 | </tr> | ||
| 27 | {{end}} | ||
| 28 | </table> | ||
| 35 | <div class="panel"> | ||
| 36 | <table> | ||
| 37 | <thead><tr><th>Fingerprint</th><th>Type</th><th>Comment</th><th></th></tr></thead> | ||
| 38 | <tbody> | ||
| 39 | {{range .Account.Keys}} | ||
| 40 | <tr> | ||
| 41 | <td class="sha">{{.Fingerprint}}</td> | ||
| 42 | <td class="muted">{{.Type}}</td> | ||
| 43 | <td class="muted">{{.Comment}}</td> | ||
| 44 | <td> | ||
| 45 | <form method="post" action="/account/keys/remove"> | ||
| 46 | <input type="hidden" name="csrf" value="{{$.CSRF}}"> | ||
| 47 | <input type="hidden" name="fingerprint" value="{{.Fingerprint}}"> | ||
| 48 | <button class="link" type="submit">remove</button> | ||
| 49 | </form> | ||
| 50 | </td> | ||
| 51 | </tr> | ||
| 52 | {{end}} | ||
| 53 | </tbody> | ||
| 54 | </table> | ||
| 55 | </div> | ||
| 29 | 56 | {{else}} | |
| 30 | 57 | <p class="muted">No SSH keys yet.</p> | |
| 31 | 58 | {{end}} | |
| 32 | 59 | <form method="post" action="/account/keys" class="form-block"> | |
| 33 | 60 | <input type="hidden" name="csrf" value="{{.CSRF}}"> | |
| 34 | <div class="card form-card"> | ||
| 35 | <label>Public key <textarea name="key" rows="3" placeholder="ssh-ed25519 AAAA... you@example.com" required></textarea></label> | ||
| 61 | <label for="public-key">Add public key</label> | ||
| 62 | <div class="card form-card key-card"> | ||
| 63 | <textarea id="public-key" name="key" rows="3" placeholder="ssh-ed25519 AAAA... you@example.com" required></textarea> | ||
| 36 | 64 | </div> | |
| 37 | 65 | <div class="form-actions"><button type="submit">{{icon "plus"}}Add SSH key</button></div> | |
| 38 | 66 | </form> | |
| 39 | 67 | ||
| 40 | 68 | <h2>Passkeys</h2> | |
| 41 | 69 | {{if .Credentials}} | |
| 42 | <table> | ||
| 43 | <tr><th>Credential</th><th>Label</th><th>Created</th><th>Last used</th></tr> | ||
| 44 | {{range .Credentials}} | ||
| 45 | <tr> | ||
| 46 | <td class="sha">{{credid .ID}}</td> | ||
| 47 | <td>{{if .Label}}{{.Label}}{{else}}passkey{{end}}</td> | ||
| 48 | <td class="muted">{{since .Created.Unix}}</td> | ||
| 49 | <td class="muted">{{if .LastUsed.IsZero}}never{{else}}{{since .LastUsed.Unix}}{{end}}</td> | ||
| 50 | </tr> | ||
| 51 | {{end}} | ||
| 52 | </table> | ||
| 70 | <div class="panel"> | ||
| 71 | <table> | ||
| 72 | <thead><tr><th>Credential</th><th>Label</th><th>Created</th><th>Last used</th></tr></thead> | ||
| 73 | <tbody> | ||
| 74 | {{range .Credentials}} | ||
| 75 | <tr> | ||
| 76 | <td class="sha">{{credid .ID}}</td> | ||
| 77 | <td>{{if .Label}}{{.Label}}{{else}}passkey{{end}}</td> | ||
| 78 | <td class="muted">{{since .Created.Unix}}</td> | ||
| 79 | <td class="muted">{{if .LastUsed.IsZero}}never{{else}}{{since .LastUsed.Unix}}{{end}}</td> | ||
| 80 | </tr> | ||
| 81 | {{end}} | ||
| 82 | </tbody> | ||
| 83 | </table> | ||
| 84 | </div> | ||
| 53 | 85 | {{else}} | |
| 54 | 86 | <p class="muted">No passkeys yet.</p> | |
| 55 | 87 | {{end}} | |
| @@ -69,17 +101,21 @@ | |||
| 69 | 101 | ||
| 70 | 102 | <h2>Sessions</h2> | |
| 71 | 103 | {{if .Sessions}} | |
| 72 | <table> | ||
| 73 | <tr><th>Created</th><th>Last seen</th><th>Expires</th><th>Client</th></tr> | ||
| 74 | {{range .Sessions}} | ||
| 75 | <tr> | ||
| 76 | <td class="muted">{{since .Created.Unix}}</td> | ||
| 77 | <td class="muted">{{since .LastSeen.Unix}}</td> | ||
| 78 | <td class="muted">{{.Expires.Format "2006-01-02 15:04"}}</td> | ||
| 79 | <td class="muted">{{.UserAgent}}</td> | ||
| 80 | </tr> | ||
| 81 | {{end}} | ||
| 82 | </table> | ||
| 104 | <div class="panel"> | ||
| 105 | <table> | ||
| 106 | <thead><tr><th>Created</th><th>Last seen</th><th>Expires</th><th>Client</th></tr></thead> | ||
| 107 | <tbody> | ||
| 108 | {{range .Sessions}} | ||
| 109 | <tr> | ||
| 110 | <td class="muted">{{since .Created.Unix}}</td> | ||
| 111 | <td class="muted">{{since .LastSeen.Unix}}</td> | ||
| 112 | <td class="muted">{{.Expires.Format "2006-01-02 15:04"}}</td> | ||
| 113 | <td class="muted">{{.UserAgent}}</td> | ||
| 114 | </tr> | ||
| 115 | {{end}} | ||
| 116 | </tbody> | ||
| 117 | </table> | ||
| 118 | </div> | ||
| 83 | 119 | {{else}} | |
| 84 | 120 | <p class="muted">No sessions.</p> | |
| 85 | 121 | {{end}} | |