From 10fc817f312c1c15b843eb21798412625aab2d8d Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Sun, 15 Jan 2017 11:29:41 +0300 Subject: [PATCH] PG: permissions tab Former-commit-id: 49b339ee9bb4cc38ffbabf48245cf4779c33e51c --- .../plugin.properties | 2 +- .../plugin.xml | 5 + .../ext/postgresql/model/PostgreRole.java | 5 + .../model/PostgreRolePrivilege.java | 82 +++++++ .../editors/PostgresRolePrivilegesEditor.java | 219 ++++++++++++++++++ .../icons/tree/permissions.png | Bin 0 -> 737 bytes .../src/org/jkiss/dbeaver/model/DBIcon.java | 1 + 7 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRolePrivilege.java create mode 100644 plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgresRolePrivilegesEditor.java create mode 100644 plugins/org.jkiss.dbeaver.model/icons/tree/permissions.png diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.properties b/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.properties index 2d4cfe9666..988fa1f3b7 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.properties +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.properties @@ -444,4 +444,4 @@ tree.roles.node.name=Roles tree.role.member.node.name=Role tree.role.members.node.name=Members tree.role.belong.node.name=Role -tree.role.belongs.node.name=Belongs +tree.role.belongs.node.name=Roles diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml b/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml index 71681eb7f6..3adaf581e0 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml @@ -259,6 +259,11 @@ contributor="org.jkiss.dbeaver.ui.editors.sql.SQLEditorContributorNested" type="folder"> + + + diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java index b3bd29550e..72f421bddd 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRole.java @@ -35,6 +35,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; import java.util.Date; +import java.util.List; /** * PostgreRole @@ -212,6 +213,10 @@ public class PostgreRole implements PostgreObject { return belongsCache.getAllObjects(monitor, this); } + public List getPrivileges(DBRProgressMonitor monitor) throws DBException { + return null; + } + @Override public String toString() { return getName(); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRolePrivilege.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRolePrivilege.java new file mode 100644 index 0000000000..dbbd89e2de --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreRolePrivilege.java @@ -0,0 +1,82 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2) + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.jkiss.dbeaver.ext.postgresql.model; + +import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.model.meta.Property; +import org.jkiss.dbeaver.model.struct.DBSObject; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * PostgreRolePrivilege + */ +public class PostgreRolePrivilege implements DBSObject { + + private final PostgreDatabase database; + + public PostgreRolePrivilege(PostgreDatabase database, ResultSet dbResult) + throws SQLException + { + this.database = database; + } + + @Nullable + @Override + public String getDescription() { + return null; + } + + @Nullable + @Override + public DBSObject getParentObject() { + return database; + } + + @NotNull + @Override + public PostgreDataSource getDataSource() { + return database.getDataSource(); + } + + @Override + public boolean isPersisted() { + return true; + } + + @NotNull + @Override + @Property(viewable = true, order = 1) + public String getName() + { + return ""; + } + + @NotNull + public PostgreDatabase getDatabase() { + return database; + } + + @Override + public String toString() { + return getName(); + } +} + diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgresRolePrivilegesEditor.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgresRolePrivilegesEditor.java new file mode 100644 index 0000000000..b308acbb8b --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/ui/editors/PostgresRolePrivilegesEditor.java @@ -0,0 +1,219 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2) + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.jkiss.dbeaver.ext.postgresql.ui.editors; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.ext.postgresql.model.PostgreRole; +import org.jkiss.dbeaver.ext.postgresql.model.PostgreRolePrivilege; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService; +import org.jkiss.dbeaver.ui.LoadingJob; +import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.controls.ProgressPageControl; +import org.jkiss.dbeaver.ui.editors.AbstractDatabaseObjectEditor; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +/** + * PostgresRolePrivilegesEditor + */ +public class PostgresRolePrivilegesEditor extends AbstractDatabaseObjectEditor +{ + private static final Log log = Log.getLog(PostgresRolePrivilegesEditor.class); + + private PageControl pageControl; + + private Font boldFont; + private boolean isLoaded; + + @Override + public void createPartControl(Composite parent) + { + boldFont = UIUtils.makeBoldFont(parent.getFont()); + + pageControl = new PageControl(parent); + + Composite container = UIUtils.createPlaceholder(pageControl, 2, 5); + GridData gd = new GridData(GridData.FILL_BOTH); + container.setLayoutData(gd); + + Composite leftPane = UIUtils.createPlaceholder(container, 2); + leftPane.setLayoutData(new GridData(GridData.FILL_BOTH)); + leftPane.setLayout(new GridLayout(2, true)); +/* + { + Composite catalogGroup = UIUtils.createControlGroup(leftPane, MySQLMessages.editors_user_editor_privileges_group_catalogs, 1, GridData.FILL_BOTH, 0); + + catalogsTable = new Table(catalogGroup, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL); + catalogsTable.setHeaderVisible(true); + gd = new GridData(GridData.FILL_BOTH); + catalogsTable.setLayoutData(gd); + catalogsTable.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + int selIndex = catalogsTable.getSelectionIndex(); + if (selIndex <= 0) { + selectedCatalog = null; + } else { + selectedCatalog = (MySQLCatalog) catalogsTable.getItem(selIndex).getData(); + } + showCatalogTables(); + showGrants(); + } + }); + UIUtils.createTableColumn(catalogsTable, SWT.LEFT, MySQLMessages.editors_user_editor_privileges_column_catalog); + { + TableItem item = new TableItem(catalogsTable, SWT.NONE); + item.setText("% (All)"); //$NON-NLS-1$ + item.setImage(DBeaverIcons.getImage(DBIcon.TREE_DATABASE)); + } + for (MySQLCatalog catalog : getDatabaseObject().getDataSource().getCatalogs()) { + TableItem item = new TableItem(catalogsTable, SWT.NONE); + item.setText(catalog.getName()); + item.setImage(DBeaverIcons.getImage(DBIcon.TREE_DATABASE)); + item.setData(catalog); + } + UIUtils.packColumns(catalogsTable); + } + + { + Composite tablesGroup = UIUtils.createControlGroup(leftPane, MySQLMessages.editors_user_editor_privileges_group_tables, 1, GridData.FILL_BOTH, 0); + + tablesTable = new Table(tablesGroup, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL); + tablesTable.setHeaderVisible(true); + gd = new GridData(GridData.FILL_BOTH); + tablesTable.setLayoutData(gd); + tablesTable.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + int selIndex = tablesTable.getSelectionIndex(); + if (selIndex <= 0) { + selectedTable = null; + } else { + selectedTable = (MySQLTableBase) tablesTable.getItem(selIndex).getData(); + } + showGrants(); + } + }); + UIUtils.createTableColumn(tablesTable, SWT.LEFT, MySQLMessages.editors_user_editor_privileges_column_table); + UIUtils.packColumns(tablesTable); + } + Composite ph = UIUtils.createPlaceholder(container, 1); + ph.setLayoutData(new GridData(GridData.FILL_BOTH)); + + tablePrivilegesTable = new PrivilegeTableControl(ph, MySQLMessages.editors_user_editor_privileges_control_table_privileges); + gd = new GridData(GridData.FILL_BOTH); + tablePrivilegesTable.setLayoutData(gd); + + otherPrivilegesTable = new PrivilegeTableControl(ph, MySQLMessages.editors_user_editor_privileges_control_other_privileges); + gd = new GridData(GridData.FILL_BOTH); + otherPrivilegesTable.setLayoutData(gd); + + catalogsTable.setSelection(0); + showCatalogTables(); + + pageControl.createProgressPanel(); + + parent.addDisposeListener(new DisposeListener() { + @Override + public void widgetDisposed(DisposeEvent e) + { + UIUtils.dispose(boldFont); + } + }); + + addGrantListener(tablePrivilegesTable); + addGrantListener(otherPrivilegesTable); +*/ + } + + @Override + public void setFocus() { + + } + + @Override + public synchronized void activatePart() + { + if (isLoaded) { + return; + } + isLoaded = true; + LoadingJob.createService( + new DatabaseLoadService>("Load privileges", getExecutionContext()) { + @Override + public List evaluate(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + try { + return getDatabaseObject().getPrivileges(monitor); + } catch (DBException e) { + throw new InvocationTargetException(e); + } + } + }, + pageControl.createPrivilegesLoadVisualizer()) + .schedule(); + } + + @Override + public void refreshPart(Object source, boolean force) + { + // do nothing + } + + private class PageControl extends ProgressPageControl { + public PageControl(Composite parent) { + super(parent, SWT.NONE); + } + + public ProgressPageControl.ProgressVisualizer> createPrivilegesLoadVisualizer() { + return new ProgressPageControl.ProgressVisualizer>() { + @Override + public void completeLoading(List privs) { + super.completeLoading(privs); +/* + List otherPrivs = new ArrayList<>(); + List tablePrivs = new ArrayList<>(); + for (MySQLPrivilege priv : privs) { + if (priv.getKind() == MySQLPrivilege.Kind.ADMIN) { + continue; + } + if (priv.getContext().contains("Table")) { + tablePrivs.add(priv); + } else { + otherPrivs.add(priv); + } + } + tablePrivilegesTable.fillPrivileges(tablePrivs); + otherPrivilegesTable.fillPrivileges(otherPrivs); + loadGrants(); +*/ + } + }; + } + + } + + +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.model/icons/tree/permissions.png b/plugins/org.jkiss.dbeaver.model/icons/tree/permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..88b606b9fa493365063192860e8c7ab60df86fa5 GIT binary patch literal 737 zcmV<70v`Q|P)wf>uG0EefPnt;MWJg#NUeF_jW61DP4E z#!)h7^1b^y_sxv`AVueK?z%Z8If_!|%>_eulzW}XMUjDXUX!u69u{I3n1Q}7rD1T}W;*8OQ126s6UCfaxY zK9Xjq^x-J%t*e8rvP?xjp};FKHMdCh40|ez;rAIBnTmt4?Bpa7+G|UwUb*?Uj?qAy z0A9(_Rv&Uj%2*CeuZe?AOL8$!Rvz#K>eE!XvTt>ITZgZ4ka725*mHXdsI1 zwT<-j&Y4XH!q6I&X6GXYQb-(WsRW}8%hE&w(2CmWH7KpDw~*pCEtE?d@NkyfGk4X% z34rIoH*5!)`DmXj!sCQ#J8mwq)C)$3FhY( z5c|A-mzA6!TwSxALfs|%F=QM`LKR@5_!L5o`w=Ls#`3}kL`I*w046mZ-e^hn_1tXG z?Zf28pPd)_YsL$9>_RY9f#gaW^OI9(I{l*gmlSKVza=WlE)7TW5xp>Ljt}Gh6PQk@ z$J@RpI@#gP5|oQKvvs)*!O+tMn?1G)P$`TMPseh4rCv1{Wf TVXXH500000NkvXXu0mjf8nIaJ literal 0 HcmV?d00001 diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBIcon.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBIcon.java index 80c8bf2e72..36f61ea3fd 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBIcon.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/DBIcon.java @@ -67,6 +67,7 @@ public class DBIcon implements DBPImage public static final DBIcon TREE_TRIGGER = new DBIcon("trigger", "tree/trigger.png"); //$NON-NLS-1$ //$NON-NLS-2$ public static final DBIcon TREE_USER = new DBIcon("user", "tree/user.png"); //$NON-NLS-1$ //$NON-NLS-2$ public static final DBIcon TREE_USER_GROUP = new DBIcon("user_group", "tree/group.png"); //$NON-NLS-1$ //$NON-NLS-2$ + public static final DBIcon TREE_PERMISSIONS = new DBIcon("permissions", "tree/permissions.png"); //$NON-NLS-1$ //$NON-NLS-2$ public static final DBIcon TREE_PAGE = new DBIcon("page", "tree/page.png"); //$NON-NLS-1$ //$NON-NLS-2$ public static final DBIcon TREE_INFO = new DBIcon("info", "tree/info.png"); //$NON-NLS-1$ //$NON-NLS-2$ public static final DBIcon TREE_SESSIONS = new DBIcon("sessions", "tree/sessions.png"); //$NON-NLS-1$ //$NON-NLS-2$ -- GitLab