Allow searching for certificates by name via API
This commit is contained in:
parent
02554b427a
commit
e33a103ca1
|
@ -388,6 +388,19 @@ def render(args):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def query_name(certificate_name, args):
|
||||||
|
"""
|
||||||
|
Helper function that queries for a certificate by name
|
||||||
|
|
||||||
|
:param args:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
query = database.session_query(Certificate)
|
||||||
|
query = query.filter(Certificate.name == certificate_name)
|
||||||
|
result = database.sort_and_page(query, Certificate, args)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def create_csr(**csr_config):
|
def create_csr(**csr_config):
|
||||||
"""
|
"""
|
||||||
Given a list of domains create the appropriate csr
|
Given a list of domains create the appropriate csr
|
||||||
|
|
|
@ -37,6 +37,114 @@ mod = Blueprint('certificates', __name__)
|
||||||
api = Api(mod)
|
api = Api(mod)
|
||||||
|
|
||||||
|
|
||||||
|
class CertificatesNameQuery(AuthenticatedResource):
|
||||||
|
""" Defines the 'certificates/name' endpoint """
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.reqparse = reqparse.RequestParser()
|
||||||
|
super(CertificatesNameQuery, self).__init__()
|
||||||
|
|
||||||
|
@validate_schema(None, certificates_output_schema)
|
||||||
|
def get(self, certificate_name):
|
||||||
|
"""
|
||||||
|
.. http:get:: /certificates/name/<query>
|
||||||
|
|
||||||
|
The current list of certificates
|
||||||
|
|
||||||
|
**Example request**:
|
||||||
|
|
||||||
|
.. sourcecode:: http
|
||||||
|
|
||||||
|
GET /certificates/name/WILDCARD.test.example.net-SymantecCorporation-20160603-20180112 HTTP/1.1
|
||||||
|
Host: example.com
|
||||||
|
Accept: application/json, text/javascript
|
||||||
|
|
||||||
|
**Example response**:
|
||||||
|
|
||||||
|
.. sourcecode:: http
|
||||||
|
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Vary: Accept
|
||||||
|
Content-Type: text/javascript
|
||||||
|
|
||||||
|
{
|
||||||
|
"items": [{
|
||||||
|
"status": null,
|
||||||
|
"cn": "*.test.example.net",
|
||||||
|
"chain": "",
|
||||||
|
"csr": "-----BEGIN CERTIFICATE REQUEST-----"
|
||||||
|
"authority": {
|
||||||
|
"active": true,
|
||||||
|
"owner": "secure@example.com",
|
||||||
|
"id": 1,
|
||||||
|
"description": "verisign test authority",
|
||||||
|
"name": "verisign"
|
||||||
|
},
|
||||||
|
"owner": "joe@example.com",
|
||||||
|
"serial": "82311058732025924142789179368889309156",
|
||||||
|
"id": 2288,
|
||||||
|
"issuer": "SymantecCorporation",
|
||||||
|
"dateCreated": "2016-06-03T06:09:42.133769+00:00",
|
||||||
|
"notBefore": "2016-06-03T00:00:00+00:00",
|
||||||
|
"notAfter": "2018-01-12T23:59:59+00:00",
|
||||||
|
"destinations": [],
|
||||||
|
"bits": 2048,
|
||||||
|
"body": "-----BEGIN CERTIFICATE-----...",
|
||||||
|
"description": null,
|
||||||
|
"deleted": null,
|
||||||
|
"notifications": [{
|
||||||
|
"id": 1
|
||||||
|
}],
|
||||||
|
"signingAlgorithm": "sha256",
|
||||||
|
"user": {
|
||||||
|
"username": "jane",
|
||||||
|
"active": true,
|
||||||
|
"email": "jane@example.com",
|
||||||
|
"id": 2
|
||||||
|
},
|
||||||
|
"active": true,
|
||||||
|
"domains": [{
|
||||||
|
"sensitive": false,
|
||||||
|
"id": 1090,
|
||||||
|
"name": "*.test.example.net"
|
||||||
|
}],
|
||||||
|
"replaces": [],
|
||||||
|
"replaced": [],
|
||||||
|
"name": "WILDCARD.test.example.net-SymantecCorporation-20160603-20180112",
|
||||||
|
"roles": [{
|
||||||
|
"id": 464,
|
||||||
|
"description": "This is a google group based role created by Lemur",
|
||||||
|
"name": "joe@example.com"
|
||||||
|
}],
|
||||||
|
"san": null
|
||||||
|
}],
|
||||||
|
"total": 1
|
||||||
|
}
|
||||||
|
|
||||||
|
:query sortBy: field to sort on
|
||||||
|
:query sortDir: asc or desc
|
||||||
|
:query page: int. default is 1
|
||||||
|
:query filter: key value pair format is k;v
|
||||||
|
:query count: count number. default is 10
|
||||||
|
:reqheader Authorization: OAuth token to authenticate
|
||||||
|
:statuscode 200: no error
|
||||||
|
:statuscode 403: unauthenticated
|
||||||
|
|
||||||
|
"""
|
||||||
|
parser = paginated_parser.copy()
|
||||||
|
parser.add_argument('timeRange', type=int, dest='time_range', location='args')
|
||||||
|
parser.add_argument('owner', type=inputs.boolean, location='args')
|
||||||
|
parser.add_argument('id', type=str, location='args')
|
||||||
|
parser.add_argument('active', type=inputs.boolean, location='args')
|
||||||
|
parser.add_argument('destinationId', type=int, dest="destination_id", location='args')
|
||||||
|
parser.add_argument('creator', type=str, location='args')
|
||||||
|
parser.add_argument('show', type=str, location='args')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
args['user'] = g.user
|
||||||
|
return service.query_name(certificate_name, args)
|
||||||
|
|
||||||
|
|
||||||
class CertificatesList(AuthenticatedResource):
|
class CertificatesList(AuthenticatedResource):
|
||||||
""" Defines the 'certificates' endpoint """
|
""" Defines the 'certificates' endpoint """
|
||||||
|
|
||||||
|
@ -1080,6 +1188,7 @@ class CertificateRevoke(AuthenticatedResource):
|
||||||
|
|
||||||
|
|
||||||
api.add_resource(CertificateRevoke, '/certificates/<int:certificate_id>/revoke', endpoint='revokeCertificate')
|
api.add_resource(CertificateRevoke, '/certificates/<int:certificate_id>/revoke', endpoint='revokeCertificate')
|
||||||
|
api.add_resource(CertificatesNameQuery, '/certificates/name/<string:certificate_name>', endpoint='certificatesNameQuery')
|
||||||
api.add_resource(CertificatesList, '/certificates', endpoint='certificates')
|
api.add_resource(CertificatesList, '/certificates', endpoint='certificates')
|
||||||
api.add_resource(Certificates, '/certificates/<int:certificate_id>', endpoint='certificate')
|
api.add_resource(Certificates, '/certificates/<int:certificate_id>', endpoint='certificate')
|
||||||
api.add_resource(CertificatesStats, '/certificates/stats', endpoint='certificateStats')
|
api.add_resource(CertificatesStats, '/certificates/stats', endpoint='certificateStats')
|
||||||
|
|
|
@ -14,6 +14,11 @@ angular.module('lemur')
|
||||||
url: '/certificates/:name',
|
url: '/certificates/:name',
|
||||||
templateUrl: '/angular/certificates/view/view.tpl.html',
|
templateUrl: '/angular/certificates/view/view.tpl.html',
|
||||||
controller: 'CertificatesViewController'
|
controller: 'CertificatesViewController'
|
||||||
|
})
|
||||||
|
.state('certificate_name', {
|
||||||
|
url: '/certificates/name/:name',
|
||||||
|
templateUrl: '/angular/certificates/view/view.tpl.html',
|
||||||
|
controller: 'CertificatesViewController'
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td data-title="''" style="text-align: center; vertical-align: middle;">
|
<td data-title="''" style="text-align: center; vertical-align: middle;">
|
||||||
<div class="btn-group pull-right" role="group" aria-label="...">
|
<div class="btn-group pull-right" role="group" aria-label="...">
|
||||||
<a class="btn btn-sm btn-primary" ui-sref="certificate({name: certificate.name})">Permalink</a>
|
<a class="btn btn-sm btn-primary" ui-sref="certificate_name({name: certificate.name})">Permalink</a>
|
||||||
<button ng-model="certificate.toggle" class="btn btn-sm btn-info" uib-btn-checkbox btn-checkbox-true="1"
|
<button ng-model="certificate.toggle" class="btn btn-sm btn-info" uib-btn-checkbox btn-checkbox-true="1"
|
||||||
btn-checkbox-false="0">More
|
btn-checkbox-false="0">More
|
||||||
</button>
|
</button>
|
||||||
|
|
Loading…
Reference in New Issue