Files
cloudron-box/src/routes/test/users-test.js
T

938 lines
36 KiB
JavaScript
Raw Normal View History

/* global it:false */
/* global describe:false */
/* global before:false */
/* global after:false */
'use strict';
2020-02-11 17:32:58 -08:00
var async = require('async'),
2019-07-25 15:43:51 -07:00
constants = require('../../constants.js'),
database = require('../../database.js'),
2018-01-26 21:31:04 +01:00
domains = require('../../domains.js'),
tokendb = require('../../tokendb.js'),
expect = require('expect.js'),
2019-02-15 14:40:15 -08:00
hat = require('../../hat.js'),
groups = require('../../groups.js'),
2018-01-26 21:31:04 +01:00
mail = require('../../mail.js'),
2016-01-18 15:37:03 +01:00
mailer = require('../../mailer.js'),
2015-12-15 09:12:52 -08:00
superagent = require('superagent'),
2018-08-31 14:30:00 -07:00
server = require('../../server.js'),
users = require('../../users.js');
2019-07-25 15:43:51 -07:00
const SERVER_URL = 'http://localhost:' + constants.PORT;
2018-01-26 21:31:04 +01:00
const DOMAIN_0 = {
domain: 'example-user-test.com',
zoneName: 'example-user-test.com',
config: {},
provider: 'noop',
2018-01-31 18:09:38 +01:00
fallbackCertificate: null,
tlsConfig: { provider: 'fallback' }
2018-01-26 21:31:04 +01:00
};
2018-11-10 00:43:46 -08:00
let AUDIT_SOURCE = { ip: '1.2.3.4' };
2018-01-26 21:31:04 +01:00
const USERNAME_0 = 'superaDmIn', PASSWORD = 'Foobar?1337', EMAIL_0 = 'silLY@me.com', EMAIL_0_NEW = 'stupID@me.com', DISPLAY_NAME_0_NEW = 'New Name';
const USERNAME_1 = 'userTheFirst', EMAIL_1 = 'taO@zen.mac';
const USERNAME_2 = 'userTheSecond', EMAIL_2 = 'USER@foo.bar', EMAIL_2_NEW = 'happy@ME.com';
const USERNAME_3 = 'ut', EMAIL_3 = 'user3@FOO.bar';
const USERNAME_4 = 'importedUser', EMAIL_4 = 'import@external.com';
2016-09-30 10:17:50 -07:00
var groupObject;
function setup(done) {
2019-04-15 16:36:37 -07:00
mailer._mailQueue = [];
2018-01-26 21:31:04 +01:00
async.series([
server.start,
database._clear,
2018-11-10 00:43:46 -08:00
domains.add.bind(null, DOMAIN_0.domain, DOMAIN_0, AUDIT_SOURCE),
2018-01-26 21:31:04 +01:00
], function (error) {
expect(error).to.not.be.ok();
2016-01-18 15:37:03 +01:00
2018-07-26 10:20:19 -07:00
groups.create('somegroupname', function (error, result) {
2018-01-26 21:31:04 +01:00
expect(error).to.not.be.ok();
2016-01-18 15:37:03 +01:00
2018-01-26 21:31:04 +01:00
groupObject = result;
2018-01-26 21:31:04 +01:00
done();
});
});
}
function cleanup(done) {
database._clear(function (error) {
expect(!error).to.be.ok();
2019-04-15 16:36:37 -07:00
mailer._mailQueue = [];
2016-01-18 15:37:03 +01:00
server.stop(done);
});
}
2016-01-18 15:37:03 +01:00
function checkMails(number, done) {
// mails are enqueued async
setTimeout(function () {
2019-04-15 16:36:37 -07:00
expect(mailer._mailQueue.length).to.equal(number);
mailer._mailQueue = [];
2016-01-18 15:37:03 +01:00
done();
}, 500);
}
2018-04-29 11:29:21 -07:00
describe('Users API', function () {
var user_0, user_1, user_2, user_4;
2018-08-31 14:30:00 -07:00
var token = null, userToken = null;
2019-02-15 14:40:15 -08:00
var token_1 = hat(8 * 32);
before(setup);
after(cleanup);
2020-02-14 14:04:51 -08:00
describe('owner', function () {
it('device is in first time mode', function (done) {
superagent.get(SERVER_URL + '/api/v1/cloudron/status')
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.activated).to.not.be.ok();
done(err);
});
});
2020-02-14 14:04:51 -08:00
it('create admin fails due to missing parameters', function (done) {
superagent.post(SERVER_URL + '/api/v1/cloudron/activate')
.query({ setupToken: 'somesetuptoken' })
.send({ username: USERNAME_0 })
.end(function (err, res) {
expect(res.statusCode).to.equal(400);
done();
});
});
2020-02-14 14:04:51 -08:00
it('create admin fails because only POST is allowed', function (done) {
superagent.get(SERVER_URL + '/api/v1/cloudron/activate')
.end(function (err, res) {
expect(res.statusCode).to.equal(404);
done();
});
});
2020-03-15 15:56:06 -07:00
it('create owner', function (done) {
2020-02-14 14:04:51 -08:00
superagent.post(SERVER_URL + '/api/v1/cloudron/activate')
.query({ setupToken: 'somesetuptoken' })
.send({ username: USERNAME_0, password: PASSWORD, email: EMAIL_0 })
.end(function (err, res) {
expect(err).to.eql(null);
expect(res.statusCode).to.equal(201);
2020-02-14 14:04:51 -08:00
// stash for later use
token = res.body.token;
2016-04-04 16:17:50 +02:00
2020-02-14 14:04:51 -08:00
superagent.get(SERVER_URL + '/api/v1/profile').query({ access_token: token }).end(function (error, result) {
expect(error).to.eql(null);
expect(result.status).to.equal(200);
2016-04-04 16:17:50 +02:00
2020-02-14 14:04:51 -08:00
// stash for further use
user_0 = result.body;
done();
});
});
});
2016-04-04 16:17:50 +02:00
2020-02-14 14:04:51 -08:00
it('device left first time mode', function (done) {
superagent.get(SERVER_URL + '/api/v1/cloudron/status')
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.activated).to.be.ok();
2018-01-18 13:41:10 -08:00
done();
});
2020-02-14 14:04:51 -08:00
});
});
2020-02-14 14:04:51 -08:00
describe('user info', function () {
it('cannot get userInfo by username', function (done) {
superagent.get(SERVER_URL + '/api/v1/users/' + USERNAME_0)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(404);
2020-02-14 14:04:51 -08:00
done();
});
});
2016-04-04 16:17:50 +02:00
2020-02-14 14:04:51 -08:00
it('can get userInfo with token', function (done) {
superagent.get(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.username).to.equal(USERNAME_0.toLowerCase());
expect(res.body.email).to.equal(EMAIL_0.toLowerCase());
expect(res.body.groupIds).to.eql([]);
expect(res.body.role).to.be(users.ROLE_OWNER);
2016-04-04 16:17:50 +02:00
2020-02-14 14:04:51 -08:00
done();
});
});
2018-01-18 13:41:10 -08:00
2020-02-14 14:04:51 -08:00
it('cannot get userInfo with expired token', function (done) {
var expires = Date.now() + 2000; // 1 sec
2020-02-14 14:04:51 -08:00
let token = {
id: 'tid-0',
accessToken: hat(8 * 32),
identifier: user_0.id,
clientId: null,
expires: expires,
scope: 'unused',
name: 'tokenname'
};
2020-02-14 14:04:51 -08:00
tokendb.add(token, function (error) {
expect(error).to.not.be.ok();
2019-02-15 14:40:15 -08:00
2020-02-14 14:04:51 -08:00
setTimeout(function () {
superagent.get(SERVER_URL + '/api/v1/users/' + user_0.username)
.query({ access_token: token.accessToken })
.end(function (error, result) {
expect(result.statusCode).to.equal(401);
done();
});
}, 2000);
});
});
2020-02-14 14:04:51 -08:00
it('can get userInfo with token', function (done) {
superagent.get(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.username).to.equal(USERNAME_0.toLowerCase());
expect(res.body.email).to.equal(EMAIL_0.toLowerCase());
expect(res.body.groupIds).to.eql([]);
expect(res.body.role).to.be(users.ROLE_OWNER);
2020-02-14 14:04:51 -08:00
done();
});
});
2020-02-14 14:04:51 -08:00
it('cannot get userInfo only with basic auth', function (done) {
superagent.get(SERVER_URL + '/api/v1/users/' + user_0.id)
.auth(USERNAME_0, PASSWORD)
.end(function (err, res) {
expect(res.statusCode).to.equal(401);
done();
});
});
2018-06-17 16:13:45 -07:00
2020-02-14 14:04:51 -08:00
it('cannot get userInfo with invalid token (token length)', function (done) {
superagent.get(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: 'x' + token })
.end(function (err, res) {
expect(res.statusCode).to.equal(401);
done();
});
});
2020-02-14 14:04:51 -08:00
it('cannot get userInfo with invalid token (wrong token)', function (done) {
superagent.get(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token.toUpperCase() })
.end(function (err, res) {
expect(res.statusCode).to.equal(401);
done();
});
});
2020-02-14 14:04:51 -08:00
it('can get userInfo with token in auth header', function (done) {
superagent.get(SERVER_URL + '/api/v1/users/' + user_0.id)
.set('Authorization', 'Bearer ' + token)
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.username).to.equal(USERNAME_0.toLowerCase());
expect(res.body.email).to.equal(EMAIL_0.toLowerCase());
expect(res.body.groupIds).to.eql([]);
expect(res.body.role).to.be(users.ROLE_OWNER);
2020-02-14 14:04:51 -08:00
expect(res.body.displayName).to.be.a('string');
expect(res.body.password).to.not.be.ok();
expect(res.body.salt).to.not.be.ok();
done();
});
});
2020-02-14 14:04:51 -08:00
it('cannot get userInfo with invalid token in auth header', function (done) {
superagent.get(SERVER_URL + '/api/v1/users/' + user_0.id)
.set('Authorization', 'Bearer ' + 'x' + token)
.end(function (err, res) {
expect(res.statusCode).to.equal(401);
done();
});
});
2020-02-14 14:04:51 -08:00
it('cannot get userInfo with invalid token (wrong token)', function (done) {
superagent.get(SERVER_URL + '/api/v1/users/' + user_0.id)
.set('Authorization', 'Bearer ' + 'x' + token.toUpperCase())
.end(function (err, res) {
expect(res.statusCode).to.equal(401);
done();
});
});
});
2020-02-14 14:04:51 -08:00
describe('create user', function () {
2020-02-14 14:04:51 -08:00
it('cannot create user without email', function (done) {
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ username: USERNAME_1 })
.end(function (error, result) {
expect(error).to.be.ok();
expect(result.statusCode).to.equal(400);
done();
});
});
2020-02-14 14:04:51 -08:00
it('create second user succeeds', function (done) {
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ username: USERNAME_1, email: EMAIL_1 })
.end(function (error, result) {
expect(error).to.not.be.ok();
expect(result.statusCode).to.equal(201);
2020-02-14 14:04:51 -08:00
user_1 = result.body;
2016-04-04 16:17:50 +02:00
2020-02-14 14:04:51 -08:00
// HACK to get a token for second user (passwords are generated and the user should have gotten a password setup link...)
tokendb.add({ id: 'tid-3', accessToken: token_1, identifier: user_1.id, clientId: 'test-client-id', expires: Date.now() + 10000, scope: 'unused', name: 'fromtest' }, done);
});
});
2020-02-14 14:04:51 -08:00
it('create user missing username succeeds', function (done) {
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ email: `unnamed${EMAIL_2}` })
.end(function (error, result) {
expect(result.statusCode).to.equal(201);
done();
});
});
2016-01-18 15:37:03 +01:00
2020-02-14 14:04:51 -08:00
it('create user missing email fails', function (done) {
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ username: USERNAME_2 })
.end(function (error, result) {
expect(result.statusCode).to.equal(400);
done();
});
});
2016-01-18 15:37:03 +01:00
2020-02-14 14:04:51 -08:00
it('create user reserved name fails', function (done) {
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ username: 'no-reply' })
.end(function (error, result) {
expect(result.statusCode).to.equal(400);
done();
});
});
2016-01-18 15:37:03 +01:00
2020-02-14 14:04:51 -08:00
it('create user with short name fails', function (done) {
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ username: 'n' })
.end(function (error, result) {
expect(result.statusCode).to.equal(400);
done();
});
});
2018-08-17 09:49:58 -07:00
2020-02-14 14:04:51 -08:00
it('create second and third user', function (done) {
mailer._mailQueue = [];
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ username: USERNAME_2, email: EMAIL_2 })
.end(function (error, result) {
expect(result.statusCode).to.equal(201);
2018-08-17 09:49:58 -07:00
2020-02-14 14:04:51 -08:00
user_2 = result.body;
2020-02-14 14:04:51 -08:00
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ username: USERNAME_3, email: EMAIL_3 })
.end(function (error, result) {
expect(result.statusCode).to.equal(201);
2018-01-18 13:41:10 -08:00
2020-02-14 14:04:51 -08:00
done();
});
});
});
2018-01-18 13:41:10 -08:00
2020-02-14 14:04:51 -08:00
it('get userInfo succeeds for second user', function (done) {
superagent.get(SERVER_URL + '/api/v1/users/' + user_2.id)
.query({ access_token: token })
.end(function (error, result) {
expect(result.statusCode).to.equal(200);
expect(result.body.username).to.equal(USERNAME_2.toLowerCase());
expect(result.body.email).to.equal(EMAIL_2.toLowerCase());
expect(result.body.groupIds).to.eql([]);
2020-02-14 14:04:51 -08:00
done();
});
});
2016-06-03 00:14:52 -07:00
2020-02-14 14:04:51 -08:00
it('create user with same username should fail', function (done) {
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ username: USERNAME_2, email: EMAIL_0, invite: false })
.end(function (err, res) {
expect(res.statusCode).to.equal(409);
done();
2018-01-18 13:41:10 -08:00
});
2020-02-14 14:04:51 -08:00
});
2016-06-03 00:14:52 -07:00
2020-02-14 14:04:51 -08:00
it('cannot create user with bad password', function (done) {
mailer._mailQueue = [];
2020-02-14 14:04:51 -08:00
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ username: USERNAME_4, email: EMAIL_4, password: 'tooweak' })
.end(function (error, result) {
expect(error).to.be.ok();
expect(result.statusCode).to.equal(400);
done();
});
});
2018-01-18 13:41:10 -08:00
2020-02-14 14:04:51 -08:00
it('can create user with a password', function (done) {
superagent.post(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.send({ username: USERNAME_4, email: EMAIL_4, password: 'Secret1#' })
.end(function (error, result) {
expect(error).to.not.be.ok();
expect(result.statusCode).to.equal(201);
2018-01-18 13:41:10 -08:00
2020-02-14 14:04:51 -08:00
user_4 = result.body;
2020-02-14 14:04:51 -08:00
userToken = hat(8 * 32);
var expires = Date.now() + 2000; // 1 sec
2020-02-14 13:01:51 -08:00
2020-02-14 14:04:51 -08:00
tokendb.add({ id: 'tid-2', accessToken: userToken, identifier: user_4.id, clientId: null, expires: expires, scope: 'unused', name: '' }, done);
});
});
2020-02-14 14:04:51 -08:00
it('can get profile of user with pre-set password', function (done) {
superagent.get(SERVER_URL + '/api/v1/profile')
.query({ access_token: userToken })
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
2020-02-14 14:04:51 -08:00
expect(res.body.email).to.be(EMAIL_4);
2016-05-23 15:00:21 -07:00
2020-02-14 14:04:51 -08:00
done();
});
});
2016-05-23 15:00:21 -07:00
});
2020-02-14 14:04:51 -08:00
describe('invite', function () {
2016-04-04 16:17:50 +02:00
2020-02-14 14:04:51 -08:00
it('reinvite unknown user fails', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + USERNAME_1+USERNAME_1 + '/create_invite')
.query({ access_token: token })
.send({})
.end(function (err, res) {
expect(err).to.be.an(Error);
expect(res.statusCode).to.equal(404);
done();
});
});
2018-01-18 13:41:10 -08:00
2020-02-14 14:04:51 -08:00
it('send invite without creating invite fails succeeds', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_1.id + '/send_invite')
.query({ access_token: token })
.send({})
.end(function (err, res) {
expect(err).to.be.an(Error);
expect(res.statusCode).to.equal(409);
done();
});
});
2020-02-14 14:04:51 -08:00
it('create invite second user succeeds', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_1.id + '/create_invite')
.query({ access_token: token })
.send({})
.end(function (err, res) {
expect(err).to.not.be.ok();
expect(res.statusCode).to.equal(200);
expect(res.body.resetToken).to.be.ok();
done();
});
});
2020-02-14 14:04:51 -08:00
it('can send invite', function (done) {
mailer._mailQueue = [];
2018-01-18 13:41:10 -08:00
2020-02-14 14:04:51 -08:00
superagent.post(SERVER_URL + '/api/v1/users/' + user_1.id + '/send_invite')
.query({ access_token: token })
.send({})
.end(function (err, res) {
expect(err).to.be(null);
expect(res.statusCode).to.equal(200);
checkMails(1, done);
});
});
});
2020-02-14 14:04:51 -08:00
describe('admin status', function () {
it('set second user as admin succeeds', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_1.id)
.query({ access_token: token })
.send({ role: users.ROLE_ADMIN })
2020-02-14 14:04:51 -08:00
.end(function (err, res) {
expect(res.statusCode).to.equal(204);
2016-02-25 13:53:18 +01:00
2020-02-14 14:04:51 -08:00
superagent.get(SERVER_URL + '/api/v1/users/' + user_1.id)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.role).to.be(users.ROLE_ADMIN);
2018-01-18 13:41:10 -08:00
2020-02-14 14:04:51 -08:00
done();
});
2018-01-18 13:41:10 -08:00
});
2020-02-14 14:04:51 -08:00
});
2018-01-18 13:41:10 -08:00
it('make self as admin fails', function (done) {
2020-02-14 14:04:51 -08:00
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token })
.send({ role: users.ROLE_ADMIN })
.end(function (err, res) {
expect(res.statusCode).to.equal(409);
done();
});
});
it('make self as normal user fails', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token })
.send({ role: users.ROLE_USER })
2020-02-14 14:04:51 -08:00
.end(function (err, res) {
expect(res.statusCode).to.equal(409);
done();
});
});
2020-02-14 14:04:51 -08:00
it('remove second user as admin succeeds', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_1.id)
.query({ access_token: token })
.send({ role: users.ROLE_USER })
2020-02-14 14:04:51 -08:00
.end(function (err, res) {
expect(res.statusCode).to.equal(204);
done();
});
});
});
2020-02-14 14:04:51 -08:00
describe('groups', function () {
it('does not list groupIds when listing users', function (done) {
superagent.get(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.end(function (error, res) {
expect(error).to.be(null);
expect(res.statusCode).to.equal(200);
expect(res.body.users).to.be.an('array');
2020-02-14 14:04:51 -08:00
res.body.users.forEach(function (user) {
expect('groupIds' in user).to.be(false);
});
done();
});
});
2020-02-14 14:04:51 -08:00
it('remove second user from group succeeds', function (done) {
superagent.put(SERVER_URL + '/api/v1/users/' + user_1.id + '/groups')
.query({ access_token: token })
.send({ groupIds: [ groupObject.id ] })
.end(function (err, res) {
expect(res.statusCode).to.equal(204);
superagent.get(SERVER_URL + '/api/v1/users/' + user_1.id)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.groupIds).to.eql([ groupObject.id ]);
done();
});
});
});
});
2020-02-14 14:04:51 -08:00
describe('list users', function () {
2016-01-25 14:12:09 +01:00
2020-02-14 14:04:51 -08:00
it('list users fails for normal user', function (done) {
superagent.get(SERVER_URL + '/api/v1/users')
.query({ access_token: token_1 })
.end(function (error, res) {
expect(res.statusCode).to.equal(403);
done();
});
});
2018-01-18 13:41:10 -08:00
2020-02-14 14:04:51 -08:00
it('list users succeeds for admin', function (done) {
superagent.get(SERVER_URL + '/api/v1/users')
.query({ access_token: token })
.end(function (error, res) {
expect(error).to.be(null);
expect(res.statusCode).to.equal(200);
expect(res.body.users).to.be.an('array');
expect(res.body.users.length).to.equal(6);
res.body.users.forEach(function (user) {
expect(user).to.be.an('object');
expect(user.id).to.be.ok();
expect(user.email).to.be.ok();
if (!user.email.startsWith('unnamed')) expect(user.username).to.be.ok();
expect(user.password).to.not.be.ok();
expect(user.salt).to.not.be.ok();
expect(user.groupIds).to.not.be.ok();
2018-01-18 13:41:10 -08:00
});
2020-02-14 14:04:51 -08:00
done();
});
});
});
2020-02-14 14:04:51 -08:00
describe('update', function () {
// Change email
it('change email fails due to missing token', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id)
.send({ email: EMAIL_0_NEW })
.end(function (error, result) {
expect(result.statusCode).to.equal(401);
done();
});
});
2020-02-14 14:04:51 -08:00
it('change email fails due to invalid email', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token })
.send({ email: 'foo@bar' })
.end(function (error, result) {
expect(result.statusCode).to.equal(400);
done();
});
});
2020-02-14 14:04:51 -08:00
it('change user succeeds without email nor displayName', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token })
.send({})
.end(function (error, result) {
expect(result.statusCode).to.equal(204);
done();
});
});
2020-02-14 14:04:51 -08:00
it('change email succeeds', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_2.id)
.query({ access_token: token })
.send({ email: EMAIL_2_NEW })
.end(function (error, result) {
expect(result.statusCode).to.equal(204);
superagent.get(SERVER_URL + '/api/v1/users/' + user_2.id)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.username).to.equal(USERNAME_2.toLowerCase());
expect(res.body.email).to.equal(EMAIL_2_NEW.toLowerCase());
expect(res.body.displayName).to.equal('');
done();
});
});
});
2020-02-14 14:04:51 -08:00
it('change email as admin for other user succeeds', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_2.id)
.query({ access_token: token })
.send({ email: EMAIL_2 })
.end(function (error, result) {
expect(result.statusCode).to.equal(204);
superagent.get(SERVER_URL + '/api/v1/users/' + user_2.id)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.username).to.equal(USERNAME_2.toLowerCase());
expect(res.body.email).to.equal(EMAIL_2.toLowerCase());
expect(res.body.displayName).to.equal('');
done();
});
});
});
2020-02-14 14:04:51 -08:00
it('change displayName succeeds', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token })
.send({ displayName: DISPLAY_NAME_0_NEW })
.end(function (error, result) {
expect(result.statusCode).to.equal(204);
superagent.get(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.username).to.equal(USERNAME_0.toLowerCase());
expect(res.body.email).to.equal(EMAIL_0.toLowerCase());
expect(res.body.displayName).to.equal(DISPLAY_NAME_0_NEW);
done();
});
});
});
});
2020-02-14 14:04:51 -08:00
describe('password', function () {
// Change password
it('change password fails due to missing token', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id + '/password')
.send({ password: 'youdontsay' })
.end(function (error, result) {
expect(result.statusCode).to.equal(401);
done();
});
});
2020-02-14 14:04:51 -08:00
it('change password fails due to small password', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id + '/password')
.query({ access_token: token })
.send({ password: 'small' })
.end(function (error, result) {
expect(result.statusCode).to.equal(400);
done();
});
});
2018-08-31 14:30:00 -07:00
2020-02-14 14:04:51 -08:00
it('change password succeeds', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id + '/password')
.query({ access_token: token })
.send({ password: 'bigenough' })
.end(function (error, result) {
expect(result.statusCode).to.equal(204);
done();
});
});
2018-08-31 14:30:00 -07:00
2020-02-14 14:04:51 -08:00
it('did change the user password', function (done) {
users.verify(user_0.id, 'bigenough', users.AP_WEBADMIN, function (error) {
expect(error).to.be(null);
2018-08-31 14:30:00 -07:00
done();
});
2020-02-14 14:04:51 -08:00
});
2018-08-31 14:30:00 -07:00
});
2020-02-14 14:04:51 -08:00
describe('app password', function () {
2018-08-31 14:30:00 -07:00
2020-02-14 14:04:51 -08:00
it('cannot add app password with invalid token', function (done) {
superagent.post(SERVER_URL + '/api/v1/app_passwords')
.query({ access_token: token + 'xx' })
.send({ name: 'my-device', identifier: 'someapp' })
.end(function (error, result) {
expect(result.statusCode).to.equal(401);
done();
});
2018-08-31 14:30:00 -07:00
});
2020-02-01 10:00:52 -08:00
2020-02-14 14:04:51 -08:00
it('cannot add app password without name', function (done) {
superagent.post(SERVER_URL + '/api/v1/app_passwords')
.query({ access_token: token })
.send({ identifier: 'someapp' })
.end(function (error, result) {
expect(result.statusCode).to.equal(400);
done();
});
});
2020-02-01 10:00:52 -08:00
2020-02-14 14:04:51 -08:00
let pwd;
it('can add app password', function (done) {
superagent.post(SERVER_URL + '/api/v1/app_passwords')
.query({ access_token: token })
.send({ name: 'my-device', identifier: 'someapp' })
.end(function (error, result) {
expect(result.statusCode).to.equal(201);
expect(result.body.password).to.be.a('string');
pwd = result.body;
done();
});
});
2020-02-01 10:00:52 -08:00
2020-02-14 14:04:51 -08:00
it('can get app passwords', function (done) {
superagent.get(SERVER_URL + '/api/v1/app_passwords')
.query({ access_token: token })
.end(function (error, result) {
expect(result.statusCode).to.equal(200);
expect(result.body.appPasswords).to.be.an(Array);
expect(result.body.appPasswords.length).to.be(1);
expect(result.body.appPasswords[0].name).to.be('my-device');
expect(result.body.appPasswords[0].identifier).to.be('someapp');
expect(result.body.appPasswords[0].hashedPassword).to.be(undefined);
expect(result.body.appPasswords[0].password).to.be(undefined);
done();
});
});
2020-02-01 10:00:52 -08:00
2020-02-14 14:04:51 -08:00
it('can get app password', function (done) {
superagent.get(SERVER_URL + '/api/v1/app_passwords/' + pwd.id)
.query({ access_token: token })
.end(function (error, result) {
expect(result.statusCode).to.equal(200);
expect(result.body.name).to.be('my-device');
expect(result.body.identifier).to.be('someapp');
expect(result.body.hashedPassword).to.be(undefined);
expect(result.body.password).to.be(undefined);
done();
});
});
2020-02-01 10:00:52 -08:00
2020-02-14 14:04:51 -08:00
it('can del app password', function (done) {
superagent.del(SERVER_URL + '/api/v1/app_passwords/' + pwd.id)
.query({ access_token: token })
.end(function (error, result) {
expect(result.statusCode).to.equal(204);
done();
});
});
2020-02-01 10:00:52 -08:00
});
2020-02-14 14:34:29 -08:00
describe('role - user manager', function () {
2020-02-14 14:34:29 -08:00
it('can make second user a usermanager', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_1.id)
.query({ access_token: token })
.send({ role: users.ROLE_USER_MANAGER })
2020-02-14 14:34:29 -08:00
.end(function (err, res) {
expect(res.statusCode).to.equal(204);
done();
});
});
it('can list users as usermanager', function (done) {
superagent.get(SERVER_URL + '/api/v1/users')
.query({ access_token: token_1 })
.end(function (error, res) {
expect(res.statusCode).to.equal(200);
done();
});
});
it('cannot set password of admin', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id + '/password')
.query({ access_token: token_1 })
.send({ password: 'bigenough' })
.end(function (error, result) {
expect(result.statusCode).to.equal(403);
done();
});
});
it('can set password of another', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_2.id + '/password')
.query({ access_token: token_1 })
.send({ password: 'bigenough' })
.end(function (error, result) {
expect(result.statusCode).to.equal(204);
done();
});
});
it('cannot create invite for admin', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_0.id + '/create_invite')
.query({ access_token: token_1 })
.send({})
.end(function (err, result) {
expect(result.statusCode).to.equal(403);
done();
});
});
it('cannot change admin bit of another', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_2.id)
.query({ access_token: token_1 })
.send({ role: users.ROLE_ADMIN })
2020-02-14 14:34:29 -08:00
.end(function (err, result) {
expect(result.statusCode).to.equal(403);
done();
});
});
it('cannot change admin bit of self', function (done) {
superagent.post(SERVER_URL + '/api/v1/users/' + user_1.id)
.query({ access_token: token_1 })
.send({ role: users.ROLE_ADMIN })
2020-02-14 14:34:29 -08:00
.end(function (err, result) {
expect(result.statusCode).to.equal(409);
2020-02-14 14:34:29 -08:00
done();
});
});
it('cannot remove admin', function (done) {
superagent.del(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token_1 })
.end(function (err, res) {
expect(res.statusCode).to.equal(403);
done();
});
});
it('can remove normal user', function (done) {
superagent.del(SERVER_URL + '/api/v1/users/' + user_2.id)
.query({ access_token: token_1 })
.end(function (err, res) {
expect(res.statusCode).to.equal(204);
done();
});
});
});
describe('remove', function () {
it('remove random user fails', function (done) {
superagent.del(SERVER_URL + '/api/v1/users/randomid')
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(404);
done();
});
});
it('user removes himself is not allowed', function (done) {
superagent.del(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(409);
done();
});
});
it('admin removes normal user', function (done) {
superagent.del(SERVER_URL + '/api/v1/users/' + user_1.id)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(204);
done();
});
});
it('admin removes himself should not be allowed', function (done) {
superagent.del(SERVER_URL + '/api/v1/users/' + user_0.id)
.query({ access_token: token })
.end(function (err, res) {
expect(res.statusCode).to.equal(409);
done();
});
});
});
});