mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-13 13:03:01 +00:00
No more reinitialization of roles on each startup
This commit is contained in:
@@ -15,7 +15,6 @@ from tornado.iostream import StreamClosedError
|
|||||||
|
|
||||||
from .. import orm
|
from .. import orm
|
||||||
from ..roles import assign_default_roles
|
from ..roles import assign_default_roles
|
||||||
from ..roles import update_roles
|
|
||||||
from ..scopes import needs_scope
|
from ..scopes import needs_scope
|
||||||
from ..user import User
|
from ..user import User
|
||||||
from ..utils import isoformat
|
from ..utils import isoformat
|
||||||
@@ -57,7 +56,7 @@ class UserListAPIHandler(APIHandler):
|
|||||||
@needs_scope(
|
@needs_scope(
|
||||||
'read:users',
|
'read:users',
|
||||||
'read:users:name',
|
'read:users:name',
|
||||||
'reda:users:servers',
|
'read:users:servers',
|
||||||
'read:users:groups',
|
'read:users:groups',
|
||||||
'read:users:activity',
|
'read:users:activity',
|
||||||
)
|
)
|
||||||
|
@@ -1884,11 +1884,16 @@ class JupyterHub(Application):
|
|||||||
db, entity=orm_obj, rolename=predef_role['name']
|
db, entity=orm_obj, rolename=predef_role['name']
|
||||||
)
|
)
|
||||||
|
|
||||||
# make sure all users, services and tokens have at least one role (update with default)
|
# make sure that on no admin situation, all roles are reset
|
||||||
|
admin_role = orm.Role.find(db, name='admin')
|
||||||
|
if not admin_role.users:
|
||||||
|
app_log.info(
|
||||||
|
"No admin users found; assuming hub upgrade. Initializing default roles for all entities"
|
||||||
|
)
|
||||||
for bearer in role_bearers:
|
for bearer in role_bearers:
|
||||||
Class = orm.get_class(bearer)
|
Class = orm.get_class(bearer)
|
||||||
for obj in db.query(Class):
|
for obj in db.query(Class):
|
||||||
if len(obj.roles) < 1:
|
# if len(obj.roles) < 1: # todo: Should I check if some roles are already assigned?
|
||||||
roles.assign_default_roles(db, entity=obj)
|
roles.assign_default_roles(db, entity=obj)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
@@ -1994,6 +1999,8 @@ class JupyterHub(Application):
|
|||||||
if orm_service is None:
|
if orm_service is None:
|
||||||
# not found, create a new one
|
# not found, create a new one
|
||||||
orm_service = orm.Service(name=name)
|
orm_service = orm.Service(name=name)
|
||||||
|
if spec.get('admin', False):
|
||||||
|
roles.update_roles(self.db, entity=orm_service, roles=['admin'])
|
||||||
self.db.add(orm_service)
|
self.db.add(orm_service)
|
||||||
orm_service.admin = spec.get('admin', False)
|
orm_service.admin = spec.get('admin', False)
|
||||||
self.db.commit()
|
self.db.commit()
|
||||||
|
@@ -230,7 +230,7 @@ def _switch_default_role(db, obj, admin):
|
|||||||
|
|
||||||
def assign_default_roles(db, entity):
|
def assign_default_roles(db, entity):
|
||||||
"""Assigns the default roles to an entity:
|
"""Assigns the default roles to an entity:
|
||||||
users and services get 'user' role, unless they have admin flag
|
users and services get 'user' role, or admin role if they have admin flag
|
||||||
Tokens get 'token' role"""
|
Tokens get 'token' role"""
|
||||||
default_token_role = orm.Role.find(db, 'token')
|
default_token_role = orm.Role.find(db, 'token')
|
||||||
# tokens can have only 'token' role as default
|
# tokens can have only 'token' role as default
|
||||||
@@ -246,13 +246,10 @@ def assign_default_roles(db, entity):
|
|||||||
|
|
||||||
|
|
||||||
def update_roles(db, entity, roles):
|
def update_roles(db, entity, roles):
|
||||||
"""Updates object's roles if specified,
|
"""Updates object's roles"""
|
||||||
assigns default if no roles specified"""
|
|
||||||
Class = type(entity)
|
|
||||||
standard_permissions = {'all', 'read:all'}
|
standard_permissions = {'all', 'read:all'}
|
||||||
for rolename in roles:
|
for rolename in roles:
|
||||||
if Class == orm.APIToken:
|
if isinstance(entity, orm.APIToken):
|
||||||
|
|
||||||
role = orm.Role.find(db, rolename)
|
role = orm.Role.find(db, rolename)
|
||||||
if role:
|
if role:
|
||||||
# compare the requested role permissions with the owner's permissions (scopes)
|
# compare the requested role permissions with the owner's permissions (scopes)
|
||||||
@@ -266,7 +263,7 @@ def update_roles(db, entity, roles):
|
|||||||
owner = db.query(orm.Service).get(entity.service_id)
|
owner = db.query(orm.Service).get(entity.service_id)
|
||||||
if owner:
|
if owner:
|
||||||
owner_scopes = expand_roles_to_scopes(owner)
|
owner_scopes = expand_roles_to_scopes(owner)
|
||||||
if (extra_scopes).issubset(owner_scopes):
|
if extra_scopes.issubset(owner_scopes):
|
||||||
role.tokens.append(entity)
|
role.tokens.append(entity)
|
||||||
else:
|
else:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
|
Reference in New Issue
Block a user