| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- import _ from "lodash";
- import { castJsonIfNeed } from "../lib/helpers.js";
- import deadHostModel from "../models/dead_host.js";
- import proxyHostModel from "../models/proxy_host.js";
- import redirectionHostModel from "../models/redirection_host.js";
- const internalHost = {
- /**
- * Makes sure that the ssl_* and hsts_* fields play nicely together.
- * ie: if there is no cert, then force_ssl is off.
- * if force_ssl is off, then hsts_enabled is definitely off.
- *
- * @param {object} data
- * @param {object} [existing_data]
- * @returns {object}
- */
- cleanSslHstsData: (data, existingData) => {
- const combinedData = _.assign({}, existingData || {}, data);
- if (!combinedData.certificate_id) {
- combinedData.ssl_forced = false;
- combinedData.http2_support = false;
- }
- if (!combinedData.ssl_forced) {
- combinedData.hsts_enabled = false;
- }
- if (!combinedData.hsts_enabled) {
- combinedData.hsts_subdomains = false;
- }
- return combinedData;
- },
- /**
- * used by the getAll functions of hosts, this removes the certificate meta if present
- *
- * @param {Array} rows
- * @returns {Array}
- */
- cleanAllRowsCertificateMeta: (rows) => {
- rows.map((_, idx) => {
- if (typeof rows[idx].certificate !== "undefined" && rows[idx].certificate) {
- rows[idx].certificate.meta = {};
- }
- return true;
- });
- return rows;
- },
- /**
- * used by the get/update functions of hosts, this removes the certificate meta if present
- *
- * @param {Object} row
- * @returns {Object}
- */
- cleanRowCertificateMeta: (row) => {
- if (typeof row.certificate !== "undefined" && row.certificate) {
- row.certificate.meta = {};
- }
- return row;
- },
- /**
- * This returns all the host types with any domain listed in the provided domainNames array.
- * This is used by the certificates to temporarily disable any host that is using the domain
- *
- * @param {Array} domainNames
- * @returns {Promise}
- */
- getHostsWithDomains: async (domainNames) => {
- const responseObject = {
- total_count: 0,
- dead_hosts: [],
- proxy_hosts: [],
- redirection_hosts: [],
- };
- const proxyRes = await proxyHostModel.query().where("is_deleted", 0);
- responseObject.proxy_hosts = internalHost._getHostsWithDomains(proxyRes, domainNames);
- responseObject.total_count += responseObject.proxy_hosts.length;
- const redirRes = await redirectionHostModel.query().where("is_deleted", 0);
- responseObject.redirection_hosts = internalHost._getHostsWithDomains(redirRes, domainNames);
- responseObject.total_count += responseObject.redirection_hosts.length;
- const deadRes = await deadHostModel.query().where("is_deleted", 0);
- responseObject.dead_hosts = internalHost._getHostsWithDomains(deadRes, domainNames);
- responseObject.total_count += responseObject.dead_hosts.length;
- return responseObject;
- },
- /**
- * Internal use only, checks to see if the domain is already taken by any other record
- *
- * @param {String} hostname
- * @param {String} [ignore_type] 'proxy', 'redirection', 'dead'
- * @param {Integer} [ignore_id] Must be supplied if type was also supplied
- * @returns {Promise}
- */
- isHostnameTaken: (hostname, ignore_type, ignore_id) => {
- const promises = [
- proxyHostModel
- .query()
- .where("is_deleted", 0)
- .andWhere(castJsonIfNeed("domain_names"), "like", `%${hostname}%`),
- redirectionHostModel
- .query()
- .where("is_deleted", 0)
- .andWhere(castJsonIfNeed("domain_names"), "like", `%${hostname}%`),
- deadHostModel
- .query()
- .where("is_deleted", 0)
- .andWhere(castJsonIfNeed("domain_names"), "like", `%${hostname}%`),
- ];
- return Promise.all(promises).then((promises_results) => {
- let is_taken = false;
- if (promises_results[0]) {
- // Proxy Hosts
- if (
- internalHost._checkHostnameRecordsTaken(
- hostname,
- promises_results[0],
- ignore_type === "proxy" && ignore_id ? ignore_id : 0,
- )
- ) {
- is_taken = true;
- }
- }
- if (promises_results[1]) {
- // Redirection Hosts
- if (
- internalHost._checkHostnameRecordsTaken(
- hostname,
- promises_results[1],
- ignore_type === "redirection" && ignore_id ? ignore_id : 0,
- )
- ) {
- is_taken = true;
- }
- }
- if (promises_results[2]) {
- // Dead Hosts
- if (
- internalHost._checkHostnameRecordsTaken(
- hostname,
- promises_results[2],
- ignore_type === "dead" && ignore_id ? ignore_id : 0,
- )
- ) {
- is_taken = true;
- }
- }
- return {
- hostname: hostname,
- is_taken: is_taken,
- };
- });
- },
- /**
- * Private call only
- *
- * @param {String} hostname
- * @param {Array} existingRows
- * @param {Integer} [ignoreId]
- * @returns {Boolean}
- */
- _checkHostnameRecordsTaken: (hostname, existingRows, ignoreId) => {
- let isTaken = false;
- if (existingRows?.length) {
- existingRows.map((existingRow) => {
- existingRow.domain_names.map((existingHostname) => {
- // Does this domain match?
- if (existingHostname.toLowerCase() === hostname.toLowerCase()) {
- if (!ignoreId || ignoreId !== existingRow.id) {
- isTaken = true;
- }
- }
- return true;
- });
- return true;
- });
- }
- return isTaken;
- },
- /**
- * Private call only
- *
- * @param {Array} hosts
- * @param {Array} domainNames
- * @returns {Array}
- */
- _getHostsWithDomains: (hosts, domainNames) => {
- const response = [];
- if (hosts?.length) {
- hosts.map((host) => {
- let hostMatches = false;
- domainNames.map((domainName) => {
- host.domain_names.map((hostDomainName) => {
- if (domainName.toLowerCase() === hostDomainName.toLowerCase()) {
- hostMatches = true;
- }
- return true;
- });
- return true;
- });
- if (hostMatches) {
- response.push(host);
- }
- return true;
- });
- }
- return response;
- },
- };
- export default internalHost;
|