const express = require('express'); const router = express.Router(); const domainValidator = require('../validators/domain'); const authMw = require('../session'); const database = require('../database.js'); const dbConnection = database.db; const Sequelize = require('sequelize'); const pageTitle = 'Domain Manager | Edit DNS'; const { GetAllRecords, CoreDNSToDomain } = require('../coredns_bridge.js'); const { capitalizeFirstLetter } = require('../helpers.js'); const recordTypeMap = { "host": "A", "cname": "CNAME", "txt": "TXT", "mx": "MX", "srv": "SRV" } const supportedRecordTypes = [ "A", "CNAME", "TXT", "MX" ]; // Manage domains router.get('/dns/edit/:domainId', authMw.AllowIfAuthenticated, async (req, res, next) => { const result = await dbConnection.transaction(async(t) => { const ownedDomain = await database.models.RegisteredDomain.findOne({ where: { id: req.params.domainId, owner: req.session.userId } }, {transaction: t}); return ownedDomain; }); if(!result) return next(); const fullDomain = result.domain + "." + result.tld; const rawRecords = await GetAllRecords(fullDomain); let records = []; let recordHeaders = ["Type", "Name"]; for(const [key, value] of Object.entries(rawRecords)) { let parsedVal = JSON.parse(value); let finalRecord = {_key: key}; let recordType = undefined; for(const [key, value] of Object.entries(parsedVal)) { if(recordTypeMap[key] !== undefined) { finalRecord["Type"] = recordTypeMap[key]; break; } } finalRecord["Name"] = CoreDNSToDomain(key); if(recordType === undefined) { console.warn("Unknown record type!"); } for(const [key, value] of Object.entries(parsedVal)) { if(!recordHeaders.includes(key) && key !== '_key') { recordHeaders.push(capitalizeFirstLetter(key)); } finalRecord[key] = value; } records.push(finalRecord); } res.render('dns', {title: pageTitle, domain: result, dnsRecords: records, dnsRecordsHeaders: recordHeaders}); }); // Add new DNS record router.get('/dns/new/:domainId', authMw.AllowIfAuthenticated, async (req, res, next) => { const result = await dbConnection.transaction(async(t) => { const ownedDomain = await database.models.RegisteredDomain.findOne({ where: { id: req.params.domainId, owner: req.session.userId } }, {transaction: t}); return ownedDomain; }); if(!result) return next(); const fullDomain = result.domain + "." + result.tld; res.render('newdns', {title: pageTitle, domain: result, supportedRecordTypes: supportedRecordTypes}); }); module.exports = router;