From 75f83568938f4c6f70e79ce27612ebf197c30c49 Mon Sep 17 00:00:00 2001 From: Caleb Gardner Date: Sat, 18 May 2024 10:00:37 -0500 Subject: [PATCH] Getting basics down --- go.mod | 7 +++ go.sum | 6 ++ internal/darkstorm_backend/README.md | 4 ++ internal/darkstorm_backend/app.go | 10 +++- internal/darkstorm_backend/crash.go | 4 ++ internal/darkstorm_backend/darkstorm_test.go | 1 + internal/darkstorm_backend/user.go | 62 ++++++++++++++++++++ internal/db/interface.go | 5 ++ 8 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 internal/darkstorm_backend/crash.go create mode 100644 internal/darkstorm_backend/darkstorm_test.go create mode 100644 internal/darkstorm_backend/user.go create mode 100644 internal/db/interface.go diff --git a/go.mod b/go.mod index e88cfaf..3b03944 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,10 @@ module github.com/CalebQ42/darkstorm-server go 1.22.3 + +require golang.org/x/crypto v0.23.0 + +require ( + github.com/google/uuid v1.6.0 // indirect + golang.org/x/sys v0.20.0 // indirect +) diff --git a/go.sum b/go.sum index e69de29..4297843 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,6 @@ +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/internal/darkstorm_backend/README.md b/internal/darkstorm_backend/README.md index 9d244c2..35e8bbf 100644 --- a/internal/darkstorm_backend/README.md +++ b/internal/darkstorm_backend/README.md @@ -28,7 +28,11 @@ This is a purposefully "simple" application backend made specifically for _my_ a username: "username", password: "hashed password", salt: "password salt", + email: "email", passwordChange: 0, // unix timestamp of last password change + perm: { + appID: "user", // Optional. Apps should have a default permission level if thier appID is not in perm. + } } ``` diff --git a/internal/darkstorm_backend/app.go b/internal/darkstorm_backend/app.go index a1e2aca..4ebdc4b 100644 --- a/internal/darkstorm_backend/app.go +++ b/internal/darkstorm_backend/app.go @@ -1,3 +1,11 @@ package darkstorm -type App interface{} \ No newline at end of file +type App interface { + //TODO +} + +type CrashApp interface { + App + AddCrash(CrashReport) + // TODO +} diff --git a/internal/darkstorm_backend/crash.go b/internal/darkstorm_backend/crash.go new file mode 100644 index 0000000..043f315 --- /dev/null +++ b/internal/darkstorm_backend/crash.go @@ -0,0 +1,4 @@ +package darkstorm + +type CrashReport struct{} + diff --git a/internal/darkstorm_backend/darkstorm_test.go b/internal/darkstorm_backend/darkstorm_test.go new file mode 100644 index 0000000..a8fface --- /dev/null +++ b/internal/darkstorm_backend/darkstorm_test.go @@ -0,0 +1 @@ +package darkstorm diff --git a/internal/darkstorm_backend/user.go b/internal/darkstorm_backend/user.go new file mode 100644 index 0000000..439299d --- /dev/null +++ b/internal/darkstorm_backend/user.go @@ -0,0 +1,62 @@ +package darkstorm + +import ( + "crypto/rand" + "encoding/base64" + + "github.com/google/uuid" + "golang.org/x/crypto/argon2" +) + +func generateSalt() (string, error) { + out := make([]byte, 16) + _, err := rand.Read(out) + return base64.RawStdEncoding.EncodeToString(out), err +} + +type User struct { + Perm map[string]string + ID string + Username string + Password string + Salt string + Email string + PasswordChange uint64 +} + +func NewUser(username, password, email string) (*User, error) { + id, err := uuid.NewV7() + if err != nil { + return nil, err + } + salt, err := generateSalt() + if err != nil { + return nil, err + } + out := &User{ + Perm: make(map[string]string), + ID: id.String(), + Username: username, + Salt: salt, + Email: email, + } + out.Password, err = out.HashPassword(password) + return out, err +} + +func (u *User) HashPassword(password string) (string, error) { + salt, err := base64.RawStdEncoding.DecodeString(u.Salt) + if err != nil { + return "", err + } + res := argon2.IDKey([]byte(password), salt, 1, 64*1024, 4, 32) + return base64.RawStdEncoding.EncodeToString(res), nil +} + +func (u *User) ValidatePassword(password string) (bool, error) { + hsh, err := u.HashPassword(password) + if err != nil { + return false, err + } + return hsh == u.Password, nil +} diff --git a/internal/db/interface.go b/internal/db/interface.go new file mode 100644 index 0000000..8a2770a --- /dev/null +++ b/internal/db/interface.go @@ -0,0 +1,5 @@ +package db + +type DB interface { + //TODO +}