diff --git a/certidude/api/request.py b/certidude/api/request.py index da374da..42a8a55 100644 --- a/certidude/api/request.py +++ b/certidude/api/request.py @@ -11,7 +11,7 @@ from asn1crypto.csr import CertificationRequest from base64 import b64decode from certidude import config, authority, push, errors from certidude.auth import login_required, login_optional, authorize_admin -from certidude.decorators import csrf_protection, MyEncoder +from certidude.decorators import csrf_protection, MyEncoder, serialize from certidude.firewall import whitelist_subnets, whitelist_content_types from datetime import datetime from oscrypto import asymmetric @@ -38,8 +38,14 @@ class RequestListResource(object): reasons = [] body = req.stream.read(req.content_length) - header, _, der_bytes = pem.unarmor(body) - csr = CertificationRequest.load(der_bytes) + try: + header, _, der_bytes = pem.unarmor(body) + csr = CertificationRequest.load(der_bytes) + except ValueError: + raise falcon.HTTPBadRequest( + "Bad request", + "Malformed certificate signing request") + common_name = csr["certification_request_info"]["subject"].native["common_name"] """ @@ -164,6 +170,9 @@ class RequestListResource(object): # Request was accepted, but not processed resp.status = falcon.HTTP_202 resp.body = ". ".join(reasons) + if req.client_accepts("application/json"): + resp.body = json.dumps({"title":"Accepted", "description":resp.body}, + cls=MyEncoder) class RequestDetailResource(object): diff --git a/certidude/decorators.py b/certidude/decorators.py index 00a0826..638151c 100644 --- a/certidude/decorators.py +++ b/certidude/decorators.py @@ -67,13 +67,15 @@ def serialize(func): """ import falcon def wrapped(instance, req, resp, **kwargs): - if not req.client_accepts("application/json"): - logger.debug("Client did not accept application/json") - raise falcon.HTTPUnsupportedMediaType( - "Client did not accept application/json") - resp.set_header("Cache-Control", "no-cache, no-store, must-revalidate") - resp.set_header("Pragma", "no-cache") - resp.set_header("Expires", "0") - resp.body = json.dumps(func(instance, req, resp, **kwargs), cls=MyEncoder) + retval = func(instance, req, resp, **kwargs) + if not resp.body and not resp.location: + if not req.client_accepts("application/json"): + logger.debug("Client did not accept application/json") + raise falcon.HTTPUnsupportedMediaType( + "Client did not accept application/json") + resp.set_header("Cache-Control", "no-cache, no-store, must-revalidate") + resp.set_header("Pragma", "no-cache") + resp.set_header("Expires", "0") + resp.body = json.dumps(retval, cls=MyEncoder) return wrapped diff --git a/certidude/static/js/certidude.js b/certidude/static/js/certidude.js index 8fb34f1..ae5069b 100644 --- a/certidude/static/js/certidude.js +++ b/certidude/static/js/certidude.js @@ -220,6 +220,27 @@ function onAttributeUpdated(e) { }) } +function onSubmitRequest() { + $.ajax({ + method: "POST", + url: "/api/request/", + headers: { + "Accept": "application/json; charset=utf-8", + "Content-Type": "application/pkcs10" + }, + data: $("#request_body").val(), + + success:function(attributes, status, xhr) { + // Close the modal + $("[data-dismiss=modal]").trigger({ type: "click" }); + }, + error: function(xhr, status, e) { + console.info("Submitting request failed with:", status, e); + alert(e); + } + }) +} + function onServerStarted() { console.info("Server started"); location.reload(); diff --git a/certidude/static/views/authority.html b/certidude/static/views/authority.html index d85affa..058efd7 100644 --- a/certidude/static/views/authority.html +++ b/certidude/static/views/authority.html @@ -5,34 +5,34 @@ -