# Copyright (C) 2018 Lars Wirzenius
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
import os
import urllib.parse
import bottle
import qvisqve
import qvisqve_secrets
class ManagementRouter(qvisqve.Router):
def __init__(self, storedir, baseurl):
super().__init__()
rs = qvisqve.FileStore(storedir)
self._clients = qvisqve.ClientManager(rs)
self._users = qvisqve.UserManager(rs)
self._apps = qvisqve.ApplicationManager(rs)
self._baseurl = baseurl
def get_routes(self):
clients = ManagementEndpoint(self._baseurl, '/clients', self._clients)
users = ManagementEndpoint(self._baseurl, '/users', self._users)
apps = ManagementEndpoint(self._baseurl, '/applications', self._apps)
return clients.get_routes() + users.get_routes() + apps.get_routes()
class ManagementEndpoint:
def __init__(self, baseurl, path, entities):
self._baseurl = baseurl
self._path = path
self._entities = entities
def get_routes(self):
return [
{
'method': 'POST',
'path': self._path,
'callback': self._create,
},
{
'method': 'GET',
'path': self._path,
'callback': self._list,
},
{
'method': 'GET',
'path': '{}/'.format(self._path),
'callback': self._show,
},
{
'method': 'PUT',
'path': '{}/'.format(self._path),
'callback': self._update,
},
{
'method': 'PUT',
'path': '{}//secret'.format(self._path),
'callback': self._set_secret,
},
{
'method': 'DELETE',
'path': '{}/'.format(self._path),
'callback': self._delete,
},
]
def _create(self, content_type, body, **kwargs):
qvisqve.log.log('info', msg_text='Creating', path=self._path)
entity_id = body.get('id')
if not entity_id:
return qvisqve.bad_request_response(
'No {}'.format(self._entity_id_name))
self._entities.create(entity_id, body)
entity = self._entities.get(entity_id)
location = '{}{}/{}'.format(self._baseurl, self._path, entity_id)
return qvisqve.created_response(entity, location)
def _update(self, content_type, body, **kwargs):
qvisqve.log.log('info', msg_text='Updating', path=self._path)
entity_id = kwargs['id']
try:
entity = self._entities.get(entity_id)
except qvisqve.ResourceDoesNotExist as e:
return qvisqve.not_found_response()
self._entities.create(entity_id, body)
entity = self._entities.get(entity_id)
return qvisqve.ok_response(entity)
def _list(self, content_type, body, **kwargs):
qvisqve.log.log('info', msg_text='Listing', path=self._path)
entity_ids = list(self._entities.list())
return qvisqve.ok_response({"resources": entity_ids})
def _show(self, content_type, body, **kwargs):
qvisqve.log.log('info', msg_text='Showing client')
entity_id = kwargs['id']
try:
entity = self._entities.get(entity_id)
except qvisqve.ResourceDoesNotExist as e:
return qvisqve.not_found_response()
qvisqve.log.log('info', msg_text='Showing', entity=entity)
return qvisqve.ok_response(entity)
def _set_secret(self, content_type, body, **kwargs):
qvisqve.log.log('info', msg_text='Setting client secret')
entity_id = kwargs['id']
try:
entity = self._entities.get(entity_id)
except qvisqve.ResourceDoesNotExist as e:
return qvisqve.not_found_response()
secret = body.get('secret')
if not secret:
return qvisqve.bad_request_response('No secret')
self._entities.set_secret(entity_id, secret)
return qvisqve.ok_response(entity)
def _delete(self, content_type, body, **kwargs):
qvisqve.log.log('info', msg_text='Deleting', path=self._path)
entity_id = kwargs['id']
self._entities.delete(entity_id)
return qvisqve.ok_response('')