diff --git a/modules/structs/socket.go b/modules/structs/socket.go index c382d44..abc133a 100644 --- a/modules/structs/socket.go +++ b/modules/structs/socket.go @@ -104,6 +104,7 @@ type AllUsers struct { Avatar string Username string ConnectionStatus uint8 + Deactivated bool LastOnline time.Time } diff --git a/modules/structs/user.go b/modules/structs/user.go index 2ad64a7..fcc2f10 100644 --- a/modules/structs/user.go +++ b/modules/structs/user.go @@ -5,15 +5,16 @@ import ( ) type User struct { - Id string - RoleId string - Avatar string - Username string - Email string - Password string - LastOnline time.Time - UpdatedAt time.Time - CreatedAt time.Time + Id string + RoleId string + Avatar string + Username string + Email string + Password string + Deactivated bool + LastOnline time.Time + UpdatedAt time.Time + CreatedAt time.Time } type UserSession struct { diff --git a/modules/systempermissions/systempermissions.go b/modules/systempermissions/systempermissions.go index dfedb78..0150e29 100644 --- a/modules/systempermissions/systempermissions.go +++ b/modules/systempermissions/systempermissions.go @@ -11,6 +11,7 @@ func InitSystemPermissions() { utils.PermissionGroupTasksHistory, utils.PermissionAllUsersActionChangeRole, utils.PermissionAllUsersActionDeleteUser, + utils.PermissionAllUsersActionUserDeactivation, utils.PermissionAllUsersCreateNewUser, utils.PermissionScannerUseScanners, utils.PermissionAdminAreaCreateNewRole, diff --git a/modules/utils/globals.go b/modules/utils/globals.go index 4e2285f..0ea4333 100644 --- a/modules/utils/globals.go +++ b/modules/utils/globals.go @@ -59,6 +59,7 @@ const ( SentCmdErrorNoPermissions = 25 SentCmdAllUsersNewUserCreated = 26 SentCmdAllUsersUserDeleted = 27 + SentCmdAllUsersUserDeactivation = 28 ) // commands received from web clients @@ -76,6 +77,7 @@ const ( ReceivedCmdAllUsersUpdateUserRole = 11 ReceivedCmdAllUsersCreateNewUser = 12 ReceivedCmdAllUsersDeleteUser = 13 + ReceivedCmdAllUsersUserDeactivation = 14 ) const ( @@ -102,10 +104,11 @@ const ( PermissionGroupTasksOverviewXYView = _groupTasks + "overview.XY.view" PermissionGroupTasksHistory = _groupTasks + "history" - PermissionAllUsersCreateNewUser = "all_users.create_new_user" - PermissionAllUsersActionChangeRole = "all_users.action.change_role" - PermissionAllUsersActionDeleteUser = "all_users.action.delete_user" - PermissionScannerUseScanners = "scanner.use_scanners" + PermissionAllUsersCreateNewUser = "all_users.create_new_user" + PermissionAllUsersActionChangeRole = "all_users.action.change_role" + PermissionAllUsersActionDeleteUser = "all_users.action.delete_user" + PermissionAllUsersActionUserDeactivation = "all_users.action.user_deactivation" + PermissionScannerUseScanners = "scanner.use_scanners" _adminArea = "admin_area." _adminAreaRoles = _adminArea + "roles." diff --git a/routers/router/api/v1/user/auth.go b/routers/router/api/v1/user/auth.go index 0c89a40..a494545 100644 --- a/routers/router/api/v1/user/auth.go +++ b/routers/router/api/v1/user/auth.go @@ -53,6 +53,10 @@ func UserLogin(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusBadRequest) } + if user.Deactivated { + return c.SendStatus(fiber.StatusUnauthorized) + } + session, err := GenerateSession() if err != nil { diff --git a/socketclients/socketclients.go b/socketclients/socketclients.go index 7e16eae..3fa841e 100644 --- a/socketclients/socketclients.go +++ b/socketclients/socketclients.go @@ -177,6 +177,7 @@ func GetAllUsers() []structs.AllUsers { Avatar: user.Avatar, Username: user.Username, ConnectionStatus: isUserGenerallyConnected(user.Id), + Deactivated: user.Deactivated, LastOnline: user.LastOnline, }) } @@ -730,3 +731,26 @@ func AllUsersDeleteUser(userId string) { }, }) } + +func AllUsersUserDeactivation(userId string, deactivate bool) { + log.Debug().Msgf("deactivation %v %v", userId, deactivate) + + database.DB.Model(&structs.User{}).Select("deactivated").Where("id = ?", userId).Updates(structs.User{ + Deactivated: deactivate, + }) + + if deactivate { + CloseAndDeleteAllUserConnections(userId) + } + + BroadcastMessage(structs.SendSocketMessage{ + Cmd: utils.SentCmdAllUsersUserDeactivation, + Body: struct { + UserId string + Deactivated bool + }{ + UserId: userId, + Deactivated: deactivate, + }, + }) +} diff --git a/socketserver/hub.go b/socketserver/hub.go index 19523fc..6f33d3f 100644 --- a/socketserver/hub.go +++ b/socketserver/hub.go @@ -275,6 +275,14 @@ func RunHub() { socketclients.AllUsersDeleteUser(receivedMessage.Body["UserId"].(string)) break + case utils.ReceivedCmdAllUsersUserDeactivation: + if !socketclients.HasPermission(data.Conn.Locals("userId").(string), utils.PermissionAllUsersActionUserDeactivation) { + socketclients.SendErrorMessageNoPermissions(data.Conn.Locals("sessionId").(string)) + break + } + + socketclients.AllUsersUserDeactivation(receivedMessage.Body["UserId"].(string), receivedMessage.Body["Deactivation"].(bool)) + break default: log.Error().Msgf("Received unknown message: %v", receivedMessage) @@ -293,7 +301,6 @@ func RunHub() { }) socketclients.UpdateUserSessionsForUser(userId, sessionId) - socketclients.UpdateConnectedUsers(userId) } }