aboutsummaryrefslogtreecommitdiff
path: root/server/user.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/user.go')
-rw-r--r--server/user.go58
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)
+ }
}