Skip to content

Commit 674d482

Browse files
committed
Add view security argument to checkCanCreateView
1 parent b7a6a36 commit 674d482

File tree

29 files changed

+143
-55
lines changed

29 files changed

+143
-55
lines changed

core/trino-main/src/main/java/io/trino/execution/CreateViewTask.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import io.trino.metadata.ViewPropertyManager;
2727
import io.trino.security.AccessControl;
2828
import io.trino.spi.security.Identity;
29+
import io.trino.spi.security.ViewSecurity;
2930
import io.trino.sql.PlannerContext;
3031
import io.trino.sql.analyzer.Analysis;
3132
import io.trino.sql.analyzer.AnalyzerFactory;
@@ -92,8 +93,9 @@ public ListenableFuture<Void> execute(
9293

9394
Session session = stateMachine.getSession();
9495
QualifiedObjectName name = createQualifiedObjectName(session, statement, statement.getName());
96+
Optional<ViewSecurity> security = statement.getSecurity().map(sec -> ViewSecurity.valueOf(sec.name()));
9597

96-
accessControl.checkCanCreateView(session.toSecurityContext(), name);
98+
accessControl.checkCanCreateView(session.toSecurityContext(), name, security);
9799

98100
if (metadata.isMaterializedView(session, name)) {
99101
throw semanticException(TABLE_ALREADY_EXISTS, statement, "Materialized view already exists: '%s'", name);

core/trino-main/src/main/java/io/trino/security/AccessControl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import io.trino.spi.security.Privilege;
3030
import io.trino.spi.security.TrinoPrincipal;
3131
import io.trino.spi.security.ViewExpression;
32+
import io.trino.spi.security.ViewSecurity;
3233

3334
import java.security.Principal;
3435
import java.util.Collection;
@@ -313,7 +314,7 @@ public interface AccessControl
313314
*
314315
* @throws AccessDeniedException if not allowed
315316
*/
316-
void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName);
317+
void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName, Optional<ViewSecurity> security);
317318

