2016-11-01 15:34:04 +00:00
|
|
|
|
from flask import request, render_template, redirect, url_for, flash, Markup, abort
|
2016-01-16 10:59:16 +00:00
|
|
|
|
from flask_login import login_required
|
|
|
|
|
|
from app.main import main
|
2016-09-20 12:30:00 +01:00
|
|
|
|
from app.main.forms import CreateKeyForm, Whitelist
|
2016-09-21 10:13:25 +01:00
|
|
|
|
from app import api_key_api_client, service_api_client, notification_api_client, current_service
|
2016-10-07 10:59:32 +01:00
|
|
|
|
from app.utils import user_has_permissions, email_safe
|
2016-08-10 16:49:25 +01:00
|
|
|
|
from app.notify_client.api_key_api_client import KEY_TYPE_NORMAL, KEY_TYPE_TEST, KEY_TYPE_TEAM
|
2016-01-19 09:55:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
2016-09-20 11:34:37 +01:00
|
|
|
|
@main.route("/services/<service_id>/api")
|
|
|
|
|
|
@login_required
|
2016-09-29 12:55:25 +01:00
|
|
|
|
@user_has_permissions('manage_api_keys', admin_override=True)
|
2016-09-20 11:34:37 +01:00
|
|
|
|
def api_integration(service_id):
|
|
|
|
|
|
return render_template(
|
2016-09-21 10:13:25 +01:00
|
|
|
|
'views/api/index.html',
|
2017-09-20 16:02:15 +01:00
|
|
|
|
api_notifications=notification_api_client.get_api_notifications_for_service(service_id)
|
2016-09-20 11:34:37 +01:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-09-20 11:38:22 +01:00
|
|
|
|
@main.route("/services/<service_id>/api/documentation")
|
|
|
|
|
|
@login_required
|
2016-09-29 12:55:25 +01:00
|
|
|
|
@user_has_permissions('manage_api_keys', admin_override=True)
|
2016-09-20 11:38:22 +01:00
|
|
|
|
def api_documentation(service_id):
|
|
|
|
|
|
return render_template(
|
|
|
|
|
|
'views/api/documentation.html'
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-09-20 12:30:00 +01:00
|
|
|
|
@main.route("/services/<service_id>/api/whitelist", methods=['GET', 'POST'])
|
|
|
|
|
|
@login_required
|
2016-09-29 12:55:25 +01:00
|
|
|
|
@user_has_permissions('manage_api_keys', admin_override=True)
|
2016-09-20 12:30:00 +01:00
|
|
|
|
def whitelist(service_id):
|
|
|
|
|
|
form = Whitelist()
|
|
|
|
|
|
if form.validate_on_submit():
|
|
|
|
|
|
service_api_client.update_whitelist(service_id, {
|
|
|
|
|
|
'email_addresses': list(filter(None, form.email_addresses.data)),
|
2017-10-18 14:51:26 +01:00
|
|
|
|
'phone_numbers': list(filter(None, form.phone_numbers.data))
|
2016-09-20 12:30:00 +01:00
|
|
|
|
})
|
2016-10-07 15:06:47 +01:00
|
|
|
|
flash('Whitelist updated', 'default_with_tick')
|
2016-09-20 12:30:00 +01:00
|
|
|
|
return redirect(url_for('.api_integration', service_id=service_id))
|
|
|
|
|
|
if not form.errors:
|
|
|
|
|
|
form.populate(**service_api_client.get_whitelist(service_id))
|
|
|
|
|
|
return render_template(
|
|
|
|
|
|
'views/api/whitelist.html',
|
|
|
|
|
|
form=form
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-09-20 11:09:50 +01:00
|
|
|
|
@main.route("/services/<service_id>/api/keys")
|
2016-01-16 10:59:16 +00:00
|
|
|
|
@login_required
|
2016-09-29 12:55:25 +01:00
|
|
|
|
@user_has_permissions('manage_api_keys', admin_override=True)
|
2016-01-16 10:59:16 +00:00
|
|
|
|
def api_keys(service_id):
|
2016-01-19 09:55:13 +00:00
|
|
|
|
return render_template(
|
2016-09-20 11:23:59 +01:00
|
|
|
|
'views/api/keys.html',
|
2016-01-20 17:32:55 +00:00
|
|
|
|
keys=api_key_api_client.get_api_keys(service_id=service_id)['apiKeys']
|
2016-01-19 09:55:13 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-09-20 11:09:50 +01:00
|
|
|
|
@main.route("/services/<service_id>/api/keys/create", methods=['GET', 'POST'])
|
2016-01-19 09:55:13 +00:00
|
|
|
|
@login_required
|
2016-02-29 14:57:07 +00:00
|
|
|
|
@user_has_permissions('manage_api_keys')
|
2016-01-19 09:55:13 +00:00
|
|
|
|
def create_api_key(service_id):
|
2016-01-21 14:15:36 +00:00
|
|
|
|
key_names = [
|
|
|
|
|
|
key['name'] for key in api_key_api_client.get_api_keys(service_id=service_id)['apiKeys']
|
|
|
|
|
|
]
|
|
|
|
|
|
form = CreateKeyForm(key_names)
|
2016-11-01 15:34:04 +00:00
|
|
|
|
form.key_type.choices = [
|
2017-02-02 12:44:12 +00:00
|
|
|
|
(KEY_TYPE_NORMAL, 'Live – sends to anyone'),
|
|
|
|
|
|
(KEY_TYPE_TEAM, 'Team and whitelist – limits who you can send to'),
|
|
|
|
|
|
(KEY_TYPE_TEST, 'Test – pretends to send messages'),
|
2016-11-01 15:34:04 +00:00
|
|
|
|
]
|
2017-10-03 13:15:52 +01:00
|
|
|
|
disabled_options, option_hints = [], {}
|
2016-11-01 15:34:04 +00:00
|
|
|
|
if current_service['restricted']:
|
|
|
|
|
|
disabled_options = [KEY_TYPE_NORMAL]
|
2017-10-03 13:15:52 +01:00
|
|
|
|
option_hints[KEY_TYPE_NORMAL] = Markup(
|
2017-10-03 13:17:37 +01:00
|
|
|
|
'Not available because your service is in '
|
2017-08-30 15:28:55 +01:00
|
|
|
|
'<a href="{}#trial-mode">trial mode</a>'.format(url_for(".using_notify"))
|
2017-10-03 13:15:52 +01:00
|
|
|
|
)
|
|
|
|
|
|
if 'letter' in current_service['permissions']:
|
|
|
|
|
|
option_hints[KEY_TYPE_TEAM] = 'Can’t be used to send letters'
|
2016-01-19 09:55:13 +00:00
|
|
|
|
if form.validate_on_submit():
|
2016-11-01 15:34:04 +00:00
|
|
|
|
if form.key_type.data in disabled_options:
|
|
|
|
|
|
abort(400)
|
2016-07-06 15:10:36 +01:00
|
|
|
|
secret = api_key_api_client.create_api_key(
|
|
|
|
|
|
service_id=service_id,
|
|
|
|
|
|
key_name=form.key_name.data,
|
|
|
|
|
|
key_type=form.key_type.data
|
|
|
|
|
|
)
|
2016-10-07 10:59:32 +01:00
|
|
|
|
return render_template(
|
|
|
|
|
|
'views/api/keys/show.html',
|
|
|
|
|
|
secret=secret,
|
|
|
|
|
|
service_id=service_id,
|
|
|
|
|
|
key_name=email_safe(form.key_name.data, whitespace='_')
|
|
|
|
|
|
)
|
2016-01-19 09:55:13 +00:00
|
|
|
|
return render_template(
|
2016-09-20 11:23:59 +01:00
|
|
|
|
'views/api/keys/create.html',
|
2016-11-01 15:34:04 +00:00
|
|
|
|
form=form,
|
|
|
|
|
|
disabled_options=disabled_options,
|
|
|
|
|
|
option_hints=option_hints
|
2016-01-19 09:55:13 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-09-20 11:09:50 +01:00
|
|
|
|
@main.route("/services/<service_id>/api/keys/revoke/<key_id>", methods=['GET', 'POST'])
|
2016-01-19 09:55:13 +00:00
|
|
|
|
@login_required
|
2016-09-29 12:55:25 +01:00
|
|
|
|
@user_has_permissions('manage_api_keys', admin_override=True)
|
2016-01-19 09:55:13 +00:00
|
|
|
|
def revoke_api_key(service_id, key_id):
|
2016-01-21 12:28:05 +00:00
|
|
|
|
key_name = api_key_api_client.get_api_keys(service_id=service_id, key_id=key_id)['apiKeys'][0]['name']
|
2016-01-19 09:55:13 +00:00
|
|
|
|
if request.method == 'GET':
|
2016-01-21 12:28:05 +00:00
|
|
|
|
return render_template(
|
2017-07-24 15:36:38 +01:00
|
|
|
|
'views/api/keys.html',
|
|
|
|
|
|
revoke_key=key_name,
|
|
|
|
|
|
keys=api_key_api_client.get_api_keys(service_id=service_id)['apiKeys'],
|
2016-01-21 12:28:05 +00:00
|
|
|
|
)
|
2016-01-19 09:55:13 +00:00
|
|
|
|
elif request.method == 'POST':
|
2016-01-20 17:32:55 +00:00
|
|
|
|
api_key_api_client.revoke_api_key(service_id=service_id, key_id=key_id)
|
2016-02-05 10:33:14 +00:00
|
|
|
|
flash('‘{}’ was revoked'.format(key_name), 'default_with_tick')
|
2016-01-19 09:55:13 +00:00
|
|
|
|
return redirect(url_for('.api_keys', service_id=service_id))
|