import axios, { AxiosResponse } from 'axios'; import { Route, Server } from '../../../class'; import { X509Certificate } from '../../../commands/x509'; import { PGPKey, PublicKeyAlgorithm } from '../../../commands/pgp'; export default class Keys extends Route { constructor(server: Server) { super(server); this.conf = { path: '/keys', }; } public bind() { this.router.all('*', (_req, res, next) => { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', '*'); res.setHeader('Access-Control-Allow-Headers', '*'); next(); }); this.router.get('/x509/:userID', async (req, res) => { const memberDoc = await this.server.client.db.Member.findOne({ userID: req.params.userID }).lean().exec(); const member = this.mainGuild.members.get(req.params.userID); if (!member || !memberDoc || !memberDoc?.x509) return res.status(404).json({ code: this.constants.codes.NOT_FOUND, message: this.constants.messages.NOT_FOUND }); return res.status(200).send(memberDoc.x509); }); this.router.get('/pgp/:userID', async (req, res) => { const memberDoc = await this.server.client.db.Member.findOne({ userID: req.params.userID }).lean().exec(); const member = this.mainGuild.members.get(req.params.userID); if (!member || !memberDoc || !memberDoc?.pgp) return res.status(404).json({ code: this.constants.codes.NOT_FOUND, message: this.constants.messages.NOT_FOUND }); return res.status(200).send(memberDoc.pgp); }); // this.router.get('/confirm/pgp/:jwt', async (req, res) => { // const data: { pgp: string, userID: string } = jwt.verify(req.params.jwt, this.server.client.config.internalKey); // }) this.router.get('/~/x509/:userID', async (req, res) => { const memberDoc = await this.server.client.db.Member.findOne({ userID: req.params.userID }).lean().exec(); const member = this.mainGuild.members.get(req.params.userID); if (!member || !memberDoc || !memberDoc?.x509) return res.status(404).json({ code: this.constants.codes.NOT_FOUND, message: this.constants.messages.NOT_FOUND }); const x509: AxiosResponse = await axios.post('https://certapi.libraryofcode.org/parse', memberDoc.x509); res.status(200).send(`

Discord Username + Discriminator ${member.username}#${member.discriminator} (${member.id})

Common Name: ${x509.data.subject.commonName}

Email Address: ${x509.data.emailAddresses[0]}

Expires on: ${new Date(x509.data.notAfter).toLocaleString('en-us')}

Public Key Algorithm ${x509.data.publicKeyAlgorithm}

Key Bit Length ${x509.data.bitLength}

Signature Algorithm ${x509.data.signatureAlgorithm}

Serial Number ${x509.data.serialNumber}

Fingerprint ${x509.data.fingerprint}

Issuer: ${x509.data.issuer.organization} (${x509.data.issuer.commonName})




${memberDoc.x509.replace(/(?:\r\n|\r|\n)/g, '
')} `); }); this.router.get('/~/pgp/:userID', async (req, res) => { const memberDoc = await this.server.client.db.Member.findOne({ userID: req.params.userID }).lean().exec(); const member = this.mainGuild.members.get(req.params.userID); if (!member || !memberDoc || !memberDoc?.pgp) return res.status(404).json({ code: this.constants.codes.NOT_FOUND, message: this.constants.messages.NOT_FOUND }); const pgp: AxiosResponse = await axios.post('https://certapi.libraryofcode.org/pgp', memberDoc.pgp); let algo: string; switch (pgp.data.publicKeyAlgorithm) { case PublicKeyAlgorithm.DSA: algo = 'DSA'; break; case PublicKeyAlgorithm.ECDH: algo = 'ECDH'; break; case PublicKeyAlgorithm.ECDSA: algo = 'ECDSA'; break; case PublicKeyAlgorithm.ElGamal: algo = 'ElGamal'; break; case PublicKeyAlgorithm.RSA: algo = 'RSA'; break; default: algo = 'N/A'; break; } res.status(200).send(`

Discord Username + Discriminator ${member.username}#${member.discriminator} (${member.id})

Name: ${pgp.data.name}

Email Address: ${pgp.data.email}

Comment: ${pgp.data.comment}

Public Key Algorithm: ${algo}

Key ID: ${pgp.data.keyID}

Fingerprint: ${pgp.data.fingerprint}




${memberDoc.pgp.replace(/(?:\r\n|\r|\n)/g, '
')} `); }); } }