create new user

main
alex 2023-06-25 12:13:14 +02:00
parent 634cb1ef6e
commit 5a13c3fe36
5 changed files with 108 additions and 14 deletions

View File

@ -91,8 +91,6 @@ func handleMasterRolePermissions() (roleId string) {
DB.Where("role_id = ?", foundRole.Id).Find(&foundRolePermissions) DB.Where("role_id = ?", foundRole.Id).Find(&foundRolePermissions)
log.Debug().Msgf("init database %v", cache.GetSystemPermissions())
systemPermissions := cache.GetSystemPermissions() systemPermissions := cache.GetSystemPermissions()
if len(foundRolePermissions) > 0 { if len(foundRolePermissions) > 0 {

View File

@ -10,7 +10,7 @@ func InitSystemPermissions() {
cache.AddSystemPermissions([]string{ cache.AddSystemPermissions([]string{
utils.PermissionGroupTasksHistory, utils.PermissionGroupTasksHistory,
utils.PermissionAllUsersActionChangeRole, utils.PermissionAllUsersActionChangeRole,
utils.PermissionAllUsersCreateUser, utils.PermissionAllUsersCreateNewUser,
utils.PermissionScannerUseScanners, utils.PermissionScannerUseScanners,
utils.PermissionAdminAreaCreateNewRole, utils.PermissionAdminAreaCreateNewRole,
utils.PermissionAdminAreaUpdateRole, utils.PermissionAdminAreaUpdateRole,

View File

@ -25,6 +25,9 @@ const (
GroupTaskLockedTime = 3 GroupTaskLockedTime = 3
SessionExpiresAtTime = 7 * 24 * 60 * 60 // 1 week SessionExpiresAtTime = 7 * 24 * 60 * 60 // 1 week
ConnectionStateOffline = 0
ConnectionStateOnline = 1
) )
// commands sent to web clients // commands sent to web clients
@ -51,9 +54,10 @@ const (
SentCmdAdminAreaRoleUpdated = 20 SentCmdAdminAreaRoleUpdated = 20
SentCmdAdminAreaUpdateRoleSortingOrder = 21 SentCmdAdminAreaUpdateRoleSortingOrder = 21
SentCmdAdminAreaRoleDeleted = 22 SentCmdAdminAreaRoleDeleted = 22
SentCmdUserRoleUpdated = 23 SentCmdAllUsersUserRoleUpdated = 23
SentCmdRolePermissionsUpdated = 24 SentCmdRolePermissionsUpdated = 24
SentCmdErrorNoPermissions = 25 SentCmdErrorNoPermissions = 25
SentCmdAllUsersNewUserCreated = 26
) )
// commands received from web clients // commands received from web clients
@ -68,7 +72,8 @@ const (
ReceivedCmdAdminAreaUpdateRole = 8 ReceivedCmdAdminAreaUpdateRole = 8
ReceivedCmdAdminAreaUpdateRoleSortingOrder = 9 ReceivedCmdAdminAreaUpdateRoleSortingOrder = 9
ReceivedCmdAdminAreaDeleteRole = 10 ReceivedCmdAdminAreaDeleteRole = 10
ReceivedCmdUpdateUserRole = 11 ReceivedCmdAllUsersUpdateUserRole = 11
ReceivedCmdAllUsersCreateNewUser = 12
) )
const ( const (
@ -95,7 +100,7 @@ const (
PermissionGroupTasksOverviewXYView = _groupTasks + "overview.XY.view" PermissionGroupTasksOverviewXYView = _groupTasks + "overview.XY.view"
PermissionGroupTasksHistory = _groupTasks + "history" PermissionGroupTasksHistory = _groupTasks + "history"
PermissionAllUsersCreateUser = "all_users.create_user" PermissionAllUsersCreateNewUser = "all_users.create_new_user"
PermissionAllUsersActionChangeRole = "all_users.action.change_role" PermissionAllUsersActionChangeRole = "all_users.action.change_role"
PermissionScannerUseScanners = "scanner.use_scanners" PermissionScannerUseScanners = "scanner.use_scanners"

View File

@ -10,6 +10,7 @@ import (
"time" "time"
"github.com/gofiber/websocket/v2" "github.com/gofiber/websocket/v2"
"github.com/google/uuid"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
"gorm.io/gorm" "gorm.io/gorm"
@ -153,11 +154,11 @@ func isUserSessionConnected(userSessionId string, socketClients []*structs.Socke
func isUserGenerallyConnected(userId string) uint8 { func isUserGenerallyConnected(userId string) uint8 {
for _, socketClient := range cache.GetSocketClients() { for _, socketClient := range cache.GetSocketClients() {
if socketClient.UserId == userId { if socketClient.UserId == userId {
return 1 return utils.ConnectionStateOnline
} }
} }
return 0 return utils.ConnectionStateOffline
} }
// Get all users from database. // Get all users from database.
@ -530,7 +531,6 @@ func AdminAreaMoveRoleToSortingOrder(body map[string]interface{}) {
return return
} }
// TODO: check permissions
BroadcastMessage(structs.SendSocketMessage{ BroadcastMessage(structs.SendSocketMessage{
Cmd: utils.SentCmdAdminAreaUpdateRoleSortingOrder, Cmd: utils.SentCmdAdminAreaUpdateRoleSortingOrder,
Body: body, Body: body,
@ -559,14 +559,12 @@ func AdminAreaDeleteRole(body map[string]interface{}) {
} }
func UpdateUserRole(userId string, roleId string) { func UpdateUserRole(userId string, roleId string) {
log.Debug().Msgf("userId %s roleId %s", userId, roleId)
database.DB.Model(&structs.User{}).Where("id = ?", userId).Updates(structs.User{ database.DB.Model(&structs.User{}).Where("id = ?", userId).Updates(structs.User{
RoleId: roleId, RoleId: roleId,
}) })
SendMessageToUser(userId, "", structs.SendSocketMessage{ SendMessageToUser(userId, "", structs.SendSocketMessage{
Cmd: utils.SentCmdUserRoleUpdated, Cmd: utils.SentCmdAllUsersUserRoleUpdated,
Body: struct { Body: struct {
UserId string UserId string
RoleId string RoleId string
@ -579,7 +577,7 @@ func UpdateUserRole(userId string, roleId string) {
}) })
BroadcastMessageExceptUserId(userId, structs.SendSocketMessage{ BroadcastMessageExceptUserId(userId, structs.SendSocketMessage{
Cmd: utils.SentCmdUserRoleUpdated, Cmd: utils.SentCmdAllUsersUserRoleUpdated,
Body: struct { Body: struct {
UserId string UserId string
RoleId string RoleId string
@ -611,3 +609,87 @@ func SendErrorMessageNoPermissions(sessionId string) {
Cmd: utils.SentCmdErrorNoPermissions, Cmd: utils.SentCmdErrorNoPermissions,
}) })
} }
func AllUsersCreateNewUser(sessionId string, body map[string]interface{}) {
if body["Username"] == nil ||
body["Email"] == nil ||
body["Password"] == nil ||
body["RoleId"] == nil {
log.Error().Msgf("Invalid body provided for user creation: %v", body)
return
}
username := body["Username"].(string)
email := body["Email"].(string)
password := body["Password"].(string)
roleId := body["RoleId"].(string)
if !isValueLenValid(username, utils.MinUsername, utils.MaxUsername) {
log.Error().Msgf("Invalid username length: %s", username)
return
}
if !isUsernameAvailable(username) {
SendMessageOnlyToSessionId(sessionId, structs.SendSocketMessage{
Cmd: utils.SentCmdAllUsersNewUserCreated,
Body: struct {
Result uint8
}{
Result: 0,
},
})
return
}
if !isEmailAvailable(email) {
SendMessageOnlyToSessionId(sessionId, structs.SendSocketMessage{
Cmd: utils.SentCmdAllUsersNewUserCreated,
Body: struct {
Result uint8
}{
Result: 1,
},
})
return
}
decodedPassword, err := base64.StdEncoding.DecodeString(password)
if err != nil {
log.Error().Msgf("Failed to decode base64 password, err: %s", err.Error())
return
}
hashedPassword, err := bcrypt.GenerateFromPassword(decodedPassword, bcrypt.DefaultCost)
if err != nil {
log.Error().Msgf("Failed to generate password: %s", err.Error())
return
}
newUser := structs.User{
Id: uuid.New().String(),
RoleId: roleId,
Username: username,
Email: email,
Password: string(hashedPassword),
CreatedAt: time.Now(),
}
database.DB.Create(&newUser)
BroadcastMessage(structs.SendSocketMessage{
Cmd: utils.SentCmdAllUsersNewUserCreated,
Body: struct {
Id string
Username string
RoleId string
ConnectionStatus uint8
}{
Id: newUser.Id,
Username: username,
RoleId: roleId,
ConnectionStatus: utils.ConnectionStateOffline,
},
})
}

View File

@ -251,7 +251,7 @@ func RunHub() {
socketclients.AdminAreaDeleteRole(receivedMessage.Body) socketclients.AdminAreaDeleteRole(receivedMessage.Body)
break break
case utils.ReceivedCmdUpdateUserRole: case utils.ReceivedCmdAllUsersUpdateUserRole:
if !socketclients.HasPermission(data.Conn.Locals("userId").(string), utils.PermissionAllUsersActionChangeRole) { if !socketclients.HasPermission(data.Conn.Locals("userId").(string), utils.PermissionAllUsersActionChangeRole) {
socketclients.SendErrorMessageNoPermissions(data.Conn.Locals("sessionId").(string)) socketclients.SendErrorMessageNoPermissions(data.Conn.Locals("sessionId").(string))
break break
@ -259,6 +259,15 @@ func RunHub() {
socketclients.UpdateUserRole(receivedMessage.Body["UserId"].(string), receivedMessage.Body["RoleId"].(string)) socketclients.UpdateUserRole(receivedMessage.Body["UserId"].(string), receivedMessage.Body["RoleId"].(string))
break break
case utils.ReceivedCmdAllUsersCreateNewUser:
if !socketclients.HasPermission(data.Conn.Locals("userId").(string), utils.PermissionAllUsersCreateNewUser) {
socketclients.SendErrorMessageNoPermissions(data.Conn.Locals("sessionId").(string))
break
}
socketclients.AllUsersCreateNewUser(data.Conn.Locals("sessionId").(string), receivedMessage.Body)
break
default: default:
log.Error().Msgf("Received unknown message: %v", receivedMessage) log.Error().Msgf("Received unknown message: %v", receivedMessage)
break break