Skip to content
Snippets Groups Projects
Commit 554734f6 authored by Megan Henning's avatar Megan Henning
Browse files

Add api key generation endpoint

parent 7aa46db6
No related branches found
No related tags found
No related merge requests found
...@@ -198,6 +198,7 @@ routes = [ ...@@ -198,6 +198,7 @@ routes = [
webapp2_extras.routes.PathPrefixRoute(r'/api/users', [ webapp2_extras.routes.PathPrefixRoute(r'/api/users', [
webapp2.Route(r'/self', userhandler.UserHandler, handler_method='self', methods=['GET']), webapp2.Route(r'/self', userhandler.UserHandler, handler_method='self', methods=['GET']),
webapp2.Route(r'/self/avatar', userhandler.UserHandler, handler_method='self_avatar', methods=['GET']), webapp2.Route(r'/self/avatar', userhandler.UserHandler, handler_method='self_avatar', methods=['GET']),
webapp2.Route(r'/self/key', userhandler.UserHandler, handler_method='generate_api_key',methods=['POST']),
webapp2.Route(_format(r'/<_id:{user_id_re}>'), userhandler.UserHandler, name='user'), webapp2.Route(_format(r'/<_id:{user_id_re}>'), userhandler.UserHandler, name='user'),
webapp2.Route(_format(r'/<uid:{user_id_re}>/groups'), grouphandler.GroupHandler, handler_method='get_all', methods=['GET'], name='groups'), webapp2.Route(_format(r'/<uid:{user_id_re}>/groups'), grouphandler.GroupHandler, handler_method='get_all', methods=['GET'], name='groups'),
webapp2.Route(_format(r'/<uid:{user_id_re}>/avatar'), userhandler.UserHandler, handler_method='avatar', methods=['GET'], name='avatar'), webapp2.Route(_format(r'/<uid:{user_id_re}>/avatar'), userhandler.UserHandler, handler_method='avatar', methods=['GET'], name='avatar'),
......
import base64
import datetime import datetime
import pymongo import pymongo
import uuid
from .. import base from .. import base
from .. import util from .. import util
...@@ -21,12 +23,7 @@ class UserHandler(base.RequestHandler): ...@@ -21,12 +23,7 @@ class UserHandler(base.RequestHandler):
self._init_storage() self._init_storage()
user = self._get_user(_id) user = self._get_user(_id)
permchecker = userauth.default(self, user) permchecker = userauth.default(self, user)
projection = [] result = permchecker(self.storage.exec_op)('GET', _id, projection={'api_key': 0} or None)
if self.is_true('remotes'):
projection += ['remotes']
if self.is_true('status'):
projection += ['status']
result = permchecker(self.storage.exec_op)('GET', _id, projection=projection or None)
if result is None: if result is None:
self.abort(404, 'User does not exist') self.abort(404, 'User does not exist')
return result return result
...@@ -44,7 +41,7 @@ class UserHandler(base.RequestHandler): ...@@ -44,7 +41,7 @@ class UserHandler(base.RequestHandler):
def get_all(self): def get_all(self):
self._init_storage() self._init_storage()
permchecker = userauth.list_permission_checker(self) permchecker = userauth.list_permission_checker(self)
result = permchecker(self.storage.exec_op)('GET', projection={'preferences': False}) result = permchecker(self.storage.exec_op)('GET', projection={'preferences': 0, 'api_key': 0})
if result is None: if result is None:
self.abort(404, 'Not found') self.abort(404, 'Not found')
return result return result
...@@ -227,6 +224,20 @@ class UserHandler(base.RequestHandler): ...@@ -227,6 +224,20 @@ class UserHandler(base.RequestHandler):
else: else:
self.abort(404, 'no avatar') self.abort(404, 'no avatar')
def generate_api_key(self):
self._init_storage()
if not self.uid:
self.abort(400, 'no user is logged in')
generated_key = base64.urlsafe_b64encode(str(uuid.uuid4()))
now = datetime.datetime.utcnow()
# Fix last used to unset somehow with containerstorage in the way
payload = {'api_key': {'key': generated_key, 'created': now, 'last_used': None}}
result = self.storage.exec_op('PUT', _id=self.uid, payload=payload)
if result.modified_count == 1:
return {'key': generated_key}
else:
self.abort(404, 'New key for user {} not generated'.format(_id))
def _get_user(self, _id): def _get_user(self, _id):
user = self.storage.get_container(_id) user = self.storage.get_container(_id)
if user is not None: if user is not None:
......
...@@ -31,7 +31,17 @@ ...@@ -31,7 +31,17 @@
"preferences": { "preferences": {
"title": "Preferences", "title": "Preferences",
"type": "object" "type": "object"
} },
"api_keys": {
"type": "object",
"properties": {
"key": {"type": "string"},
"created": {},
"last_used": {}
},
"additionalProperties": false
}
}, },
"additionalProperties": false, "additionalProperties": false,
"required":["_id", "firstname", "lastname", "created", "modified", "root"] "required":["_id", "firstname", "lastname", "created", "modified", "root"]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment