Implementation of api key pages.

Revoke page will show the correct key name
Show api keys shows a well formatted expiry date
Fix tests for api key endpoints.
This commit is contained in:
Rebecca Law
2016-01-21 12:28:05 +00:00
parent 41c775cd68
commit 90fca93308
8 changed files with 127 additions and 42 deletions

View File

@@ -1,6 +1,7 @@
import os
import re
import dateutil
from flask import Flask, session, Markup, escape, render_template
from flask._compat import string_types
from flask.ext.sqlalchemy import SQLAlchemy
@@ -54,6 +55,7 @@ def create_app(config_name, config_overrides=None):
application.add_template_filter(placeholders)
application.add_template_filter(replace_placeholders)
application.add_template_filter(nl2br)
application.add_template_filter(format_datetime)
application.after_request(useful_headers_after_request)
register_errorhandlers(application)
@@ -134,6 +136,12 @@ def replace_placeholders(template, values):
))
def format_datetime(date):
date = dateutil.parser.parse(date)
native = date.replace(tzinfo=None)
return native.strftime('%A %d %B %Y at %H:%M')
# https://www.owasp.org/index.php/List_of_useful_HTTP_headers
def useful_headers_after_request(response):
response.headers.add('X-Frame-Options', 'deny')

View File

@@ -36,18 +36,17 @@ def create_api_key(service_id):
)
@main.route("/services/<int:service_id>/api-keys/show")
@login_required
def show_api_key(service_id):
return render_template('views/api-keys/show.html', service_id=service_id)
@main.route("/services/<int:service_id>/api-keys/revoke/<int:key_id>", methods=['GET', 'POST'])
@login_required
def revoke_api_key(service_id, key_id):
key_name = api_key_api_client.get_api_keys(service_id=service_id, key_id=key_id)['apiKeys'][0]['name']
if request.method == 'GET':
return render_template('views/api-keys/revoke.html', service_id=service_id)
return render_template(
'views/api-keys/revoke.html',
service_id=service_id,
key_name=key_name
)
elif request.method == 'POST':
api_key_api_client.revoke_api_key(service_id=service_id, key_id=key_id)
flash('Test key 1 was revoked')
flash('{} was revoked'.format(key_name))
return redirect(url_for('.api_keys', service_id=service_id))

View File

@@ -12,8 +12,11 @@ class ApiKeyApiClient(BaseAPIClient):
self.client_id = app.config['ADMIN_CLIENT_USER_NAME']
self.secret = app.config['ADMIN_CLIENT_SECRET']
def get_api_keys(self, service_id, *params):
return self.get(url='/service/{}/api-keys'.format(service_id))
def get_api_keys(self, service_id, key_id=None, *params):
if key_id:
return self.get(url='/service/{}/api-keys/{}'.format(service_id, key_id))
else:
return self.get(url='/service/{}/api-keys'.format(service_id))
def create_api_key(self, service_id, key_name, *params):
data = {"name": key_name}
@@ -21,4 +24,4 @@ class ApiKeyApiClient(BaseAPIClient):
return key['data']
def revoke_api_key(self, service_id, key_id, *params):
return self.post(url='/service/{0}/api-key/revoke/{1}'.format(service_id, key_id), data=None)
return self.post(url='/service/{0}/api-key/revoke/{1}'.format(service_id, key_id), data=None)

View File

@@ -42,7 +42,7 @@
{% endcall %}
{% if item.expiry_date %}
{% call field(align='right', status='default') %}
Revoked {{ item.expiry_date }}
Revoked {{ item.expiry_date|format_datetime }}
{% endcall %}
{% else %}
{% call field(align='right', status='error') %}

View File

@@ -16,7 +16,7 @@
</h1>
<p>
Test key 1 will no longer let you connect to GOV.UK Notify.
{{ key_name }} will no longer let you connect to GOV.UK Notify.
</p>
<p>
You cant undo this.