diff --git a/nodejs/models/group_ldap.js b/nodejs/models/group_ldap.js
index 7231a92..282863a 100644
--- a/nodejs/models/group_ldap.js
+++ b/nodejs/models/group_ldap.js
@@ -20,6 +20,7 @@ async function getGroups(client, member){
return groups.map(function(group){
if(!Array.isArray(group.member)) group.member = [group.member];
+ if(!Array.isArray(group.owner)) group.owner = [group.owner];
return group
});
}catch(error){
@@ -81,6 +82,41 @@ async function removeMember(client, group, user){
}
}
+async function addOwner(client, group, user){
+ try{
+ await client.modify(group.dn, [
+ new Change({
+ operation: 'add',
+ modification: new Attribute({
+ type: 'owner',
+ values: [user.dn]
+ })
+ }),
+ ]);
+ }catch(error){
+ // if(error = "TypeOrValueExistsError"){
+ // console.error('addMember error skipped', error)
+ // return ;
+ // }
+ throw error;
+ }
+}
+
+async function removeOwner(client, group, user){
+ try{
+ await client.modify(group.dn, [
+ new Change({
+ operation: 'delete',
+ modification: new Attribute({
+ type: 'owner',
+ values: [user.dn]
+ })}),
+ ]);
+ }catch(error){
+ if(error = "TypeOrValueExistsError")return ;
+ throw error;
+ }
+}
var Group = {};
@@ -133,6 +169,7 @@ Group.get = async function(data){
await client.unbind();
if(!Array.isArray(group.member)) group.member = [group.member];
+ if(!Array.isArray(group.owner)) group.owner = [group.owner];
if(group){
let obj = Object.create(this);
@@ -196,6 +233,37 @@ Group.removeMember = async function(user){
}
};
+
+Group.addOwner = async function(user){
+ try{
+ await client.bind(conf.bindDN, conf.bindPassword);
+
+ await addOwner(client, this, user);
+
+ await client.unbind();
+
+ return this;
+
+ }catch(error){
+ throw error;
+ }
+};
+
+Group.removeOwner = async function(user){
+ try{
+ await client.bind(conf.bindDN, conf.bindPassword);
+
+ await removeOwner(client, this, user);
+
+ await client.unbind();
+
+ return this;
+
+ }catch(error){
+ throw error;
+ }
+};
+
Group.remove = async function(){
try{
await client.bind(conf.bindDN, conf.bindPassword);
diff --git a/nodejs/routes/group.js b/nodejs/routes/group.js
index 39d01bd..bedf8c1 100644
--- a/nodejs/routes/group.js
+++ b/nodejs/routes/group.js
@@ -2,7 +2,8 @@
const router = require('express').Router();
const {User} = require('../models/user_ldap');
-const {Group} = require('../models/group_ldap');
+const {Group} = require('../models/group_ldap');
+const permission = require('../utils/permission');
router.get('/', async function(req, res, next){
try{
@@ -18,6 +19,9 @@ router.get('/', async function(req, res, next){
router.post('/', async function(req, res, next){
try{
+
+ await permission.byGroup(req.user, ['app_sso_admin']);
+
req.body.owner = req.user.dn;
return res.json({
results: await Group.add(req.body),
@@ -38,8 +42,44 @@ router.get('/:name', async function(req, res, next){
}
});
+router.put('/owner/:name/:uid', async function(req, res, next){
+ try{
+
+ // await permission.byGroup(req.user, ['app_sso_admin']);
+
+ var group = await Group.get(req.params.name);
+ var user = await User.get(req.params.uid);
+ return res.json({
+ results: group.addOwner(user),
+ message: `Added owner ${req.params.uid} to ${req.params.name} group.`
+ });
+ }catch(error){
+ next(error);
+ }
+});
+
+router.delete('/owner/:name/:uid', async function(req, res, next){
+ try{
+
+ await permission.byGroup(req.user, ['app_sso_admin']);
+
+ var group = await Group.get(req.params.name);
+ var user = await User.get(req.params.uid);
+ return res.json({
+ results: group.removeOwner(user),
+ message: `Removed Owner ${req.params.uid} from ${req.params.name} group.`
+ });
+ }catch(error){
+ next(error);
+ }
+});
+
+
router.put('/:name/:uid', async function(req, res, next){
try{
+
+ // await permission.byGroup(req.user, ['app_sso_admin']);
+
var group = await Group.get(req.params.name);
var user = await User.get(req.params.uid);
return res.json({
@@ -53,6 +93,9 @@ router.put('/:name/:uid', async function(req, res, next){
router.delete('/:name/:uid', async function(req, res, next){
try{
+
+ await permission.byGroup(req.user, ['app_sso_admin']);
+
var group = await Group.get(req.params.name);
var user = await User.get(req.params.uid);
return res.json({
@@ -66,6 +109,9 @@ router.delete('/:name/:uid', async function(req, res, next){
router.delete('/:name', async function(req, res, next){
try{
+
+ await permission.byGroup(req.user, ['app_sso_admin']);
+
var group = await Group.get(req.params.name);
return res.json({
removed: await group.remove(),
diff --git a/nodejs/views/groups.ejs b/nodejs/views/groups.ejs
index 1e11270..4e50d27 100644
--- a/nodejs/views/groups.ejs
+++ b/nodejs/views/groups.ejs
@@ -1,46 +1,111 @@
<%- include('top') %>