diff --git a/spec/SettingsRouter.spec.js b/spec/SettingsRouter.spec.js new file mode 100644 index 0000000000..913e2c8a8f --- /dev/null +++ b/spec/SettingsRouter.spec.js @@ -0,0 +1,57 @@ +var request = require('request'); + +var headers = { + 'X-Parse-Application-Id': 'test', + 'X-Parse-Master-Key': 'test' +}; + + +describe('SettingsRouter', () => { + + it('should set the loglevel', (done) => { + request.post({ + headers: headers, + json: { + 'logLevel': 'silly' + }, + url: 'http://localhost:8378/1/settings' + }, (err, res, body) => { + request.get({ + url: 'http://localhost:8378/1/settings', + headers: headers + }, (err, res, body)=> { + body = JSON.parse(body); + expect(body.logLevel).toBe('silly'); + done(); + }); + }); + }); + + it('should not access without masterKey', (done) => { + request.post({ + headers: { + 'X-Parse-Application-Id': 'test', + 'X-Parse-Master-Key': 'invalid' + }, + json: { + 'logLevel': 'silly' + }, + url: 'http://localhost:8378/1/settings' + }, (err, res, body) => { + expect(body.error).not.toBeUndefined(); + expect(body.error).toBe('unauthorized'); + request.get({ + url: 'http://localhost:8378/1/settings', + headers: { + 'X-Parse-Application-Id': 'test', + 'X-Parse-Master-Key': 'invalid' + } + }, (err, res, body)=> { + body = JSON.parse(body); + expect(body.error).toBe('unauthorized'); + done(); + }); + }); + }) + +}) diff --git a/src/ParseServer.js b/src/ParseServer.js index a556bf1e51..1c1eececf1 100644 --- a/src/ParseServer.js +++ b/src/ParseServer.js @@ -46,6 +46,7 @@ import { SchemasRouter } from './Routers/SchemasRouter'; import { SessionsRouter } from './Routers/SessionsRouter'; import { UserController } from './Controllers/UserController'; import { UsersRouter } from './Routers/UsersRouter'; +import { SettingsRouter } from './Routers/SettingsRouter'; import ParsePushAdapter from 'parse-server-push-adapter'; // Mutate the Parse object to add the Cloud Code handlers @@ -246,6 +247,7 @@ class ParseServer { new IAPValidationRouter(), new FeaturesRouter(), new GlobalConfigRouter(), + new SettingsRouter(), ]; if (process.env.PARSE_EXPERIMENTAL_HOOKS_ENABLED || process.env.TESTING) { diff --git a/src/Routers/SettingsRouter.js b/src/Routers/SettingsRouter.js new file mode 100644 index 0000000000..6d0a97af6a --- /dev/null +++ b/src/Routers/SettingsRouter.js @@ -0,0 +1,26 @@ +import PromiseRouter from '../PromiseRouter'; +import * as middleware from "../middlewares"; +import { logger, configureLogger } from '../logger'; +import winston from 'winston'; + +export class SettingsRouter extends PromiseRouter { + mountRoutes() { + this.route('GET', '/settings', middleware.promiseEnforceMasterKeyAccess, (req) => { + return Promise.resolve({ + response: { + logLevel: winston.level + } + }) + }); + this.route('POST','/settings', middleware.promiseEnforceMasterKeyAccess, (req) => { + let body = req.body; + let logLevel = body.logLevel; + if (logLevel) { + configureLogger({level: logLevel}); + } + return Promise.resolve({ + response: body + }) + }); + } +}