* Adding release info.

* adding some fields

* Adding Source Plugin change.

* Updating docs
This commit is contained in:
kevgliss 2016-06-03 08:28:09 -07:00
parent acd47d5ec9
commit dc198fec8c
14 changed files with 809 additions and 435 deletions

View File

@ -1,12 +1,62 @@
Changelog Changelog
========= =========
0.3.1 - `master`
0.2.3 - `master`
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
.. note:: This version is not yet released and is under active development .. note:: This version is not yet released and is under active development
0.3.0 - `master`
~~~~~~~~~~~~~~~~
This is quite a large upgrade, it is highly advised you backup your database before attempting to upgrade as this release
requires the migration of database structure as well as data.
Upgrading
---------
Please follow the `documentation <https://lemur.readthedocs.io/en/latest/administration.html#upgrading-lemur>`_ to upgrade Lemur.
Source Plugin Owners
--------------------
The dictionary returned from a source plugin has changed keys from `public_certificate` to `body` and `intermediate_certificate` to chain.
Issuer Plugin Owners
--------------------
This release may break your plugins, the keys in `issuer_options` have been changed from `camelCase` to `under_score`.
This change was made to break a undue reliance on downstream options maintains a more pythonic naming convention. Renaming
these keys should be fairly trivial, additionally pull requests have been submitted to affected plugins to help ease the transition.
.. note:: This change only affects issuer plugins and does not affect any other types of plugins.
* Closed `#63 <https://github.com/Netflix/lemur/issues/63>`_ - Validates all endpoints with Marshmallow schemas, this allows for
stricter input validation and better error messages when validation fails.
* Closed `#146 <https://github.com/Netflix/lemur/issues/146>`_ - Moved authority type to first pane of authority creation wizard.
* Closed `#147 <https://github.com/Netflix/lemur/issues/147>`_ - Added and refactored the relationship between authorities and their
root certificates. Displays the certificates (and chains) next the the authority in question.
* Closed `#199 <https://github.com/Netflix/lemur/issues/199>`_ - Ensures that the dates submitted to Lemur during authority and
certificate creation are actually dates.
* Closed `#230 <https://github.com/Netflix/lemur/issues/230>`_ - Migrated authority dropdown to a ui-select based dropdown, this
should be easier to determine what authorities are available and when an authority has actually been selected.
* Closed `#254 <https://github.com/Netflix/lemur/issues/254>`_ - Forces certificate names to be generally unique. If a certificate name
(generated or otherwise) is found to be a duplicate we increment by appending a counter.
* Closed `#254 <https://github.com/Netflix/lemur/issues/275>`_ - Switched to using Fernet generated passphrases for exported items.
These are more sounds that pseudo random passphrases generated before and have the nice property of being in base64.
* Closed `#278 <https://github.com/Netflix/lemur/issues/278>`_ - Added ability to specify a custom name to certificate creation, previously
this was only available in the certificate import wizard.
* Closed `#281 <https://github.com/Netflix/lemur/issues/281>`_ - Fixed an issue where notifications could not be removed from a certificate
via the UI.
* Closed `#289 <https://github.com/Netflix/lemur/issues/289>`_ - Fixed and issue where intermediates were not being properly exported.
* Closed `#315 <https://github.com/Netflix/lemur/issues/315>`_ - Made how roles are associated with certificates and authorities much more
explict, including adding the ability to add roles directly to certificates and authorities on creation.
0.2.2 - 2016-02-05 0.2.2 - 2016-02-05
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
@ -36,7 +86,7 @@ Changelog
0.2.0 - 2015-12-02 0.2.0 - 2015-12-02
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
* Closed #120 - Error messages not displaying long enough * Closed #120 - Error messages not displaying long enough
* Closed #121 - Certificate create form should not be valid until a Certificate Authority object is available * Closed #121 - Certificate create form should not be valid until a Certificate Authority object is available
@ -52,7 +102,7 @@ Changelog
0.1.5 - 2015-10-26 0.1.5 - 2015-10-26
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
* **SECURITY ISSUE**: Switched from use a AES static key to Fernet encryption. * **SECURITY ISSUE**: Switched from use a AES static key to Fernet encryption.
Affects all versions prior to 0.1.5. If upgrading this will require a data migration. Affects all versions prior to 0.1.5. If upgrading this will require a data migration.

View File

@ -5,10 +5,6 @@ Lemur
:alt: Join the chat at https://gitter.im/Netflix/lemur :alt: Join the chat at https://gitter.im/Netflix/lemur
:target: https://gitter.im/Netflix/lemur?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge :target: https://gitter.im/Netflix/lemur?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
.. image:: https://img.shields.io/pypi/v/lemur.svg
:target: https://pypi.python.org/pypi/lemur/
:alt: Latest Version
.. image:: https://readthedocs.org/projects/lemur/badge/?version=latest .. image:: https://readthedocs.org/projects/lemur/badge/?version=latest
:target: https://lemur.readthedocs.org :target: https://lemur.readthedocs.org
:alt: Latest Docs :alt: Latest Docs
@ -20,10 +16,6 @@ Lemur
:target: https://requires.io/github/Netflix/lemur/requirements/?branch=master :target: https://requires.io/github/Netflix/lemur/requirements/?branch=master
:alt: Requirements Status :alt: Requirements Status
.. image:: https://badge.waffle.io/Netflix/lemur.png?label=ready&title=Ready
:target: https://waffle.io/Netflix/lemur
:alt: 'Stories in Ready'
Lemur manages TLS certificate creation. While not able to issue certificates itself, Lemur acts as a broker between CAs Lemur manages TLS certificate creation. While not able to issue certificates itself, Lemur acts as a broker between CAs
and environments providing a central portal for developers to issue TLS certificates with 'sane' defaults. and environments providing a central portal for developers to issue TLS certificates with 'sane' defaults.

