|
@@ -158,6 +158,10 @@ class TestApiKeyDenylistIntegrity:
|
|
|
Permission.PRINTERS_READ,
|
|
Permission.PRINTERS_READ,
|
|
|
Permission.PRINTERS_CONTROL,
|
|
Permission.PRINTERS_CONTROL,
|
|
|
Permission.ARCHIVES_READ,
|
|
Permission.ARCHIVES_READ,
|
|
|
|
|
+ # #1888: archive delete/update moved off the denylist to the
|
|
|
|
|
+ # can_manage_archives allowlist scope; must not be denied.
|
|
|
|
|
+ Permission.ARCHIVES_DELETE_ALL,
|
|
|
|
|
+ Permission.ARCHIVES_UPDATE_ALL,
|
|
|
# SpoolBuddy kiosk reads settings (e.g. language) via API key — must stay allowed.
|
|
# SpoolBuddy kiosk reads settings (e.g. language) via API key — must stay allowed.
|
|
|
Permission.SETTINGS_READ,
|
|
Permission.SETTINGS_READ,
|
|
|
}
|
|
}
|
|
@@ -216,6 +220,7 @@ class TestApiKeyScopeAllowlist:
|
|
|
"can_manage_library",
|
|
"can_manage_library",
|
|
|
"can_manage_inventory",
|
|
"can_manage_inventory",
|
|
|
"can_manage_maintenance",
|
|
"can_manage_maintenance",
|
|
|
|
|
+ "can_manage_archives",
|
|
|
"can_access_cloud",
|
|
"can_access_cloud",
|
|
|
}
|
|
}
|
|
|
used_flags = set(_APIKEY_SCOPE_BY_PERMISSION.values())
|
|
used_flags = set(_APIKEY_SCOPE_BY_PERMISSION.values())
|
|
@@ -243,6 +248,7 @@ class TestApiKeyScopeAllowlist:
|
|
|
"can_manage_library",
|
|
"can_manage_library",
|
|
|
"can_manage_inventory",
|
|
"can_manage_inventory",
|
|
|
"can_manage_maintenance",
|
|
"can_manage_maintenance",
|
|
|
|
|
+ "can_manage_archives",
|
|
|
"can_access_cloud",
|
|
"can_access_cloud",
|
|
|
],
|
|
],
|
|
|
)
|
|
)
|
|
@@ -271,6 +277,7 @@ class _FakeApiKey:
|
|
|
can_manage_library=False,
|
|
can_manage_library=False,
|
|
|
can_manage_inventory=False,
|
|
can_manage_inventory=False,
|
|
|
can_manage_maintenance=False,
|
|
can_manage_maintenance=False,
|
|
|
|
|
+ can_manage_archives=False,
|
|
|
):
|
|
):
|
|
|
self.can_read_status = can_read_status
|
|
self.can_read_status = can_read_status
|
|
|
self.can_queue = can_queue
|
|
self.can_queue = can_queue
|
|
@@ -278,6 +285,7 @@ class _FakeApiKey:
|
|
|
self.can_manage_library = can_manage_library
|
|
self.can_manage_library = can_manage_library
|
|
|
self.can_manage_inventory = can_manage_inventory
|
|
self.can_manage_inventory = can_manage_inventory
|
|
|
self.can_manage_maintenance = can_manage_maintenance
|
|
self.can_manage_maintenance = can_manage_maintenance
|
|
|
|
|
+ self.can_manage_archives = can_manage_archives
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestCheckApiKeyPermissionsMatrix:
|
|
class TestCheckApiKeyPermissionsMatrix:
|
|
@@ -324,6 +332,15 @@ class TestCheckApiKeyPermissionsMatrix:
|
|
|
("MAINTENANCE_CREATE", "can_manage_maintenance", "assign maintenance type to printer"),
|
|
("MAINTENANCE_CREATE", "can_manage_maintenance", "assign maintenance type to printer"),
|
|
|
("MAINTENANCE_UPDATE", "can_manage_maintenance", "log maintenance / edit interval"),
|
|
("MAINTENANCE_UPDATE", "can_manage_maintenance", "log maintenance / edit interval"),
|
|
|
("MAINTENANCE_DELETE", "can_manage_maintenance", "remove custom maintenance item"),
|
|
("MAINTENANCE_DELETE", "can_manage_maintenance", "remove custom maintenance item"),
|
|
|
|
|
+ # can_manage_archives (#1888) — prune print history via API key. OWN and
|
|
|
|
|
+ # ALL ownership variants both fold into the same scope (API keys have no
|
|
|
|
|
+ # per-row ownership identity), matching the can_manage_library shape.
|
|
|
|
|
+ # ARCHIVES_PURGE stays admin-only (see _ADMIN_CASES).
|
|
|
|
|
+ ("ARCHIVES_CREATE", "can_manage_archives", "create an archive"),
|
|
|
|
|
+ ("ARCHIVES_UPDATE_OWN", "can_manage_archives", "edit own archive"),
|
|
|
|
|
+ ("ARCHIVES_UPDATE_ALL", "can_manage_archives", "edit any archive"),
|
|
|
|
|
+ ("ARCHIVES_DELETE_OWN", "can_manage_archives", "delete own archive"),
|
|
|
|
|
+ ("ARCHIVES_DELETE_ALL", "can_manage_archives", "delete any archive"),
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
_ADMIN_CASES = [
|
|
_ADMIN_CASES = [
|
|
@@ -339,6 +356,10 @@ class TestCheckApiKeyPermissionsMatrix:
|
|
|
# LIBRARY_DELETE_ALL / LIBRARY_UPDATE_ALL moved to can_manage_library
|
|
# LIBRARY_DELETE_ALL / LIBRARY_UPDATE_ALL moved to can_manage_library
|
|
|
# under #1832 — covered by the _SCOPE_CASES matrix above.
|
|
# under #1832 — covered by the _SCOPE_CASES matrix above.
|
|
|
"LIBRARY_PURGE",
|
|
"LIBRARY_PURGE",
|
|
|
|
|
+ # ARCHIVES_PURGE stays admin-only even though the rest of archive
|
|
|
|
|
+ # management moved to can_manage_archives under #1888 — it drops the
|
|
|
|
|
+ # print's stats contribution, mirroring LIBRARY_PURGE.
|
|
|
|
|
+ "ARCHIVES_PURGE",
|
|
|
"DISCOVERY_SCAN",
|
|
"DISCOVERY_SCAN",
|
|
|
]
|
|
]
|
|
|
|
|
|
|
@@ -370,6 +391,7 @@ class TestCheckApiKeyPermissionsMatrix:
|
|
|
"can_manage_library",
|
|
"can_manage_library",
|
|
|
"can_manage_inventory",
|
|
"can_manage_inventory",
|
|
|
"can_manage_maintenance",
|
|
"can_manage_maintenance",
|
|
|
|
|
+ "can_manage_archives",
|
|
|
)
|
|
)
|
|
|
if f != required_flag
|
|
if f != required_flag
|
|
|
}
|
|
}
|