mirror of
https://github.com/speatzle/nfsense.git
synced 2025-05-11 10:58:21 +00:00
Add User Backend
This commit is contained in:
parent
e8f697003e
commit
e44d66d334
6 changed files with 164 additions and 0 deletions
9
internal/api/system/system.go
Normal file
9
internal/api/system/system.go
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
"nfsense.net/nfsense/internal/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
type System struct {
|
||||||
|
ConfigManager *config.ConfigManager
|
||||||
|
}
|
139
internal/api/system/user.go
Normal file
139
internal/api/system/user.go
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"nfsense.net/nfsense/internal/auth"
|
||||||
|
"nfsense.net/nfsense/internal/definitions/system"
|
||||||
|
)
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
Comment string `json:"comment"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetUserParameters struct {
|
||||||
|
ID string
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetUserResult struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
User
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *System) GetUser(ctx context.Context, params GetUserParameters) (GetUserResult, error) {
|
||||||
|
_, ok := f.ConfigManager.GetPendingConfig().System.Users[params.ID]
|
||||||
|
if !ok {
|
||||||
|
return GetUserResult{}, fmt.Errorf("User does not Exist")
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetUserResult{
|
||||||
|
Name: params.ID,
|
||||||
|
User: User{
|
||||||
|
Comment: f.ConfigManager.GetPendingConfig().System.Users[params.ID].Comment,
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetUsersResult struct {
|
||||||
|
Users map[string]User
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *System) GetUsers(ctx context.Context, params struct{}) (GetUsersResult, error) {
|
||||||
|
users := map[string]User{}
|
||||||
|
for n, u := range f.ConfigManager.GetPendingConfig().System.Users {
|
||||||
|
users[n] = User{Comment: u.Comment}
|
||||||
|
}
|
||||||
|
return GetUsersResult{
|
||||||
|
Users: users,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type CreateUserParameters struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
User
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *System) CreateUser(ctx context.Context, params CreateUserParameters) (struct{}, error) {
|
||||||
|
_, ok := f.ConfigManager.GetPendingConfig().System.Users[params.Name]
|
||||||
|
if ok {
|
||||||
|
return struct{}{}, fmt.Errorf("User already Exists")
|
||||||
|
}
|
||||||
|
|
||||||
|
if params.Name == "" {
|
||||||
|
return struct{}{}, fmt.Errorf("Name Cannot be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
if params.Password == "" {
|
||||||
|
return struct{}{}, fmt.Errorf("Password Cannot be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
hash, salt, err := auth.GenerateHash(params.Password)
|
||||||
|
if err != nil {
|
||||||
|
return struct{}{}, fmt.Errorf("Generate Hash: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
t, conf := f.ConfigManager.StartTransaction()
|
||||||
|
defer t.Discard()
|
||||||
|
|
||||||
|
conf.System.Users[params.Name] = system.User{
|
||||||
|
Hash: hash,
|
||||||
|
Salt: salt,
|
||||||
|
Comment: params.User.Comment,
|
||||||
|
}
|
||||||
|
return struct{}{}, t.Commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
type UpdateUserParameters struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
User
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *System) UpdateUser(ctx context.Context, params UpdateUserParameters) (struct{}, error) {
|
||||||
|
_, ok := f.ConfigManager.GetPendingConfig().System.Users[params.Name]
|
||||||
|
if !ok {
|
||||||
|
return struct{}{}, fmt.Errorf("User does not Exist")
|
||||||
|
}
|
||||||
|
|
||||||
|
if params.Name == "" {
|
||||||
|
return struct{}{}, fmt.Errorf("Name Cannot be empty")
|
||||||
|
}
|
||||||
|
user := f.ConfigManager.GetPendingConfig().System.Users[params.Name]
|
||||||
|
|
||||||
|
if params.Password != "" {
|
||||||
|
hash, salt, err := auth.GenerateHash(params.Password)
|
||||||
|
if err != nil {
|
||||||
|
return struct{}{}, fmt.Errorf("Generate Hash: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
user.Hash = hash
|
||||||
|
user.Salt = salt
|
||||||
|
}
|
||||||
|
|
||||||
|
user.Comment = params.User.Comment
|
||||||
|
|
||||||
|
t, conf := f.ConfigManager.StartTransaction()
|
||||||
|
defer t.Discard()
|
||||||
|
|
||||||
|
conf.System.Users[params.Name] = user
|
||||||
|
return struct{}{}, t.Commit()
|
||||||
|
}
|
||||||
|
|
||||||
|
type DeleteUserParameters struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *System) DeleteUser(ctx context.Context, params DeleteUserParameters) (struct{}, error) {
|
||||||
|
_, ok := f.ConfigManager.GetPendingConfig().System.Users[params.Name]
|
||||||
|
if !ok {
|
||||||
|
return struct{}{}, fmt.Errorf("User does not Exist")
|
||||||
|
}
|
||||||
|
|
||||||
|
t, conf := f.ConfigManager.StartTransaction()
|
||||||
|
defer t.Discard()
|
||||||
|
|
||||||
|
delete(conf.System.Users, params.Name)
|
||||||
|
return struct{}{}, t.Commit()
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"nfsense.net/nfsense/internal/definitions/network"
|
"nfsense.net/nfsense/internal/definitions/network"
|
||||||
"nfsense.net/nfsense/internal/definitions/object"
|
"nfsense.net/nfsense/internal/definitions/object"
|
||||||
"nfsense.net/nfsense/internal/definitions/service"
|
"nfsense.net/nfsense/internal/definitions/service"
|
||||||
|
"nfsense.net/nfsense/internal/definitions/system"
|
||||||
"nfsense.net/nfsense/internal/definitions/vpn"
|
"nfsense.net/nfsense/internal/definitions/vpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -20,6 +21,7 @@ type Config struct {
|
||||||
Network network.Network `json:"network" validate:"required,dive"`
|
Network network.Network `json:"network" validate:"required,dive"`
|
||||||
Service service.Service `json:"service" validate:"required,dive"`
|
Service service.Service `json:"service" validate:"required,dive"`
|
||||||
VPN vpn.VPN `json:"vpn" validate:"required,dive"`
|
VPN vpn.VPN `json:"vpn" validate:"required,dive"`
|
||||||
|
System system.System `json:"system" validate:"required,dive"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clone TODO find a better way to deep copy
|
// Clone TODO find a better way to deep copy
|
||||||
|
|
5
internal/definitions/system/system.go
Normal file
5
internal/definitions/system/system.go
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
package system
|
||||||
|
|
||||||
|
type System struct {
|
||||||
|
Users map[string]User `json:"users" validate:"required,dive"`
|
||||||
|
}
|
7
internal/definitions/system/user.go
Normal file
7
internal/definitions/system/user.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package system
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
Comment string `json:"comment"`
|
||||||
|
Hash string `json:"hash"`
|
||||||
|
Salt string `json:"salt"`
|
||||||
|
}
|
2
main.go
2
main.go
|
@ -16,6 +16,7 @@ import (
|
||||||
"nfsense.net/nfsense/internal/api/network"
|
"nfsense.net/nfsense/internal/api/network"
|
||||||
"nfsense.net/nfsense/internal/api/object"
|
"nfsense.net/nfsense/internal/api/object"
|
||||||
"nfsense.net/nfsense/internal/api/service"
|
"nfsense.net/nfsense/internal/api/service"
|
||||||
|
"nfsense.net/nfsense/internal/api/system"
|
||||||
"nfsense.net/nfsense/internal/api/vpn"
|
"nfsense.net/nfsense/internal/api/vpn"
|
||||||
"nfsense.net/nfsense/internal/chrony"
|
"nfsense.net/nfsense/internal/chrony"
|
||||||
"nfsense.net/nfsense/internal/config"
|
"nfsense.net/nfsense/internal/config"
|
||||||
|
@ -104,6 +105,7 @@ func RegisterAPIMethods(apiHandler *jsonrpc.Handler, configManager *config.Confi
|
||||||
apiHandler.Register("Object", &object.Object{ConfigManager: configManager})
|
apiHandler.Register("Object", &object.Object{ConfigManager: configManager})
|
||||||
apiHandler.Register("Service", &service.Service{ConfigManager: configManager, DbusConn: dbusConn})
|
apiHandler.Register("Service", &service.Service{ConfigManager: configManager, DbusConn: dbusConn})
|
||||||
apiHandler.Register("VPN", &vpn.VPN{ConfigManager: configManager, DbusConn: dbusConn})
|
apiHandler.Register("VPN", &vpn.VPN{ConfigManager: configManager, DbusConn: dbusConn})
|
||||||
|
apiHandler.Register("System", &system.System{ConfigManager: configManager})
|
||||||
}
|
}
|
||||||
|
|
||||||
func RegisterApplyFunctions(configManager *config.ConfigManager) {
|
func RegisterApplyFunctions(configManager *config.ConfigManager) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue