-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Add support for GRANT/DENY/REVOKE on branches #25152
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -27,6 +27,7 @@ | |
| import io.trino.spi.security.Privilege; | ||
| import io.trino.sql.tree.Deny; | ||
| import io.trino.sql.tree.Expression; | ||
| import io.trino.sql.tree.Identifier; | ||
|
|
||
| import java.util.List; | ||
| import java.util.Optional; | ||
|
|
@@ -82,6 +83,10 @@ else if (entityKind.equalsIgnoreCase("SCHEMA")) { | |
|
|
||
| private static void executeDenyOnSchema(Session session, Deny statement, Metadata metadata, AccessControl accessControl) | ||
| { | ||
| if (statement.getGrantObject().getBranch().isPresent()) { | ||
| throw semanticException(NOT_SUPPORTED, statement, "Denying on branch is not supported"); | ||
| } | ||
|
|
||
| CatalogSchemaName schemaName = createCatalogSchemaName(session, statement, Optional.of(statement.getGrantObject().getName())); | ||
|
|
||
| if (!metadata.schemaExists(session, schemaName)) { | ||
|
|
@@ -99,6 +104,7 @@ private static void executeDenyOnSchema(Session session, Deny statement, Metadat | |
| private static void executeDenyOnTable(Session session, Deny statement, Metadata metadata, AccessControl accessControl) | ||
| { | ||
| QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getGrantObject().getName()); | ||
| Optional<Identifier> branch = statement.getGrantObject().getBranch(); | ||
|
|
||
| if (!metadata.isMaterializedView(session, tableName) && !metadata.isView(session, tableName)) { | ||
| RedirectionAwareTableHandle redirection = metadata.getRedirectionAwareTableHandle(session, tableName); | ||
|
|
@@ -112,15 +118,23 @@ private static void executeDenyOnTable(Session session, Deny statement, Metadata | |
|
|
||
| Set<Privilege> privileges = parseStatementPrivileges(statement, statement.getPrivileges()); | ||
|
|
||
| for (Privilege privilege : privileges) { | ||
| accessControl.checkCanDenyTablePrivilege(session.toSecurityContext(), privilege, tableName, createPrincipal(statement.getGrantee())); | ||
| if (branch.isEmpty()) { | ||
| privileges.forEach(privilege -> accessControl.checkCanDenyTablePrivilege(session.toSecurityContext(), privilege, tableName, createPrincipal(statement.getGrantee()))); | ||
| metadata.denyTablePrivileges(session, tableName, privileges, createPrincipal(statement.getGrantee())); | ||
kasiafi marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
| else { | ||
| String branchName = branch.get().getValue(); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We don't have proper Identifier semantics in Trino, but it would be closer to correct if we used However, I just noticed that we also rely on On the other hand, when creating a I think that for branches, we should also lowercase the name to keep it locally consistent. @martint what do you think? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I will send a follow-up PR if Martin request changes. |
||
| privileges.forEach(privilege -> accessControl.checkCanDenyTableBranchPrivilege(session.toSecurityContext(), privilege, tableName, branchName, createPrincipal(statement.getGrantee()))); | ||
| metadata.denyTableBranchPrivileges(session, tableName, branchName, privileges, createPrincipal(statement.getGrantee())); | ||
ebyhr marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
|
|
||
| metadata.denyTablePrivileges(session, tableName, privileges, createPrincipal(statement.getGrantee())); | ||
| } | ||
|
|
||
| private static void executeDenyOnEntity(Session session, Deny statement, Metadata metadata, String entityKind, AccessControl accessControl) | ||
| { | ||
| if (statement.getGrantObject().getBranch().isPresent()) { | ||
| throw semanticException(NOT_SUPPORTED, statement, "Denying on branch is not supported"); | ||
| } | ||
|
|
||
| EntityKindAndName entity = createEntityKindAndName(entityKind, statement.getGrantObject().getName()); | ||
| Set<EntityPrivilege> privileges = fetchEntityKindPrivileges(entityKind, metadata, statement.getPrivileges()); | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.