diff --git a/src/apps.js b/src/apps.js index 4a2eac215..0c57ea282 100644 --- a/src/apps.js +++ b/src/apps.js @@ -691,7 +691,13 @@ function validateLocations(locations, callback) { for (let location of locations) { if (!(location.domain in domainObjectMap)) return callback(new BoxError(BoxError.BAD_FIELD, 'No such domain', { field: 'location', domain: location.domain, subdomain: location.subdomain })); - error = domains.validateHostname(location.subdomain, domainObjectMap[location.domain]); + let subdomain = location.subdomain; + if (location.type === 'alias' && subdomain.startsWith('*')) { + if (subdomain === '*') continue; + subdomain = subdomain.replace(/^\*\./, ''); // remove *. + } + + error = domains.validateHostname(subdomain, domainObjectMap[location.domain]); if (error) return callback(new BoxError(BoxError.BAD_FIELD, 'Bad location: ' + error.message, { field: 'location', domain: location.domain, subdomain: location.subdomain })); } @@ -776,7 +782,10 @@ function install(data, auditSource, callback) { } } - const locations = [{subdomain: location, domain}].concat(alternateDomains).concat(aliasDomains); + const locations = [{ subdomain: location, domain, type: 'primary' }] + .concat(alternateDomains.map(ad => _.extend(ad, { type: 'redirect' }))) + .concat(aliasDomains.map(ad => _.extend(ad, { type: 'alias' }))); + validateLocations(locations, function (error, domainObjectMap) { if (error) return callback(error); @@ -1211,7 +1220,9 @@ function setLocation(app, data, auditSource, callback) { values.aliasDomains = data.aliasDomains; } - const locations = [{subdomain: values.location, domain: values.domain}].concat(values.alternateDomains).concat(values.aliasDomains); + const locations = [{ subdomain: values.location, domain: values.domain, type: 'primary' }] + .concat(values.alternateDomains.map(ad => _.extend(ad, { type: 'redirect' }))) + .concat(values.aliasDomains.map(ad => _.extend(ad, { type: 'alias' }))); validateLocations(locations, function (error, domainObjectMap) { if (error) return callback(error); @@ -1640,7 +1651,7 @@ function clone(app, data, user, auditSource, callback) { let mailboxName = hasMailAddon(manifest) ? mailboxNameForLocation(location, manifest) : null; let mailboxDomain = hasMailAddon(manifest) ? domain : null; - const locations = [{subdomain: location, domain}]; + const locations = [{ subdomain: location, domain, type: 'primary' }]; validateLocations(locations, function (error, domainObjectMap) { if (error) return callback(error);