diff --git a/dashboard/src/models/AppstoreModel.js b/dashboard/src/models/AppstoreModel.js index 0029c82ee..45a8684d3 100644 --- a/dashboard/src/models/AppstoreModel.js +++ b/dashboard/src/models/AppstoreModel.js @@ -42,21 +42,10 @@ function create() { if (error || result.status !== 200) return [error || result]; return [null, result.body]; }, - async register(setupToken) { - let result; - try { - result = await fetcher.post(`${API_ORIGIN}/api/v1/appstore/register_cloudron_with_setup_token`, { setupToken }, { access_token: accessToken }); - } catch (e) { - return [e]; - } - - if (result.status !== 201) return [result]; - return [null]; - }, async resetCloudronId() { let result; try { - result = await fetcher.post(`${API_ORIGIN}/api/v1/appstore/reset_cloudron`, {}, { access_token: accessToken }); + result = await fetcher.post(`${API_ORIGIN}/api/v1/appstore/reset_cloudron_id`, {}, { access_token: accessToken }); } catch (e) { return [e]; } diff --git a/src/appstore.js b/src/appstore.js index 32373aa66..49ba3d2f3 100644 --- a/src/appstore.js +++ b/src/appstore.js @@ -14,8 +14,6 @@ exports = module.exports = { downloadIcon, registerCloudron3, - registerCloudronWithSetupToken, - registerCloudronWithLogin, updateCloudron, getSubscription, @@ -32,7 +30,6 @@ exports = module.exports = { const assert = require('assert'), BoxError = require('./boxerror.js'), constants = require('./constants.js'), - dashboard = require('./dashboard.js'), debug = require('debug')('box:appstore'), manifestFormat = require('cloudron-manifestformat'), paths = require('./paths.js'), @@ -100,38 +97,6 @@ async function getConsoleServerOrigin() { return await settings.get(settings.CONSOLE_SERVER_ORIGIN_KEY) || 'https://console.cloudron.io'; } -async function login(email, password, totpToken) { - assert.strictEqual(typeof email, 'string'); - assert.strictEqual(typeof password, 'string'); - assert.strictEqual(typeof totpToken, 'string'); - - const [error, response] = await safe(superagent.post(`${await getApiServerOrigin()}/api/v1/login`) - .send({ email, password, totpToken }) - .timeout(60 * 1000) - .ok(() => true)); - - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); - if (response.status === 401) throw new BoxError(BoxError.INVALID_CREDENTIALS, 'Incorrect username or password'); - if (response.status !== 200) throw new BoxError(BoxError.EXTERNAL_ERROR, `Login error. status code: ${response.status}`); - if (!response.body.accessToken) throw new BoxError(BoxError.EXTERNAL_ERROR, `Login error. invalid response: ${response.text}`); - - return response.body; // { userId, accessToken } -} - -async function registerUser(email, password) { - assert.strictEqual(typeof email, 'string'); - assert.strictEqual(typeof password, 'string'); - - const [error, response] = await safe(superagent.post(`${await getApiServerOrigin()}/api/v1/register_user`) - .send({ email, password, utmSource: 'cloudron-dashboard' }) - .timeout(60 * 1000) - .ok(() => true)); - - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); - if (response.status === 409) throw new BoxError(BoxError.ALREADY_EXISTS, 'Registration error: account already exists'); - if (response.status !== 201) throw new BoxError(BoxError.EXTERNAL_ERROR, `Registration error. invalid response: ${response.status}`); -} - async function getSubscription() { const token = await settings.get(settings.APPSTORE_API_TOKEN_KEY); if (!token) throw new BoxError(BoxError.LICENSE_ERROR, 'Missing token'); @@ -264,29 +229,6 @@ async function registerCloudron3(domain, version) { debug(`registerCloudron3: Cloudron registered with id ${response.body.cloudronId}`); } -async function registerCloudron(data) { - assert.strictEqual(typeof data, 'object'); - - const { domain, setupToken, accessToken, version, existingApps } = data; - - const [error, response] = await safe(superagent.post(`${await getApiServerOrigin()}/api/v1/register_cloudron`) - .send({ domain, setupToken, accessToken, version, existingApps }) - .timeout(60 * 1000) - .ok(() => true)); - - if (error) throw new BoxError(BoxError.NETWORK_ERROR, error); - if (response.status === 401) throw new BoxError(BoxError.LICENSE_ERROR, 'Setup token invalid'); - if (response.status !== 201) throw new BoxError(BoxError.EXTERNAL_ERROR, `Unable to register cloudron: ${response.status} ${error.message}`); - - if (!response.body.cloudronId) throw new BoxError(BoxError.EXTERNAL_ERROR, 'Invalid response - no cloudron id'); - if (!response.body.cloudronToken) throw new BoxError(BoxError.EXTERNAL_ERROR, 'Invalid response - no token'); - - await settings.set(settings.CLOUDRON_ID_KEY, response.body.cloudronId); - await settings.set(settings.APPSTORE_API_TOKEN_KEY, response.body.cloudronToken); - - debug(`registerCloudron: Cloudron registered with id ${response.body.cloudronId}`); -} - async function updateCloudron(data) { assert.strictEqual(typeof data, 'object'); @@ -312,25 +254,6 @@ async function updateCloudron(data) { debug(`updateCloudron: Cloudron updated with data ${JSON.stringify(data)}`); } -async function registerCloudronWithSetupToken(options) { - assert.strictEqual(typeof options, 'object'); - - const { domain } = await dashboard.getLocation(); - - await registerCloudron({ domain, setupToken: options.setupToken, version: constants.VERSION }); -} - -async function registerCloudronWithLogin(options) { - assert.strictEqual(typeof options, 'object'); - - if (options.signup) await registerUser(options.email, options.password); - const result = await login(options.email, options.password, options.totpToken || ''); - - const { domain } = await dashboard.getLocation(); - - await registerCloudron({ domain, accessToken: result.accessToken, version: constants.VERSION }); -} - async function unregister() { await settings.set(settings.CLOUDRON_ID_KEY, ''); await settings.set(settings.APPSTORE_API_TOKEN_KEY, ''); diff --git a/src/routes/appstore.js b/src/routes/appstore.js index c1ee59319..1f93c1674 100644 --- a/src/routes/appstore.js +++ b/src/routes/appstore.js @@ -5,17 +5,15 @@ exports = module.exports = { getApp, getAppVersion, - resetCloudron, - registerCloudronWithSetupToken, - registerCloudronWithLogin, + resetCloudronId, getSubscription }; const appstore = require('../appstore.js'), assert = require('assert'), BoxError = require('../boxerror.js'), + constants = require('../constants.js'), dashboard = require('../dashboard.js'), - HttpError = require('connect-lastmile').HttpError, HttpSuccess = require('connect-lastmile').HttpSuccess, safe = require('safetydance'), users = require('../users.js'), @@ -47,46 +45,18 @@ async function getAppVersion(req, res, next) { next(new HttpSuccess(200, manifest)); } -async function resetCloudron(req, res, next) { +async function resetCloudronId(req, res, next) { assert.strictEqual(typeof req.body, 'object'); - let [error, result] = await safe(dashboard.getConfig()); - if (error) return next(new HttpError(500, 'internal error')); + const [getLocationError, dashboardLocation] = await dashboard.getLocation(); // authenticated route implies already activated + if (getLocationError) return next(BoxError.toHttpError(getLocationError)); - const version = result.version; - const domain = result.adminDomain; - - [error, result] = await safe(appstore.registerCloudron3(domain, version)); - if (error) return next(new HttpError(409, 'appstore not reachable')); + const [registerError] = await appstore.registerCloudron3(dashboardLocation.domain, constants.VERSION); + if (registerError) return next(BoxError.toHttpError(registerError)); next(new HttpSuccess(202, {})); } -async function registerCloudronWithSetupToken(req, res, next) { - assert.strictEqual(typeof req.body, 'object'); - - if (typeof req.body.setupToken !== 'string') return next(new HttpError(400, 'setupToken must be a string')); - - const [error] = await safe(appstore.registerCloudronWithSetupToken({ setupToken: req.body.setupToken })); - if (error) return next(BoxError.toHttpError(error)); - - next(new HttpSuccess(201, {})); -} - -async function registerCloudronWithLogin(req, res, next) { - assert.strictEqual(typeof req.body, 'object'); - - if (typeof req.body.email !== 'string' || !req.body.email) return next(new HttpError(400, 'email must be string')); - if (typeof req.body.password !== 'string' || !req.body.password) return next(new HttpError(400, 'password must be string')); - if ('totpToken' in req.body && typeof req.body.totpToken !== 'string') return next(new HttpError(400, 'totpToken must be string')); - if (typeof req.body.signup !== 'boolean') return next(new HttpError(400, 'signup must be a boolean')); - - const [error] = await safe(appstore.registerCloudronWithLogin(req.body)); - if (error) return next(BoxError.toHttpError(error)); - - next(new HttpSuccess(201, {})); -} - async function getSubscription(req, res, next) { const [error, result] = await safe(appstore.getSubscription()); if (error) return next(BoxError.toHttpError(error)); diff --git a/src/server.js b/src/server.js index 85166922c..7c9955948 100644 --- a/src/server.js +++ b/src/server.js @@ -234,9 +234,7 @@ async function initializeExpressSync() { router.post('/api/v1/directory_server/config', json, token, authorizeAdmin, routes.directoryServer.setConfig); // appstore and subscription routes - router.post('/api/v1/appstore/reset_cloudron', json, token, authorizeOwner, routes.appstore.resetCloudron); - router.post('/api/v1/appstore/register_cloudron', json, token, authorizeOwner, routes.appstore.registerCloudronWithLogin); - router.post('/api/v1/appstore/register_cloudron_with_setup_token', json, token, authorizeOwner, routes.appstore.registerCloudronWithSetupToken); + router.post('/api/v1/appstore/reset_cloudron_id', json, token, authorizeOwner, routes.appstore.resetCloudronId); router.get ('/api/v1/appstore/subscription', token, authorizeUser, routes.appstore.getSubscription); // for all users router.get ('/api/v1/appstore/apps', token, authorizeAdmin, routes.appstore.getApps); router.get ('/api/v1/appstore/apps/:appstoreId', token, authorizeAdmin, routes.appstore.getApp);