import React, { useState, useEffect } from 'react';
import Head from 'next/head';
import BackButton from '../components/BackButton.js';
import ErrorAlert from '../components/ErrorAlert.js';
import * as API from '../api.js'
import { useRouter } from 'next/router';
export default function Certs(props) {
const router = useRouter();
const [state, dispatch] = useState(props);
const [error, setError] = useState();
useEffect(() => {
if (!state.user) {
API.getCerts(dispatch, setError, router);
}
}, [state.user, router]);
if (!state.user) {
return (
);
}
const { user, csrf, dbCerts, clusterCerts } = state;
async function addCert(e) {
e.preventDefault();
await API.addCert({
_csrf: csrf,
subject: e.target.subject.value,
altnames: e.target.altnames.value.split(',').map(x => x.trim())
}, dispatch, setError, router);
await API.getCerts(dispatch, setError, router);
}
async function deleteCert(e) {
e.preventDefault();
await API.deleteCert({ _csrf: csrf, subject: e.target.subject.value }, dispatch, setError, router);
await API.getCerts(dispatch, setError, router);
}
async function uploadCert(e) {
e.preventDefault();
await API.uploadCert({ _csrf: csrf, domain: e.target.domain.value }, dispatch, setError, router);
await API.getCerts(dispatch, setError, router);
}
const clusterOnlyCerts = clusterCerts
.filter(c => !dbCerts.some(dc => dc.storageName === c.storage_name))
.filter(c => c.storage_name !== 'server-cert.pem'); //no point showing this
const clusterOnlyCertList = clusterOnlyCerts.map((c, i) => {
const approxSubject = c.storage_name
.replace('_', '.')
.substr(0, c.storage_name.length-4);
return (
{/*TODO: delete non-db cert */}
|
{approxSubject || '-'}
|
-
|
-
|
{c.storage_name || '-'}
|
);
});
const certList = dbCerts.map((d, i) => {
//TODO: refactor, to component
let creation = new Date(d.date);
const expiry = creation.setDate(creation.getDate()+90);
const daysRemaining = (Math.floor(expiry - Date.now()) / 86400000).toFixed(1);
const inCluster = clusterCerts.some(c => c.storage_name === d.storageName);
return (
{inCluster
? ()
: ()
}
|
{d.subject || '-'}
|
|
{expiry ? `${daysRemaining} days` : '-'}
|
{d.storageName || '-'}
|
);
});
return (
<>
Certificates
{error && }
HTTPS Certificates:
{/* Certs table */}
|
Subject
|
Altname(s)
|
Expires
|
Storage Name
|
{certList}
{clusterOnlyCerts && clusterOnlyCerts.length > 0 && (<>
Not in local DB:
|
{clusterOnlyCertList}
>)}
{/* Add new cert form */}
|
|
{/* back to account */}
>
);
};
export async function getServerSideProps({ req, res, query, resolvedUrl, locale, locales, defaultLocale}) {
return { props: { user: res.locals.user || null, ...query } }
};