diff --git a/ui/app/adapters/pki/certificate.js b/ui/app/adapters/pki/certificate.js
deleted file mode 100644
index 1c88c8979c..0000000000
--- a/ui/app/adapters/pki/certificate.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import PkiCertAdapter from './cert';
-
-export default class PkiCertificateAdapter extends PkiCertAdapter {}
diff --git a/ui/app/adapters/pki/certificate/base.js b/ui/app/adapters/pki/certificate/base.js
index c95f678dde..b36bb17320 100644
--- a/ui/app/adapters/pki/certificate/base.js
+++ b/ui/app/adapters/pki/certificate/base.js
@@ -4,10 +4,46 @@ import ApplicationAdapter from '../../application';
export default class PkiCertificateBaseAdapter extends ApplicationAdapter {
namespace = 'v1';
- deleteRecord(store, type, snapshot) {
+ getURL(backend, id) {
+ const uri = `${this.buildURL()}/${encodePath(backend)}`;
+ return id ? `${uri}/cert/${id}` : `${uri}/certs`;
+ }
+
+ fetchByQuery(query) {
+ const { backend, id } = query;
+ const data = !id ? { list: true } : {};
+ return this.ajax(this.getURL(backend, id), 'GET', { data }).then((resp) => {
+ resp.data.backend = backend;
+ if (id) {
+ resp.data.id = id;
+ resp.data.serial_number = id;
+ }
+ return resp;
+ });
+ }
+
+ query(store, type, query) {
+ return this.fetchByQuery(query);
+ }
+
+ queryRecord(store, type, query) {
+ return this.fetchByQuery(query);
+ }
+
+ // the only way to update a record is by revoking it which will set the revocationTime property
+ updateRecord(store, type, snapshot) {
const { backend, serialNumber, certificate } = snapshot.record;
// Revoke certificate requires either serial_number or certificate
const data = serialNumber ? { serial_number: serialNumber } : { certificate };
- return this.ajax(`${this.buildURL()}/${encodePath(backend)}/revoke`, 'POST', { data });
+ return this.ajax(`${this.buildURL()}/${encodePath(backend)}/revoke`, 'POST', { data }).then(
+ (response) => {
+ return {
+ data: {
+ ...this.serialize(snapshot),
+ ...response.data,
+ },
+ };
+ }
+ );
}
}
diff --git a/ui/app/models/pki/certificate/base.js b/ui/app/models/pki/certificate/base.js
index 517b70cf7e..3453167e8c 100644
--- a/ui/app/models/pki/certificate/base.js
+++ b/ui/app/models/pki/certificate/base.js
@@ -11,7 +11,15 @@ import lazyCapabilities, { apiPath } from 'vault/macros/lazy-capabilities';
* attributes and adapter methods.
*/
-const certDisplayFields = ['certificate', 'commonName', 'serialNumber', 'notValidAfter', 'notValidBefore'];
+const certDisplayFields = [
+ 'certificate',
+ 'commonName',
+ 'revocationTime',
+ 'issueDate',
+ 'serialNumber',
+ 'notValidBefore',
+ 'notValidAfter',
+];
@withFormFields(certDisplayFields)
export default class PkiCertificateBaseModel extends Model {
@@ -31,16 +39,18 @@ export default class PkiCertificateBaseModel extends Model {
// Attrs that come back from API POST request
@attr() caChain;
- @attr('string') certificate;
+ @attr('string', { masked: true }) certificate;
@attr('number') expiration;
+ @attr('number', { formatDate: true }) revocationTime;
@attr('string') issuingCa;
@attr('string') privateKey;
@attr('string') privateKeyType;
@attr('string') serialNumber;
// Parsed from cert in serializer
- @attr('date') notValidAfter;
- @attr('date') notValidBefore;
+ @attr('number', { formatDate: true }) issueDate;
+ @attr('number', { formatDate: true }) notValidAfter;
+ @attr('number', { formatDate: true }) notValidBefore;
// For importing
@attr('string') pemBundle;
diff --git a/ui/app/serializers/pki/certificate/base.js b/ui/app/serializers/pki/certificate/base.js
new file mode 100644
index 0000000000..30e904ae7d
--- /dev/null
+++ b/ui/app/serializers/pki/certificate/base.js
@@ -0,0 +1,31 @@
+import { parseCertificate } from 'vault/helpers/parse-pki-cert';
+import ApplicationSerializer from '../../application';
+
+export default class PkiCertificateBaseSerializer extends ApplicationSerializer {
+ primaryKey = 'serial_number';
+
+ attrs = {
+ role: { serialize: false },
+ };
+
+ normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ if (payload.data.certificate) {
+ // Parse certificate back from the API and add to payload
+ const parsedCert = parseCertificate(payload.data.certificate);
+ // convert issueDate to same format as other date values
+ // this can be moved into the parseCertificate helper once the old pki implementation is removed
+ if (parsedCert.issue_date) {
+ parsedCert.issue_date = parsedCert.issue_date.valueOf();
+ }
+ const json = super.normalizeResponse(
+ store,
+ primaryModelClass,
+ { ...payload, ...parsedCert },
+ id,
+ requestType
+ );
+ return json;
+ }
+ return super.normalizeResponse(...arguments);
+ }
+}
diff --git a/ui/app/serializers/pki/certificate/generate.js b/ui/app/serializers/pki/certificate/generate.js
index fb06f8e8cd..332504f672 100644
--- a/ui/app/serializers/pki/certificate/generate.js
+++ b/ui/app/serializers/pki/certificate/generate.js
@@ -1,25 +1,3 @@
-import { parseCertificate } from 'vault/helpers/parse-pki-cert';
-import ApplicationSerializer from '../../application';
+import PkiCertificateBaseSerializer from './base';
-export default class PkiCertificateGenerateSerializer extends ApplicationSerializer {
- primaryKey = 'serial_number';
- attrs = {
- role: { serialize: false },
- };
-
- normalizeResponse(store, primaryModelClass, payload, id, requestType) {
- if (requestType === 'createRecord' && payload.data.certificate) {
- // Parse certificate back from the API and add to payload
- const parsedCert = parseCertificate(payload.data.certificate);
- const json = super.normalizeResponse(
- store,
- primaryModelClass,
- { ...payload, ...parsedCert },
- id,
- requestType
- );
- return json;
- }
- return super.normalizeResponse(...arguments);
- }
-}
+export default class PkiCertificateGenerateSerializer extends PkiCertificateBaseSerializer {}
diff --git a/ui/app/serializers/pki/certificate/sign.js b/ui/app/serializers/pki/certificate/sign.js
index 367c6398a6..332504f672 100644
--- a/ui/app/serializers/pki/certificate/sign.js
+++ b/ui/app/serializers/pki/certificate/sign.js
@@ -1,25 +1,3 @@
-import { parseCertificate } from 'vault/helpers/parse-pki-cert';
-import ApplicationSerializer from '../../application';
+import PkiCertificateBaseSerializer from './base';
-export default class PkiCertificateSignSerializer extends ApplicationSerializer {
- primaryKey = 'serial_number';
- attrs = {
- type: { serialize: false },
- };
-
- normalizeResponse(store, primaryModelClass, payload, id, requestType) {
- if (requestType === 'createRecord' && payload.data.certificate) {
- // Parse certificate back from the API and add to payload
- const parsedCert = parseCertificate(payload.data.certificate);
- const json = super.normalizeResponse(
- store,
- primaryModelClass,
- { ...payload, ...parsedCert },
- id,
- requestType
- );
- return json;
- }
- return super.normalizeResponse(...arguments);
- }
-}
+export default class PkiCertificateGenerateSerializer extends PkiCertificateBaseSerializer {}
diff --git a/ui/lib/pki/addon/components/page/pki-certificate-details.hbs b/ui/lib/pki/addon/components/page/pki-certificate-details.hbs
new file mode 100644
index 0000000000..2394ee70d0
--- /dev/null
+++ b/ui/lib/pki/addon/components/page/pki-certificate-details.hbs
@@ -0,0 +1,55 @@
+{{@model.serialNumber}}
+