package server import ( "html/template" "net/http" ) // The server has no browsable UI. These three pages exist only because a // browser is the right place to approve a device, redeem an invite and run an // OIDC round trip. var pages = template.Must(template.New("layout").Parse(` {{define "layout"}}
Sign in to let the client on your device sync your databases.
{{if .Error}}{{.Error}}
{{end}} {{if .OIDC}}Sign in with single sign-on →{{end}} {{end}}`)) var inviteTmpl = template.Must(template.Must(pages.Clone()).Parse(` {{define "body"}}You were invited to a KeepOrg server.
{{if .Error}}{{.Error}}
{{end}} {{end}}`)) var signInTmpl = template.Must(template.Must(pages.Clone()).Parse(` {{define "body"}}Sign in to create and manage your vaults.
{{if .Error}}{{.Error}}
{{end}} {{if .OIDC}}Sign in with single sign-on →{{end}} {{end}}`)) var vaultsTmpl = template.Must(template.Must(pages.Clone()).Parse(` {{define "body"}}{{.User}}
{{.Error}}
{{end}} {{if .Notice}}{{.Notice}}
{{end}} {{if .Vaults}}| Vault | Access | On conflict | Version | Last saved |
|---|---|---|---|---|
| {{.Name}}.kdbx | {{.Perm}} | {{.Strategy}} | {{.Version}} | {{.Updated}}{{if .By}} by {{.By}}{{end}} |
No vaults yet. Create one below, then open it from the KeepOrg client on your computer or phone.
{{end}} {{if .Groups}} {{else}}You do not administer a group yet, so there is nowhere to put a vault. Ask an administrator to add you to one.
{{end}} {{end}}`)) var doneTmpl = template.Must(template.Must(pages.Clone()).Parse(` {{define "body"}}{{.Message}}
{{end}}`)) func (s *Server) renderDevice(w http.ResponseWriter, code, errMsg string) { render(w, deviceTmpl, map[string]any{ "Title": "Approve device", "Code": code, "Error": errMsg, "OIDC": s.oidc != nil, }) } func (s *Server) renderInvite(w http.ResponseWriter, token, errMsg string) { render(w, inviteTmpl, map[string]any{"Title": "Create account", "Token": token, "Error": errMsg}) } func (s *Server) renderSignIn(w http.ResponseWriter, errMsg string) { render(w, signInTmpl, map[string]any{ "Title": "Sign in", "Error": errMsg, "OIDC": s.oidc != nil, }) } func (s *Server) renderVaults(w http.ResponseWriter, sess *webSession, errMsg, notice string) { vaults, groups := s.vaultRows(sess.user) render(w, vaultsTmpl, map[string]any{ "Title": "Vaults", "Wide": true, "User": sess.user.Username, "CSRF": sess.csrf, "Vaults": vaults, "Groups": groups, "Error": errMsg, "Notice": notice, }) } func (s *Server) renderDone(w http.ResponseWriter, title, msg string) { render(w, doneTmpl, map[string]any{"Title": title, "Message": msg}) } func render(w http.ResponseWriter, t *template.Template, data map[string]any) { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Referrer-Policy", "no-referrer") _ = t.ExecuteTemplate(w, "layout", data) }