diff options
Diffstat (limited to 'server/user.go')
-rw-r--r-- | server/user.go | 58 |
1 files changed, 50 insertions, 8 deletions
diff --git a/server/user.go b/server/user.go index 37ceee5..5865c93 100644 --- a/server/user.go +++ b/server/user.go @@ -3,10 +3,20 @@ package main import ( "crypto/ed25519" "encoding/base64" + "encoding/gob" "errors" "net/http" + "os" + "strings" ) +type user struct { + dhtVal []byte +} + +var users map[string]user + +// Verify that a body was signed by this ID func verify(id string, body []byte) error { b, err := base64.RawURLEncoding.DecodeString(id) if err != nil { @@ -23,15 +33,47 @@ func verify(id string, body []byte) error { return nil } -// Create user -func createHandler(w http.ResponseWriter, r *http.Request) { - r.ParseForm() - id := r.Form.Get("id") - dhtGet(id) - +// Persist a user's data to disk +func persist(id string) { + writer, err := os.Open(dataDir + "/" + id + "/gob") + if err != nil { + return + } + enc := gob.NewEncoder(writer) + enc.Encode(users[id]) } -// Delete user -func deleteHandler(w http.ResponseWriter, r *http.Request) { +// Handle user configuration changes +func userHandler(w http.ResponseWriter, r *http.Request) { + id := r.URL.Fragment[6:] + // Resolve ID to server list + val, err := dhtGet(id) + if err != nil || verify(id, val) != nil { + w.WriteHeader(http.StatusNotFound) + return + } + // Check if server list contains this server + message := string(val[:len(val)-ed25519.SignatureSize]) + if !strings.Contains(message, me) { + // Delete user if they are no longer associated with this server + delete(users, id) + err = os.RemoveAll(id) + if err != nil { + w.WriteHeader(http.StatusNotFound) + return + } + w.WriteHeader(http.StatusOK) + return + } + //valSplit := strings.Split(message, "\n") + //servers := valSplit[1:len(valSplit)-1] + if _, ok := users[id]; !ok { + // Add user + users[id] = user{ + dhtVal: val, + } + os.Mkdir(id, 755) + persist(id) + } } |