Getting basics down
This commit is contained in:
@@ -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
|
||||||
|
)
|
||||||
|
|||||||
@@ -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=
|
||||||
|
|||||||
@@ -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.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,11 @@
|
|||||||
package darkstorm
|
package darkstorm
|
||||||
|
|
||||||
type App interface{}
|
type App interface {
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
type CrashApp interface {
|
||||||
|
App
|
||||||
|
AddCrash(CrashReport)
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package darkstorm
|
||||||
|
|
||||||
|
type CrashReport struct{}
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
package darkstorm
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package db
|
||||||
|
|
||||||
|
type DB interface {
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user