feature/user-api-calls (#80)

* initial changes for jwt auth

* return permissions as an array of string

* basic GET, POST, DELETE user api calls

* add permission checks

* hide hashed_password

* cleanup

* add check if admin user is active

* return account and serviceProvider sid un user object

* add more values to user PUT

* logout user after self delete, fix scope assignment

* add admin scope user tests

* fix test case and align jwt and api key data model in req.user

* fixes for ibm speech

* add limits license_count and voice_call_minutes

* update limits enum again

* rebase to main

* allow predefined carriers and speech credentials for Account user

* reverse the hasAccountPermissions changes

* SpeechCredentials permissions

* fix /Users/me api non-saas jambonz

Co-authored-by: Dave Horton <daveh@beachdognet.com>
Co-authored-by: eglehelms <e.helms@cognigy.com>
This commit is contained in:
EgleH
2022-12-10 15:12:05 +01:00
committed by GitHub
parent fadbe116c2
commit dd2176bf89
14 changed files with 759 additions and 133 deletions
+2 -1
View File
@@ -79,13 +79,14 @@ test('service provider tests', async(t) => {
}
});
//console.log(`result: ${JSON.stringify(result)}`);
t.ok(result.statusCode === 422, 'cannot add two service providers with the same name');
t.ok(result.statusCode === 422, 'cannot add two service providers with the same root domain');
/* query all service providers */
result = await request.get('/ServiceProviders', {
auth: authAdmin,
json: true,
});
console.log(JSON.stringify(result));
t.ok(result.length === 2 , 'successfully queried all service providers');
/* query one service providers */
+170 -4
View File
@@ -1,8 +1,10 @@
const test = require('tape') ;
const jwt = require('jsonwebtoken');
const request = require('request-promise-native').defaults({
baseUrl: 'http://127.0.0.1:3000/v1'
});
const exec = require('child_process').exec ;
const {generateHashedPassword} = require('../lib/utils/password-utils');
process.on('unhandledRejection', (reason, p) => {
@@ -21,7 +23,7 @@ test('add an admin user', (t) => {
test('user tests', async(t) => {
const app = require('../app');
let sid;
const password = await generateHashedPassword('abcd1234-');
try {
let result;
@@ -35,16 +37,180 @@ test('user tests', async(t) => {
}
});
t.ok(result.statusCode === 200 && result.body.token, 'successfully logged in as admin');
const authAdmin = {bearer: result.body.token};
const decodedJwt = jwt.verify(result.body.token, process.env.JWT_SECRET);
/* add admin user */
result = await request.post(`/Users`, {
resolveWithFullResponse: true,
json: true,
auth: authAdmin,
body: {
name: 'admin2',
email: 'admin2@jambonz.com',
is_active: true,
force_change: true,
initial_password: password,
}
});
t.ok(result.statusCode === 201 && result.body.user_sid, 'admin user created');
const admin_user_sid = result.body.user_sid;
/* add a service provider */
result = await request.post('/ServiceProviders', {
resolveWithFullResponse: true,
auth: authAdmin,
json: true,
body: {
name: 'sp',
}
});
t.ok(result.statusCode === 201, 'successfully created service provider');
const sp_sid = result.body.sid;
/* add service_provider user */
result = await request.post(`/Users`, {
resolveWithFullResponse: true,
json: true,
auth: authAdmin,
body: {
name: 'service_provider',
email: 'sp@jambonz.com',
is_active: true,
force_change: true,
initial_password: password,
service_provider_sid: sp_sid,
}
});
t.ok(result.statusCode === 201 && result.body.user_sid, 'service_provider scope user created');
const sp_user_sid = result.body.sid;
/* add an account */
result = await request.post('/Accounts', {
resolveWithFullResponse: true,
auth: authAdmin,
json: true,
body: {
name: 'sample_account',
service_provider_sid: sp_sid,
registration_hook: {
url: 'http://example.com/reg',
method: 'get'
},
webhook_secret: 'foobar'
}
});
t.ok(result.statusCode === 201, 'successfully created account');
const account_sid = result.body.sid;
/* add account user */
result = await request.post(`/Users`, {
resolveWithFullResponse: true,
json: true,
auth: authAdmin,
body: {
name: 'account',
email: 'account@jambonz.com',
is_active: true,
force_change: true,
initial_password: password,
service_provider_sid: sp_sid,
account_sid: account_sid
}
});
t.ok(result.statusCode === 201 && result.body.user_sid, 'account scope user created');
const account_user_sid = result.body.sid;
/* retrieve list of users */
const authAdmin = {bearer: result.body.token};
result = await request.get(`/Users`, {
resolveWithFullResponse: true,
json: true,
auth: authAdmin,
});
//console.log(result.body);
t.ok(result.statusCode === 200 && result.body.length === 1, 'successfully user list');
t.ok(result.statusCode === 200 && result.body.length, 'successfully user list');
/* delete account user */
result = await request.delete(`/Users/${account_user_sid}`, {
resolveWithFullResponse: true,
json: true,
auth: authAdmin,
});
t.ok(result.statusCode === 204, 'account scope user deleted');
/* delete sp user */
result = await request.delete(`/Users/${sp_user_sid}`, {
resolveWithFullResponse: true,
json: true,
auth: authAdmin,
});
t.ok(result.statusCode === 204, 'account scope user deleted');
/* delete admin user */
result = await request.delete(`/Users/${admin_user_sid}`, {
resolveWithFullResponse: true,
json: true,
auth: authAdmin,
});
t.ok(result.statusCode === 204, 'account scope user deleted');
// /* self delete as admin user */
// result = await request.delete(`/Users/${decodedJwt.user_sid}`, {
// resolveWithFullResponse: true,
// json: true,
// auth: authAdmin,
// });
// t.ok(result.statusCode === 500 && result.error.msg === 'cannot delete this admin user - there are no other active admin users');
/* add another service_provider user */
result = await request.post(`/Users`, {
resolveWithFullResponse: true,
json: true,
auth: authAdmin,
body: {
name: 'service_provider1',
email: 'sp1@jambonz.com',
is_active: true,
force_change: false,
initial_password: password,
service_provider_sid: sp_sid,
}
});
t.ok(result.statusCode === 201 && result.body.user_sid, 'service_provider scope user created');
/* logout as sp to get a jwt */
result = await request.post('/logout', {
resolveWithFullResponse: true,
auth: authAdmin,
json: true,
});
t.ok(result.statusCode === 204, 'successfully logged out');
// /* login as sp user to get a jwt */
// result = await request.post('/login', {
// resolveWithFullResponse: true,
// json: true,
// body: {
// username: 'service_provider1',
// password: 'abcd1234-',
// }
// });
// t.ok(result.statusCode === 200 && result.body.token, 'successfully logged in as sp');
// const authSPUser = {bearer: result.body.token};
// result = await request.post(`/Users`, {
// resolveWithFullResponse: true,
// json: true,
// auth: authSPUser,
// body: {
// name: 'sp2',
// email: 'sp2@jambonz.com',
// is_active: true,
// force_change: false,
// initial_password: password,
// }
// });
// t.ok(result.statusCode === 403, 'sp user cannot create admin users');
} catch (err) {
console.error(err);
t.end(err);