blob: 3583d7f1e174c10d77d5c15a9b430ae23f594085 [file] [log] [blame]
import api from '@/store/api';
import i18n from '@/i18n';
export const CERTIFICATE_TYPES = [
{
type: 'HTTPS Certificate',
location: '/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates/',
label: i18n.t('pageCertificates.httpsCertificate'),
},
{
type: 'LDAP Certificate',
location: '/redfish/v1/AccountService/LDAP/Certificates/',
label: i18n.t('pageCertificates.ldapCertificate'),
},
{
type: 'TrustStore Certificate',
location: '/redfish/v1/Managers/bmc/Truststore/Certificates/',
// Web UI will show 'CA Certificate' instead of
// 'TrustStore Certificate' after user testing revealed
// the term 'TrustStore Certificate' wasn't recognized/was unfamilar
label: i18n.t('pageCertificates.caCertificate'),
},
];
const getCertificateProp = (type, prop) => {
const certificate = CERTIFICATE_TYPES.find(
(certificate) => certificate.type === type,
);
return certificate ? certificate[prop] : null;
};
const CertificatesStore = {
namespaced: true,
state: {
allCertificates: [],
availableUploadTypes: [],
},
getters: {
allCertificates: (state) => state.allCertificates,
availableUploadTypes: (state) => state.availableUploadTypes,
},
mutations: {
setCertificates(state, certificates) {
state.allCertificates = certificates;
},
setAvailableUploadTypes(state, availableUploadTypes) {
state.availableUploadTypes = availableUploadTypes;
},
},
actions: {
async getCertificates({ commit }) {
return await api
.get('/redfish/v1/CertificateService/CertificateLocations')
.then(
({
data: {
Links: { Certificates },
},
}) => Certificates.map((certificate) => certificate['@odata.id']),
)
.then((certificateLocations) => {
const promises = certificateLocations.map((location) =>
api.get(location),
);
api.all(promises).then(
api.spread((...responses) => {
const certificates = responses.map(({ data }) => {
const {
Name,
ValidNotAfter,
ValidNotBefore,
Issuer = {},
Subject = {},
} = data;
return {
type: Name,
location: data['@odata.id'],
certificate: getCertificateProp(Name, 'label'),
issuedBy: Issuer.CommonName,
issuedTo: Subject.CommonName,
validFrom: new Date(ValidNotBefore),
validUntil: new Date(ValidNotAfter),
};
});
const availableUploadTypes = CERTIFICATE_TYPES.filter(
({ type }) =>
!certificates
.map((certificate) => certificate.type)
.includes(type),
);
commit('setCertificates', certificates);
commit('setAvailableUploadTypes', availableUploadTypes);
}),
);
});
},
async addNewCertificate({ dispatch }, { file, type }) {
return await api
.post(getCertificateProp(type, 'location'), file, {
headers: { 'Content-Type': 'application/x-pem-file' },
})
.then(() => dispatch('getCertificates'))
.then(() =>
i18n.t('pageCertificates.toast.successAddCertificate', {
certificate: getCertificateProp(type, 'label'),
}),
)
.catch((error) => {
console.log(error);
throw new Error(i18n.t('pageCertificates.toast.errorAddCertificate'));
});
},
async replaceCertificate(
{ dispatch },
{ certificateString, location, type },
) {
const data = {};
data.CertificateString = certificateString;
data.CertificateType = 'PEM';
data.CertificateUri = { '@odata.id': location };
return await api
.post(
'/redfish/v1/CertificateService/Actions/CertificateService.ReplaceCertificate',
data,
)
.then(() => dispatch('getCertificates'))
.then(() =>
i18n.t('pageCertificates.toast.successReplaceCertificate', {
certificate: getCertificateProp(type, 'label'),
}),
)
.catch((error) => {
console.log(error);
throw new Error(
i18n.t('pageCertificates.toast.errorReplaceCertificate'),
);
});
},
async deleteCertificate({ dispatch }, { type, location }) {
return await api
.delete(location)
.then(() => dispatch('getCertificates'))
.then(() =>
i18n.t('pageCertificates.toast.successDeleteCertificate', {
certificate: getCertificateProp(type, 'label'),
}),
)
.catch((error) => {
console.log(error);
throw new Error(
i18n.t('pageCertificates.toast.errorDeleteCertificate'),
);
});
},
async generateCsr(_, userData) {
const {
certificateType,
country,
state,
city,
companyName,
companyUnit,
commonName,
keyPairAlgorithm,
keyBitLength,
keyCurveId,
challengePassword,
contactPerson,
emailAddress,
alternateName,
} = userData;
const data = {};
data.CertificateCollection = {
'@odata.id': getCertificateProp(certificateType, 'location'),
};
data.Country = country;
data.State = state;
data.City = city;
data.Organization = companyName;
data.OrganizationalUnit = companyUnit;
data.CommonName = commonName;
data.KeyPairAlgorithm = keyPairAlgorithm;
data.AlternativeNames = alternateName;
if (keyCurveId) data.KeyCurveId = keyCurveId;
if (keyBitLength) data.KeyBitLength = keyBitLength;
if (challengePassword) data.ChallengePassword = challengePassword;
if (contactPerson) data.ContactPerson = contactPerson;
if (emailAddress) data.Email = emailAddress;
return await api
.post(
'/redfish/v1/CertificateService/Actions/CertificateService.GenerateCSR',
data,
)
//TODO: Success response also throws error so
// can't accurately show legitimate error in UI
.catch((error) => console.log(error));
},
},
};
export default CertificatesStore;