View File

@ -211,8 +211,8 @@ certificate Lemur does not know about and adding the certificate to it's invento
The `SourcePlugin` object has one default option of `pollRate`. This controls the number of seconds which to get new certificates. The `SourcePlugin` object has one default option of `pollRate`. This controls the number of seconds which to get new certificates.
.. warning:: .. warning::
Lemur currently has a very basic polling system of running a cron job every 15min to see which source plugins need to be run. A lock file is generated to guarantee that Lemur currently has a very basic polling system of running a cron job every 15min to see which source plugins need to be run. A lock file is generated to guarantee that
only one sync is running at a time. It also means that the minimum resolution of a source plugin poll rate is effectively 15min. You can always specify a faster cron only one sync is running at a time. It also means that the minimum resolution of a source plugin poll rate is effectively 15min. You can always specify a faster cron
job if you need a higher resolution sync job. job if you need a higher resolution sync job.
@ -223,8 +223,8 @@ The `SourcePlugin` object requires implementation of one function::
# request.get("some source of certificates") # request.get("some source of certificates")
.. Note:: .. note::
Often times to facilitate code re-use it makes sense put source and destination plugins into one package. Often times to facilitate code re-use it makes sense put source and destination plugins into one package.
Export Export
@ -244,9 +244,8 @@ The `ExportPlugin` object requires the implementation of one function::
# return "extension", passphrase, raw # return "extension", passphrase, raw
.. Note:: .. note::
Support of various formats sometimes relies on external tools system calls. Always be mindful of sanitizing any input to Support of various formats sometimes relies on external tools system calls. Always be mindful of sanitizing any input to these calls.
these calls.
Testing Testing

View File

@ -9,7 +9,7 @@ __title__ = "lemur"
__summary__ = ("Certificate management and orchestration service") __summary__ = ("Certificate management and orchestration service")
__uri__ = "https://github.com/Netflix/lemur" __uri__ = "https://github.com/Netflix/lemur"
__version__ = "0.2.3dev" __version__ = "0.3.0"
__author__ = "The Lemur developers" __author__ = "The Lemur developers"
__email__ = "security@netflix.com" __email__ = "security@netflix.com"

View File

