123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- const _ = require('lodash');
- const proxyHostModel = require('../models/proxy_host');
- const redirectionHostModel = require('../models/redirection_host');
- const deadHostModel = require('../models/dead_host');
- 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: function (data, existing_data) {
- existing_data = existing_data === undefined ? {} : existing_data;
- let combined_data = _.assign({}, existing_data, data);
- if (!combined_data.certificate_id) {
- combined_data.ssl_forced = false;
- combined_data.http2_support = false;
- }
- if (!combined_data.ssl_forced) {
- combined_data.hsts_enabled = false;
- }
- if (!combined_data.hsts_enabled) {
- combined_data.hsts_subdomains = false;
- }
- return combined_data;
- },
- /**
- * used by the getAll functions of hosts, this removes the certificate meta if present
- *
- * @param {Array} rows
- * @returns {Array}
- */
- cleanAllRowsCertificateMeta: function (rows) {
- rows.map(function (row, idx) {
- if (typeof rows[idx].certificate !== 'undefined' && rows[idx].certificate) {
- rows[idx].certificate.meta = {};
- }
- });
- return rows;
- },
- /**
- * used by the get/update functions of hosts, this removes the certificate meta if present
- *
- * @param {Object} row
- * @returns {Object}
- */
- cleanRowCertificateMeta: function (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 domain_names array.
- * This is used by the certificates to temporarily disable any host that is using the domain
- *
- * @param {Array} domain_names
- * @returns {Promise}
- */
- getHostsWithDomains: function (domain_names) {
- let promises = [
- proxyHostModel
- .query()
- .where('is_deleted', 0),
- redirectionHostModel
- .query()
- .where('is_deleted', 0),
- deadHostModel
- .query()
- .where('is_deleted', 0)
- ];
- return Promise.all(promises)
- .then((promises_results) => {
- let response_object = {
- total_count: 0,
- dead_hosts: [],
- proxy_hosts: [],
- redirection_hosts: []
- };
- if (promises_results[0]) {
- // Proxy Hosts
- response_object.proxy_hosts = internalHost._getHostsWithDomains(promises_results[0], domain_names);
- response_object.total_count += response_object.proxy_hosts.length;
- }
- if (promises_results[1]) {
- // Redirection Hosts
- response_object.redirection_hosts = internalHost._getHostsWithDomains(promises_results[1], domain_names);
- response_object.total_count += response_object.redirection_hosts.length;
- }
- if (promises_results[2]) {
- // Dead Hosts
- response_object.dead_hosts = internalHost._getHostsWithDomains(promises_results[2], domain_names);
- response_object.total_count += response_object.dead_hosts.length;
- }
- return response_object;
- });
- },
- /**
- * 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: function (hostname, ignore_type, ignore_id) {
- let promises = [
- proxyHostModel
- .query()
- .where('is_deleted', 0)
- .andWhere('domain_names', 'like', '%' + hostname + '%'),
- redirectionHostModel
- .query()
- .where('is_deleted', 0)
- .andWhere('domain_names', 'like', '%' + hostname + '%'),
- deadHostModel
- .query()
- .where('is_deleted', 0)
- .andWhere('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} existing_rows
- * @param {Integer} [ignore_id]
- * @returns {Boolean}
- */
- _checkHostnameRecordsTaken: function (hostname, existing_rows, ignore_id) {
- let is_taken = false;
- if (existing_rows && existing_rows.length) {
- existing_rows.map(function (existing_row) {
- existing_row.domain_names.map(function (existing_hostname) {
- // Does this domain match?
- if (existing_hostname.toLowerCase() === hostname.toLowerCase()) {
- if (!ignore_id || ignore_id !== existing_row.id) {
- is_taken = true;
- }
- }
- });
- });
- }
- return is_taken;
- },
- /**
- * Private call only
- *
- * @param {Array} hosts
- * @param {Array} domain_names
- * @returns {Array}
- */
- _getHostsWithDomains: function (hosts, domain_names) {
- let response = [];
- if (hosts && hosts.length) {
- hosts.map(function (host) {
- let host_matches = false;
- domain_names.map(function (domain_name) {
- host.domain_names.map(function (host_domain_name) {
- if (domain_name.toLowerCase() === host_domain_name.toLowerCase()) {
- host_matches = true;
- }
- });
- });
- if (host_matches) {
- response.push(host);
- }
- });
- }
- return response;
- }
- };
- module.exports = internalHost;
|