Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 26 additions & 6 deletions src/easy_oauth/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,15 +198,16 @@ async def route_logout(self, request):
# User management routes #
##########################

def _manage_cap_response(self, email):
def _get_user_capabilities(self, email):
db = self.capabilities.db
return serialize(set[self.capabilities.captype], db.value.get(email, set()))

def _manage_cap_response(self, email):
return JSONResponse(
{
"status": "ok",
"email": email,
"capabilities": serialize(
set[self.capabilities.captype], db.value.get(email, set())
),
"capabilities": self._get_user_capabilities(email),
}
)

Expand Down Expand Up @@ -255,7 +256,7 @@ def apply(self, caps):

return await self._manage_generic(request, SetRequest)

async def route_manage_capabilities_list(self, request):
async def route_manage_capabilities_list_user(self, request):
user = await self.get_email(request)

@dataclass
Expand All @@ -269,6 +270,20 @@ class ListRequest:

return self._manage_cap_response(req.email)

async def route_manage_capabilities_list(self, request: Request):
user = await self.get_email(request)
self.ensure_user_manager(user)

users_capabilities = {}
for email in self.capabilities.db.value.keys():
users_capabilities[email] = self._get_user_capabilities(email)

graph = self.capabilities.graph.copy()
if self.capabilities.auto_admin:
graph.setdefault("admin", list(graph.keys()))

return JSONResponse({"status": "ok", "users": users_capabilities, "graph": graph})

##################
# Install to app #
##################
Expand Down Expand Up @@ -313,5 +328,10 @@ def install(self, app):
)

app.add_route(
f"{self.prefix}/manage_capabilities/list", self.route_manage_capabilities_list
f"{self.prefix}/manage_capabilities/list_user",
self.route_manage_capabilities_list_user,
)
app.add_route(
f"{self.prefix}/manage_capabilities/list",
self.route_manage_capabilities_list,
)
42 changes: 40 additions & 2 deletions tests/test_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,44 @@ def test_capability_admin(app, query):
assert response.text == f"{u.email} is god"


@queries(
D(user="boss@corleone.com", caps={"mafia"}, status=403),
D(user="admin@admin.admin", caps={"admin"}),
)
def test_manage_list(app, query):
u = app.client(query.user)
email = query.email or query.user
response = u.get("/manage_capabilities/list", email=email, expect=query.status)
if query.status is None:
res = response.json()
assert res["status"] == "ok"
assert deserialize(dict[str, set], res["users"]) == {
"hubert.bonjour@courrier-chaud.fr": {"villager"},
"boss@corleone.com": {"mafia"},
"paul.baguette@corleone.com": {"mafia", "baker"},
"wiggum@springfield.us": {"police"},
"admin@admin.admin": {"admin"},
}
assert deserialize(dict[str, set], res["graph"]) == {
"user_management": set(),
"traveller": set(),
"villager": set(),
"mafia": {"villager"},
"police": {"villager"},
"mayor": {"villager", "police"},
"baker": {"villager"},
"admin": {
"user_management",
"traveller",
"villager",
"mafia",
"police",
"mayor",
"baker",
},
}


@queries(
# Trying to view own capabilities
D(user="boss@corleone.com", caps={"mafia"}),
Expand All @@ -145,10 +183,10 @@ def test_capability_admin(app, query):
D(user="boss@corleone.com", email="hubert.bonjour@courrier-chaud.fr", status=403),
D(user="admin@admin.admin", email="hubert.bonjour@courrier-chaud.fr", caps={"villager"}),
)
def test_manage_list(app, query):
def test_manage_list_user(app, query):
u = app.client(query.user)
email = query.email or query.user
response = u.get("/manage_capabilities/list", email=email, expect=query.status)
response = u.get("/manage_capabilities/list_user", email=email, expect=query.status)
if query.status is None:
assert response.json()["email"] == email
assert set(response.json()["capabilities"]) == query.caps
Expand Down