提交 e15120a4 编写于 作者: S Serge Rider

#6397 Restrict structure modifications


Former-commit-id: e1d748c0
上级 f4d3f35e
......@@ -31,6 +31,9 @@ import org.jkiss.dbeaver.model.impl.DBObjectNameCaseTransformer;
import org.jkiss.dbeaver.model.impl.data.DBDValueError;
import org.jkiss.dbeaver.model.impl.data.DefaultValueHandler;
import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect;
import org.jkiss.dbeaver.model.navigator.DBNDataSource;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.sql.*;
......@@ -1839,4 +1842,13 @@ public final class DBUtils {
}
return null;
}
public static boolean isReadOnly(DBSObject object)
{
if (object == null) {
return true;
}
DBPDataSource dataSource = object.getDataSource();
return dataSource == null || !dataSource.getContainer().hasModifyPermission(DBPDataSourcePermission.PERMISSION_EDIT_METADATA);
}
}
......@@ -21,6 +21,7 @@ import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ModelPreferences;
import org.jkiss.dbeaver.model.DBPDataSourcePermission;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
......@@ -148,6 +149,13 @@ public class DBNUtils {
return divPos == -1 ? path : path.substring(divPos + 1);
}
public static boolean isReadOnly(DBNNode node)
{
return node instanceof DBNDatabaseNode &&
!(node instanceof DBNDataSource) &&
!((DBNDatabaseNode) node).getDataSourceContainer().hasModifyPermission(DBPDataSourcePermission.PERMISSION_EDIT_METADATA);
}
private static class NodeNameComparator implements Comparator<DBNNode> {
static NodeNameComparator INSTANCE = new NodeNameComparator();
@Override
......
......@@ -357,7 +357,7 @@ public class DataSourceDescriptor
if (connectionReadOnly) {
return false;
}
return connectionModifyRestrictions != null && !connectionModifyRestrictions.contains(permission);
return connectionModifyRestrictions == null || !connectionModifyRestrictions.contains(permission);
}
@Override
......
......@@ -22,8 +22,8 @@ import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchPart;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPOrderedObject;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.app.DBPResourceHandler;
import org.jkiss.dbeaver.model.edit.DBEObjectMaker;
import org.jkiss.dbeaver.model.edit.DBEObjectManager;
......@@ -130,9 +130,14 @@ public class ObjectPropertyTester extends PropertyTester
if (node instanceof DBNDataSource || node instanceof DBNLocalFolder) {
return true;
}
if (DBNUtils.isReadOnly(node)) {
return false;
}
if (node instanceof DBSWrapper) {
DBSObject object = ((DBSWrapper) node).getObject();
if (object == null || isReadOnly(object) || !(node.getParentNode() instanceof DBNContainer)) {
if (object == null || DBUtils.isReadOnly(object) || !(node.getParentNode() instanceof DBNContainer)) {
return false;
}
DBEObjectMaker objectMaker = getObjectManager(object.getClass(), DBEObjectMaker.class);
......@@ -149,10 +154,13 @@ public class ObjectPropertyTester extends PropertyTester
return true;
}
if (node instanceof DBNDatabaseNode) {
if (DBNUtils.isReadOnly(node)) {
return false;
}
DBSObject object = ((DBNDatabaseNode) node).getObject();
return
object != null &&
!isReadOnly(object) &&
!DBUtils.isReadOnly(object) &&
object.isPersisted() &&
node.getParentNode() instanceof DBNContainer &&
getObjectManager(object.getClass(), DBEObjectRenamer.class) != null;
......@@ -162,6 +170,9 @@ public class ObjectPropertyTester extends PropertyTester
case PROP_CAN_MOVE_UP:
case PROP_CAN_MOVE_DOWN: {
if (node instanceof DBNDatabaseNode) {
if (DBNUtils.isReadOnly(node)) {
return false;
}
DBSObject object = ((DBNDatabaseNode) node).getObject();
if (object instanceof DBPOrderedObject) {
DBEObjectReorderer objectReorderer = getObjectManager(object.getClass(), DBEObjectReorderer.class);
......@@ -239,8 +250,11 @@ public class ObjectPropertyTester extends PropertyTester
} else {
return false;
}
if (DBNUtils.isReadOnly(node)) {
return false;
}
if (node instanceof DBSWrapper && isReadOnly(((DBSWrapper) node).getObject())) {
if (node instanceof DBSWrapper && DBUtils.isReadOnly(((DBSWrapper) node).getObject())) {
return false;
}
if (objectType == null) {
......@@ -255,6 +269,10 @@ public class ObjectPropertyTester extends PropertyTester
}
return true;
}
if (DBNUtils.isReadOnly(node)) {
return false;
}
// Check whether only single object type can be created or multiple ones
List<IContributionItem> createItems = NavigatorHandlerObjectCreateNew.fillCreateMenuItems(null, node);
......@@ -265,15 +283,6 @@ public class ObjectPropertyTester extends PropertyTester
}
}
public static boolean isReadOnly(DBSObject object)
{
if (object == null) {
return true;
}
DBPDataSource dataSource = object.getDataSource();
return dataSource == null || dataSource.getContainer().isConnectionReadOnly();
}
private static <T extends DBEObjectManager> T getObjectManager(Class<?> objectType, Class<T> managerType)
{
return ObjectManagerRegistry.getInstance().getObjectManager(objectType, managerType);
......
......@@ -228,6 +228,14 @@ public class EntityEditor extends MultiPageDatabaseEditor
return;
}
if (DBUtils.isReadOnly(getDatabaseObject())) {
DBWorkbench.getPlatformUI().showMessageBox(
"Read-only",
"Object [" + DBUtils.getObjectFullName(getDatabaseObject(), DBPEvaluationContext.UI) + "] is read-only",
true);
return;
}
// Flush all nested object editors and result containers
for (IEditorPart editor : editorMap.values()) {
if (editor instanceof ObjectPropertiesEditor || editor instanceof IEntityDataContainer) {
......@@ -240,6 +248,8 @@ public class EntityEditor extends MultiPageDatabaseEditor
}
}
// Check read-only
// Show preview
int previewResult = IDialogConstants.PROCEED_ID;
if (DBWorkbench.getPlatform().getPreferenceStore().getBoolean(NavigatorPreferences.NAVIGATOR_SHOW_SQL_PREVIEW)) {
......
......@@ -36,6 +36,7 @@ import org.eclipse.ui.part.MultiPageEditorSite;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBConstants;
import org.jkiss.dbeaver.model.DBPNamedObject;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.DBValueFormatting;
import org.jkiss.dbeaver.model.data.DBDDisplayFormat;
import org.jkiss.dbeaver.model.edit.DBECommand;
......@@ -421,7 +422,7 @@ public class TabbedFolderPageForm extends TabbedFolderPage implements IRefreshab
private void createPropertyEditor(Composite group, DBPPropertyDescriptor prop) {
DBSObject databaseObject = input.getDatabaseObject();
boolean isReadOnlyCon = databaseObject == null || databaseObject.getDataSource().getContainer().isConnectionReadOnly();
boolean isReadOnlyCon = databaseObject == null || DBUtils.isReadOnly(databaseObject);
if (prop == null) {
UIUtils.createEmptyLabel(group, 2, 1);
} else {
......
......@@ -296,6 +296,9 @@ public class ItemListControl extends NodeListControl
protected boolean canEdit(Object element)
{
DBNNode object = (DBNNode) element;
if (DBNUtils.isReadOnly(object)) {
return false;
}
final ObjectPropertyDescriptor property = objectColumn.getProperty(getObjectValue(object));
return property != null && property.isEditable(getObjectValue(object));
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册