forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
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}