Finished with crash requests

Change Log to Count
Added option to get user count
Moved functions to VerifyHeader
Added user delete
This commit is contained in:
Caleb Gardner
2024-06-11 13:42:58 -05:00
parent 99c881b51e
commit df3fe83c5f
8 changed files with 241 additions and 84 deletions
+50 -27
View File
@@ -24,6 +24,24 @@ func generateSalt() (string, error) {
return base64.RawStdEncoding.EncodeToString(out), err
}
type ReqestUser struct {
Perm map[string]string
ID string
Username string
}
func (b *Backend) GenerateJWT(r *ReqestUser) (string, error) {
if b.jwtPriv == nil || b.jwtPub == nil {
return "", errors.New("user management not enabled")
}
return jwt.NewWithClaims(jwt.SigningMethodEdDSA, jwt.RegisteredClaims{
ID: r.ID,
Issuer: "darkstorm.tech",
IssuedAt: jwt.NewNumericDate(time.Now()),
ExpiresAt: jwt.NewNumericDate(time.Now().Add(12 * time.Hour)),
}).SignedString(b.jwtPriv)
}
type User struct {
Perm map[string]string `json:"perm" bson:"perm"`
ID string `json:"id" bson:"_id"`
@@ -59,27 +77,12 @@ func NewUser(username, password, email string) (User, error) {
return u, nil
}
type ReqUser struct {
Perm map[string]string
ID string
Username string
}
func (b *Backend) generateJWT(r *ReqUser) (string, error) {
return jwt.NewWithClaims(jwt.SigningMethodEdDSA, jwt.RegisteredClaims{
ID: r.ID,
Issuer: "darkstorm.tech",
IssuedAt: jwt.NewNumericDate(time.Now()),
ExpiresAt: jwt.NewNumericDate(time.Now().Add(12 * time.Hour)),
}).SignedString(b.jwtPriv)
}
func (u User) GetID() string {
return u.ID
}
func (u User) toReqUser() *ReqUser {
return &ReqUser{
func (u User) toReqUser() *ReqestUser {
return &ReqestUser{
Perm: u.Perm,
ID: u.ID,
Username: u.Username,
@@ -114,7 +117,7 @@ type createUserReturn struct {
Token string `json:"token"`
}
func (b *Backend) CreateUser(w http.ResponseWriter, r *http.Request) {
func (b *Backend) createUser(w http.ResponseWriter, r *http.Request) {
hdr, err := b.VerifyHeader(w, r, "user", false)
if hdr == nil {
if err == nil {
@@ -164,7 +167,7 @@ func (b *Backend) CreateUser(w http.ResponseWriter, r *http.Request) {
}
var ret createUserReturn
ret.Username = u.Username
ret.Token, err = b.generateJWT(u.toReqUser())
ret.Token, err = b.GenerateJWT(u.toReqUser())
if err != nil {
ReturnError(w, http.StatusInternalServerError, "internal", "Server error")
return
@@ -173,6 +176,27 @@ func (b *Backend) CreateUser(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(ret)
}
func (b *Backend) deleteUser(w http.ResponseWriter, r *http.Request) {
hdr, err := b.VerifyHeader(w, r, "management", true)
if hdr == nil {
if err == nil {
log.Println("request key parsing error:", err)
}
return
}
userID := r.PathValue("userID")
if userID == "" {
ReturnError(w, http.StatusBadRequest, "badRequest", "Bad Request")
return
}
b.userMutex.Lock()
defer b.userMutex.Unlock()
err = b.userTable.Remove(userID)
if err != nil && err != ErrNotFound {
log.Println("error deleting user:", err)
}
}
type loginRequest struct {
Username string
Password string
@@ -184,13 +208,12 @@ type loginReturn struct {
Timeout int64 `json:"timeout"`
}
func (b *Backend) Login(w http.ResponseWriter, r *http.Request) {
hdr, err := b.ParseHeader(r)
if hdr.Key == nil || !hdr.Key.Perm["user"] || errors.Is(err, ErrApiKeyUnauthorized) {
ReturnError(w, http.StatusUnauthorized, "invalidKey", "Application not authorized")
return
} else if err != nil {
ReturnError(w, http.StatusInternalServerError, "internal", "Server error")
func (b *Backend) login(w http.ResponseWriter, r *http.Request) {
hdr, err := b.VerifyHeader(w, r, "user", false)
if hdr == nil {
if err == nil {
log.Println("request key parsing error:", err)
}
return
}
defer r.Body.Close()
@@ -224,7 +247,7 @@ func (b *Backend) Login(w http.ResponseWriter, r *http.Request) {
return
}
if u.Password == hash {
ret.Token, err = b.generateJWT(u.toReqUser())
ret.Token, err = b.GenerateJWT(u.toReqUser())
if err != nil {
ReturnError(w, http.StatusInternalServerError, "internal", "Server error")
return