Getting basics down

This commit is contained in:
Caleb Gardner
2024-05-18 10:00:37 -05:00
parent b6bc9240d9
commit 75f8356893
8 changed files with 98 additions and 1 deletions
+7
View File
@@ -1,3 +1,10 @@
module github.com/CalebQ42/darkstorm-server module github.com/CalebQ42/darkstorm-server
go 1.22.3 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
)
+6
View File
@@ -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=
+4
View File
@@ -28,7 +28,11 @@ This is a purposefully "simple" application backend made specifically for _my_ a
username: "username", username: "username",
password: "hashed password", password: "hashed password",
salt: "password salt", salt: "password salt",
email: "email",
passwordChange: 0, // unix timestamp of last password change 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.
}
} }
``` ```
+9 -1
View File
@@ -1,3 +1,11 @@
package darkstorm package darkstorm
type App interface{} type App interface {
//TODO
}
type CrashApp interface {
App
AddCrash(CrashReport)
// TODO
}
+4
View File
@@ -0,0 +1,4 @@
package darkstorm
type CrashReport struct{}
@@ -0,0 +1 @@
package darkstorm
+62
View File
@@ -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
}
+5
View File
@@ -0,0 +1,5 @@
package db
type DB interface {
//TODO
}