No more reinitialization of roles on each startup

This commit is contained in:
0mar
2021-03-30 08:50:20 +02:00
parent 1515747b1e
commit db66443793
3 changed files with 17 additions and 14 deletions

View File

@@ -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',
) )

View File

@@ -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
for bearer in role_bearers: admin_role = orm.Role.find(db, name='admin')
Class = orm.get_class(bearer) if not admin_role.users:
for obj in db.query(Class): app_log.info(
if len(obj.roles) < 1: "No admin users found; assuming hub upgrade. Initializing default roles for all entities"
)
for bearer in role_bearers:
Class = orm.get_class(bearer)
for obj in db.query(Class):
# 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()

View File

@@ -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(