diff --git a/dashboard/src/js/client.js b/dashboard/src/js/client.js index e3935e689..ed12b9fc5 100644 --- a/dashboard/src/js/client.js +++ b/dashboard/src/js/client.js @@ -1446,7 +1446,7 @@ angular.module('Application').service('Client', ['$http', '$interval', '$timeout setupToken: setupToken }; - post('/api/v1/cloudron/restore', data, null, function (error, data, status) { + post('/api/v1/provision/restore', data, null, function (error, data, status) { if (error) return callback(error); if (status !== 200) return callback(new ClientError(status)); @@ -1840,7 +1840,7 @@ angular.module('Application').service('Client', ['$http', '$interval', '$timeout }; Client.prototype.setup = function (data, callback) { - post('/api/v1/cloudron/setup', data, null, function (error, data, status) { + post('/api/v1/provision/setup', data, null, function (error, data, status) { if (error) return callback(error); if (status !== 200) return callback(new ClientError(status, data)); @@ -1849,7 +1849,7 @@ angular.module('Application').service('Client', ['$http', '$interval', '$timeout }; Client.prototype.getProvisionBlockDevices = function (callback) { - get('/api/v1/cloudron/block_devices', null, function (error, data, status) { + get('/api/v1/provision/block_devices', null, function (error, data, status) { if (error) return callback(error); if (status !== 200) return callback(new ClientError(status, data)); @@ -1860,7 +1860,7 @@ angular.module('Application').service('Client', ['$http', '$interval', '$timeout Client.prototype.createAdmin = function (data, callback) { var that = this; - post('/api/v1/cloudron/activate', data, null, function (error, result, status) { + post('/api/v1/provision/activate', data, null, function (error, result, status) { if (error) return callback(error); if (status !== 201) return callback(new ClientError(status, result)); diff --git a/src/provision.js b/src/provision.js index ba23d40d0..ef77a1a0b 100644 --- a/src/provision.js +++ b/src/provision.js @@ -9,8 +9,7 @@ exports = module.exports = { provider }; -const appstore = require('./appstore.js'), - assert = require('assert'), +const assert = require('assert'), backups = require('./backups.js'), backuptask = require('./backuptask.js'), BoxError = require('./boxerror.js'), diff --git a/src/routes/test/apps-test.js b/src/routes/test/apps-test.js index b1ad3c4d3..bf70db437 100644 --- a/src/routes/test/apps-test.js +++ b/src/routes/test/apps-test.js @@ -143,7 +143,7 @@ function startBox(done) { settings._setApiServerOrigin.bind(null, 'http://localhost:6060'), function (callback) { - superagent.post(SERVER_URL + '/api/v1/cloudron/setup') + superagent.post(SERVER_URL + '/api/v1/provision/setup') .send({ domainConfig: DOMAIN_0 }) .end(function (error, result) { expect(result).to.be.ok(); @@ -154,7 +154,7 @@ function startBox(done) { }, function (callback) { - superagent.post(SERVER_URL + '/api/v1/cloudron/activate') + superagent.post(SERVER_URL + '/api/v1/provision/activate') .send({ username: USERNAME, password: PASSWORD, email: EMAIL }) .end(function (error, result) { expect(result).to.be.ok(); diff --git a/src/routes/test/common.js b/src/routes/test/common.js index 23bd30542..09c353819 100644 --- a/src/routes/test/common.js +++ b/src/routes/test/common.js @@ -73,14 +73,14 @@ async function setup() { await safe(fs.promises.unlink(support._sshInfo().filePath)); // setup - let response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + let response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'noop', domain: exports.dashboardDomain, config: {}, tlsConfig: { provider: 'fallback' } } }); expect(response.status).to.eql(200); await timers.setTimeout(2000); // create admin - response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .query({ setupToken: 'somesetuptoken' }) .send({ username: owner.username, password: owner.password, email: owner.email }); expect(response.status).to.eql(201); diff --git a/src/routes/test/provision-test.js b/src/routes/test/provision-test.js index 7dc437333..2c241b387 100644 --- a/src/routes/test/provision-test.js +++ b/src/routes/test/provision-test.js @@ -35,7 +35,7 @@ describe('Provision', function () { describe('DNS Setup', async function () { it('fails without provider', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { domain: DOMAIN, config: {} } }) .ok(() => true); @@ -43,7 +43,7 @@ describe('Provision', function () { }); it('fails with invalid provider', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'foobar', domain: DOMAIN, config: {} } }) .ok(() => true); @@ -51,7 +51,7 @@ describe('Provision', function () { }); it('fails with missing domain', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'noop', config: {} } }) .ok(() => true); @@ -59,7 +59,7 @@ describe('Provision', function () { }); it('fails with invalid domain', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'noop', domain: '.foo', config: {} } }) .ok(() => true); @@ -67,7 +67,7 @@ describe('Provision', function () { }); it('fails with invalid config', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'noop', domain: DOMAIN, config: 'not an object' } }) .ok(() => true); @@ -75,7 +75,7 @@ describe('Provision', function () { }); it('fails with invalid zoneName', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'noop', domain: DOMAIN, config: {}, zoneName: 1337 } }) .ok(() => true); @@ -83,7 +83,7 @@ describe('Provision', function () { }); it('fails with invalid tlsConfig', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'noop', domain: DOMAIN, config: {}, tlsConfig: 'foobar' } }) .ok(() => true); @@ -91,7 +91,7 @@ describe('Provision', function () { }); it('fails with invalid tlsConfig provider', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'noop', domain: DOMAIN, config: {}, tlsConfig: { provider: 1337 } } }) .ok(() => true); @@ -99,7 +99,7 @@ describe('Provision', function () { }); it('succeeds', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'noop', domain: DOMAIN, adminFqdn: 'my.' + DOMAIN, config: {}, tlsConfig: { provider: 'fallback' } } }) .ok(() => true); @@ -109,7 +109,7 @@ describe('Provision', function () { }); it('twice succeeds', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'noop', domain: DOMAIN, adminFqdn: 'my.' + DOMAIN, config: {}, tlsConfig: { provider: 'fallback' } } }) .ok(() => true); @@ -127,7 +127,7 @@ describe('Provision', function () { }); it('fails without username', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ password: owner.password, email: owner.email }) .ok(() => true); @@ -135,7 +135,7 @@ describe('Provision', function () { }); it('fails with invalid username', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: '?this.is-not!valid', password: owner.password, email: owner.email }) .ok(() => true); @@ -143,7 +143,7 @@ describe('Provision', function () { }); it('fails due to empty username', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: '', password: owner.password, email: owner.email }) .ok(() => true); @@ -151,7 +151,7 @@ describe('Provision', function () { }); it('fails without email', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: owner.username, password: owner.password }) .ok(() => true); @@ -159,7 +159,7 @@ describe('Provision', function () { }); it('fails due to empty email', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: owner.username, password: owner.password, email: '' }) .ok(() => true); @@ -167,7 +167,7 @@ describe('Provision', function () { }); it('fails due to invalid email', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: owner.username, password: owner.password, email: 'invalidemail' }) .ok(() => true); @@ -175,7 +175,7 @@ describe('Provision', function () { }); it('fails without password', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: owner.password.username, email: owner.email }) .ok(() => true); @@ -183,7 +183,7 @@ describe('Provision', function () { }); it('fails due to empty password', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: owner.username, password: '', email: owner.email }) .ok(() => true); @@ -191,7 +191,7 @@ describe('Provision', function () { }); it('fails with invalid password', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: owner.username, password: 'short', email: owner.email }) .ok(() => true); @@ -199,7 +199,7 @@ describe('Provision', function () { }); it('fails due to wrong displayName type', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: owner.username, password: owner.password, email: owner.email, displayName: 1234 }) .ok(() => true); @@ -207,7 +207,7 @@ describe('Provision', function () { }); it('succeeds', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: owner.username, password: owner.password, email: owner.email, displayName: owner.displayName }); expect(response.statusCode).to.equal(201); @@ -215,7 +215,7 @@ describe('Provision', function () { }); it('fails the second time', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/activate`) .send({ username: owner.username, password: owner.password, email: owner.email, displayName: owner.displayName }) .ok(() => true); @@ -223,7 +223,7 @@ describe('Provision', function () { }); it('after fails', async function () { - const response = await superagent.post(`${serverUrl}/api/v1/cloudron/setup`) + const response = await superagent.post(`${serverUrl}/api/v1/provision/setup`) .send({ domainConfig: { provider: 'noop', domain: DOMAIN, adminFqdn: 'my.' + DOMAIN, config: {}, tlsConfig: { provider: 'fallback' } } }) .ok(() => true); diff --git a/src/server.js b/src/server.js index d0924959e..f6ddd6642 100644 --- a/src/server.js +++ b/src/server.js @@ -92,14 +92,11 @@ async function initializeExpressSync() { const authorizeMailManager = routes.accesscontrol.authorize(users.ROLE_MAIL_MANAGER); const authorizeUser = routes.accesscontrol.authorize(users.ROLE_USER); - // public routes - router.post('/api/v1/cloudron/setup', json, routes.provision.setupTokenAuth, routes.provision.providerTokenAuth, routes.provision.setup); // only available until no-domain - router.post('/api/v1/cloudron/restore', json, routes.provision.setupTokenAuth, routes.provision.restore); // only available until activated - router.post('/api/v1/cloudron/activate', json, routes.provision.setupTokenAuth, routes.provision.activate); - router.get ('/api/v1/cloudron/status', routes.provision.getStatus); - router.get ('/api/v1/cloudron/block_devices', routes.provision.getBlockDevices); - - router.get ('/api/v1/cloudron/avatar', routes.branding.getCloudronAvatar); // this is a public alias for /api/v1/branding/cloudron_avatar + // boostrapping/provision routes + router.post('/api/v1/provision/setup', json, routes.provision.setupTokenAuth, routes.provision.providerTokenAuth, routes.provision.setup); // only available until no-domain + router.post('/api/v1/provision/restore', json, routes.provision.setupTokenAuth, routes.provision.restore); // only available until activated + router.post('/api/v1/provision/activate', json, routes.provision.setupTokenAuth, routes.provision.activate); + router.get ('/api/v1/provision/block_devices', routes.provision.getBlockDevices); // auth routes router.post('/api/v1/auth/login', json, password, routes.auth.login); @@ -112,7 +109,10 @@ async function initializeExpressSync() { router.get ('/api/v1/config', token, authorizeUser, routes.cloudron.getConfig); router.get ('/api/v1/platform_status', token, authorizeUser, routes.cloudron.getPlatformStatus); - // cloudron routes + // cloudron routes. public routes are for the dashboard + router.get ('/api/v1/cloudron/status', routes.provision.getStatus); + router.get ('/api/v1/cloudron/avatar', routes.branding.getCloudronAvatar); + router.get ('/api/v1/cloudron/languages', routes.cloudron.listLanguages); router.get ('/api/v1/cloudron/language', token, authorizeAdmin, routes.cloudron.getLanguage); router.post('/api/v1/cloudron/language', json, token, authorizeAdmin, routes.cloudron.setLanguage); diff --git a/src/test/check-install b/src/test/check-install index 86a040c20..31bf45ede 100755 --- a/src/test/check-install +++ b/src/test/check-install @@ -47,7 +47,7 @@ if [[ ${#missing_scripts[@]} -gt 0 ]]; then exit 1 fi -images=$(node -e "const i = require('${box_src_tmp_dir}/src/infra_version.js'); console.log(Object.keys(i.images).map(x => i.images[x]).join(' '));") +images=$(node -e "const i = require('${SOURCE_DIR}/src/infra_version.js'); console.log(Object.keys(i.images).map(x => i.images[x]).join(' '));") for image in ${images}; do if ! docker inspect "${image}" >/dev/null 2>/dev/null; then