diff --git a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/CatalogNameModule.java b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/CatalogNameModule.java new file mode 100644 index 000000000000..12380cb02ace --- /dev/null +++ b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/CatalogNameModule.java @@ -0,0 +1,36 @@ +/* + * 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 io.trino.plugin.base; + +import com.google.inject.Binder; +import com.google.inject.Module; + +import static java.util.Objects.requireNonNull; + +public class CatalogNameModule + implements Module +{ + private final String catalogName; + + public CatalogNameModule(String catalogName) + { + this.catalogName = requireNonNull(catalogName, "catalogName is null"); + } + + @Override + public void configure(Binder binder) + { + binder.bind(CatalogName.class).toInstance(new CatalogName(catalogName)); + } +} diff --git a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/security/FileBasedAccessControl.java b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/security/FileBasedAccessControl.java index 2164926b0b4b..3a1de62a8c79 100644 --- a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/security/FileBasedAccessControl.java +++ b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/security/FileBasedAccessControl.java @@ -14,6 +14,7 @@ package io.trino.plugin.base.security; import com.google.common.collect.ImmutableSet; +import io.trino.plugin.base.CatalogName; import io.trino.plugin.base.security.TableAccessControlRule.TablePrivilege; import io.trino.spi.connector.ConnectorAccessControl; import io.trino.spi.connector.ConnectorSecurityContext; @@ -94,9 +95,9 @@ public class FileBasedAccessControl private final List<SessionPropertyAccessControlRule> sessionPropertyRules; private final Set<AnySchemaPermissionsRule> anySchemaPermissionsRules; - public FileBasedAccessControl(String catalogName, FileBasedAccessControlConfig config) + public FileBasedAccessControl(CatalogName catalogName, FileBasedAccessControlConfig config) { - this.catalogName = requireNonNull(catalogName, "catalogName is null"); + this.catalogName = requireNonNull(catalogName, "catalogName is null").toString(); AccessControlRules rules = parseJson(Paths.get(config.getConfigFile()), AccessControlRules.class); checkArgument(!rules.hasRoleRules(), "File connector access control does not support role rules: %s", config.getConfigFile()); diff --git a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/security/FileBasedAccessControlModule.java b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/security/FileBasedAccessControlModule.java index 46057adf7138..574d23b98bd2 100644 --- a/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/security/FileBasedAccessControlModule.java +++ b/lib/trino-plugin-toolkit/src/main/java/io/trino/plugin/base/security/FileBasedAccessControlModule.java @@ -18,11 +18,11 @@ import com.google.inject.Module; import com.google.inject.Provides; import io.airlift.log.Logger; +import io.trino.plugin.base.CatalogName; import io.trino.spi.connector.ConnectorAccessControl; import static com.google.common.base.Suppliers.memoizeWithExpiration; import static io.airlift.configuration.ConfigBinder.configBinder; -import static java.util.Objects.requireNonNull; import static java.util.concurrent.TimeUnit.MILLISECONDS; public class FileBasedAccessControlModule @@ -30,13 +30,6 @@ public class FileBasedAccessControlModule { private static final Logger log = Logger.get(FileBasedAccessControlModule.class); - private final String catalogName; - - public FileBasedAccessControlModule(String catalogName) - { - this.catalogName = requireNonNull(catalogName, "catalogName is null"); - } - @Override public void configure(Binder binder) { @@ -45,7 +38,7 @@ public void configure(Binder binder) @Inject @Provides - public ConnectorAccessControl getConnectorAccessControl(FileBasedAccessControlConfig config) + public ConnectorAccessControl getConnectorAccessControl(CatalogName catalogName, FileBasedAccessControlConfig config) { if (config.getRefreshPeriod() != null) { return ForwardingConnectorAccessControl.of(memoizeWithExpiration( diff --git a/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/security/TestFileBasedAccessControl.java b/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/security/TestFileBasedAccessControl.java index f1368faa46d3..9366ff0668b1 100644 --- a/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/security/TestFileBasedAccessControl.java +++ b/lib/trino-plugin-toolkit/src/test/java/io/trino/plugin/base/security/TestFileBasedAccessControl.java @@ -14,6 +14,7 @@ package io.trino.plugin.base.security; import com.google.common.collect.ImmutableSet; +import io.trino.plugin.base.CatalogName; import io.trino.spi.QueryId; import io.trino.spi.connector.ConnectorAccessControl; import io.trino.spi.connector.ConnectorSecurityContext; @@ -440,7 +441,7 @@ private ConnectorAccessControl createAccessControl(String fileName) String path = this.getClass().getClassLoader().getResource(fileName).getPath(); FileBasedAccessControlConfig config = new FileBasedAccessControlConfig(); config.setConfigFile(path); - return new FileBasedAccessControl("test_catalog", config); + return new FileBasedAccessControl(new CatalogName("test_catalog"), config); } private static void assertDenied(ThrowingRunnable runnable) diff --git a/plugin/trino-atop/src/main/java/io/trino/plugin/atop/AtopConnectorFactory.java b/plugin/trino-atop/src/main/java/io/trino/plugin/atop/AtopConnectorFactory.java index 44b058e484f9..6a43cb15c647 100644 --- a/plugin/trino-atop/src/main/java/io/trino/plugin/atop/AtopConnectorFactory.java +++ b/plugin/trino-atop/src/main/java/io/trino/plugin/atop/AtopConnectorFactory.java @@ -17,6 +17,7 @@ import io.airlift.bootstrap.Bootstrap; import io.airlift.json.JsonModule; import io.trino.plugin.atop.AtopConnectorConfig.AtopSecurity; +import io.trino.plugin.base.CatalogNameModule; import io.trino.plugin.base.security.AllowAllAccessControlModule; import io.trino.plugin.base.security.FileBasedAccessControlModule; import io.trino.spi.classloader.ThreadContextClassLoader; @@ -65,8 +66,8 @@ public Connector create(String catalogName, Map<String, String> requiredConfig, atopFactoryClass, context.getTypeManager(), context.getNodeManager(), - context.getNodeManager().getEnvironment(), - catalogName), + context.getNodeManager().getEnvironment()), + new CatalogNameModule(catalogName), conditionalModule( AtopConnectorConfig.class, config -> config.getSecurity() == AtopSecurity.NONE, @@ -75,7 +76,7 @@ public Connector create(String catalogName, Map<String, String> requiredConfig, AtopConnectorConfig.class, config -> config.getSecurity() == AtopSecurity.FILE, binder -> { - binder.install(new FileBasedAccessControlModule(catalogName)); + binder.install(new FileBasedAccessControlModule()); binder.install(new JsonModule()); })); diff --git a/plugin/trino-atop/src/main/java/io/trino/plugin/atop/AtopModule.java b/plugin/trino-atop/src/main/java/io/trino/plugin/atop/AtopModule.java index 028401e8e4d4..49fac8de7d0f 100644 --- a/plugin/trino-atop/src/main/java/io/trino/plugin/atop/AtopModule.java +++ b/plugin/trino-atop/src/main/java/io/trino/plugin/atop/AtopModule.java @@ -16,7 +16,6 @@ import com.google.inject.Binder; import com.google.inject.Module; import com.google.inject.Scopes; -import io.trino.plugin.base.CatalogName; import io.trino.spi.NodeManager; import io.trino.spi.type.TypeManager; @@ -30,15 +29,13 @@ public class AtopModule private final TypeManager typeManager; private final NodeManager nodeManager; private final String environment; - private final String catalogName; - public AtopModule(Class<? extends AtopFactory> atopFactoryClass, TypeManager typeManager, NodeManager nodeManager, String environment, String catalogName) + public AtopModule(Class<? extends AtopFactory> atopFactoryClass, TypeManager typeManager, NodeManager nodeManager, String environment) { this.atopFactoryClass = requireNonNull(atopFactoryClass, "atopFactoryClass is null"); this.typeManager = requireNonNull(typeManager, "typeManager is null"); this.nodeManager = requireNonNull(nodeManager, "nodeManager is null"); this.environment = requireNonNull(environment, "environment is null"); - this.catalogName = requireNonNull(catalogName, "catalogName is null"); } @Override @@ -47,7 +44,6 @@ public void configure(Binder binder) binder.bind(TypeManager.class).toInstance(typeManager); binder.bind(NodeManager.class).toInstance(nodeManager); binder.bind(Environment.class).toInstance(new Environment(environment)); - binder.bind(CatalogName.class).toInstance(new CatalogName(catalogName)); binder.bind(AtopConnector.class).in(Scopes.SINGLETON); binder.bind(AtopMetadata.class).in(Scopes.SINGLETON); binder.bind(AtopSplitManager.class).in(Scopes.SINGLETON); diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/InternalHiveConnectorFactory.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/InternalHiveConnectorFactory.java index e5c13b97d918..0bfd5a8e880c 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/InternalHiveConnectorFactory.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/InternalHiveConnectorFactory.java @@ -23,7 +23,7 @@ import io.airlift.bootstrap.LifeCycleManager; import io.airlift.event.client.EventModule; import io.airlift.json.JsonModule; -import io.trino.plugin.base.CatalogName; +import io.trino.plugin.base.CatalogNameModule; import io.trino.plugin.base.TypeDeserializerModule; import io.trino.plugin.base.classloader.ClassLoaderSafeConnectorAccessControl; import io.trino.plugin.base.classloader.ClassLoaderSafeConnectorPageSinkProvider; @@ -87,6 +87,7 @@ public static Connector createConnector(String catalogName, Map<String, String> ClassLoader classLoader = InternalHiveConnectorFactory.class.getClassLoader(); try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { Bootstrap app = new Bootstrap( + new CatalogNameModule(catalogName), new EventModule(), new MBeanModule(), new ConnectorObjectNameGeneratorModule(catalogName, "io.trino.plugin.hive", "trino.plugin.hive"), @@ -99,7 +100,7 @@ public static Connector createConnector(String catalogName, Map<String, String> new HiveAzureModule(), conditionalModule(RubixEnabledConfig.class, RubixEnabledConfig::isCacheEnabled, new RubixModule()), new HiveMetastoreModule(metastore), - new HiveSecurityModule(catalogName), + new HiveSecurityModule(), new HdfsAuthenticationModule(), new HiveProcedureModule(), new MBeanServerModule(), @@ -109,7 +110,6 @@ public static Connector createConnector(String catalogName, Map<String, String> binder.bind(VersionEmbedder.class).toInstance(context.getVersionEmbedder()); binder.bind(PageIndexerFactory.class).toInstance(context.getPageIndexerFactory()); binder.bind(PageSorter.class).toInstance(context.getPageSorter()); - binder.bind(CatalogName.class).toInstance(new CatalogName(catalogName)); }, binder -> newSetBinder(binder, EventListener.class), binder -> bindSessionPropertiesProvider(binder, HiveSessionProperties.class), diff --git a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/security/HiveSecurityModule.java b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/security/HiveSecurityModule.java index 2c9b2cbc6665..c05baf54c24b 100644 --- a/plugin/trino-hive/src/main/java/io/trino/plugin/hive/security/HiveSecurityModule.java +++ b/plugin/trino-hive/src/main/java/io/trino/plugin/hive/security/HiveSecurityModule.java @@ -21,18 +21,10 @@ import static io.airlift.configuration.ConditionalModule.conditionalModule; import static io.airlift.configuration.ConfigurationAwareModule.combine; -import static java.util.Objects.requireNonNull; public class HiveSecurityModule extends AbstractConfigurationAwareModule { - private final String catalogName; - - public HiveSecurityModule(String catalogName) - { - this.catalogName = requireNonNull(catalogName, "catalogName is null"); - } - @Override protected void setup(Binder binder) { @@ -44,7 +36,7 @@ protected void setup(Binder binder) bindSecurityModule( "file", combine( - new FileBasedAccessControlModule(catalogName), + new FileBasedAccessControlModule(), new StaticAccessControlMetadataModule())); bindSecurityModule( "read-only", diff --git a/plugin/trino-raptor-legacy/src/main/java/io/trino/plugin/raptor/legacy/RaptorConnectorFactory.java b/plugin/trino-raptor-legacy/src/main/java/io/trino/plugin/raptor/legacy/RaptorConnectorFactory.java index 37f46523b321..019b97e83ad5 100644 --- a/plugin/trino-raptor-legacy/src/main/java/io/trino/plugin/raptor/legacy/RaptorConnectorFactory.java +++ b/plugin/trino-raptor-legacy/src/main/java/io/trino/plugin/raptor/legacy/RaptorConnectorFactory.java @@ -18,6 +18,7 @@ import com.google.inject.Module; import io.airlift.bootstrap.Bootstrap; import io.airlift.json.JsonModule; +import io.trino.plugin.base.CatalogNameModule; import io.trino.plugin.base.jmx.ConnectorObjectNameGeneratorModule; import io.trino.plugin.base.jmx.MBeanServerModule; import io.trino.plugin.raptor.legacy.backup.BackupModule; @@ -69,6 +70,7 @@ public ConnectorHandleResolver getHandleResolver() public Connector create(String catalogName, Map<String, String> config, ConnectorContext context) { Bootstrap app = new Bootstrap( + new CatalogNameModule(catalogName), new JsonModule(), new MBeanModule(), new ConnectorObjectNameGeneratorModule(catalogName, "io.trino.plugin.raptor.legacy", "trino.plugin.raptor.legacy"), @@ -82,7 +84,7 @@ public Connector create(String catalogName, Map<String, String> config, Connecto new BackupModule(backupProviders), new StorageModule(), new RaptorModule(catalogName), - new RaptorSecurityModule(catalogName)); + new RaptorSecurityModule()); Injector injector = app .doNotInitializeLogging() diff --git a/plugin/trino-raptor-legacy/src/main/java/io/trino/plugin/raptor/legacy/security/RaptorSecurityModule.java b/plugin/trino-raptor-legacy/src/main/java/io/trino/plugin/raptor/legacy/security/RaptorSecurityModule.java index 6b496a02c81b..64ea51697a56 100644 --- a/plugin/trino-raptor-legacy/src/main/java/io/trino/plugin/raptor/legacy/security/RaptorSecurityModule.java +++ b/plugin/trino-raptor-legacy/src/main/java/io/trino/plugin/raptor/legacy/security/RaptorSecurityModule.java @@ -21,24 +21,16 @@ import io.trino.plugin.base.security.ReadOnlySecurityModule; import static io.airlift.configuration.ConditionalModule.conditionalModule; -import static java.util.Objects.requireNonNull; public class RaptorSecurityModule extends AbstractConfigurationAwareModule { - private final String catalogName; - - public RaptorSecurityModule(String catalogName) - { - this.catalogName = requireNonNull(catalogName, "catalogName is null"); - } - @Override protected void setup(Binder binder) { bindSecurityModule("none", new AllowAllAccessControlModule()); bindSecurityModule("read-only", new ReadOnlySecurityModule()); - bindSecurityModule("file", new FileBasedAccessControlModule(catalogName)); + bindSecurityModule("file", new FileBasedAccessControlModule()); } private void bindSecurityModule(String name, Module module)