@ -53,20 +53,44 @@ class AuthoritiesList(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"items": [ "items": [{
{ "name": "TestAuthority",
"id": 1, "roles": [{
"name": "authority1", "id": 123,
"description": "this is authority1", "name": "secure@example.com"
"pluginName": null, }, {
"chain": "-----Begin ...", "id": 564,
"body": "-----Begin ...", "name": "TestAuthority_admin"
}, {
"id": 565,
"name": "TestAuthority_operator"
}],
"options": null,
"active": true, "active": true,
"notBefore": "2015-06-05T17:09:39", "authorityCertificate": {
"notAfter": "2015-06-10T17:09:39" "body": "-----BEGIN CERTIFICATE-----IyMzU5MTVaMHk...",
"options": null "status": true,
"cn": "AcommonName",
"description": "This is the ROOT certificate for the TestAuthority certificate authority.",
"chain": "",
"notBefore": "2016-06-02T00:00:15+00:00",
"notAfter": "2023-06-02T23:59:15+00:00",
"owner": "secure@example.com",
"user": {
"username": "joe@example.com",
"active": true,
"email": "joe@example.com",
"id": 3
},
"active": true,
"bits": 2048,
"id": 2235,
"name": "TestAuthority"
},
"owner": "secure@example.com",
"id": 43,
"description": "This is the ROOT certificate for the TestAuthority certificate authority."
} }
]
"total": 1 "total": 1
} }
@ -74,7 +98,7 @@ class AuthoritiesList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair. format is k;v :query filter: key value pair. format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
@ -101,29 +125,28 @@ class AuthoritiesList(AuthenticatedResource):
Accept: application/json, text/javascript Accept: application/json, text/javascript
{ {
"caDN": {
"country": "US", "country": "US",
"state": "CA", "state": "California",
"location": "A Location", "location": "Los Gatos",
"organization": "ExampleInc", "organization": "Netflix",
"organizationalUnit": "Operations", "organizationalUnit": "Operations",
"commonName": "a common name" "type": "root",
}, "signingAlgorithm": "sha256WithRSA",
"caType": "root", "sensitivity": "medium",
"caSigningAlgo": "sha256WithRSA",
"caSensitivity": "medium",
"keyType": "RSA2048", "keyType": "RSA2048",
"pluginName": "cloudca", "plugin": {
"validityStart": "2015-06-11T07:00:00.000Z", "slug": "cloudca-issuer",
"validityEnd": "2015-06-13T07:00:00.000Z", },
"caName": "DoctestCA", "name": "TimeTestAuthority5",
"ownerEmail": "jimbob@example.com", "owner": "secure@example.com",
"caDescription": "Example CA", "description": "test",
"commonName": "AcommonName",
"validityYears": "20",
"extensions": { "extensions": {
"subAltNames": { "subAltNames": {
"names": [] "names": []
}
}, },
"custom": []
} }
**Example response**: **Example response**:
@ -135,34 +158,62 @@ class AuthoritiesList(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"id": 1, "name": "TestAuthority",
"name": "authority1", "roles": [{
"description": "this is authority1", "id": 123,
"pluginName": null, "name": "secure@example.com"
"chain": "-----Begin ...", }, {
"body": "-----Begin ...", "id": 564,
"name": "TestAuthority_admin"
}, {
"id": 565,
"name": "TestAuthority_operator"
}],
"options": null,
"active": true, "active": true,
"notBefore": "2015-06-05T17:09:39", "authorityCertificate": {
"notAfter": "2015-06-10T17:09:39" "body": "-----BEGIN CERTIFICATE-----IyMzU5MTVaMHk...",
"options": null "status": true,
"cn": "AcommonName",
"description": "This is the ROOT certificate for the TestAuthority certificate authority.",
"chain": "",
"notBefore": "2016-06-02T00:00:15+00:00",
"notAfter": "2023-06-02T23:59:15+00:00",
"owner": "secure@example.com",
"user": {
"username": "joe@example.com",
"active": true,
"email": "joe@example.com",
"id": 3
},
"active": true,
"bits": 2048,
"id": 2235,
"name": "TestAuthority"
},
"owner": "secure@example.com",
"id": 43,
"description": "This is the ROOT certificate for the TestAuthority certificate authority."
} }
:arg caName: authority's name
:arg caDescription: a sensible description about what the CA with be used for :arg name: authority's name
:arg ownerEmail: the team or person who 'owns' this authority :arg description: a sensible description about what the CA with be used for
:arg owner: the team or person who 'owns' this authority
:arg validityStart: when this authority should start issuing certificates :arg validityStart: when this authority should start issuing certificates
:arg validityEnd: when this authority should stop issuing certificates :arg validityEnd: when this authority should stop issuing certificates
:arg validityYears: starting from `now` how many years into the future the authority should be valid
:arg extensions: certificate extensions :arg extensions: certificate extensions
:arg pluginName: name of the plugin to create the authority :arg plugin: name of the plugin to create the authority
:arg caType: the type of authority (root/subca) :arg type: the type of authority (root/subca)
:arg caParent: the parent authority if this is to be a subca :arg parent: the parent authority if this is to be a subca
:arg caSigningAlgo: algorithm used to sign the authority :arg signingAlgorithm: algorithm used to sign the authority
:arg keyType: key type :arg keyType: key type
:arg caSensitivity: the sensitivity of the root key, for CloudCA this determines if the root keys are stored :arg sensitivity: the sensitivity of the root key, for CloudCA this determines if the root keys are stored
in an HSM in an HSM
:arg caKeyName: name of the key to store in the HSM (CloudCA) :arg keyName: name of the key to store in the HSM (CloudCA)
:arg caSerialNumber: serial number of the authority :arg serialNumber: serial number of the authority
:arg caFirstSerial: specifies the starting serial number for certificates issued off of this authority :arg firstSerial: specifies the starting serial number for certificates issued off of this authority
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
:statuscode 200: no error :statuscode 200: no error
@ -199,18 +250,28 @@ class Authorities(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"id": 1, "roles": [{
"name": "authority1", "id": 123,
"description": "this is authority1", "name": "secure@example.com"
"pluginName": null, }, {
"chain": "-----Begin ...", "id": 564,
"body": "-----Begin ...", "name": "TestAuthority_admin"
}, {
"id": 565,
"name": "TestAuthority_operator"
}],
"active": true, "active": true,
"notBefore": "2015-06-05T17:09:39", "owner": "secure@example.com",
"notAfter": "2015-06-10T17:09:39" "id": 43,
"options": null "description": "This is the ROOT certificate for the TestAuthority certificate authority."
} }
:arg description: a sensible description about what the CA with be used for
:arg owner: the team or person who 'owns' this authority
:arg active: set whether this authoritity is currently in use
:reqheader Authorization: OAuth token to authenticate
:statuscode 403: unauthenticated
:statuscode 200: no error
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
@ -233,10 +294,41 @@ class Authorities(AuthenticatedResource):
Accept: application/json, text/javascript Accept: application/json, text/javascript
{ {
"roles": [], "name": "TestAuthority5",
"active": false, "roles": [{
"owner": "bob@example.com", "id": 566,
"description": "this is authority1" "name": "TestAuthority5_admin"
}, {
"id": 567,
"name": "TestAuthority5_operator"
}, {
"id": 123,
"name": "secure@example.com"
}],
"active": true,
"authorityCertificate": {
"body": "-----BEGIN CERTIFICATE-----",
"status": null,
"cn": "AcommonName",
"description": "This is the ROOT certificate for the TestAuthority5 certificate authority.",
"chain": "",
"notBefore": "2016-06-03T00:00:51+00:00",
"notAfter": "2036-06-03T23:59:51+00:00",
"owner": "secure@example.com",
"user": {
"username": "joe@example.com",
"active": true,
"email": "joe@example.com",
"id": 3
},
"active": true,
"bits": 2048,
"id": 2280,
"name": "TestAuthority5"
},
"owner": "secure@example.com",
"id": 44,
"description": "This is the ROOT certificate for the TestAuthority5 certificate authority."
} }
**Example response**: **Example response**:
@ -248,16 +340,42 @@ class Authorities(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"id": 1, "name": "TestAuthority",
"name": "authority1", "roles": [{
"description": "this is authority1", "id": 123,
"pluginName": null, "name": "secure@example.com"
"chain": "-----begin ...", }, {
"body": "-----begin ...", "id": 564,
"active": false, "name": "TestAuthority_admin"
"notBefore": "2015-06-05t17:09:39", }, {
"notAfter": "2015-06-10t17:09:39" "id": 565,
"options": null "name": "TestAuthority_operator"
}],
"options": null,
"active": true,
"authorityCertificate": {
"body": "-----BEGIN CERTIFICATE-----IyMzU5MTVaMHk...",
"status": true,
"cn": "AcommonName",
"description": "This is the ROOT certificate for the TestAuthority certificate authority.",
"chain": "",
"notBefore": "2016-06-02T00:00:15+00:00",
"notAfter": "2023-06-02T23:59:15+00:00",
"owner": "secure@example.com",
"user": {
"username": "joe@example.com",
"active": true,
"email": "joe@example.com",
"id": 3
},
"active": true,
"bits": 2048,
"id": 2235,
"name": "TestAuthority"
},
"owner": "secure@example.com",
"id": 43,
"description": "This is the ROOT certificate for the TestAuthority certificate authority."
} }
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
@ -313,16 +431,42 @@ class CertificateAuthority(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"id": 1, "name": "TestAuthority",
"name": "authority1", "roles": [{
"description": "this is authority1", "id": 123,
"pluginName": null, "name": "secure@example.com"
"chain": "-----Begin ...", }, {
"body": "-----Begin ...", "id": 564,
"name": "TestAuthority_admin"
}, {
"id": 565,
"name": "TestAuthority_operator"
}],
"options": null,
"active": true, "active": true,
"notBefore": "2015-06-05T17:09:39", "authorityCertificate": {
"notAfter": "2015-06-10T17:09:39" "body": "-----BEGIN CERTIFICATE-----IyMzU5MTVaMHk...",
"options": null "status": true,
"cn": "AcommonName",
"description": "This is the ROOT certificate for the TestAuthority certificate authority.",
"chain": "",
"notBefore": "2016-06-02T00:00:15+00:00",
"notAfter": "2023-06-02T23:59:15+00:00",
"owner": "secure@example.com",
"user": {
"username": "joe@example.com",
"active": true,
"email": "joe@example.com",
"id": 3
},
"active": true,
"bits": 2048,
"id": 2235,
"name": "TestAuthority"
},
"owner": "secure@example.com",
"id": 43,
"description": "This is the ROOT certificate for the TestAuthority certificate authority."
} }
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate

