diff --git a/src/apptask.js b/src/apptask.js index 01e52718a..1c097047e 100644 --- a/src/apptask.js +++ b/src/apptask.js @@ -255,14 +255,14 @@ function registerSubdomain(app, overwrite, callback) { debugApp(app, 'Registering subdomain location [%s] overwrite: %s', config.appFqdn(app), overwrite); // get the current record before updating it - domains.getDNSRecords(config.appFqdn(app), 'A', function (error, values) { + domains.getDNSRecords(app.location, app.domain, 'A', function (error, values) { if (error) return retryCallback(error); // refuse to update any existing DNS record for custom domains that we did not create // note that the appstore sets up the naked domain for non-custom domains if (config.isCustomDomain() && values.length !== 0 && !overwrite) return retryCallback(null, new Error('DNS Record already exists')); - domains.upsertDNSRecords(config.appFqdn(app), 'A', [ ip ], function (error, changeId) { + domains.upsertDNSRecords(app.location, app.domain, 'A', [ ip ], function (error, changeId) { if (error && (error.reason === DomainError.STILL_BUSY || error.reason === DomainError.EXTERNAL_ERROR)) return retryCallback(error); // try again retryCallback(null, error || changeId); @@ -303,7 +303,7 @@ function unregisterSubdomain(app, location, domain, callback) { async.retry({ times: 30, interval: 5000 }, function (retryCallback) { debugApp(app, 'Unregistering subdomain: %s', config.appFqdn({ domain: domain, location: location })); - domains.removeDNSRecords(config.appFqdn({ domain: domain, location: location }), 'A', [ ip ], function (error) { + domains.removeDNSRecords(location, domain, 'A', [ ip ], function (error) { if (error && (error.reason === DomainError.STILL_BUSY || error.reason === DomainError.EXTERNAL_ERROR)) return retryCallback(error); // try again retryCallback(null, error); diff --git a/src/cloudron.js b/src/cloudron.js index 80d59769c..6ab1f3a9c 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -509,7 +509,7 @@ function readDkimPublicKeySync() { function txtRecordsWithSpf(callback) { assert.strictEqual(typeof callback, 'function'); - domains.getDNSRecords(config.fqdn(), 'TXT', function (error, txtRecords) { + domains.getDNSRecords('', config.fqdn(), 'TXT', function (error, txtRecords) { if (error) return callback(error); debug('txtRecordsWithSpf: current txt records - %j', txtRecords); @@ -892,7 +892,7 @@ function refreshDNS(callback) { // do not change state of installing apps since apptask will error if dns record already exists if (app.installationState !== appdb.ISTATE_INSTALLED) return callback(); - domains.upsertDNSRecords(config.appFqdn(app), 'A', [ ip ], callback); + domains.upsertDNSRecords(app.location, app.domain, 'A', [ ip ], callback); }, function (error) { if (error) return callback(error); diff --git a/src/domains.js b/src/domains.js index a8e6c594b..66c469ec4 100644 --- a/src/domains.js +++ b/src/domains.js @@ -135,6 +135,7 @@ function get(domain, callback) { assert.strictEqual(typeof callback, 'function'); domaindb.get(domain, function (error, result) { + // TODO try to find subdomain entries maybe based on zoneNames or so if (error && error.reason === DatabaseError.NOT_FOUND) return callback(new DomainError(DomainError.NOT_FOUND)); if (error) return callback(new DomainError(DomainError.INTERNAL_ERROR, error)); @@ -214,14 +215,12 @@ function del(domain, callback) { }); } -function getDNSRecords(fqdn, type, callback) { - assert.strictEqual(typeof fqdn, 'string'); +function getDNSRecords(subdomain, domain, type, callback) { + assert.strictEqual(typeof subdomain, 'string'); + assert.strictEqual(typeof domain, 'string'); assert.strictEqual(typeof type, 'string'); assert.strictEqual(typeof callback, 'function'); - const domain = tld.getDomain(fqdn); - const subdomain = tld.getSubdomain(fqdn); - get(domain, function (error, result) { if (error) return callback(new DomainError(DomainError.INTERNAL_ERROR, error)); @@ -233,14 +232,14 @@ function getDNSRecords(fqdn, type, callback) { }); } -function upsertDNSRecords(fqdn, type, values, callback) { - assert.strictEqual(typeof fqdn, 'string'); +function upsertDNSRecords(subdomain, domain, type, values, callback) { + assert.strictEqual(typeof subdomain, 'string'); + assert.strictEqual(typeof domain, 'string'); assert.strictEqual(typeof type, 'string'); assert(util.isArray(values)); assert.strictEqual(typeof callback, 'function'); - debug('upsertDNSRecord: %s type %s values', fqdn, type, values); - + debug('upsertDNSRecord: %s on %s type %s values', subdomain, domain, type, values); get(domain, function (error, result) { if (error) return callback(new DomainError(DomainError.INTERNAL_ERROR, error)); @@ -253,16 +252,14 @@ function upsertDNSRecords(fqdn, type, values, callback) { }); } - function removeDNSRecords(fqdn, type, values, callback) { - assert.strictEqual(typeof fqdn, 'string'); + function removeDNSRecords(subdomain, domain, type, values, callback) { + assert.strictEqual(typeof subdomain, 'string'); + assert.strictEqual(typeof domain, 'string'); assert.strictEqual(typeof type, 'string'); assert(util.isArray(values)); assert.strictEqual(typeof callback, 'function'); - debug('removeDNSRecord: %s type %s values', fqdn, type, values); - - const domain = tld.getDomain(fqdn); - const subdomain = tld.getSubdomain(fqdn); + debug('removeDNSRecord: %s on %s type %s values', subdomain, domain, type, values); get(domain, function (error, result) { if (error) return callback(new DomainError(DomainError.INTERNAL_ERROR, error)); diff --git a/src/platform.js b/src/platform.js index 5e8447d04..34deb89e6 100644 --- a/src/platform.js +++ b/src/platform.js @@ -328,7 +328,7 @@ function startMail(callback) { ]; async.mapSeries(records, function (record, iteratorCallback) { - domains.upsertDNSRecords(config.appFqdn({ location: record.subdomain, domain: config.fqdn() }), record.type, record.values, iteratorCallback); + domains.upsertDNSRecords(record.subdomain, config.fqdn(), record.type, record.values, iteratorCallback); }, NOOP_CALLBACK); // do not crash if DNS creds do not work in startup sequence callback();