diff --git a/internimsclient.py b/internimsclient.py index 2503b0678cf288d54dca31b92deb2f00878d6c1d..b3424ba96de5981817b43cffe822e0aaa036e578 100644 --- a/internimsclient.py +++ b/internimsclient.py @@ -44,10 +44,10 @@ def update(db, api_uri, site_id, privkey, internims_url): new_remotes = response['users'] log.debug('users w/ remotes: ' + str(new_remotes)) for user in response['users']: - db.users.update({'oa2_id': user}, {'$set': {'remotes': new_remotes.get(user, [])}}) + db.users.update({'user_id': user}, {'$set': {'remotes': new_remotes.get(user, [])}}) # cannot use new_remotes.viewkeys(). leads to 'bson.errors.InvalidDocument: Cannot encode object: dict_keys([])' - db.users.update({'remotes': {'$exists':True}, 'oa2_id': {'$nin': new_remotes.keys()}}, {'$unset': {'remotes': ''}}, multi=True) + db.users.update({'remotes': {'$exists':True}, 'user_id': {'$nin': new_remotes.keys()}}, {'$unset': {'remotes': ''}}, multi=True) else: log.warning((r.status_code, r.reason)) diff --git a/nimsapi.py b/nimsapi.py index 8399add3405a6d8f7408609250c562c9ff3293ac..a7298c6ade4be88baba57bc661f83dadf382e8ef 100755 --- a/nimsapi.py +++ b/nimsapi.py @@ -43,7 +43,7 @@ class NIMSAPI(nimsapiutil.NIMSRequestHandler): nimsapi/remotes | list of remote instances [(nimsapi/log)] | list of uwsgi log messages [(nimsapi/users)] | list of users - (nimsapi/users/current) | details for currently logged in user + nimsapi/users/current | details for currently logged in user [(nimsapi/users/count)] | count of users [(nimsapi/users/listschema)] | schema for user list [(nimsapi/users/schema)] | schema for single user @@ -132,7 +132,7 @@ class NIMSAPI(nimsapiutil.NIMSRequestHandler): def remotes(self): """Return the list of remotes where user has membership""" remotes = [remote['_id'] for remote in list(self.app.db.remotes.find({}, []))] - self.response.write(json.dumps(remotes)) + self.response.write(json.dumps(remotes, default=bson.json_util.default)) def log(self): """Return logs""" @@ -212,7 +212,8 @@ class Users(nimsapiutil.NIMSRequestHandler): def current(self): """Return the current User.""" - self.response.write(json.dumps(self.user)) + # FIXME: trim this down to not use the self.user object, and only send relevant info + self.response.write(json.dumps(self.user, default=bson.json_util.default)) def post(self): """Create a new User""" @@ -272,12 +273,12 @@ class User(nimsapiutil.NIMSRequestHandler): def get(self, uid): """Return User details.""" - user = self.app.db.users.find_one({'oa2_id': uid}) + user = self.app.db.users.find_one({'user_info': uid}) self.response.write(json.dumps(user, default=bson.json_util.default)) def put(self, uid): """Update an existing User.""" - user = self.app.db.users.find_one({'oa2_id': uid}) + user = self.app.db.users.find_one({'user_info': uid}) if not user: self.abort(404) if uid == self.userid or self.user_is_superuser: # users can only update their own info @@ -292,7 +293,7 @@ class User(nimsapiutil.NIMSRequestHandler): updates['$set'][k] = False # superuser is tri-state: False indicates granted, but disabled, superuser privileges elif v.lower() not in ('1', 'true'): updates['$unset'][k] = '' - self.app.db.users.update({'oa2_id': uid}, updates) + self.app.db.users.update({'user_info': uid}, updates) else: self.abort(403) @@ -463,6 +464,7 @@ if __name__ == '__main__': arg_parser.add_argument('--stage_path', help='path to staging area') arg_parser.add_argument('--ssl_key', help='path to private SSL key file') arg_parser.add_argument('--site_id', help='InterNIMS site ID') + arg_parser.add_argument('--oauth2_id_endpoint', help='OAuth2 provider ID endpoint') args = arg_parser.parse_args() config = ConfigParser.ConfigParser({'here': os.path.dirname(os.path.abspath(args.config_file))}) @@ -483,7 +485,8 @@ if __name__ == '__main__': app.config['site_id'] = args.site_id or 'local' app.config['stage_path'] = args.stage_path or config.get('nims', 'stage_path') - + app.config['oauth2_id_endpoint'] = args.oauth2_id_endpoint or config.get('oauth2', 'id_endpoint') + log.debug(app.config['oauth2_id_endpoint']) db_uri = args.db_uri or config.get('nims', 'db_uri') app.db = (pymongo.MongoReplicaSetClient(db_uri) if 'replicaSet' in db_uri else pymongo.MongoClient(db_uri)).get_default_database() diff --git a/nimsapi.wsgi b/nimsapi.wsgi index 6915565d9d991ba29da9f61c2ded9d5f7f398cbd..8322407110c412eddcb047f2b1efc584c078352b 100644 --- a/nimsapi.wsgi +++ b/nimsapi.wsgi @@ -50,6 +50,7 @@ application = nimsapi.app application.config['stage_path'] = config.get('nims', 'stage_path') application.config['site_id'] = site_id application.config['ssl_key'] = privkey +application.config['oauth2_id_endpoint'] = config.get('oauth2', 'id_endpoint') # connect to db db_uri = config.get('nims', 'db_uri') diff --git a/nimsapiutil.py b/nimsapiutil.py index 4e1ec8acec7470635bcb4b6ea62370e2c041c9a7..ce5a64e10d55af22cbc5753420e679c6e2d0af5c 100644 --- a/nimsapiutil.py +++ b/nimsapiutil.py @@ -55,27 +55,29 @@ class NIMSRequestHandler(webapp2.RequestHandler): log.debug('accesstoken: ' + str(self.access_token)) self.userid = '@public' # @public is default user + # self.user_is_superuser = None # check for user as url encoded param if self.request.remote_user: self.userid = self.request.remote_user # handle access token - if self.access_token: + if self.access_token and self.app.config['oauth2_id_endpoint']: r = requests.request(method='GET', - url='https://www.googleapis.com/plus/v1/people/me/openIdConnect', - params={'access_token': self.access_token}) + url = self.app.config['oauth2_id_endpoint'], + headers={'Authorization': 'Bearer ' + self.access_token}) if r.status_code == 200: # TODO: reduce to minimum needed to match user_profile = json.loads(r.content) - # FIXME: lookup should be on oauth_id - self.user = self.app.db.users.find_one({'firstname': user_profile['given_name'], 'lastname': user_profile['family_name']}) - self.userid = self.user['_id'] + # FIXME: lookup should be on user_id + self.user = self.app.db.users.find_one({'user_id': user_profile['email']}) + # self.user_is_superuser = self.user.get('superuser', None) + self.userid = self.user['user_id'] log.debug('oauth user: ' + user_profile['email']) else: #TODO: add handlers for bad tokens. log.debug('ERR: ' + str(r.status_code) + ' bad token') - self.user = self.app.db.users.find_one({'oa2_id': self.userid}) - self.user_is_superuser = self.user.get('superuser', None) - log.debug(self.user) + # self.user = self.app.db.users.find_one({'user_info': self.user_info}) + self.user = self.app.db.users.find_one({'user_id': self.userid}) + self.user_is_superuser = self.user.get('superuser', None) if self.user else False # p2p request self.target_id = self.request.get('iid', None) @@ -143,6 +145,10 @@ class NIMSRequestHandler(webapp2.RequestHandler): except KeyError as e: pass # not all requests will have access_token + # build up a description of request to sign + # msg = self.request.method + self.request.path + str(self.request.params) + str(self.request.headers) + self.request.body + # log.debug(msg) + # create a signature of the incoming request payload h = Crypto.Hash.SHA.new(reqpayload) signature = Crypto.Signature.PKCS1_v1_5.new(self.ssl_key).sign(h) @@ -153,7 +159,7 @@ class NIMSRequestHandler(webapp2.RequestHandler): r = requests.request(method=self.request.method, data=reqpayload, url=target_api, params=reqparams, headers=reqheaders, verify=False) # return response content - # TODO: headers + # TODO: think about: are the headers even useful? self.response.write(r.content) elif self.ssl_key is None or self.site_id is None: