From 7fdd511c79523ea42d401253cd7b7a38564d8a9d Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Tue, 5 Mar 2019 13:12:57 +0300 Subject: [PATCH] ACL editor Former-commit-id: 10a0bbb02e13f622e062153e253a002476863a4c --- .../model/PostgrePrivilegeType.java | 2 +- .../dbeaver/model/access/DBAPrivilege.java | 3 + .../acl/ACLCommandChangePrivilege.java | 85 +++++++++++++++++++ .../ui/editors/acl/BaseACLManager.java | 34 ++++++++ .../ui/editors/acl/ObjectACLEditor.java | 50 ++++++----- .../ui/editors/acl/ObjectACLManager.java | 47 ++++++++++ .../ui/editors/acl/internal/ACLMessages.java | 37 ++++++++ .../acl/internal/ACLMessages.properties | 3 + .../acl/internal/ACLMessages_de.properties | 2 + .../acl/internal/ACLMessages_ru.properties | 2 + .../acl/internal/ACLMessages_zh.properties | 3 + 11 files changed, 241 insertions(+), 27 deletions(-) create mode 100644 plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ACLCommandChangePrivilege.java create mode 100644 plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/BaseACLManager.java create mode 100644 plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLManager.java create mode 100644 plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages.java create mode 100644 plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages.properties create mode 100644 plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_de.properties create mode 100644 plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_ru.properties create mode 100644 plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_zh.properties diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePrivilegeType.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePrivilegeType.java index 52b8f275e1..07105e1b2d 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePrivilegeType.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgrePrivilegeType.java @@ -23,7 +23,7 @@ import org.jkiss.dbeaver.model.access.DBAPrivilegeType; */ public enum PostgrePrivilegeType implements DBAPrivilegeType { // ALL privs - ALL(' ', true, Object.class), + ALL(' ', false, Object.class), // TABLE privs SELECT('r', true, PostgreTableBase.class, PostgreTableColumn.class), INSERT('a', true, PostgreTableReal.class, PostgreTableColumn.class), diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/access/DBAPrivilege.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/access/DBAPrivilege.java index 4e9ddbe14c..839e1d3d99 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/access/DBAPrivilege.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/access/DBAPrivilege.java @@ -23,4 +23,7 @@ import org.jkiss.dbeaver.model.struct.DBSObject; * Privilege */ public interface DBAPrivilege extends DBSObject { + + //DBAPrivilegeType[] getTypes(); + } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ACLCommandChangePrivilege.java b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ACLCommandChangePrivilege.java new file mode 100644 index 0000000000..5bfbc6d56a --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ACLCommandChangePrivilege.java @@ -0,0 +1,85 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.ui.editors.acl; + +import org.jkiss.dbeaver.model.access.DBAPrivilege; +import org.jkiss.dbeaver.model.access.DBAPrivilegeOwner; +import org.jkiss.dbeaver.model.access.DBAPrivilegeType; +import org.jkiss.dbeaver.model.edit.DBECommand; +import org.jkiss.dbeaver.model.edit.DBEPersistAction; +import org.jkiss.dbeaver.model.impl.edit.DBECommandAbstract; +import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.ui.editors.acl.internal.ACLMessages; + +import java.util.Map; + +/** + * Grant/Revoke privilege command + */ +public class ACLCommandChangePrivilege extends DBECommandAbstract { + + private ObjectACLManager aclManager; + private boolean grant; + private DBAPrivilege privilege; + private DBAPrivilegeType[] privilegeTypes; + + public ACLCommandChangePrivilege(ObjectACLManager aclManager, DBAPrivilegeOwner user, boolean grant, DBAPrivilege privilege, DBAPrivilegeType[] privilegeTypes) + { + super(user, grant ? ACLMessages.edit_command_grant_privilege_action_grant_privilege : ACLMessages.edit_command_grant_privilege_action_revoke_privilege); + this.aclManager = aclManager; + this.grant = grant; + this.privilege = privilege; + this.privilegeTypes = privilegeTypes; + } + + @Override + public void updateModel() + { + //getObject().clearGrantsCache(); + } + + @Override + public DBEPersistAction[] getPersistActions(DBRProgressMonitor monitor, Map options) + { + DBAPrivilegeOwner object = getObject(); + + String grantScript = aclManager.generatePermissionChangeScript(monitor, object, grant, privilege, privilegeTypes, options); + return new DBEPersistAction[] { + new SQLDatabasePersistAction( + ACLMessages.edit_command_grant_privilege_action_grant_privilege, + grantScript) + }; + } + + @Override + public DBECommand merge(DBECommand prevCommand, Map userParams) + { + if (prevCommand instanceof ACLCommandChangePrivilege) { + ACLCommandChangePrivilege prevGrant = (ACLCommandChangePrivilege) prevCommand; + if (prevGrant.privilege == privilege && prevGrant.privilegeTypes == privilegeTypes) { + if (prevGrant.grant == grant) { + return prevCommand; + } else { + return null; + } + } + } + return super.merge(prevCommand, userParams); + } + +} diff --git a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/BaseACLManager.java b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/BaseACLManager.java new file mode 100644 index 0000000000..4804fe9d01 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/BaseACLManager.java @@ -0,0 +1,34 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.ui.editors.acl; + +import org.jkiss.dbeaver.model.DBPEvaluationContext; +import org.jkiss.dbeaver.model.DBUtils; +import org.jkiss.dbeaver.model.access.DBAPrivilege; +import org.jkiss.dbeaver.model.access.DBAPrivilegeType; +import org.jkiss.dbeaver.model.struct.DBSObject; + +/** + * PostgresRolePrivilegesEditor + */ +public abstract class BaseACLManager implements ObjectACLManager { + + public String getObjectUniqueName(DBSObject object) { + return DBUtils.getObjectFullName(object, DBPEvaluationContext.DDL); + } + +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLEditor.java index 05a6c55999..1a98eb41df 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLEditor.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLEditor.java @@ -22,6 +22,7 @@ import org.eclipse.jface.dialogs.ControlEnableState; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.jgit.annotations.Nullable; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.MouseAdapter; @@ -41,7 +42,7 @@ import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.access.*; -import org.jkiss.dbeaver.model.access.DBAPrivilege; +import org.jkiss.dbeaver.model.edit.DBECommandReflector; import org.jkiss.dbeaver.model.navigator.*; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; @@ -53,6 +54,7 @@ import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.LoadingJob; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.ProgressPageControl; +import org.jkiss.dbeaver.ui.controls.ViewerColumnController; import org.jkiss.dbeaver.ui.editors.AbstractDatabaseObjectEditor; import org.jkiss.dbeaver.ui.editors.DatabaseEditorUtils; import org.jkiss.dbeaver.ui.navigator.NavigatorUtils; @@ -63,12 +65,15 @@ import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import java.lang.reflect.InvocationTargetException; -import java.util.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * PostgresRolePrivilegesEditor */ -public abstract class ObjectACLEditor extends AbstractDatabaseObjectEditor +public abstract class ObjectACLEditor extends AbstractDatabaseObjectEditor { private PageControl pageControl; @@ -83,13 +88,7 @@ public abstract class ObjectACLEditor extends AbstractDatabaseObjectEditor privilegeMap = new HashMap<>(); private Text objectDescriptionText; - protected abstract DBAPrivilegeType[] getPrivilegeTypes(); - - protected abstract DBAPrivilege createNewPrivilege(DBAPrivilegeOwner owner, DBSObject object, DBAPrivilege privilege); - - protected String getObjectUniqueName(DBSObject object) { - return DBUtils.getObjectFullName(object, DBPEvaluationContext.DDL); - } + protected abstract ObjectACLManager getACLManager(); public void createPartControl(Composite parent) { this.pageControl = new PageControl(parent); @@ -156,6 +155,8 @@ public abstract class ObjectACLEditor extends AbstractDatabaseObjectEditor() { + new DBECommandReflector() { @Override - public void redoCommand(PostgreCommandGrantPrivilege cmd) + public void redoCommand(ACLCommandChangePrivilege cmd) { } @Override - public void undoCommand(PostgreCommandGrantPrivilege cmd) + public void undoCommand(ACLCommandChangePrivilege cmd) { } }); -*/ } } @@ -305,7 +303,7 @@ public abstract class ObjectACLEditor extends AbstractDatabaseObjectEditor objectType = objects.get(0).getClass(); - for (DBAPrivilegeType pt : getPrivilegeTypes()) { + for (PRIVILEGE_TYPE pt : getACLManager().getPrivilegeTypes()) { if (!pt.isValid() || !pt.supportsType(objectType)) { continue; } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLManager.java b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLManager.java new file mode 100644 index 0000000000..612b82f388 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLManager.java @@ -0,0 +1,47 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.ui.editors.acl; + +import org.jkiss.dbeaver.model.DBPEvaluationContext; +import org.jkiss.dbeaver.model.DBUtils; +import org.jkiss.dbeaver.model.access.DBAPrivilege; +import org.jkiss.dbeaver.model.access.DBAPrivilegeOwner; +import org.jkiss.dbeaver.model.access.DBAPrivilegeType; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.struct.DBSObject; + +import java.util.Map; + +/** + * PostgresRolePrivilegesEditor + */ +public interface ObjectACLManager { + + PRIVILEGE_TYPE[] getPrivilegeTypes(); + + PRIVILEGE createNewPrivilege(DBAPrivilegeOwner owner, DBSObject object, PRIVILEGE copyFrom); + + String getObjectUniqueName(DBSObject object); + + String generatePermissionChangeScript( + DBRProgressMonitor monitor, + DBAPrivilegeOwner object, + boolean grant, + PRIVILEGE privilege, + PRIVILEGE_TYPE[] privilegeTypes, + Map options); +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages.java b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages.java new file mode 100644 index 0000000000..b3739961cd --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages.java @@ -0,0 +1,37 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * Copyright (C) 2017 Liu, Yuanyuan (liuyuanyuan@highgo.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.ui.editors.acl.internal; + +import org.eclipse.osgi.util.NLS; + +public class ACLMessages extends NLS { + static final String BUNDLE_NAME = "org.jkiss.dbeaver.ui.editors.acl.internal.ACLMessages"; //$NON-NLS-1$ + + /* Permissions */ + public static String edit_command_grant_privilege_action_grant_privilege; + public static String edit_command_grant_privilege_action_revoke_privilege; + + static { + // initialize resource bundle + NLS.initializeMessages(BUNDLE_NAME, ACLMessages.class); + } + + private ACLMessages() { + } + +} diff --git a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages.properties b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages.properties new file mode 100644 index 0000000000..147e757248 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages.properties @@ -0,0 +1,3 @@ +# Permissions +edit_command_grant_privilege_action_grant_privilege = Grant +edit_command_grant_privilege_action_revoke_privilege = Revoke diff --git a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_de.properties b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_de.properties new file mode 100644 index 0000000000..bacfc7bbfc --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_de.properties @@ -0,0 +1,2 @@ +edit_command_grant_privilege_action_grant_privilege = Bewilligung +edit_command_grant_privilege_action_revoke_privilege = Widerrufen diff --git a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_ru.properties b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_ru.properties new file mode 100644 index 0000000000..cf464d395b --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_ru.properties @@ -0,0 +1,2 @@ +edit_command_grant_privilege_action_grant_privilege = \u0412\u044B\u0434\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0430 +edit_command_grant_privilege_action_revoke_privilege = \u041E\u0442\u043E\u0437\u0432\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0430 diff --git a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_zh.properties b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_zh.properties new file mode 100644 index 0000000000..f378666de9 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/internal/ACLMessages_zh.properties @@ -0,0 +1,3 @@ +# Permissions +edit_command_grant_privilege_action_grant_privilege = \u6388\u4E88 +edit_command_grant_privilege_action_revoke_privilege = \u64A4\u56DE -- GitLab