mirror of
https://github.com/documize/community.git
synced 2025-07-19 13:19:43 +02:00
Remove group permissions on delete event
This commit is contained in:
parent
1c4a4424e5
commit
359e0e29eb
7 changed files with 236 additions and 142 deletions
10
.editorconfig
Normal file
10
.editorconfig
Normal file
|
@ -0,0 +1,10 @@
|
|||
sample EditorConfig file
|
||||
# indicate this is the root of the project
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
indent_size = 4
|
|
@ -202,6 +202,7 @@ func (h *Handler) Delete(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
// Delete group and associated membership data
|
||||
_, err = h.Store.Group.Delete(ctx, g.RefID)
|
||||
if err != nil {
|
||||
ctx.Transaction.Rollback()
|
||||
|
@ -210,6 +211,15 @@ func (h *Handler) Delete(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
// Delete permissions associated with group
|
||||
_, err = h.Store.Permission.DeleteGroupPermissions(ctx, groupID)
|
||||
if err != nil {
|
||||
ctx.Transaction.Rollback()
|
||||
response.WriteServerError(w, method, err)
|
||||
h.Runtime.Log.Error(method, err)
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Transaction.Commit()
|
||||
|
||||
h.Store.Audit.Record(ctx, audit.EventTypeGroupDelete)
|
||||
|
|
|
@ -289,3 +289,13 @@ func (s Scope) DeleteSpaceCategoryPermissions(ctx domain.RequestContext, spaceID
|
|||
|
||||
return b.DeleteWhere(ctx.Transaction, sql)
|
||||
}
|
||||
|
||||
// DeleteGroupPermissions removes all roles for the specified group
|
||||
func (s Scope) DeleteGroupPermissions(ctx domain.RequestContext, groupID string) (rows int64, err error) {
|
||||
b := mysql.BaseQuery{}
|
||||
|
||||
sql := fmt.Sprintf("DELETE FROM permission WHERE orgid='%s' AND who='role' AND whoid='%s'",
|
||||
ctx.OrgID, groupID)
|
||||
|
||||
return b.DeleteWhere(ctx.Transaction, sql)
|
||||
}
|
||||
|
|
|
@ -88,17 +88,18 @@ type PermissionStorer interface {
|
|||
AddPermissions(ctx RequestContext, r permission.Permission, actions ...permission.Action) (err error)
|
||||
GetUserSpacePermissions(ctx RequestContext, spaceID string) (r []permission.Permission, err error)
|
||||
GetSpacePermissions(ctx RequestContext, spaceID string) (r []permission.Permission, err error)
|
||||
DeleteSpacePermissions(ctx RequestContext, spaceID string) (rows int64, err error)
|
||||
DeleteUserSpacePermissions(ctx RequestContext, spaceID, userID string) (rows int64, err error)
|
||||
DeleteUserPermissions(ctx RequestContext, userID string) (rows int64, err error)
|
||||
DeleteCategoryPermissions(ctx RequestContext, categoryID string) (rows int64, err error)
|
||||
DeleteSpaceCategoryPermissions(ctx RequestContext, spaceID string) (rows int64, err error)
|
||||
GetCategoryPermissions(ctx RequestContext, catID string) (r []permission.Permission, err error)
|
||||
GetCategoryUsers(ctx RequestContext, catID string) (u []user.User, err error)
|
||||
GetUserCategoryPermissions(ctx RequestContext, userID string) (r []permission.Permission, err error)
|
||||
GetUserDocumentPermissions(ctx RequestContext, documentID string) (r []permission.Permission, err error)
|
||||
GetDocumentPermissions(ctx RequestContext, documentID string) (r []permission.Permission, err error)
|
||||
DeleteDocumentPermissions(ctx RequestContext, documentID string) (rows int64, err error)
|
||||
DeleteSpacePermissions(ctx RequestContext, spaceID string) (rows int64, err error)
|
||||
DeleteUserSpacePermissions(ctx RequestContext, spaceID, userID string) (rows int64, err error)
|
||||
DeleteUserPermissions(ctx RequestContext, userID string) (rows int64, err error)
|
||||
DeleteCategoryPermissions(ctx RequestContext, categoryID string) (rows int64, err error)
|
||||
DeleteSpaceCategoryPermissions(ctx RequestContext, spaceID string) (rows int64, err error)
|
||||
DeleteGroupPermissions(ctx RequestContext, groupID string) (rows int64, err error)
|
||||
}
|
||||
|
||||
// UserStorer defines required methods for user management
|
||||
|
|
|
@ -33,7 +33,9 @@ export default Component.extend(AuthProvider, ModalMixin, {
|
|||
},
|
||||
|
||||
loadGroups() {
|
||||
this.get('groupSvc').getAll().then((groups) => {
|
||||
this.get('groupSvc')
|
||||
.getAll()
|
||||
.then(groups => {
|
||||
this.set('groups', groups);
|
||||
});
|
||||
},
|
||||
|
@ -46,14 +48,18 @@ export default Component.extend(AuthProvider, ModalMixin, {
|
|||
let groupId = this.get('membersGroup.id');
|
||||
let searchText = this.get('searchText');
|
||||
|
||||
this.get('groupSvc').getGroupMembers(groupId).then((members) => {
|
||||
this.get('groupSvc')
|
||||
.getGroupMembers(groupId)
|
||||
.then(members => {
|
||||
this.set('members', members);
|
||||
|
||||
this.get('userSvc').matchUsers(searchText).then((users) => {
|
||||
users.forEach((user) => {
|
||||
this.get('userSvc')
|
||||
.matchUsers(searchText)
|
||||
.then(users => {
|
||||
users.forEach(user => {
|
||||
let m = members.findBy('userId', user.get('id'));
|
||||
user.set('isMember', is.not.undefined(m));
|
||||
})
|
||||
});
|
||||
|
||||
if (this.get('showMembers') && members.length === 0) {
|
||||
this.set('showMembers', false);
|
||||
|
@ -67,7 +73,11 @@ export default Component.extend(AuthProvider, ModalMixin, {
|
|||
|
||||
actions: {
|
||||
onOpenGroupModal() {
|
||||
this.modalOpen("#add-group-modal", {"show": true}, '#new-group-name');
|
||||
this.modalOpen(
|
||||
'#add-group-modal',
|
||||
{ show: true },
|
||||
'#new-group-name'
|
||||
);
|
||||
},
|
||||
|
||||
onAddGroup(e) {
|
||||
|
@ -76,21 +86,29 @@ export default Component.extend(AuthProvider, ModalMixin, {
|
|||
let newGroup = this.get('newGroup');
|
||||
|
||||
if (is.empty(newGroup.name)) {
|
||||
$("#new-group-name").addClass("is-invalid").focus();
|
||||
$('#new-group-name')
|
||||
.addClass('is-invalid')
|
||||
.focus();
|
||||
return;
|
||||
}
|
||||
|
||||
this.get('groupSvc').add(newGroup).then(() => {
|
||||
this.get('groupSvc')
|
||||
.add(newGroup)
|
||||
.then(() => {
|
||||
this.loadGroups();
|
||||
});
|
||||
|
||||
this.modalClose("#add-group-modal");
|
||||
this.modalClose('#add-group-modal');
|
||||
this.setDefaults();
|
||||
},
|
||||
|
||||
onShowDeleteModal(groupId) {
|
||||
this.set('deleteGroup', { name: '', id: groupId });
|
||||
this.modalOpen("#delete-group-modal", {"show": true}, '#delete-group-name');
|
||||
this.modalOpen(
|
||||
'#delete-group-modal',
|
||||
{ show: true },
|
||||
'#delete-group-name'
|
||||
);
|
||||
},
|
||||
|
||||
onDeleteGroup(e) {
|
||||
|
@ -99,22 +117,33 @@ export default Component.extend(AuthProvider, ModalMixin, {
|
|||
let deleteGroup = this.get('deleteGroup');
|
||||
let group = this.get('groups').findBy('id', deleteGroup.id);
|
||||
|
||||
if (is.empty(deleteGroup.name) || group.get('name') !== deleteGroup.name) {
|
||||
$("#delete-group-name").addClass("is-invalid").focus();
|
||||
if (
|
||||
is.empty(deleteGroup.name) ||
|
||||
group.get('name') !== deleteGroup.name
|
||||
) {
|
||||
$('#delete-group-name')
|
||||
.addClass('is-invalid')
|
||||
.focus();
|
||||
return;
|
||||
}
|
||||
|
||||
this.get('groupSvc').delete(deleteGroup.id).then(() => {
|
||||
this.get('groupSvc')
|
||||
.delete(deleteGroup.id)
|
||||
.then(() => {
|
||||
this.loadGroups();
|
||||
});
|
||||
|
||||
this.modalClose("#delete-group-modal");
|
||||
this.modalClose('#delete-group-modal');
|
||||
this.set('deleteGroup', { name: '', id: '' });
|
||||
},
|
||||
|
||||
onShowEditModal(groupId) {
|
||||
this.set('editGroup', this.get('groups').findBy('id', groupId));
|
||||
this.modalOpen("#edit-group-modal", {"show": true}, '#edit-group-name');
|
||||
this.modalOpen(
|
||||
'#edit-group-modal',
|
||||
{ show: true },
|
||||
'#edit-group-name'
|
||||
);
|
||||
},
|
||||
|
||||
onEditGroup(e) {
|
||||
|
@ -123,21 +152,29 @@ export default Component.extend(AuthProvider, ModalMixin, {
|
|||
let group = this.get('editGroup');
|
||||
|
||||
if (is.empty(group.get('name'))) {
|
||||
$("#edit-group-name").addClass("is-invalid").focus();
|
||||
$('#edit-group-name')
|
||||
.addClass('is-invalid')
|
||||
.focus();
|
||||
return;
|
||||
}
|
||||
|
||||
this.get('groupSvc').update(group).then(() => {
|
||||
this.get('groupSvc')
|
||||
.update(group)
|
||||
.then(() => {
|
||||
this.load();
|
||||
});
|
||||
|
||||
this.modalClose("#edit-group-modal");
|
||||
this.modalClose('#edit-group-modal');
|
||||
this.set('editGroup', null);
|
||||
},
|
||||
|
||||
onShowMembersModal(groupId) {
|
||||
this.set('membersGroup', this.get('groups').findBy('id', groupId));
|
||||
this.modalOpen("#group-members-modal", {"show": true}, '#group-members-search');
|
||||
this.modalOpen(
|
||||
'#group-members-modal',
|
||||
{ show: true },
|
||||
'#group-members-search'
|
||||
);
|
||||
this.set('members', null);
|
||||
this.set('users', null);
|
||||
this.set('showMembers', true);
|
||||
|
@ -146,7 +183,9 @@ export default Component.extend(AuthProvider, ModalMixin, {
|
|||
},
|
||||
|
||||
onSearch() {
|
||||
debounce(this, function() {
|
||||
debounce(
|
||||
this,
|
||||
function() {
|
||||
let searchText = this.get('searchText');
|
||||
this.loadGroupInfo();
|
||||
|
||||
|
@ -157,13 +196,17 @@ export default Component.extend(AuthProvider, ModalMixin, {
|
|||
this.set('showMembers', true);
|
||||
this.set('showUsers', false);
|
||||
}
|
||||
}, 250);
|
||||
},
|
||||
250
|
||||
);
|
||||
},
|
||||
|
||||
onLeaveGroup(userId) {
|
||||
let groupId = this.get('membersGroup.id');
|
||||
|
||||
this.get('groupSvc').leave(groupId, userId).then(() => {
|
||||
this.get('groupSvc')
|
||||
.leave(groupId, userId)
|
||||
.then(() => {
|
||||
this.loadGroupInfo();
|
||||
this.loadGroups();
|
||||
});
|
||||
|
@ -172,7 +215,9 @@ export default Component.extend(AuthProvider, ModalMixin, {
|
|||
onJoinGroup(userId) {
|
||||
let groupId = this.get('membersGroup.id');
|
||||
|
||||
this.get('groupSvc').join(groupId, userId).then(() => {
|
||||
this.get('groupSvc')
|
||||
.join(groupId, userId)
|
||||
.then(() => {
|
||||
this.loadGroupInfo();
|
||||
this.loadGroups();
|
||||
});
|
||||
|
|
|
@ -25,28 +25,39 @@ export default Router.map(function () {
|
|||
path: 'dashboard'
|
||||
});
|
||||
|
||||
this.route('folder', {
|
||||
this.route(
|
||||
'folder',
|
||||
{
|
||||
path: 's/:folder_id/:folder_slug'
|
||||
}, function() {
|
||||
},
|
||||
function() {
|
||||
this.route('category', {
|
||||
path: 'category'
|
||||
})
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
this.route('document', {
|
||||
this.route(
|
||||
'document',
|
||||
{
|
||||
path: 's/:folder_id/:folder_slug/d/:document_id/:document_slug'
|
||||
}, function () {
|
||||
},
|
||||
function() {
|
||||
this.route('section', {
|
||||
path: 'section/:page_id'
|
||||
});
|
||||
this.route('block', {
|
||||
path: 'block/:block_id'
|
||||
});
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
this.route('customize', {
|
||||
this.route(
|
||||
'customize',
|
||||
{
|
||||
path: 'settings'
|
||||
}, function () {
|
||||
},
|
||||
function() {
|
||||
this.route('general', {
|
||||
path: 'general'
|
||||
});
|
||||
|
@ -71,7 +82,8 @@ export default Router.map(function () {
|
|||
this.route('audit', {
|
||||
path: 'audit'
|
||||
});
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
this.route('setup', {
|
||||
path: 'setup'
|
||||
|
@ -81,9 +93,12 @@ export default Router.map(function () {
|
|||
path: 'secure/:token'
|
||||
});
|
||||
|
||||
this.route('auth', {
|
||||
this.route(
|
||||
'auth',
|
||||
{
|
||||
path: 'auth'
|
||||
}, function () {
|
||||
},
|
||||
function() {
|
||||
this.route('sso', {
|
||||
path: 'sso/:token'
|
||||
});
|
||||
|
@ -105,7 +120,8 @@ export default Router.map(function () {
|
|||
this.route('share', {
|
||||
path: 'share/:id/:slug/:serial'
|
||||
});
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
this.route('profile', {
|
||||
path: 'profile'
|
||||
|
|
|
@ -56,7 +56,9 @@
|
|||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="margin-top-30"><i>No groups</i></div>
|
||||
<div class="margin-top-30">
|
||||
<i>No groups</i>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue