diff --git a/src/cloudron.js b/src/cloudron.js index 343acadb1..60e64cede 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -438,31 +438,26 @@ function getConfig(callback) { settings.getCloudronName(function (error, cloudronName) { if (error) return callback(new CloudronError(CloudronError.INTERNAL_ERROR, error)); - settings.getDeveloperMode(function (error, developerMode) { - if (error) return callback(new CloudronError(CloudronError.INTERNAL_ERROR, error)); - - callback(null, { - apiServerOrigin: config.apiServerOrigin(), - webServerOrigin: config.webServerOrigin(), - fqdn: config.fqdn(), - adminLocation: config.adminLocation(), - adminFqdn: config.adminFqdn(), - mailFqdn: config.mailFqdn(), - version: config.version(), - update: updateChecker.getUpdateInfo(), - progress: progress.getAll(), - isCustomDomain: config.isCustomDomain(), - isDemo: config.isDemo(), - developerMode: developerMode, - region: result.box.region, - size: result.box.size, - billing: !!result.user.billing, - plan: result.box.plan, - currency: result.user.currency, - memory: os.totalmem(), - provider: config.provider(), - cloudronName: cloudronName - }); + callback(null, { + apiServerOrigin: config.apiServerOrigin(), + webServerOrigin: config.webServerOrigin(), + fqdn: config.fqdn(), + adminLocation: config.adminLocation(), + adminFqdn: config.adminFqdn(), + mailFqdn: config.mailFqdn(), + version: config.version(), + update: updateChecker.getUpdateInfo(), + progress: progress.getAll(), + isCustomDomain: config.isCustomDomain(), + isDemo: config.isDemo(), + region: result.box.region, + size: result.box.size, + billing: !!result.user.billing, + plan: result.box.plan, + currency: result.user.currency, + memory: os.totalmem(), + provider: config.provider(), + cloudronName: cloudronName }); }); }); diff --git a/src/developer.js b/src/developer.js index 66ccca3d5..7e5c2d397 100644 --- a/src/developer.js +++ b/src/developer.js @@ -5,8 +5,6 @@ exports = module.exports = { DeveloperError: DeveloperError, - isEnabled: isEnabled, - setEnabled: setEnabled, issueDeveloperToken: issueDeveloperToken }; @@ -15,7 +13,6 @@ var assert = require('assert'), constants = require('./constants.js'), eventlog = require('./eventlog.js'), tokendb = require('./tokendb.js'), - settings = require('./settings.js'), util = require('util'); function DeveloperError(reason, errorOrMessage) { @@ -40,29 +37,6 @@ util.inherits(DeveloperError, Error); DeveloperError.INTERNAL_ERROR = 'Internal Error'; DeveloperError.EXTERNAL_ERROR = 'External Error'; -function isEnabled(callback) { - assert.strictEqual(typeof callback, 'function'); - - settings.getDeveloperMode(function (error, enabled) { - if (error) return callback(new DeveloperError(DeveloperError.INTERNAL_ERROR, error)); - callback(null, enabled); - }); -} - -function setEnabled(enabled, auditSource, callback) { - assert.strictEqual(typeof enabled, 'boolean'); - assert.strictEqual(typeof auditSource, 'object'); - assert.strictEqual(typeof callback, 'function'); - - settings.setDeveloperMode(enabled, function (error) { - if (error) return callback(new DeveloperError(DeveloperError.INTERNAL_ERROR, error)); - - eventlog.add(eventlog.ACTION_CLI_MODE, auditSource, { enabled: enabled }); - - callback(null); - }); -} - function issueDeveloperToken(user, auditSource, callback) { assert.strictEqual(typeof user, 'object'); assert.strictEqual(typeof auditSource, 'object'); diff --git a/src/routes/developer.js b/src/routes/developer.js index 16dcca338..ccb727564 100644 --- a/src/routes/developer.js +++ b/src/routes/developer.js @@ -1,9 +1,6 @@ 'use strict'; exports = module.exports = { - enabled: enabled, - setEnabled: setEnabled, - status: status, login: login }; @@ -17,27 +14,6 @@ function auditSource(req) { return { ip: ip, username: req.user ? req.user.username : null, userId: req.user ? req.user.id : null }; } -function enabled(req, res, next) { - developer.isEnabled(function (error, enabled) { - if (enabled) return next(); - next(new HttpError(412, 'Developer mode not enabled')); - }); -} - -function setEnabled(req, res, next) { - if (typeof req.body.enabled !== 'boolean') return next(new HttpError(400, 'enabled must be boolean')); - - developer.setEnabled(req.body.enabled, auditSource(req), function (error) { - if (error) return next(new HttpError(500, error)); - - next(new HttpSuccess(200, {})); - }); -} - -function status(req, res, next) { - next(new HttpSuccess(200, {})); -} - function login(req, res, next) { passport.authenticate('local', function (error, user) { if (error) return next(new HttpError(500, error)); diff --git a/src/routes/test/apps-test.js b/src/routes/test/apps-test.js index 17388602a..f1637510b 100644 --- a/src/routes/test/apps-test.js +++ b/src/routes/test/apps-test.js @@ -575,29 +575,25 @@ describe('App API', function () { }); it('app install succeeds without password but developer token', function (done) { - settings.setDeveloperMode(true, function (error) { - expect(error).to.be(null); + superagent.post(SERVER_URL + '/api/v1/developer/login') + .send({ username: USERNAME, password: PASSWORD }) + .end(function (error, result) { + expect(error).to.not.be.ok(); + expect(result.statusCode).to.equal(200); + expect(new Date(result.body.expiresAt).toString()).to.not.be('Invalid Date'); + expect(result.body.token).to.be.a('string'); - superagent.post(SERVER_URL + '/api/v1/developer/login') - .send({ username: USERNAME, password: PASSWORD }) - .end(function (error, result) { - expect(error).to.not.be.ok(); - expect(result.statusCode).to.equal(200); - expect(new Date(result.body.expiresAt).toString()).to.not.be('Invalid Date'); - expect(result.body.token).to.be.a('string'); + // overwrite non dev token + token = result.body.token; - // overwrite non dev token - token = result.body.token; - - superagent.post(SERVER_URL + '/api/v1/apps/install') - .query({ access_token: token }) - .send({ manifest: APP_MANIFEST, location: APP_LOCATION+APP_LOCATION, portBindings: null, accessRestriction: null }) - .end(function (err, res) { - expect(res.statusCode).to.equal(202); - expect(res.body.id).to.be.a('string'); - APP_ID = res.body.id; - done(); - }); + superagent.post(SERVER_URL + '/api/v1/apps/install') + .query({ access_token: token }) + .send({ manifest: APP_MANIFEST, location: APP_LOCATION+APP_LOCATION, portBindings: null, accessRestriction: null }) + .end(function (err, res) { + expect(res.statusCode).to.equal(202); + expect(res.body.id).to.be.a('string'); + APP_ID = res.body.id; + done(); }); }); }); diff --git a/src/routes/test/clients-test.js b/src/routes/test/clients-test.js index decaeac94..95b0f4207 100644 --- a/src/routes/test/clients-test.js +++ b/src/routes/test/clients-test.js @@ -65,141 +65,119 @@ describe('OAuth Clients API', function () { after(cleanup); - describe('without developer mode', function () { - before(function (done) { - settings.setDeveloperMode(false, done); - }); - - it('fails', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ appId: 'someApp', redirectURI: 'http://foobar.com', scope: 'profile' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(412); - done(); - }); + it('fails without token', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .send({ appId: 'someApp', redirectURI: 'http://foobar.com', scope: 'profile' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(401); + done(); }); }); - describe('with developer mode', function () { - before(function (done) { - settings.setDeveloperMode(true, done); + it('fails without appId', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .query({ access_token: token }) + .send({ redirectURI: 'http://foobar.com', scope: 'profile' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(400); + done(); }); + }); - it('fails without token', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .send({ appId: 'someApp', redirectURI: 'http://foobar.com', scope: 'profile' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(401); - done(); - }); + it('fails with empty appId', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .query({ access_token: token }) + .send({ appId: '', redirectURI: 'http://foobar.com', scope: 'profile' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(400); + done(); }); + }); - it('fails without appId', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ redirectURI: 'http://foobar.com', scope: 'profile' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); + it('fails without scope', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .query({ access_token: token }) + .send({ appId: 'someApp', redirectURI: 'http://foobar.com' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(400); + done(); }); + }); - it('fails with empty appId', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ appId: '', redirectURI: 'http://foobar.com', scope: 'profile' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); + it('fails with empty scope', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .query({ access_token: token }) + .send({ appId: 'someApp', redirectURI: 'http://foobar.com', scope: '' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(400); + done(); }); + }); - it('fails without scope', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ appId: 'someApp', redirectURI: 'http://foobar.com' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); + it('fails without redirectURI', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .query({ access_token: token }) + .send({ appId: 'someApp', scope: 'profile' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(400); + done(); }); + }); - it('fails with empty scope', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ appId: 'someApp', redirectURI: 'http://foobar.com', scope: '' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); + it('fails with empty redirectURI', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .query({ access_token: token }) + .send({ appId: 'someApp', redirectURI: '', scope: 'profile' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(400); + done(); }); + }); - it('fails without redirectURI', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ appId: 'someApp', scope: 'profile' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); + it('fails with malformed redirectURI', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .query({ access_token: token }) + .send({ appId: 'someApp', redirectURI: 'foobar', scope: 'profile' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(400); + done(); }); + }); - it('fails with empty redirectURI', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ appId: 'someApp', redirectURI: '', scope: 'profile' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); + it('fails with invalid name', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .query({ access_token: token }) + .send({ appId: '$"$%^45asdfasdfadf.adf.', redirectURI: 'http://foobar.com', scope: 'profile' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(400); + done(); }); + }); - it('fails with malformed redirectURI', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ appId: 'someApp', redirectURI: 'foobar', scope: 'profile' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); + it('succeeds with dash', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .query({ access_token: token }) + .send({ appId: 'fo-1234-bar', redirectURI: 'http://foobar.com', scope: 'profile' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(201); + done(); }); + }); - it('fails with invalid name', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ appId: '$"$%^45asdfasdfadf.adf.', redirectURI: 'http://foobar.com', scope: 'profile' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); - }); + it('succeeds', function (done) { + superagent.post(SERVER_URL + '/api/v1/oauth/clients') + .query({ access_token: token }) + .send({ appId: 'someApp', redirectURI: 'http://foobar.com', scope: 'profile' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(201); + expect(result.body.id).to.be.a('string'); + expect(result.body.appId).to.be.a('string'); + expect(result.body.redirectURI).to.be.a('string'); + expect(result.body.clientSecret).to.be.a('string'); + expect(result.body.scope).to.be.a('string'); + expect(result.body.type).to.equal(clients.TYPE_EXTERNAL); - it('succeeds with dash', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ appId: 'fo-1234-bar', redirectURI: 'http://foobar.com', scope: 'profile' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(201); - done(); - }); - }); - - it('succeeds', function (done) { - superagent.post(SERVER_URL + '/api/v1/oauth/clients') - .query({ access_token: token }) - .send({ appId: 'someApp', redirectURI: 'http://foobar.com', scope: 'profile' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(201); - expect(result.body.id).to.be.a('string'); - expect(result.body.appId).to.be.a('string'); - expect(result.body.redirectURI).to.be.a('string'); - expect(result.body.clientSecret).to.be.a('string'); - expect(result.body.scope).to.be.a('string'); - expect(result.body.type).to.equal(clients.TYPE_EXTERNAL); - - done(); - }); + done(); }); }); }); @@ -236,8 +214,6 @@ describe('OAuth Clients API', function () { }); }, - settings.setDeveloperMode.bind(null, true), - function (callback) { superagent.post(SERVER_URL + '/api/v1/oauth/clients') .query({ access_token: token }) @@ -255,52 +231,31 @@ describe('OAuth Clients API', function () { after(cleanup); - describe('without developer mode', function () { - before(function (done) { - settings.setDeveloperMode(false, done); - }); - - it('fails', function (done) { - superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(412); - done(); - }); + it('fails without token', function (done) { + superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) + .end(function (error, result) { + expect(result.statusCode).to.equal(401); + done(); }); }); - describe('with developer mode', function () { - before(function (done) { - settings.setDeveloperMode(true, done); + + it('fails with unknown id', function (done) { + superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id.toUpperCase()) + .query({ access_token: token }) + .end(function (error, result) { + expect(result.statusCode).to.equal(404); + done(); }); + }); - it('fails without token', function (done) { - superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) - .end(function (error, result) { - expect(result.statusCode).to.equal(401); - done(); - }); - }); - - - it('fails with unknown id', function (done) { - superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id.toUpperCase()) - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(404); - done(); - }); - }); - - it('succeeds', function (done) { - superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(200); - expect(result.body).to.eql(CLIENT_0); - done(); - }); + it('succeeds', function (done) { + superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) + .query({ access_token: token }) + .end(function (error, result) { + expect(result.statusCode).to.equal(200); + expect(result.body).to.eql(CLIENT_0); + done(); }); }); }); @@ -345,8 +300,6 @@ describe('OAuth Clients API', function () { }); }, - settings.setDeveloperMode.bind(null, true), - function (callback) { superagent.post(SERVER_URL + '/api/v1/oauth/clients') .query({ access_token: token }) @@ -364,94 +317,73 @@ describe('OAuth Clients API', function () { after(cleanup); - describe('without developer mode', function () { - before(function (done) { - settings.setDeveloperMode(false, done); + it('fails without token', function (done) { + superagent.del(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) + .end(function (error, result) { + expect(result.statusCode).to.equal(401); + done(); }); + }); + + + it('fails with unknown id', function (done) { + superagent.del(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id.toUpperCase()) + .query({ access_token: token }) + .end(function (error, result) { + expect(result.statusCode).to.equal(404); + done(); + }); + }); + + it('succeeds', function (done) { + superagent.del(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) + .query({ access_token: token }) + .end(function (error, result) { + expect(result.statusCode).to.equal(204); + + superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) + .query({ access_token: token }) + .end(function (error, result) { + expect(result.statusCode).to.equal(404); - it('fails', function (done) { - superagent.del(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(412); done(); }); }); }); - describe('with developer mode', function () { - before(function (done) { - settings.setDeveloperMode(true, done); - }); + it('fails for cid-webadmin', function (done) { + superagent.del(SERVER_URL + '/api/v1/oauth/clients/cid-webadmin') + .query({ access_token: token }) + .end(function (error, result) { + expect(result.statusCode).to.equal(405); + + superagent.get(SERVER_URL + '/api/v1/oauth/clients/cid-webadmin') + .query({ access_token: token }) + .end(function (error, result) { + expect(result.statusCode).to.equal(200); - it('fails without token', function (done) { - superagent.del(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) - .end(function (error, result) { - expect(result.statusCode).to.equal(401); done(); }); }); + }); + it('fails for addon auth client', function (done) { + clients.add(CLIENT_1.appId, CLIENT_1.type, CLIENT_1.redirectURI, CLIENT_1.scope, function (error, result) { + expect(error).to.equal(null); - it('fails with unknown id', function (done) { - superagent.del(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id.toUpperCase()) - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(404); - done(); - }); - }); + CLIENT_1.id = result.id; - it('succeeds', function (done) { - superagent.del(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(204); - - superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_0.id) - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(404); - - done(); - }); - }); - }); - - it('fails for cid-webadmin', function (done) { - superagent.del(SERVER_URL + '/api/v1/oauth/clients/cid-webadmin') - .query({ access_token: token }) - .end(function (error, result) { + superagent.del(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_1.id) + .query({ access_token: token }) + .end(function (error, result) { expect(result.statusCode).to.equal(405); - superagent.get(SERVER_URL + '/api/v1/oauth/clients/cid-webadmin') - .query({ access_token: token }) - .end(function (error, result) { + superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_1.id) + .query({ access_token: token }) + .end(function (error, result) { expect(result.statusCode).to.equal(200); done(); - }); - }); - }); - - it('fails for addon auth client', function (done) { - clients.add(CLIENT_1.appId, CLIENT_1.type, CLIENT_1.redirectURI, CLIENT_1.scope, function (error, result) { - expect(error).to.equal(null); - - CLIENT_1.id = result.id; - - superagent.del(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_1.id) - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(405); - - superagent.get(SERVER_URL + '/api/v1/oauth/clients/' + CLIENT_1.id) - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(200); - - done(); - }); }); }); }); diff --git a/src/routes/test/cloudron-test.js b/src/routes/test/cloudron-test.js index f08acbdd0..56d83ca38 100644 --- a/src/routes/test/cloudron-test.js +++ b/src/routes/test/cloudron-test.js @@ -244,7 +244,6 @@ describe('Cloudron', function () { expect(result.body.progress).to.be.an('object'); expect(result.body.update).to.be.an('object'); expect(result.body.version).to.eql(config.version()); - expect(result.body.developerMode).to.be.a('boolean'); expect(result.body.size).to.eql(null); expect(result.body.region).to.eql(null); expect(result.body.memory).to.eql(os.totalmem()); @@ -270,7 +269,6 @@ describe('Cloudron', function () { expect(result.body.progress).to.be.an('object'); expect(result.body.update).to.be.an('object'); expect(result.body.version).to.eql(config.version()); - expect(result.body.developerMode).to.be.a('boolean'); expect(result.body.size).to.eql('1gb'); expect(result.body.region).to.eql('sfo'); expect(result.body.memory).to.eql(os.totalmem()); diff --git a/src/routes/test/developer-test.js b/src/routes/test/developer-test.js index 42d25b8e9..923bc576b 100644 --- a/src/routes/test/developer-test.js +++ b/src/routes/test/developer-test.js @@ -34,200 +34,10 @@ function cleanup(done) { } describe('Developer API', function () { - describe('isEnabled', function () { - before(function (done) { - async.series([ - setup, - - function (callback) { - var scope1 = nock(config.apiServerOrigin()).get('/api/v1/boxes/' + config.fqdn() + '/setup/verify?setupToken=somesetuptoken').reply(200, {}); - var scope2 = nock(config.apiServerOrigin()).post('/api/v1/boxes/' + config.fqdn() + '/setup/done?setupToken=somesetuptoken').reply(201, {}); - - superagent.post(SERVER_URL + '/api/v1/cloudron/activate') - .query({ setupToken: 'somesetuptoken' }) - .send({ username: USERNAME, password: PASSWORD, email: EMAIL }) - .end(function (error, result) { - expect(result).to.be.ok(); - expect(scope1.isDone()).to.be.ok(); - expect(scope2.isDone()).to.be.ok(); - - // stash token for further use - token = result.body.token; - - callback(); - }); - }, - ], done); - }); - - after(cleanup); - - it('fails without token', function (done) { - settings.setDeveloperMode(true, function (error) { - expect(error).to.be(null); - - superagent.get(SERVER_URL + '/api/v1/developer') - .end(function (error, result) { - expect(result.statusCode).to.equal(401); - done(); - }); - }); - }); - - it('succeeds (enabled)', function (done) { - settings.setDeveloperMode(true, function (error) { - expect(error).to.be(null); - - superagent.get(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(200); - done(); - }); - }); - }); - - it('succeeds (not enabled)', function (done) { - settings.setDeveloperMode(false, function (error) { - expect(error).to.be(null); - - superagent.get(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(412); - done(); - }); - }); - }); - }); - - describe('setEnabled', function () { - before(function (done) { - async.series([ - setup, - - function (callback) { - var scope1 = nock(config.apiServerOrigin()).get('/api/v1/boxes/' + config.fqdn() + '/setup/verify?setupToken=somesetuptoken').reply(200, {}); - var scope2 = nock(config.apiServerOrigin()).post('/api/v1/boxes/' + config.fqdn() + '/setup/done?setupToken=somesetuptoken').reply(201, {}); - - superagent.post(SERVER_URL + '/api/v1/cloudron/activate') - .query({ setupToken: 'somesetuptoken' }) - .send({ username: USERNAME, password: PASSWORD, email: EMAIL }) - .end(function (error, result) { - expect(result).to.be.ok(); - expect(scope1.isDone()).to.be.ok(); - expect(scope2.isDone()).to.be.ok(); - - // stash token for further use - token = result.body.token; - - callback(); - }); - }, - ], done); - }); - - after(cleanup); - - it('fails without token', function (done) { - superagent.post(SERVER_URL + '/api/v1/developer') - .send({ enabled: true }) - .end(function (error, result) { - expect(result.statusCode).to.equal(401); - done(); - }); - }); - - it('fails due to missing password', function (done) { - superagent.post(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .send({ enabled: true }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); - }); - - it('fails due to empty password', function (done) { - superagent.post(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .send({ password: '', enabled: true }) - .end(function (error, result) { - expect(result.statusCode).to.equal(403); - done(); - }); - }); - - it('fails due to wrong password', function (done) { - superagent.post(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .send({ password: PASSWORD.toUpperCase(), enabled: true }) - .end(function (error, result) { - expect(result.statusCode).to.equal(403); - done(); - }); - }); - - it('fails due to missing enabled property', function (done) { - superagent.post(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .send({ password: PASSWORD }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); - }); - - it('fails due to wrong enabled property type', function (done) { - superagent.post(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .send({ password: PASSWORD, enabled: 'true' }) - .end(function (error, result) { - expect(result.statusCode).to.equal(400); - done(); - }); - }); - - it('succeeds enabling', function (done) { - superagent.post(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .send({ password: PASSWORD, enabled: true }) - .end(function (error, result) { - expect(result.statusCode).to.equal(200); - - superagent.get(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(200); - done(); - }); - }); - }); - - it('succeeds disabling', function (done) { - superagent.post(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .send({ password: PASSWORD, enabled: false }) - .end(function (error, result) { - expect(result.statusCode).to.equal(200); - - superagent.get(SERVER_URL + '/api/v1/developer') - .query({ access_token: token }) - .end(function (error, result) { - expect(result.statusCode).to.equal(412); - done(); - }); - }); - }); - }); - describe('login', function () { before(function (done) { async.series([ setup, - - settings.setDeveloperMode.bind(null, true), - function (callback) { var scope1 = nock(config.apiServerOrigin()).get('/api/v1/boxes/' + config.fqdn() + '/setup/verify?setupToken=somesetuptoken').reply(200, {}); var scope2 = nock(config.apiServerOrigin()).post('/api/v1/boxes/' + config.fqdn() + '/setup/done?setupToken=somesetuptoken').reply(201, {}); @@ -373,9 +183,6 @@ describe('Developer API', function () { before(function (done) { async.series([ setup, - - settings.setDeveloperMode.bind(null, true), - function (callback) { var scope1 = nock(config.apiServerOrigin()).get('/api/v1/boxes/' + config.fqdn() + '/setup/verify?setupToken=somesetuptoken').reply(200, {}); var scope2 = nock(config.apiServerOrigin()).post('/api/v1/boxes/' + config.fqdn() + '/setup/done?setupToken=somesetuptoken').reply(201, {}); diff --git a/src/server.js b/src/server.js index 6e355eccf..45867e192 100644 --- a/src/server.js +++ b/src/server.js @@ -107,9 +107,7 @@ function initializeExpressSync() { router.get ('/api/v1/cloudron/avatar', routes.settings.getCloudronAvatar); // this is a public alias for /api/v1/settings/cloudron_avatar // developer routes - router.post('/api/v1/developer', developerScope, routes.user.requireAdmin, routes.user.verifyPassword, routes.developer.setEnabled); - router.get ('/api/v1/developer', developerScope, routes.developer.enabled, routes.developer.status); - router.post('/api/v1/developer/login', routes.developer.enabled, routes.developer.login); + router.post('/api/v1/developer/login', routes.developer.login); // cloudron routes router.get ('/api/v1/cloudron/config', cloudronScope, routes.cloudron.getConfig); @@ -168,12 +166,12 @@ function initializeExpressSync() { router.get ('/api/v1/oauth/dialog/authorize', routes.oauth2.authorization); router.post('/api/v1/oauth/token', routes.oauth2.token); router.get ('/api/v1/oauth/clients', settingsScope, routes.clients.getAll); - router.post('/api/v1/oauth/clients', routes.developer.enabled, settingsScope, routes.clients.add); - router.get ('/api/v1/oauth/clients/:clientId', routes.developer.enabled, settingsScope, routes.clients.get); - router.post('/api/v1/oauth/clients/:clientId', routes.developer.enabled, settingsScope, routes.clients.add); - router.del ('/api/v1/oauth/clients/:clientId', routes.developer.enabled, settingsScope, routes.clients.del); + router.post('/api/v1/oauth/clients', settingsScope, routes.clients.add); + router.get ('/api/v1/oauth/clients/:clientId', settingsScope, routes.clients.get); + router.post('/api/v1/oauth/clients/:clientId', settingsScope, routes.clients.add); + router.del ('/api/v1/oauth/clients/:clientId', settingsScope, routes.clients.del); router.get ('/api/v1/oauth/clients/:clientId/tokens', settingsScope, routes.clients.getClientTokens); - router.post('/api/v1/oauth/clients/:clientId/tokens', routes.developer.enabled, settingsScope, routes.clients.addClientToken); + router.post('/api/v1/oauth/clients/:clientId/tokens', settingsScope, routes.clients.addClientToken); router.del ('/api/v1/oauth/clients/:clientId/tokens', settingsScope, routes.clients.delClientTokens); router.del ('/api/v1/oauth/clients/:clientId/tokens/:tokenId', settingsScope, routes.clients.delToken); @@ -193,7 +191,7 @@ function initializeExpressSync() { router.post('/api/v1/apps/:id/start', appsScope, routes.user.requireAdmin, routes.apps.startApp); router.get ('/api/v1/apps/:id/logstream', appsScope, routes.user.requireAdmin, routes.apps.getLogStream); router.get ('/api/v1/apps/:id/logs', appsScope, routes.user.requireAdmin, routes.apps.getLogs); - router.get ('/api/v1/apps/:id/exec', routes.developer.enabled, appsScope, routes.user.requireAdmin, routes.apps.exec); + router.get ('/api/v1/apps/:id/exec', appsScope, routes.user.requireAdmin, routes.apps.exec); // websocket cannot do bearer authentication router.get ('/api/v1/apps/:id/execws', routes.oauth2.websocketAuth.bind(null, [ clients.SCOPE_APPS ]), routes.user.requireAdmin, routes.apps.execWebSocket); router.post('/api/v1/apps/:id/clone', appsScope, routes.user.requireAdmin, routes.apps.cloneApp); diff --git a/src/settings.js b/src/settings.js index e10515611..d9093046c 100644 --- a/src/settings.js +++ b/src/settings.js @@ -18,9 +18,6 @@ exports = module.exports = { getCloudronAvatar: getCloudronAvatar, setCloudronAvatar: setCloudronAvatar, - getDeveloperMode: getDeveloperMode, - setDeveloperMode: setDeveloperMode, - getDynamicDnsConfig: getDynamicDnsConfig, setDynamicDnsConfig: setDynamicDnsConfig, @@ -51,7 +48,6 @@ exports = module.exports = { getAll: getAll, // booleans. if you add an entry here, be sure to fix getAll - DEVELOPER_MODE_KEY: 'developer_mode', DYNAMIC_DNS_KEY: 'dynamic_dns', MAIL_FROM_VALIDATION_KEY: 'mail_from_validation', EMAIL_DIGEST: 'email_digest', @@ -97,7 +93,6 @@ var gDefaults = (function () { result[exports.AUTOUPDATE_PATTERN_KEY] = '00 00 1,3,5,23 * * *'; result[exports.TIME_ZONE_KEY] = 'America/Los_Angeles'; result[exports.CLOUDRON_NAME_KEY] = 'Cloudron'; - result[exports.DEVELOPER_MODE_KEY] = true; result[exports.DYNAMIC_DNS_KEY] = false; result[exports.BACKUP_CONFIG_KEY] = { provider: 'filesystem', @@ -264,31 +259,6 @@ function setCloudronAvatar(avatar, callback) { return callback(null); } -function getDeveloperMode(callback) { - assert.strictEqual(typeof callback, 'function'); - - settingsdb.get(exports.DEVELOPER_MODE_KEY, function (error, enabled) { - if (error && error.reason === DatabaseError.NOT_FOUND) return callback(null, gDefaults[exports.DEVELOPER_MODE_KEY]); - if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); - - callback(null, !!enabled); // settingsdb holds string values only - }); -} - -function setDeveloperMode(enabled, callback) { - assert.strictEqual(typeof enabled, 'boolean'); - assert.strictEqual(typeof callback, 'function'); - - // settingsdb takes string values only - settingsdb.set(exports.DEVELOPER_MODE_KEY, enabled ? 'enabled' : '', function (error) { - if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); - - exports.events.emit(exports.DEVELOPER_MODE_KEY, enabled); - - return callback(null); - }); -} - function getDynamicDnsConfig(callback) { assert.strictEqual(typeof callback, 'function'); @@ -585,7 +555,6 @@ function getAll(callback) { settings.forEach(function (setting) { result[setting.name] = setting.value; }); // convert booleans - result[exports.DEVELOPER_MODE_KEY] = !!result[exports.DEVELOPER_MODE_KEY]; result[exports.DYNAMIC_DNS_KEY] = !!result[exports.DYNAMIC_DNS_KEY]; result[exports.MAIL_FROM_VALIDATION_KEY] = !!result[exports.MAIL_FROM_VALIDATION_KEY]; diff --git a/src/test/settings-test.js b/src/test/settings-test.js index 710ebddca..415732ab5 100644 --- a/src/test/settings-test.js +++ b/src/test/settings-test.js @@ -86,29 +86,6 @@ describe('Settings', function () { }); }); - it('can get default developer mode', function (done) { - settings.getDeveloperMode(function (error, enabled) { - expect(error).to.be(null); - expect(enabled).to.equal(true); - done(); - }); - }); - - it('can set developer mode', function (done) { - settings.setDeveloperMode(true, function (error) { - expect(error).to.be(null); - done(); - }); - }); - - it('can get developer mode', function (done) { - settings.getDeveloperMode(function (error, enabled) { - expect(error).to.be(null); - expect(enabled).to.equal(true); - done(); - }); - }); - it('can set tls config', function (done) { settings.setTlsConfig({ provider: 'caas' }, function (error) { expect(error).to.be(null); diff --git a/webadmin/src/views/appstore.html b/webadmin/src/views/appstore.html index 1d5572655..0af12f191 100644 --- a/webadmin/src/views/appstore.html +++ b/webadmin/src/views/appstore.html @@ -286,7 +286,6 @@ Project Management Wiki
-


diff --git a/webadmin/src/views/settings.html b/webadmin/src/views/settings.html index 91a6e0798..82c2cb1b3 100644 --- a/webadmin/src/views/settings.html +++ b/webadmin/src/views/settings.html @@ -91,7 +91,7 @@
- +
A password is required Wrong password