View File

@ -59,26 +59,53 @@ class CertificatesList(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"items": [ "items": [{
{ "status": null,
"id": 1, "cn": "*.test.example.net",
"name": "cert1", "chain": "",
"description": "this is cert1", "authority": {
"bits": 2048,
"deleted": false,
"issuer": "ExampeInc.",
"serial": "123450",
"chain": "-----Begin ...",
"body": "-----Begin ...",
"san": true,
"owner": 'bob@example.com",
"active": true, "active": true,
"notBefore": "2015-06-05T17:09:39", "owner": "secure@example.com",
"notAfter": "2015-06-10T17:09:39", "id": 1,
"cn": "example.com", "description": "verisign test authority",
"status": "unknown" "name": "verisign"
} },
] "owner": "joe@example.com",
"serial": "82311058732025924142789179368889309156",
"id": 2288,
"issuer": "SymantecCorporation",
"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": [],
"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 "total": 1
} }
@ -86,10 +113,11 @@ class CertificatesList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int. default is 1 :query page: int. default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number. default is 10 :query count: count number. default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
""" """
parser = paginated_parser.copy() parser = paginated_parser.copy()
parser.add_argument('timeRange', type=int, dest='time_range', location='args') parser.add_argument('timeRange', type=int, dest='time_range', location='args')
@ -118,92 +146,6 @@ class CertificatesList(AuthenticatedResource):
Host: example.com Host: example.com
Accept: application/json, text/javascript Accept: application/json, text/javascript
{
"country": "US",
"state": "CA",
"location": "A Place",
"organization": "ExampleInc.",
"organizationalUnit": "Operations",
"owner": "bob@example.com",
"description": "test",
"selectedAuthority": "timetest2",
"csr": "----BEGIN CERTIFICATE REQUEST-----...",
"authority": {
"body": "-----BEGIN...",
"name": "timetest2",
"chain": "",
"notBefore": "2015-06-05T15:20:59",
"active": true,
"id": 50,
"notAfter": "2015-06-17T15:21:08",
"description": "dsfdsf"
},
"notifications": [
{
"description": "Default 30 day expiration notification",
"notificationOptions": [
{
"name": "interval",
"required": true,
"value": 30,
"helpMessage": "Number of days to be alert before expiration.",
"validation": "^\\d+$",
"type": "int"
},
{
"available": [
"days",
"weeks",
"months"
],
"name": "unit",
"required": true,
"value": "days",
"helpMessage": "Interval unit",
"validation": "",
"type": "select"
},
{
"name": "recipients",
"required": true,
"value": "bob@example.com",
"helpMessage": "Comma delimited list of email addresses",
"validation": "^([\\w+-.%]+@[\\w-.]+\\.[A-Za-z]{2,4},?)+$",
"type": "str"
}
],
"label": "DEFAULT_KGLISSON_30_DAY",
"pluginName": "email-notification",
"active": true,
"id": 7
}
],
"extensions": {
"basicConstraints": {},
"keyUsage": {
"isCritical": true,
"useKeyEncipherment": true,
"useDigitalSignature": true
},
"extendedKeyUsage": {
"isCritical": true,
"useServerAuthentication": true
},
"subjectKeyIdentifier": {
"includeSKI": true
},
"subAltNames": {
"names": []
}
},
"commonName": "test",
"validityStart": "2015-06-05T07:00:00.000Z",
"validityEnd": "2015-06-16T07:00:00.000Z",
"replacements": [
{'id': 123}
],
"name": "TestCertificate"
}
**Example response**: **Example response**:
@ -214,24 +156,54 @@ class CertificatesList(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"status": null,
"cn": "*.test.example.net",
"chain": "",
"authority": {
"active": true,
"owner": "secure@example.com",
"id": 1, "id": 1,
"name": "cert1", "description": "verisign test authority",
"description": "this is cert1", "name": "verisign"
},
"owner": "joe@example.com",
"serial": "82311058732025924142789179368889309156",
"id": 2288,
"issuer": "SymantecCorporation",
"notBefore": "2016-06-03T00:00:00+00:00",
"notAfter": "2018-01-12T23:59:59+00:00",
"destinations": [],
"bits": 2048, "bits": 2048,
"deleted": false, "body": "-----BEGIN CERTIFICATE-----...",
"issuer": "ExampeInc.", "description": null,
"serial": "123450", "deleted": null,
"chain": "-----Begin ...", "notifications": [{
"body": "-----Begin ...", "id": 1
"san": true, }]
"owner": "jimbob@example.com", "signingAlgorithm": "sha256",
"active": false, "user": {
"notBefore": "2015-06-05T17:09:39", "username": "jane",
"notAfter": "2015-06-10T17:09:39", "active": true,
"cn": "example.com", "email": "jane@example.com",
"status": "unknown" "id": 2
},
"active": true,
"domains": [{
"sensitive": false,
"id": 1090,
"name": "*.test.example.net"
}],
"replaces": [],
"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
} }
:arg extensions: extensions to be used in the certificate :arg extensions: extensions to be used in the certificate
:arg description: description for new certificate :arg description: description for new certificate
:arg owner: owner email :arg owner: owner email
@ -246,6 +218,7 @@ class CertificatesList(AuthenticatedResource):
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
""" """
role = role_service.get_by_name(data['authority'].owner) role = role_service.get_by_name(data['authority'].owner)
@ -304,23 +277,51 @@ class CertificatesUpload(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"id": 1, "status": null,
"name": "cert1", "cn": "*.test.example.net",
"description": "this is cert1", "chain": "",
"bits": 2048, "authority": {
"deleted": false,
"issuer": "ExampeInc.",
"serial": "123450",
"chain": "-----Begin ...",
"body": "-----Begin ...",
"san": true,
"owner": "joe@example.com",
"active": true, "active": true,
"notBefore": "2015-06-05T17:09:39", "owner": "secure@example.com",
"notAfter": "2015-06-10T17:09:39", "id": 1,
"signingAlgorithm": "sha2" "description": "verisign test authority",
"cn": "example.com", "name": "verisign"
"status": "unknown" },
"owner": "joe@example.com",
"serial": "82311058732025924142789179368889309156",
"id": 2288,
"issuer": "SymantecCorporation",
"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": [],
"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
} }
:arg owner: owner email for certificate :arg owner: owner email for certificate
@ -331,6 +332,7 @@ class CertificatesUpload(AuthenticatedResource):
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
:statuscode 200: no error :statuscode 200: no error
""" """
if data.get('destinations'): if data.get('destinations'):
if data.get('private_key'): if data.get('private_key'):
@ -439,28 +441,57 @@ class Certificates(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"id": 1, "status": null,
"name": "cert1", "cn": "*.test.example.net",
"description": "this is cert1", "chain": "",
"bits": 2048, "authority": {
"deleted": false,
"issuer": "ExampeInc.",
"serial": "123450",
"chain": "-----Begin ...",
"body": "-----Begin ...",
"san": true,
"owner": "bob@example.com",
"active": true, "active": true,
"notBefore": "2015-06-05T17:09:39", "owner": "secure@example.com",
"notAfter": "2015-06-10T17:09:39", "id": 1,
"signingAlgorithm": "sha2", "description": "verisign test authority",
"cn": "example.com", "name": "verisign"
"status": "unknown" },
"owner": "joe@example.com",
"serial": "82311058732025924142789179368889309156",
"id": 2288,
"issuer": "SymantecCorporation",
"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": [],
"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
} }
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
""" """
return service.get(certificate_id) return service.get(certificate_id)
@ -496,27 +527,57 @@ class Certificates(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"status": null,
"cn": "*.test.example.net",
"chain": "",
"authority": {
"active": true,
"owner": "secure@example.com",
"id": 1, "id": 1,
"name": "cert1", "description": "verisign test authority",
"description": "this is cert1", "name": "verisign"
},
"owner": "joe@example.com",
"serial": "82311058732025924142789179368889309156",
"id": 2288,
"issuer": "SymantecCorporation",
"notBefore": "2016-06-03T00:00:00+00:00",
"notAfter": "2018-01-12T23:59:59+00:00",
"destinations": [],
"bits": 2048, "bits": 2048,
"deleted": false, "body": "-----BEGIN CERTIFICATE-----...",
"issuer": "ExampeInc.", "description": null,
"serial": "123450", "deleted": null,
"chain": "-----Begin ...", "notifications": [{
"body": "-----Begin ...", "id": 1
"san": true, }]
"owner": "jimbob@example.com", "signingAlgorithm": "sha256",
"active": false, "user": {
"notBefore": "2015-06-05T17:09:39", "username": "jane",
"notAfter": "2015-06-10T17:09:39", "active": true,
"cn": "example.com", "email": "jane@example.com",
"status": "unknown", "id": 2
},
"active": true,
"domains": [{
"sensitive": false,
"id": 1090,
"name": "*.test.example.net"
}],
"replaces": [],
"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
} }
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
""" """
cert = service.get(certificate_id) cert = service.get(certificate_id)
@ -568,27 +629,53 @@ class NotificationCertificatesList(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"items": [ "items": [{
{ "status": null,
"id": 1, "cn": "*.test.example.net",
"name": "cert1", "chain": "",
"description": "this is cert1", "authority": {
"bits": 2048,
"deleted": false,
"issuer": "ExampeInc.",
"serial": "123450",
"chain": "-----Begin ...",
"body": "-----Begin ...",
"san": true,
"owner": 'bob@example.com",
"active": true, "active": true,
"notBefore": "2015-06-05T17:09:39", "owner": "secure@example.com",
"notAfter": "2015-06-10T17:09:39", "id": 1,
"signingAlgorithm": "sha2", "description": "verisign test authority",
"cn": "example.com", "name": "verisign"
"status": "unknown" },
} "owner": "joe@example.com",
] "serial": "82311058732025924142789179368889309156",
"id": 2288,
"issuer": "SymantecCorporation",
"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": [],
"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 "total": 1
} }
@ -596,10 +683,11 @@ class NotificationCertificatesList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
""" """
parser = paginated_parser.copy() parser = paginated_parser.copy()
parser.add_argument('timeRange', type=int, dest='time_range', location='args') parser.add_argument('timeRange', type=int, dest='time_range', location='args')
@ -643,29 +731,61 @@ class CertificatesReplacementsList(AuthenticatedResource):
Vary: Accept Vary: Accept
Content-Type: text/javascript Content-Type: text/javascript
[{ {
"id": 1, "items": [{
"name": "cert1", "status": null,
"description": "this is cert1", "cn": "*.test.example.net",
"bits": 2048, "chain": "",
"deleted": false, "authority": {
"issuer": "ExampeInc.",
"serial": "123450",
"chain": "-----Begin ...",
"body": "-----Begin ...",
"san": true,
"owner": "bob@example.com",
"active": true, "active": true,
"notBefore": "2015-06-05T17:09:39", "owner": "secure@example.com",
"notAfter": "2015-06-10T17:09:39", "id": 1,
"signingAlgorithm": "sha2", "description": "verisign test authority",
"cn": "example.com", "name": "verisign"
"status": "unknown" },
"owner": "joe@example.com",
"serial": "82311058732025924142789179368889309156",
"id": 2288,
"issuer": "SymantecCorporation",
"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": [],
"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
}
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
""" """
return service.get(certificate_id).replaces return service.get(certificate_id).replaces
@ -740,6 +860,7 @@ class CertificateExport(AuthenticatedResource):
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
""" """
cert = service.get(certificate_id) cert = service.get(certificate_id)

View File

@ -52,24 +52,32 @@ class DestinationsList(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"items": [ "items": [{
{ "description": "test",
"destinationOptions": [ "options": [{
{
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
"value": 111111111112, "value": "111111111111111",
"helpMessage": "Must be a valid AWS account number!", "helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/", "validation": "/^[0-9]{12,12}$/",
"type": "int" "type": "str"
}],
"id": 4,
"plugin": {
"pluginOptions": [{
"name": "accountNumber",
"required": true,
"value": "111111111111111",
"helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/",
"type": "str"
}],
"description": "Allow the uploading of certificates to AWS IAM",
"slug": "aws-destination",
"title": "AWS"
},
"label": "test546"
} }
],
"pluginName": "aws-destination",
"id": 3,
"description": "test",
"label": "test"
}
],
"total": 1 "total": 1
} }
@ -77,7 +85,7 @@ class DestinationsList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int. default is 1 :query page: int. default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
""" """
@ -102,20 +110,30 @@ class DestinationsList(AuthenticatedResource):
Accept: application/json, text/javascript Accept: application/json, text/javascript
{ {
"destinationOptions": [ "description": "test33",
{ "options": [{
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
"value": 111111111112, "value": "34324324",
"helpMessage": "Must be a valid AWS account number!", "helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/", "validation": "/^[0-9]{12,12}$/",
"type": "int" "type": "str"
} }],
], "id": 4,
"pluginName": "aws-destination", "plugin": {
"id": 3, "pluginOptions": [{
"description": "test", "name": "accountNumber",
"label": "test" "required": true,
"value": "34324324",
"helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/",
"type": "str"
}],
"description": "Allow the uploading of certificates to AWS IAM",
"slug": "aws-destination",
"title": "AWS"
},
"label": "test546"
} }
**Example response**: **Example response**:
@ -127,20 +145,30 @@ class DestinationsList(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"destinationOptions": [ "description": "test33",
{ "options": [{
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
"value": 111111111112, "value": "34324324",
"helpMessage": "Must be a valid AWS account number!", "helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/", "validation": "/^[0-9]{12,12}$/",
"type": "int" "type": "str"
} }],
], "id": 4,
"pluginName": "aws-destination", "plugin": {
"id": 3, "pluginOptions": [{
"description": "test", "name": "accountNumber",
"label": "test" "required": true,
"value": "111111111111111",
"helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/",
"type": "str"
}],
"description": "Allow the uploading of certificates to AWS IAM",
"slug": "aws-destination",
"title": "AWS"
},
"label": "test546"
} }
:arg label: human readable account label :arg label: human readable account label
@ -180,20 +208,30 @@ class Destinations(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"destinationOptions": [ "description": "test",
{ "options": [{
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
"value": 111111111112, "value": "111111111111111",
"helpMessage": "Must be a valid AWS account number!", "helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/", "validation": "/^[0-9]{12,12}$/",
"type": "int" "type": "str"
} }],
], "id": 4,
"pluginName": "aws-destination", "plugin": {
"id": 3, "pluginOptions": [{
"description": "test", "name": "accountNumber",
"label": "test" "required": true,
"value": "111111111111111",
"helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/",
"type": "str"
}],
"description": "Allow the uploading of certificates to AWS IAM",
"slug": "aws-destination",
"title": "AWS"
},
"label": "test546"
} }
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
@ -217,23 +255,35 @@ class Destinations(AuthenticatedResource):
Host: example.com Host: example.com
Accept: application/json, text/javascript Accept: application/json, text/javascript
{ {
"destinationOptions": [ "description": "test33",
{ "options": [{
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
"value": 111111111112, "value": "34324324",
"helpMessage": "Must be a valid AWS account number!", "helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/", "validation": "/^[0-9]{12,12}$/",
"type": "int" "type": "str"
} }],
], "id": 4,
"pluginName": "aws-destination", "plugin": {
"id": 3, "pluginOptions": [{
"description": "test", "name": "accountNumber",
"label": "test" "required": true,
"value": "34324324",
"helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/",
"type": "str"
}],
"description": "Allow the uploading of certificates to AWS IAM",
"slug": "aws-destination",
"title": "AWS"
},
"label": "test546"
} }
**Example response**: **Example response**:
.. sourcecode:: http .. sourcecode:: http
@ -243,20 +293,30 @@ class Destinations(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"destinationOptions": [ "description": "test",
{ "options": [{
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
"value": 111111111112, "value": "111111111111111",
"helpMessage": "Must be a valid AWS account number!", "helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/", "validation": "/^[0-9]{12,12}$/",
"type": "int" "type": "str"
} }],
], "id": 4,
"pluginName": "aws-destination", "plugin": {
"id": 3, "pluginOptions": [{
"description": "test", "name": "accountNumber",
"label": "test" "required": true,
"value": "111111111111111",
"helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/",
"type": "str"
}],
"description": "Allow the uploading of certificates to AWS IAM",
"slug": "aws-destination",
"title": "AWS"
},
"label": "test546"
} }
:arg accountNumber: aws account number :arg accountNumber: aws account number
@ -302,24 +362,32 @@ class CertificateDestinations(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"items": [ "items": [{
{ "description": "test",
"destinationOptions": [ "options": [{
{
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
"value": 111111111112, "value": "111111111111111",
"helpMessage": "Must be a valid AWS account number!", "helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/", "validation": "/^[0-9]{12,12}$/",
"type": "int" "type": "str"
}],
"id": 4,
"plugin": {
"pluginOptions": [{
"name": "accountNumber",
"required": true,
"value": "111111111111111",
"helpMessage": "Must be a valid AWS account number!",
"validation": "/^[0-9]{12,12}$/",
"type": "str"
}],
"description": "Allow the uploading of certificates to AWS IAM",
"slug": "aws-destination",
"title": "AWS"
},
"label": "test546"
} }
],
"pluginName": "aws-destination",
"id": 3,
"description": "test",
"label": "test"
}
],
"total": 1 "total": 1
} }
@ -327,7 +395,7 @@ class CertificateDestinations(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
""" """

View File

@ -71,7 +71,7 @@ class DomainsList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number. default is 10 :query count: count number. default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
@ -118,7 +118,7 @@ class DomainsList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
@ -258,7 +258,7 @@ class CertificateDomains(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated

View File

@ -54,7 +54,7 @@ class NotificationsList(AuthenticatedResource):
"items": [ "items": [
{ {
"description": "An example", "description": "An example",
"notificationOptions": [ "options": [
{ {
"name": "interval", "name": "interval",
"required": true, "required": true,
@ -98,7 +98,7 @@ class NotificationsList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
""" """
@ -124,7 +124,7 @@ class NotificationsList(AuthenticatedResource):
{ {
"description": "a test", "description": "a test",
"notificationOptions": [ "options": [
{ {
"name": "interval", "name": "interval",
"required": true, "required": true,
@ -171,7 +171,7 @@ class NotificationsList(AuthenticatedResource):
{ {
"description": "a test", "description": "a test",
"notificationOptions": [ "options": [
{ {
"name": "interval", "name": "interval",
"required": true, "required": true,
@ -253,7 +253,7 @@ class Notifications(AuthenticatedResource):
{ {
"description": "a test", "description": "a test",
"notificationOptions": [ "options": [
{ {
"name": "interval", "name": "interval",
"required": true, "required": true,
@ -378,7 +378,7 @@ class CertificateNotifications(AuthenticatedResource):
"items": [ "items": [
{ {
"description": "An example", "description": "An example",
"notificationOptions": [ "options": [
{ {
"name": "interval", "name": "interval",
"required": true, "required": true,
@ -422,7 +422,7 @@ class CertificateNotifications(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
""" """

View File

@ -7,7 +7,7 @@
""" """
from marshmallow import fields from marshmallow import fields
from lemur.users.schemas import UserNestedOutputSchema from lemur.users.schemas import UserNestedOutputSchema
from lemur.authorities.schemas import AuthorityOutputSchema from lemur.authorities.schemas import AuthorityNestedOutputSchema
from lemur.common.schema import LemurInputSchema, LemurOutputSchema from lemur.common.schema import LemurInputSchema, LemurOutputSchema
from lemur.schemas import AssociatedUserSchema, AssociatedAuthoritySchema from lemur.schemas import AssociatedUserSchema, AssociatedAuthoritySchema
@ -26,7 +26,7 @@ class RoleOutputSchema(LemurOutputSchema):
id = fields.Integer() id = fields.Integer()
name = fields.String() name = fields.String()
description = fields.String() description = fields.String()
authorities = fields.Nested(AuthorityOutputSchema, many=True) authorities = fields.Nested(AuthorityNestedOutputSchema, many=True)
users = fields.Nested(UserNestedOutputSchema, many=True) users = fields.Nested(UserNestedOutputSchema, many=True)

View File

@ -73,7 +73,7 @@ class RolesList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
:statuscode 403: unauthenticated :statuscode 403: unauthenticated
@ -354,7 +354,7 @@ class UserRolesList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
""" """
@ -413,7 +413,7 @@ class AuthorityRolesList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
""" """

View File

@ -54,7 +54,7 @@ class SourcesList(AuthenticatedResource):
{ {
"items": [ "items": [
{ {
"sourceOptions": [ "options": [
{ {
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
@ -78,7 +78,7 @@ class SourcesList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
""" """
@ -103,7 +103,7 @@ class SourcesList(AuthenticatedResource):
Accept: application/json, text/javascript Accept: application/json, text/javascript
{ {
"sourceOptions": [ "options": [
{ {
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
@ -129,7 +129,7 @@ class SourcesList(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"sourceOptions": [ "options": [
{ {
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
@ -183,7 +183,7 @@ class Sources(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"sourceOptions": [ "options": [
{ {
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
@ -222,7 +222,7 @@ class Sources(AuthenticatedResource):
Accept: application/json, text/javascript Accept: application/json, text/javascript
{ {
"sourceOptions": [ "options": [
{ {
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
@ -248,7 +248,7 @@ class Sources(AuthenticatedResource):
Content-Type: text/javascript Content-Type: text/javascript
{ {
"sourceOptions": [ "options": [
{ {
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
@ -310,7 +310,7 @@ class CertificateSources(AuthenticatedResource):
{ {
"items": [ "items": [
{ {
"sourceOptions": [ "options": [
{ {
"name": "accountNumber", "name": "accountNumber",
"required": true, "required": true,
@ -334,7 +334,7 @@ class CertificateSources(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
""" """

View File

@ -78,7 +78,7 @@ class UsersList(AuthenticatedResource):
:query sortDir: acs or desc :query sortDir: acs or desc
:query page: int default is 1 :query page: int default is 1
:query filter: key value pair format is k;v :query filter: key value pair format is k;v
:query limit: limit number default is 10 :query count: count number default is 10
:reqheader Authorization: OAuth token to authenticate :reqheader Authorization: OAuth token to authenticate
:statuscode 200: no error :statuscode 200: no error
""" """