diff --git a/src/appstore.js b/src/appstore.js index cd704d0e0..b29ae0573 100644 --- a/src/appstore.js +++ b/src/appstore.js @@ -316,17 +316,15 @@ function getAccount(callback) { }); } -function registerCloudron(userId, token, callback) { +function registerCloudron(adminDomain, userId, token, callback) { + assert.strictEqual(typeof adminDomain, 'string'); assert.strictEqual(typeof userId, 'string'); assert.strictEqual(typeof token, 'string'); assert.strictEqual(typeof callback, 'function'); const url = `${config.apiServerOrigin()}/api/v1/users/${userId}/cloudrons`; - const data = { - domain: config.adminDomain() - }; - superagent.post(url).send(data).query({ accessToken: token }).timeout(30 * 1000).end(function (error, result) { + superagent.post(url).send({ domain: adminDomain }).query({ accessToken: token }).timeout(30 * 1000).end(function (error, result) { if (error && !error.response) return callback(new AppstoreError(AppstoreError.EXTERNAL_ERROR, error.message)); if (result.statusCode === 401) return callback(new AppstoreError(AppstoreError.EXTERNAL_ERROR, 'invalid appstore token')); if (result.statusCode !== 201) return callback(new AppstoreError(AppstoreError.EXTERNAL_ERROR, 'unable to register cloudron')); diff --git a/src/paths.js b/src/paths.js index ed37ce2ec..5d588adb3 100644 --- a/src/paths.js +++ b/src/paths.js @@ -8,6 +8,8 @@ exports = module.exports = { CLOUDRON_DEFAULT_AVATAR_FILE: path.join(__dirname + '/../assets/avatar.png'), INFRA_VERSION_FILE: path.join(config.baseDir(), 'platformdata/INFRA_VERSION'), + LICENSE_FILE: '/etc/cloudron/LICENSE', + PLATFORM_DATA_DIR: path.join(config.baseDir(), 'platformdata'), APPS_DATA_DIR: path.join(config.baseDir(), 'appsdata'), BOX_DATA_DIR: path.join(config.baseDir(), 'boxdata'), diff --git a/src/provision.js b/src/provision.js index e66e43609..7dc6386dd 100644 --- a/src/provision.js +++ b/src/provision.js @@ -9,7 +9,8 @@ exports = module.exports = { ProvisionError: ProvisionError }; -var assert = require('assert'), +var appstore = require('./appstore.js'), + assert = require('assert'), async = require('async'), backups = require('./backups.js'), BackupsError = require('./backups.js').BackupsError, @@ -22,6 +23,7 @@ var assert = require('assert'), DomainsError = domains.DomainsError, eventlog = require('./eventlog.js'), mail = require('./mail.js'), + paths = require('./paths.js'), safe = require('safetydance'), semver = require('semver'), settingsdb = require('./settingsdb.js'), @@ -129,6 +131,34 @@ function unprovision(callback) { ], callback); } + +function autoRegisterCloudron(adminDomain, callback) { + assert.strictEqual(typeof adminDomain, 'string'); + assert.strictEqual(typeof callback, 'function'); + + if (!config.edition()) return callback(); + + const license = safe.JSON.parse(safe.fs.readFileSync(paths.LICENSE_FILE, 'utf8')); + if (!license) return callback(new ProvisionError(ProvisionError.EXTERNAL_ERROR, 'Cannot read license')); + if (typeof license.userId !== 'string' || typeof license.token !== 'string') return callback(new ProvisionError(ProvisionError.EXTERNAL_ERROR, 'Bad license')); + + appstore.registerCloudron(adminDomain, license.userId, license.token, function (error, cloudronId) { + if (error) return callback(error); + + const data = { + userId: license.userId, + token: license.token, + cloudronId: cloudronId + }; + + settingsdb.set(settings.APPSTORE_CONFIG_KEY, JSON.stringify(data), function (error) { + if (error) return callback(new ProvisionError(ProvisionError.INTERNAL_ERROR, error)); + + callback(); + }); + }); +} + function setup(dnsConfig, autoconf, auditSource, callback) { assert.strictEqual(typeof dnsConfig, 'object'); assert.strictEqual(typeof autoconf, 'object'); @@ -173,6 +203,8 @@ function setup(dnsConfig, autoconf, auditSource, callback) { callback(); // now that args are validated run the task in the background async.series([ + setProgress.bind(null, 'setup', 'Registering server'), + autoRegisterCloudron.bind(null, domain), domains.prepareDashboardDomain.bind(null, domain, auditSource, (progress) => setProgress('setup', progress.message, NOOP_CALLBACK)), cloudron.setDashboardDomain.bind(null, domain, auditSource), // this sets up the config.fqdn() mail.addDomain.bind(null, domain), // this relies on config.mailFqdn() diff --git a/src/settings.js b/src/settings.js index 501bb2a50..66feca961 100644 --- a/src/settings.js +++ b/src/settings.js @@ -67,6 +67,7 @@ var addons = require('./addons.js'), assert = require('assert'), backups = require('./backups.js'), BackupsError = backups.BackupsError, + config = require('./config.js'), constants = require('./constants.js'), CronJob = require('cron').CronJob, DatabaseError = require('./databaseerror.js'), @@ -409,9 +410,13 @@ function setPlatformConfig(platformConfig, callback) { function setAppstoreConfig(appstoreConfig, callback) { assert.strictEqual(typeof appstoreConfig, 'object'); + assert.strictEqual(typeof appstoreConfig.userId, 'string'); + assert.strictEqual(typeof appstoreConfig.token, 'string'); assert.strictEqual(typeof callback, 'function'); - appstore.registerCloudron(appstoreConfig, function (error, cloudronId) { + const { userId, token } = appstoreConfig; + + appstore.registerCloudron(config.adminDomain(), userId, token, function (error, cloudronId) { if (error && error.reason === AppstoreError.EXTERNAL_ERROR) return callback(new SettingsError(SettingsError.EXTERNAL_ERROR, error.message)); if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); @@ -462,4 +467,4 @@ function get(name, callback) { callback(null, result); }); -} \ No newline at end of file +}