mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-10 03:23:04 +00:00
Merge pull request #4691 from meeseeksmachine/auto-backport-of-pr-4570-on-4.x
Backport PR #4570 on branch 4.x (fix mutation of frozenset in scope intersection)
This commit is contained in:
@@ -254,8 +254,12 @@ def _intersect_expanded_scopes(scopes_a, scopes_b, db=None):
|
|||||||
}
|
}
|
||||||
|
|
||||||
# resolve hierarchies (group/user/server) in both directions
|
# resolve hierarchies (group/user/server) in both directions
|
||||||
common_servers = common_filters[base].get("server", set())
|
common_servers = initial_common_servers = common_filters[base].get(
|
||||||
common_users = common_filters[base].get("user", set())
|
"server", frozenset()
|
||||||
|
)
|
||||||
|
common_users = initial_common_users = common_filters[base].get(
|
||||||
|
"user", frozenset()
|
||||||
|
)
|
||||||
|
|
||||||
for a, b in [(filters_a, filters_b), (filters_b, filters_a)]:
|
for a, b in [(filters_a, filters_b), (filters_b, filters_a)]:
|
||||||
if 'server' in a and b.get('server') != a['server']:
|
if 'server' in a and b.get('server') != a['server']:
|
||||||
@@ -267,7 +271,7 @@ def _intersect_expanded_scopes(scopes_a, scopes_b, db=None):
|
|||||||
for server in servers:
|
for server in servers:
|
||||||
username, _, servername = server.partition("/")
|
username, _, servername = server.partition("/")
|
||||||
if username in b['user']:
|
if username in b['user']:
|
||||||
common_servers.add(server)
|
common_servers = common_servers | {server}
|
||||||
|
|
||||||
# resolve group/server hierarchy if db available
|
# resolve group/server hierarchy if db available
|
||||||
servers = servers.difference(common_servers)
|
servers = servers.difference(common_servers)
|
||||||
@@ -276,7 +280,7 @@ def _intersect_expanded_scopes(scopes_a, scopes_b, db=None):
|
|||||||
for server in servers:
|
for server in servers:
|
||||||
server_groups = groups_for_server(server)
|
server_groups = groups_for_server(server)
|
||||||
if server_groups & b['group']:
|
if server_groups & b['group']:
|
||||||
common_servers.add(server)
|
common_servers = common_servers | {server}
|
||||||
|
|
||||||
# resolve group/user hierarchy if db available and user sets aren't identical
|
# resolve group/user hierarchy if db available and user sets aren't identical
|
||||||
if (
|
if (
|
||||||
@@ -290,14 +294,16 @@ def _intersect_expanded_scopes(scopes_a, scopes_b, db=None):
|
|||||||
for username in users:
|
for username in users:
|
||||||
groups = groups_for_user(username)
|
groups = groups_for_user(username)
|
||||||
if groups & b["group"]:
|
if groups & b["group"]:
|
||||||
common_users.add(username)
|
common_users = common_users | {username}
|
||||||
|
|
||||||
# add server filter if there wasn't one before
|
# add server filter if it's non-empty
|
||||||
if common_servers and "server" not in common_filters[base]:
|
# and it changed
|
||||||
|
if common_servers and common_servers != initial_common_servers:
|
||||||
common_filters[base]["server"] = common_servers
|
common_filters[base]["server"] = common_servers
|
||||||
|
|
||||||
# add user filter if it's non-empty and there wasn't one before
|
# add user filter if it's non-empty
|
||||||
if common_users and "user" not in common_filters[base]:
|
# and it changed
|
||||||
|
if common_users and common_users != initial_common_users:
|
||||||
common_filters[base]["user"] = common_users
|
common_filters[base]["user"] = common_users
|
||||||
|
|
||||||
intersection = unparse_scopes(common_filters)
|
intersection = unparse_scopes(common_filters)
|
||||||
|
@@ -913,6 +913,22 @@ def test_intersect_expanded_scopes(left, right, expected, should_warn, recwarn):
|
|||||||
["read:users!user=uy"],
|
["read:users!user=uy"],
|
||||||
{"gx": ["ux"], "gy": ["uy"]},
|
{"gx": ["ux"], "gy": ["uy"]},
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
# make sure the group > user > server hierarchy
|
||||||
|
# is managed
|
||||||
|
["read:servers!server=ux/server", "read:servers!group=gy"],
|
||||||
|
["read:servers!server=uy/server", "read:servers!user=ux"],
|
||||||
|
["read:servers!server=ux/server", "read:servers!server=uy/server"],
|
||||||
|
{"gx": ["ux"], "gy": ["uy"]},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
# make sure the group > user hierarchy
|
||||||
|
# is managed
|
||||||
|
["read:servers!user=ux", "read:servers!group=gy"],
|
||||||
|
["read:servers!user=uy", "read:servers!group=gx"],
|
||||||
|
["read:servers!user=ux", "read:servers!user=uy"],
|
||||||
|
{"gx": ["ux"], "gy": ["uy"]},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_intersect_groups(request, db, left, right, expected, groups):
|
def test_intersect_groups(request, db, left, right, expected, groups):
|
||||||
|
Reference in New Issue
Block a user