Skip to content

Commit c374b0c

Browse files
committed
feat: add group permission endpoints
1 parent 4216346 commit c374b0c

File tree

4 files changed

+159
-3
lines changed

4 files changed

+159
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const APIError = require("../../api/APIError");
2+
const eggspress = require("../../api/eggspress");
3+
const { UserActorType } = require("../../services/auth/Actor");
4+
const { Context } = require("../../util/context");
5+
6+
module.exports = eggspress('/auth/grant-user-group', {
7+
subdomain: 'api',
8+
auth2: true,
9+
allowedMethods: ['POST'],
10+
}, async (req, res, next) => {
11+
const x = Context.get();
12+
const svc_permission = x.get('services').get('permission');
13+
14+
// Only users can grant user-group permissions
15+
const actor = Context.get('actor');
16+
if ( ! (actor.type instanceof UserActorType) ) {
17+
throw APIError.create('forbidden');
18+
}
19+
20+
if ( ! req.body.group_uid ) {
21+
throw APIError.create('field_missing', null, {
22+
key: 'group_uid'
23+
});
24+
}
25+
26+
if ( ! req.body.permission ) {
27+
throw APIError.create('field_missing', null, {
28+
key: 'permission'
29+
});
30+
}
31+
32+
await svc_permission.grant_user_group_permission(
33+
actor, req.body.group_uid, req.body.permission,
34+
req.body.extra || {}, req.body.meta || {}
35+
);
36+
37+
res.json({});
38+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const APIError = require("../../api/APIError");
2+
const eggspress = require("../../api/eggspress");
3+
const { UserActorType } = require("../../services/auth/Actor");
4+
const { Context } = require("../../util/context");
5+
6+
module.exports = eggspress('/auth/revoke-user-group', {
7+
subdomain: 'api',
8+
auth2: true,
9+
allowedMethods: ['POST'],
10+
}, async (req, res, next) => {
11+
const x = Context.get();
12+
const svc_permission = x.get('services').get('permission');
13+
14+
// Only users can grant user-user permissions
15+
const actor = Context.get('actor');
16+
if ( ! (actor.type instanceof UserActorType) ) {
17+
throw APIError.create('forbidden');
18+
}
19+
20+
if ( ! req.body.group_uid ) {
21+
throw APIError.create('field_missing', null, {
22+
key: 'group_uid'
23+
});
24+
}
25+
26+
if ( ! req.body.permission ) {
27+
throw APIError.create('field_missing', null, {
28+
key: 'permission'
29+
});
30+
}
31+
32+
await svc_permission.revoke_user_group_permission(
33+
actor, req.body.group_uid, req.body.permission,
34+
req.body.meta || {}
35+
);
36+
37+
res.json({});
38+
});
39+

packages/backend/src/services/PermissionAPIService.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ class PermissionAPIService extends BaseService {
99
express: require('express'),
1010
};
1111

12-
async ['__on_install.routes'] () {
13-
const { app } = this.services.get('web-server');
14-
12+
async ['__on_install.routes'] (_, { app }) {
1513
app.use(require('../routers/auth/get-user-app-token'))
1614
app.use(require('../routers/auth/grant-user-app'))
1715
app.use(require('../routers/auth/revoke-user-app'))
1816
app.use(require('../routers/auth/grant-user-user'));
1917
app.use(require('../routers/auth/revoke-user-user'));
18+
app.use(require('../routers/auth/grant-user-group'));
19+
app.use(require('../routers/auth/revoke-user-group'));
2020
app.use(require('../routers/auth/list-permissions'))
2121

2222
// track: scoping iife

packages/backend/src/services/auth/PermissionService.js

+79
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,48 @@ class PermissionService extends BaseService {
585585
]
586586
);
587587
}
588+
589+
async grant_user_group_permission (actor, gid, permission, extra = {}, meta) {
590+
permission = await this._rewrite_permission(permission);
591+
const svc_group = this.services.get('group');
592+
const group = await svc_group.get({ uid: gid });
593+
if ( ! group ) {
594+
throw new Error('group not found');
595+
}
596+
597+
await this.db.write(
598+
'INSERT INTO `user_to_group_permissions` (`user_id`, `group_id`, `permission`, `extra`) ' +
599+
'VALUES (?, ?, ?, ?) ' +
600+
this.db.case({
601+
mysql: 'ON DUPLICATE KEY UPDATE `extra` = ?',
602+
otherwise: 'ON CONFLICT(`user_id`, `group_id`, `permission`) DO UPDATE SET `extra` = ?',
603+
}),
604+
[
605+
actor.type.user.id,
606+
group.id,
607+
permission,
608+
JSON.stringify(extra),
609+
JSON.stringify(extra),
610+
]
611+
);
612+
613+
// INSERT audit table
614+
await this.db.write(
615+
'INSERT INTO `audit_user_to_group_permissions` (' +
616+
'`user_id`, `user_id_keep`, `group_id`, `group_id_keep`, ' +
617+
'`permission`, `action`, `reason`) ' +
618+
'VALUES (?, ?, ?, ?, ?, ?, ?)',
619+
[
620+
actor.type.user.id,
621+
actor.type.user.id,
622+
group.id,
623+
group.id,
624+
permission,
625+
'grant',
626+
meta?.reason || 'granted via PermissionService',
627+
]
628+
);
629+
}
588630

589631
async revoke_user_user_permission (actor, username, permission, meta) {
590632
permission = await this._rewrite_permission(permission);
@@ -623,6 +665,43 @@ class PermissionService extends BaseService {
623665
);
624666
}
625667

668+
async revoke_user_group_permission (actor, gid, permission, meta) {
669+
permission = await this._rewrite_permission(permission);
670+
const svc_group = this.services.get('group');
671+
const group = await svc_group.get({ uid: gid });
672+
if ( ! group ) {
673+
throw new Error('group not found');
674+
}
675+
676+
// DELETE permission
677+
await this.db.write(
678+
'DELETE FROM `user_to_group_permissions` ' +
679+
'WHERE `user_id` = ? AND `group_id` = ? AND `permission` = ?',
680+
[
681+
actor.type.user.id,
682+
group.id,
683+
permission,
684+
]
685+
);
686+
687+
// INSERT audit table
688+
await this.db.write(
689+
'INSERT INTO `audit_user_to_group_permissions` (' +
690+
'`user_id`, `user_id_keep`, `group_id`, `group_id_keep`, ' +
691+
'`permission`, `action`, `reason`) ' +
692+
'VALUES (?, ?, ?, ?, ?, ?, ?)',
693+
[
694+
actor.type.user.id,
695+
actor.type.user.id,
696+
group.id,
697+
group.id,
698+
permission,
699+
'revoke',
700+
meta?.reason || 'revoked via PermissionService',
701+
]
702+
);
703+
}
704+
626705
/**
627706
* List the users that have any permissions granted to the
628707
* specified user.

0 commit comments

Comments
 (0)