diff --git a/nimsapi.py b/nimsapi.py index 1074f79e11d028d6060426ea1b0f3265e8a6e585..ae52f73e162aed2f82bac25ada230bd043a28753 100755 --- a/nimsapi.py +++ b/nimsapi.py @@ -51,7 +51,8 @@ class NIMSAPI(nimsapiutil.NIMSRequestHandler): Resource | Description :---------------------------------------------------|:----------------------- nimsapi/login | user login - [(nimsapi/remotes)] | list of remote instances + [(nimsapi/sites)] | local and remote sites + [(nimsapi/roles)] | user roles nimsapi/upload | upload nimsapi/download | download [(nimsapi/log)] | log messages @@ -119,11 +120,17 @@ class NIMSAPI(nimsapiutil.NIMSRequestHandler): log.debug(self.uid + ' has logged in') return self.app.db.users.find_and_modify({'_id': self.uid}, {'$inc': {'logins': 1}}, fields=['firstname', 'lastname', 'superuser']) - def remotes(self): - """Return the list of all remote sites.""" + def sites(self): + """Return local and remote sites.""" if self.request.method == 'OPTIONS': return self.options() - return [r['_id'] for r in self.app.db.remotes.find()] + return dict(local={'_id': app.config['site_id'], 'name': app.config['site_name']}, remotes=list(self.app.db.remotes.find(None, ['name']))) + + def roles(self): + """Return the list of user roles.""" + if self.request.method == 'OPTIONS': + return self.options() + return nimsapiutil.ROLES def upload(self): if self.request.method == 'OPTIONS': @@ -182,7 +189,8 @@ routes = [ webapp2.Route(r'/nimsapi', NIMSAPI), webapp2_extras.routes.PathPrefixRoute(r'/nimsapi', [ webapp2.Route(r'/login', NIMSAPI, handler_method='login', methods=['OPTIONS', 'GET', 'POST']), - webapp2.Route(r'/remotes', NIMSAPI, handler_method='remotes', methods=['OPTIONS', 'GET']), + webapp2.Route(r'/sites', NIMSAPI, handler_method='sites', methods=['OPTIONS', 'GET']), + webapp2.Route(r'/roles', NIMSAPI, handler_method='roles', methods=['OPTIONS', 'GET']), webapp2.Route(r'/upload', NIMSAPI, handler_method='upload', methods=['OPTIONS', 'PUT']), webapp2.Route(r'/download', NIMSAPI, handler_method='download', methods=['OPTIONS', 'GET']), webapp2.Route(r'/log', NIMSAPI, handler_method='log', methods=['OPTIONS', 'GET']), diff --git a/nimsapiutil.py b/nimsapiutil.py index 5cb852559f4209f5b72b98b5ae7fdeb06475c8cd..b851121325bfd6d5f4057b22fec5c1fa1c11ba1b 100644 --- a/nimsapiutil.py +++ b/nimsapiutil.py @@ -14,12 +14,32 @@ import Crypto.Hash.SHA import Crypto.PublicKey.RSA import Crypto.Signature.PKCS1_v1_5 -INTEGER_ROLES = { - 'anon-read': 0, - 'read-only': 1, - 'read-write': 2, - 'admin': 3, - } +ROLES = [ + { + 'rid': 'anon-read', + 'name': 'Anonymized', + 'sort': 0, + 'public': True, + }, + { + 'rid': 'read-only', + 'name': 'Read-Only', + 'sort': 1, + 'public': True, + }, + { + 'rid': 'read-write', + 'name': 'Read-Write', + 'sort': 2, + }, + { + 'rid': 'admin', + 'name': 'Admin', + 'sort': 3, + }, + ] + +INTEGER_ROLES = {r['rid']: r['sort'] for r in ROLES} class NIMSRequestHandler(webapp2.RequestHandler): @@ -181,6 +201,11 @@ class NIMSRequestHandler(webapp2.RequestHandler): self.abort(403, self.uid + ' does not have at least ' + min_role + ' permissions on this Collection') if coll['permissions'][0]['role'] != 'admin': # if not admin, mask permissions of other users collection['permissions'] = coll['permissions'] + for i, perm in enumerate(collection['permissions']): + if perm['uid'] == '@public': + collection['public'] = perm['role'] + collection['permissions'].pop(i) + break return collection def get_experiment(self, xid, min_role=None): @@ -195,6 +220,11 @@ class NIMSRequestHandler(webapp2.RequestHandler): self.abort(403, self.uid + ' does not have at least ' + min_role + ' permissions on this Experiment') if exp['permissions'][0]['role'] != 'admin': # if not admin, mask permissions of other users experiment['permissions'] = exp['permissions'] + for i, perm in enumerate(experiment['permissions']): + if perm['uid'] == '@public': + experiment['public'] = perm['role'] + experiment['permissions'].pop(i) + break return experiment def get_session(self, sid, min_role=None): diff --git a/users.py b/users.py index 932bb0ba6620079b92c2ab6f46f81d0dad65f443..a1643a306f2e88dcfd419567636662cd7d03a856 100644 --- a/users.py +++ b/users.py @@ -178,7 +178,7 @@ class Groups(nimsapiutil.NIMSRequestHandler): def get(self): """Return the list of Groups.""" - return list(self.app.db.groups.find({}, [])) + return list(self.app.db.groups.find(None, ['name'])) def put(self): """Update many Groups."""