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