2
2
mirror of https://github.com/mastodon/mastodon-ios synced 2025-04-11 22:58:02 +02:00

Correct handling of permissions bitmask

This commit is contained in:
shannon 2025-04-04 08:46:00 -04:00
parent 58425ecad5
commit c9da109ea3
2 changed files with 9 additions and 7 deletions

View File

@ -64,7 +64,8 @@ class NotificationListViewController: UIHostingController<NotificationListView>
Task {
let adminSettings: AdminNotificationFilterSettings? = await {
guard let user = AuthenticationServiceProvider.shared.currentActiveUser.value, let role = user.cachedAccount?.role else { print("no role"); return nil }
let hasAdminPermissions = role.hasPermissions(.administrator) || role.hasPermissions(.manageReports) || role.hasPermissions(.manageUsers)
let permissions = role.rolePermissions()
let hasAdminPermissions = permissions.contains(.administrator) || permissions.contains(.manageReports) || permissions.contains(.manageUsers)
guard hasAdminPermissions else { print("no permissions"); return nil }
if let existingPreferences = await BodegaPersistence.Notifications.currentPreferences(for: user.authentication) {
return existingPreferences

View File

@ -178,12 +178,9 @@ extension Mastodon.Entity.Account {
public let permissions: String // To determine the permissions available to a certain role, convert the permissions attribute to binary and compare from the least significant bit upwards.
public let highlighted: Bool
public func hasPermissions(_ desiredPermissions: Permissions) -> Bool {
let binaryData = Data(permissions.utf8)
let rawPermissions = binaryData.withUnsafeBytes { rawBuffer in
rawBuffer.load(as: UInt32.self)
}
return Permissions(rawValue: rawPermissions).contains(desiredPermissions)
public func rolePermissions() -> Permissions {
guard let rawValue = UInt32(permissions) else { return [] }
return Permissions(rawValue: rawValue)
}
public struct Permissions: OptionSet {
@ -197,18 +194,22 @@ extension Mastodon.Entity.Account {
public static let devops = Permissions(rawValue: 1 << 1)
public static let viewAuditLog = Permissions(rawValue: 1 << 2)
public static let viewDashboard = Permissions(rawValue: 1 << 3)
public static let manageReports = Permissions(rawValue: 1 << 4)
public static let manageFederation = Permissions(rawValue: 1 << 5)
public static let manageSettings = Permissions(rawValue: 1 << 6)
public static let manageBlocks = Permissions(rawValue: 1 << 7)
public static let manageTaxonomies = Permissions(rawValue: 1 << 8)
public static let manageAppeals = Permissions(rawValue: 1 << 9)
public static let manageUsers = Permissions(rawValue: 1 << 10)
public static let manageInvites = Permissions(rawValue: 1 << 11)
public static let manageRules = Permissions(rawValue: 1 << 12)
public static let manageAnnouncements = Permissions(rawValue: 1 << 13)
public static let manageCustomEmojis = Permissions(rawValue: 1 << 14)
public static let manageWebhooks = Permissions(rawValue: 1 << 15)
public static let inviteUsers = Permissions(rawValue: 1 << 16)
public static let manageRoles = Permissions(rawValue: 1 << 17)
public static let manageUserAccess = Permissions(rawValue: 1 << 18)