96 lines
2.3 KiB
Go
96 lines
2.3 KiB
Go
package room
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
type RoomMember struct {
|
|
RoomName string `json:"room_name"`
|
|
RoomID string `json:"room_id"`
|
|
UserID string `json:"user_id"`
|
|
Username string `json:"username"`
|
|
Role RoomRole `json:"role"`
|
|
Status MemberStatus `json:"status"`
|
|
AddedPerms uint64 `json:"added_permissions"`
|
|
RemovedPerms uint64 `json:"removed_permissions"`
|
|
AdminAdded uint64 `json:"admin_added_permissions"`
|
|
AdminRemoved uint64 `json:"admin_removed_permissions"`
|
|
JoinedAt time.Time `json:"joined_at"`
|
|
Version int64 `json:"version"`
|
|
}
|
|
|
|
func NewMember(room, username string, role RoomRole) *RoomMember {
|
|
return &RoomMember{
|
|
RoomName: room,
|
|
Username: username,
|
|
UserID: username,
|
|
Role: role,
|
|
Status: MemberActive,
|
|
JoinedAt: time.Now(),
|
|
Version: 1,
|
|
}
|
|
}
|
|
|
|
func (m *RoomMember) EffectivePermissions(settings *RoomSettings) PermissionSet {
|
|
if m.Role == RoleCreator {
|
|
return PermAll
|
|
}
|
|
base := m.basePermissions(settings)
|
|
switch m.Role {
|
|
case RoleAdmin:
|
|
res := base
|
|
res |= PermissionSet(m.AdminAdded)
|
|
res &^= PermissionSet(m.AdminRemoved)
|
|
return res
|
|
case RoleMember:
|
|
res := base
|
|
res |= PermissionSet(m.AddedPerms)
|
|
res &^= PermissionSet(m.RemovedPerms)
|
|
return res
|
|
case RoleGuest:
|
|
res := base & PermGuestAssignable
|
|
added := PermissionSet(m.AddedPerms) & PermGuestAssignable
|
|
removed := PermissionSet(m.RemovedPerms) & PermGuestAssignable
|
|
res |= added
|
|
res &^= removed
|
|
return res
|
|
default:
|
|
return base
|
|
}
|
|
}
|
|
|
|
func (m *RoomMember) basePermissions(settings *RoomSettings) PermissionSet {
|
|
if settings == nil {
|
|
return DefaultForRole(m.Role)
|
|
}
|
|
switch m.Role {
|
|
case RoleAdmin:
|
|
return settings.AdminPermissions()
|
|
case RoleMember:
|
|
return settings.MemberPermissions()
|
|
case RoleGuest:
|
|
return settings.GuestPermissions()
|
|
case RoleCreator:
|
|
return PermAll
|
|
default:
|
|
return DefaultForRole(m.Role)
|
|
}
|
|
}
|
|
|
|
func (m *RoomMember) HasPermission(p RoomPermission, settings *RoomSettings) bool {
|
|
return m.EffectivePermissions(settings).Has(p)
|
|
}
|
|
|
|
func (m *RoomMember) CanGrant(target *RoomMember, perm RoomPermission, settings *RoomSettings) bool {
|
|
if !m.HasPermission(PermManagePermissions, settings) {
|
|
return false
|
|
}
|
|
if !m.Role.CanManage(target.Role) {
|
|
return false
|
|
}
|
|
if m.Role == RoleAdmin && perm == PermDeleteRoom {
|
|
return false
|
|
}
|
|
return true
|
|
}
|