1package state
2
3import (
4 "log"
5 "net/http"
6 "strings"
7 "time"
8
9 comatproto "github.com/bluesky-social/indigo/api/atproto"
10 lexutil "github.com/bluesky-social/indigo/lex/util"
11 "github.com/gliderlabs/ssh"
12 "github.com/sotangled/tangled/api/tangled"
13 "github.com/sotangled/tangled/appview/db"
14 "github.com/sotangled/tangled/appview/pages"
15)
16
17func (s *State) Settings(w http.ResponseWriter, r *http.Request) {
18 // for now, this is just pubkeys
19 user := s.auth.GetUser(r)
20 pubKeys, err := db.GetPublicKeys(s.db, user.Did)
21 if err != nil {
22 log.Println(err)
23 }
24
25 s.pages.Settings(w, pages.SettingsParams{
26 LoggedInUser: user,
27 PubKeys: pubKeys,
28 })
29}
30
31func (s *State) SettingsKeys(w http.ResponseWriter, r *http.Request) {
32 switch r.Method {
33 case http.MethodGet:
34 s.pages.Notice(w, "settings-keys", "Unimplemented.")
35 log.Println("unimplemented")
36 return
37 case http.MethodPut:
38 did := s.auth.GetDid(r)
39 key := r.FormValue("key")
40 key = strings.TrimSpace(key)
41 name := r.FormValue("name")
42 client, _ := s.auth.AuthorizedClient(r)
43
44 _, _, _, _, err := ssh.ParseAuthorizedKey([]byte(key))
45 if err != nil {
46 log.Printf("parsing public key: %s", err)
47 s.pages.Notice(w, "settings-keys", "That doesn't look like a valid public key. Make sure it's a <strong>public</strong> key.")
48 return
49 }
50
51 if err := db.AddPublicKey(s.db, did, name, key); err != nil {
52 log.Printf("adding public key: %s", err)
53 s.pages.Notice(w, "settings-keys", "Failed to add public key.")
54 return
55 }
56
57 // store in pds too
58 resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
59 Collection: tangled.PublicKeyNSID,
60 Repo: did,
61 Rkey: s.TID(),
62 Record: &lexutil.LexiconTypeDecoder{
63 Val: &tangled.PublicKey{
64 Created: time.Now().Format(time.RFC3339),
65 Key: key,
66 Name: name,
67 }},
68 })
69 // invalid record
70 if err != nil {
71 log.Printf("failed to create record: %s", err)
72 s.pages.Notice(w, "settings-keys", "Failed to create record.")
73 return
74 }
75
76 log.Println("created atproto record: ", resp.Uri)
77 s.pages.HxLocation(w, "/settings")
78 return
79 }
80}