aboutsummaryrefslogtreecommitdiff
path: root/src/server/handlers/signup.go
diff options
context:
space:
mode:
authorNicolas James <Eele1Ephe7uZahRie@tutanota.com>2025-02-13 18:04:18 +1100
committerNicolas James <Eele1Ephe7uZahRie@tutanota.com>2025-02-13 18:04:18 +1100
commit93dfe2be64e8658839bcfe5356adf35f8cde7075 (patch)
treec60b1e20d569b74dbde85123e1b2bf3590c66244 /src/server/handlers/signup.go
initial commit
Diffstat (limited to 'src/server/handlers/signup.go')
-rw-r--r--src/server/handlers/signup.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/server/handlers/signup.go b/src/server/handlers/signup.go
new file mode 100644
index 0000000..e92b869
--- /dev/null
+++ b/src/server/handlers/signup.go
@@ -0,0 +1,75 @@
+package handlers
+
+import (
+ "encoding/json"
+ "net/http"
+
+ "server/database"
+ "server/helper"
+)
+
+type signupRequest struct {
+ Email string
+ Password string
+}
+
+func Signup(writer http.ResponseWriter, request *http.Request) {
+ if request.Method != "POST" {
+ helper.WriteErrorJson("expected POST method", writer, http.StatusBadRequest)
+ return
+ }
+
+ var signup_request signupRequest
+ err := json.NewDecoder(request.Body).Decode(&signup_request)
+ if err != nil {
+ helper.WriteErrorJson(err.Error(), writer, http.StatusBadRequest)
+ return
+ }
+
+ if len(signup_request.Email) < 3 || len(signup_request.Email) > 254 {
+ helper.WriteErrorJson("invalid email address", writer, http.StatusBadRequest)
+ return
+ }
+ if len(signup_request.Password) < 8 {
+ helper.WriteErrorJson("password too short", writer, http.StatusBadRequest)
+ return
+ }
+ if len(signup_request.Password) > 64 {
+ helper.WriteErrorJson("password too long", writer, http.StatusBadRequest)
+ return
+ }
+
+ user, err := database.MaybeGetUser(signup_request.Email)
+ if err != nil {
+ helper.WriteInternalErrorJson(err, writer)
+ return
+ }
+ if user != nil {
+ helper.WriteErrorJson("a user with that email already exists", writer, http.StatusForbidden)
+ return
+ }
+
+ salt, err := helper.GenerateSalt()
+ if err != nil {
+ helper.WriteInternalErrorJson(err, writer)
+ return
+ }
+
+ hash, err := helper.GenerateHash(signup_request.Password, salt)
+ if err != nil {
+ helper.WriteInternalErrorJson(err, writer)
+ return
+ }
+
+ uid, err := database.WriteNewUser(signup_request.Email, hash, salt)
+ if err != nil {
+ helper.WriteInternalErrorJson(err, writer)
+ return
+ }
+
+ err = helper.IssueToken(uid, writer)
+ if err != nil {
+ helper.WriteInternalErrorJson(err, writer)
+ return
+ }
+}