318319
/**
319320
* Check if identity is allowed to rename the specified view.

core/trino-main/src/main/java/io/trino/security/AccessControlManager.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import io.trino.spi.security.SystemSecurityContext;
5858
import io.trino.spi.security.TrinoPrincipal;
5959
import io.trino.spi.security.ViewExpression;
60+
import io.trino.spi.security.ViewSecurity;
6061
import io.trino.transaction.TransactionId;
6162
import io.trino.transaction.TransactionManager;
6263
import jakarta.annotation.PreDestroy;
@@ -771,16 +772,16 @@ public void checkCanUpdateTableColumns(SecurityContext securityContext, Qualifie
771772
}
772773

773774
@Override
774-
public void checkCanCreateView(SecurityContext securityContext, QualifiedObjectName viewName)
775+
public void checkCanCreateView(SecurityContext securityContext, QualifiedObjectName viewName, Optional<ViewSecurity> security)
775776
{
776777
requireNonNull(securityContext, "securityContext is null");
777778
requireNonNull(viewName, "viewName is null");
778779

779780
checkCanAccessCatalog(securityContext, viewName.catalogName());
780781

781-
systemAuthorizationCheck(control -> control.checkCanCreateView(securityContext.toSystemSecurityContext(), viewName.asCatalogSchemaTableName()));
782+
systemAuthorizationCheck(control -> control.checkCanCreateView(securityContext.toSystemSecurityContext(), viewName.asCatalogSchemaTableName(), security));
782783

783-
catalogAuthorizationCheck(viewName.catalogName(), securityContext, (control, context) -> control.checkCanCreateView(context, viewName.asSchemaTableName()));
784+
catalogAuthorizationCheck(viewName.catalogName(), securityContext, (control, context) -> control.checkCanCreateView(context, viewName.asSchemaTableName(), security));
784785
}
785786

786787
@Override

core/trino-main/src/main/java/io/trino/security/AllowAllAccessControl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.trino.spi.security.Identity;
2525
import io.trino.spi.security.Privilege;
2626
import io.trino.spi.security.TrinoPrincipal;
27+
import io.trino.spi.security.ViewSecurity;
2728

2829
import java.security.Principal;
2930
import java.util.Collection;
@@ -161,7 +162,7 @@ public void checkCanTruncateTable(SecurityContext context, QualifiedObjectName t
161162
public void checkCanUpdateTableColumns(SecurityContext context, QualifiedObjectName tableName, Set<String> updatedColumnNames) {}
162163

163164
@Override
164-
public void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName) {}
165+
public void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName, Optional<ViewSecurity> security) {}
165166

166167
@Override
167168
public void checkCanRenameView(SecurityContext context, QualifiedObjectName viewName, QualifiedObjectName newViewName) {}

core/trino-main/src/main/java/io/trino/security/DenyAllAccessControl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.trino.spi.security.Identity;
2828
import io.trino.spi.security.Privilege;
2929
import io.trino.spi.security.TrinoPrincipal;
30+
import io.trino.spi.security.ViewSecurity;
3031

3132
import java.security.Principal;
3233
import java.util.Collection;
@@ -337,7 +338,7 @@ public void checkCanUpdateTableColumns(SecurityContext context, QualifiedObjectN
337338
}
338339

339340
@Override
340-
public void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName)
341+
public void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName, Optional<ViewSecurity> security)
341342
{
342343
denyCreateView(viewName.toString());
343344
}

core/trino-main/src/main/java/io/trino/security/ForwardingAccessControl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import io.trino.spi.security.Privilege;
2727
import io.trino.spi.security.TrinoPrincipal;
2828
import io.trino.spi.security.ViewExpression;
29+
import io.trino.spi.security.ViewSecurity;
2930

3031
import java.security.Principal;
3132
import java.util.Collection;
@@ -279,9 +280,9 @@ public void checkCanUpdateTableColumns(SecurityContext context, QualifiedObjectN
279280
}
280281

281282
@Override
282-
public void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName)
283+
public void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName, Optional<ViewSecurity> security)
283284
{
284-
delegate().checkCanCreateView(context, viewName);
285+
delegate().checkCanCreateView(context, viewName, security);
285286
}
286287

287288
@Override

core/trino-main/src/main/java/io/trino/security/InjectedConnectorAccessControl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import io.trino.spi.security.Privilege;
3030
import io.trino.spi.security.TrinoPrincipal;
3131
import io.trino.spi.security.ViewExpression;
32+
import io.trino.spi.security.ViewSecurity;
3233
import io.trino.spi.type.Type;
3334

3435
import java.util.List;
@@ -259,10 +260,10 @@ public void checkCanUpdateTableColumns(ConnectorSecurityContext context, SchemaT
259260
}
260261

261262
@Override
262-
public void checkCanCreateView(ConnectorSecurityContext context, SchemaTableName viewName)
263+
public void checkCanCreateView(ConnectorSecurityContext context, SchemaTableName viewName, Optional<ViewSecurity> security)
263264
{
264265
checkArgument(context == null, "context must be null");
265-
accessControl.checkCanCreateView(securityContext, getQualifiedObjectName(viewName));
266+
accessControl.checkCanCreateView(securityContext, getQualifiedObjectName(viewName), security);
266267
}
267268

268269
@Override

core/trino-main/src/main/java/io/trino/sql/analyzer/StatementAnalyzer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
import io.trino.spi.security.GroupProvider;
9393
import io.trino.spi.security.Identity;
9494
import io.trino.spi.security.ViewExpression;
95+
import io.trino.spi.security.ViewSecurity;
9596
import io.trino.spi.type.ArrayType;
9697
import io.trino.spi.type.CharType;
9798
import io.trino.spi.type.DateType;
@@ -1056,6 +1057,7 @@ protected Scope visitCreateTableAsSelect(CreateTableAsSelect node, Optional<Scop
10561057
protected Scope visitCreateView(CreateView node, Optional<Scope> scope)
10571058
{
10581059
QualifiedObjectName viewName = createQualifiedObjectName(session, node, node.getName());
1060+
Optional<ViewSecurity> viewSecurity = node.getSecurity().map(security -> ViewSecurity.valueOf(security.name()));
10591061

10601062
node.getQuery().getFunctions().stream().findFirst().ifPresent(function -> {
10611063
throw semanticException(NOT_SUPPORTED, function, "Views cannot contain inline functions");
@@ -1066,7 +1068,7 @@ protected Scope visitCreateView(CreateView node, Optional<Scope> scope)
10661068

10671069
Scope queryScope = analyzer.analyze(node.getQuery());
10681070

1069-
accessControl.checkCanCreateView(session.toSecurityContext(), viewName);
1071+
accessControl.checkCanCreateView(session.toSecurityContext(), viewName, viewSecurity);
10701072

10711073
validateColumns(node, queryScope.getRelationType());
10721074

core/trino-main/src/main/java/io/trino/testing/TestingAccessControlManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import io.trino.spi.connector.SchemaTableName;
3232
import io.trino.spi.security.Identity;
3333
import io.trino.spi.security.ViewExpression;
34+
import io.trino.spi.security.ViewSecurity;
3435
import io.trino.transaction.TransactionManager;
3536

3637
import java.security.Principal;
@@ -538,13 +539,13 @@ public void checkCanUpdateTableColumns(SecurityContext context, QualifiedObjectN
538539
}
539540

540541
@Override
541-
public void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName)
542+
public void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName, Optional<ViewSecurity> security)
542543
{
543544
if (shouldDenyPrivilege(context.getIdentity().getUser(), viewName.objectName(), CREATE_VIEW)) {
544545
denyCreateView(viewName.toString());
545546
}
546547
if (denyPrivileges.isEmpty()) {
547-
super.checkCanCreateView(context, viewName);
548+
super.checkCanCreateView(context, viewName, security);
548549
}
549550
}
550551

core/trino-main/src/main/java/io/trino/tracing/TracingAccessControl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.trino.spi.security.Privilege;
3333
import io.trino.spi.security.TrinoPrincipal;
3434
import io.trino.spi.security.ViewExpression;
35+
import io.trino.spi.security.ViewSecurity;
3536

3637
import java.security.Principal;
3738
import java.util.Collection;
@@ -396,11 +397,11 @@ public void checkCanUpdateTableColumns(SecurityContext context, QualifiedObjectN
396397
}
397398

398399
@Override
399-
public void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName)
400+
public void checkCanCreateView(SecurityContext context, QualifiedObjectName viewName, Optional<ViewSecurity> security)
400401
{
401402
Span span = startSpan("checkCanCreateView");
402403
try (var _ = scopedSpan(span)) {
403-
delegate.checkCanCreateView(context, viewName);
404+
delegate.checkCanCreateView(context, viewName, security);
404405
}
405406
}
406407

0 commit comments

Comments
 (0)