blob: 97241f34b4889c303202a228422d25b80a7bb1ca [file] [log] [blame]
SurenNeware61859092020-10-01 09:37:32 +05301import api from '@/store/api';
2import i18n from '@/i18n';
Yoshie Muranaka37393812020-03-24 15:25:24 -07003
Yoshie Muranaka532a4b02020-03-27 11:00:50 -07004export const CERTIFICATE_TYPES = [
Yoshie Muranaka37393812020-03-24 15:25:24 -07005 {
6 type: 'HTTPS Certificate',
7 location: '/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates/',
Sandeepa Singhb4406162021-07-26 15:05:39 +05308 label: i18n.t('pageCertificates.httpsCertificate'),
Yoshie Muranaka37393812020-03-24 15:25:24 -07009 },
10 {
11 type: 'LDAP Certificate',
12 location: '/redfish/v1/AccountService/LDAP/Certificates/',
Sandeepa Singhb4406162021-07-26 15:05:39 +053013 label: i18n.t('pageCertificates.ldapCertificate'),
Yoshie Muranaka37393812020-03-24 15:25:24 -070014 },
15 {
16 type: 'TrustStore Certificate',
17 location: '/redfish/v1/Managers/bmc/Truststore/Certificates/',
18 // Web UI will show 'CA Certificate' instead of
19 // 'TrustStore Certificate' after user testing revealed
20 // the term 'TrustStore Certificate' wasn't recognized/was unfamilar
Sandeepa Singhb4406162021-07-26 15:05:39 +053021 label: i18n.t('pageCertificates.caCertificate'),
Derick Montague602e98a2020-10-21 16:20:00 -050022 },
Yoshie Muranaka37393812020-03-24 15:25:24 -070023];
24
25const getCertificateProp = (type, prop) => {
26 const certificate = CERTIFICATE_TYPES.find(
Derick Montague602e98a2020-10-21 16:20:00 -050027 (certificate) => certificate.type === type
Yoshie Muranaka37393812020-03-24 15:25:24 -070028 );
29 return certificate ? certificate[prop] : null;
30};
31
Sandeepa Singhb4406162021-07-26 15:05:39 +053032const CertificatesStore = {
Yoshie Muranaka37393812020-03-24 15:25:24 -070033 namespaced: true,
34 state: {
35 allCertificates: [],
Derick Montague602e98a2020-10-21 16:20:00 -050036 availableUploadTypes: [],
Yoshie Muranaka37393812020-03-24 15:25:24 -070037 },
38 getters: {
Derick Montague602e98a2020-10-21 16:20:00 -050039 allCertificates: (state) => state.allCertificates,
40 availableUploadTypes: (state) => state.availableUploadTypes,
Yoshie Muranaka37393812020-03-24 15:25:24 -070041 },
42 mutations: {
43 setCertificates(state, certificates) {
44 state.allCertificates = certificates;
45 },
46 setAvailableUploadTypes(state, availableUploadTypes) {
47 state.availableUploadTypes = availableUploadTypes;
Derick Montague602e98a2020-10-21 16:20:00 -050048 },
Yoshie Muranaka37393812020-03-24 15:25:24 -070049 },
50 actions: {
Yoshie Muranakae5be9ba2020-04-30 10:13:40 -070051 async getCertificates({ commit }) {
52 return await api
Yoshie Muranaka37393812020-03-24 15:25:24 -070053 .get('/redfish/v1/CertificateService/CertificateLocations')
54 .then(({ data: { Links: { Certificates } } }) =>
Derick Montague602e98a2020-10-21 16:20:00 -050055 Certificates.map((certificate) => certificate['@odata.id'])
Yoshie Muranaka37393812020-03-24 15:25:24 -070056 )
Derick Montague602e98a2020-10-21 16:20:00 -050057 .then((certificateLocations) => {
58 const promises = certificateLocations.map((location) =>
Yoshie Muranaka37393812020-03-24 15:25:24 -070059 api.get(location)
60 );
61 api.all(promises).then(
62 api.spread((...responses) => {
63 const certificates = responses.map(({ data }) => {
64 const {
65 Name,
66 ValidNotAfter,
67 ValidNotBefore,
68 Issuer = {},
Derick Montague602e98a2020-10-21 16:20:00 -050069 Subject = {},
Yoshie Muranaka37393812020-03-24 15:25:24 -070070 } = data;
71 return {
72 type: Name,
73 location: data['@odata.id'],
74 certificate: getCertificateProp(Name, 'label'),
75 issuedBy: Issuer.CommonName,
76 issuedTo: Subject.CommonName,
77 validFrom: new Date(ValidNotBefore),
Derick Montague602e98a2020-10-21 16:20:00 -050078 validUntil: new Date(ValidNotAfter),
Yoshie Muranaka37393812020-03-24 15:25:24 -070079 };
80 });
81 const availableUploadTypes = CERTIFICATE_TYPES.filter(
82 ({ type }) =>
83 !certificates
Derick Montague602e98a2020-10-21 16:20:00 -050084 .map((certificate) => certificate.type)
Yoshie Muranaka37393812020-03-24 15:25:24 -070085 .includes(type)
86 );
87
88 commit('setCertificates', certificates);
89 commit('setAvailableUploadTypes', availableUploadTypes);
90 })
91 );
92 });
93 },
94 async addNewCertificate({ dispatch }, { file, type }) {
95 return await api
96 .post(getCertificateProp(type, 'location'), file, {
Derick Montague602e98a2020-10-21 16:20:00 -050097 headers: { 'Content-Type': 'application/x-pem-file' },
Yoshie Muranaka37393812020-03-24 15:25:24 -070098 })
99 .then(() => dispatch('getCertificates'))
100 .then(() =>
Sandeepa Singhb4406162021-07-26 15:05:39 +0530101 i18n.t('pageCertificates.toast.successAddCertificate', {
Derick Montague602e98a2020-10-21 16:20:00 -0500102 certificate: getCertificateProp(type, 'label'),
Yoshie Muranaka37393812020-03-24 15:25:24 -0700103 })
104 )
Derick Montague602e98a2020-10-21 16:20:00 -0500105 .catch((error) => {
Yoshie Muranaka37393812020-03-24 15:25:24 -0700106 console.log(error);
Sandeepa Singhb4406162021-07-26 15:05:39 +0530107 throw new Error(i18n.t('pageCertificates.toast.errorAddCertificate'));
Yoshie Muranaka37393812020-03-24 15:25:24 -0700108 });
109 },
110 async replaceCertificate(
111 { dispatch },
112 { certificateString, location, type }
113 ) {
114 const data = {};
115 data.CertificateString = certificateString;
116 data.CertificateType = 'PEM';
117 data.CertificateUri = { '@odata.id': location };
118
119 return await api
120 .post(
121 '/redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate',
122 data
123 )
124 .then(() => dispatch('getCertificates'))
125 .then(() =>
Sandeepa Singhb4406162021-07-26 15:05:39 +0530126 i18n.t('pageCertificates.toast.successReplaceCertificate', {
Derick Montague602e98a2020-10-21 16:20:00 -0500127 certificate: getCertificateProp(type, 'label'),
Yoshie Muranaka37393812020-03-24 15:25:24 -0700128 })
129 )
Derick Montague602e98a2020-10-21 16:20:00 -0500130 .catch((error) => {
Yoshie Muranaka37393812020-03-24 15:25:24 -0700131 console.log(error);
132 throw new Error(
Sandeepa Singhb4406162021-07-26 15:05:39 +0530133 i18n.t('pageCertificates.toast.errorReplaceCertificate')
Yoshie Muranaka37393812020-03-24 15:25:24 -0700134 );
135 });
136 },
137 async deleteCertificate({ dispatch }, { type, location }) {
138 return await api
139 .delete(location)
140 .then(() => dispatch('getCertificates'))
141 .then(() =>
Sandeepa Singhb4406162021-07-26 15:05:39 +0530142 i18n.t('pageCertificates.toast.successDeleteCertificate', {
Derick Montague602e98a2020-10-21 16:20:00 -0500143 certificate: getCertificateProp(type, 'label'),
Yoshie Muranaka37393812020-03-24 15:25:24 -0700144 })
145 )
Derick Montague602e98a2020-10-21 16:20:00 -0500146 .catch((error) => {
Yoshie Muranaka37393812020-03-24 15:25:24 -0700147 console.log(error);
148 throw new Error(
Sandeepa Singhb4406162021-07-26 15:05:39 +0530149 i18n.t('pageCertificates.toast.errorDeleteCertificate')
Yoshie Muranaka37393812020-03-24 15:25:24 -0700150 );
151 });
Yoshie Muranaka532a4b02020-03-27 11:00:50 -0700152 },
153 async generateCsr(_, userData) {
154 const {
155 certificateType,
156 country,
157 state,
158 city,
159 companyName,
160 companyUnit,
161 commonName,
162 keyPairAlgorithm,
163 keyBitLength,
164 keyCurveId,
165 challengePassword,
166 contactPerson,
167 emailAddress,
Derick Montague602e98a2020-10-21 16:20:00 -0500168 alternateName,
Yoshie Muranaka532a4b02020-03-27 11:00:50 -0700169 } = userData;
170 const data = {};
171
172 data.CertificateCollection = {
Derick Montague602e98a2020-10-21 16:20:00 -0500173 '@odata.id': getCertificateProp(certificateType, 'location'),
Yoshie Muranaka532a4b02020-03-27 11:00:50 -0700174 };
175 data.Country = country;
176 data.State = state;
177 data.City = city;
178 data.Organization = companyName;
179 data.OrganizationalUnit = companyUnit;
180 data.CommonName = commonName;
181 data.KeyPairAlgorithm = keyPairAlgorithm;
182 data.AlternativeNames = alternateName;
183
184 if (keyCurveId) data.KeyCurveId = keyCurveId;
185 if (keyBitLength) data.KeyBitLength = keyBitLength;
186 if (challengePassword) data.ChallengePassword = challengePassword;
187 if (contactPerson) data.ContactPerson = contactPerson;
188 if (emailAddress) data.Email = emailAddress;
189
190 return await api
191 .post(
192 '/redfish/v1/CertificateService/Actions/CertificateService.GenerateCSR',
193 data
194 )
195 //TODO: Success response also throws error so
196 // can't accurately show legitimate error in UI
Derick Montague602e98a2020-10-21 16:20:00 -0500197 .catch((error) => console.log(error));
198 },
199 },
Yoshie Muranaka37393812020-03-24 15:25:24 -0700200};
201
Sandeepa Singhb4406162021-07-26 15:05:39 +0530202export default CertificatesStore;