Skip to content

Commit ffbb28a

Browse files
authored
[To dev/1.3] Supprt trusted_uri_pattern in config file
1 parent 5aa3f1a commit ffbb28a

File tree

14 files changed

+113
-16
lines changed

14 files changed

+113
-16
lines changed

integration-test/src/test/java/org/apache/iotdb/ainode/it/AINodeBasicIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public class AINodeBasicIT {
5656

5757
static String[] sqls =
5858
new String[] {
59+
"set configuration \"trusted_uri_pattern\"='.*'",
5960
"create model identity using uri \"" + MODEL_PATH + "\"",
6061
"CREATE DATABASE root.AI.data",
6162
"CREATE TIMESERIES root.AI.data.s0 WITH DATATYPE=FLOAT, ENCODING=RLE",

integration-test/src/test/java/org/apache/iotdb/db/it/trigger/IoTDBTriggerManagementIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ private static void createTimeSeries() {
109109
"CREATE TIMESERIES root.test.stateful.b with datatype=INT32,encoding=PLAIN");
110110
statement.execute(
111111
"CREATE TIMESERIES root.test.stateful.c with datatype=INT32,encoding=PLAIN");
112+
statement.execute("set configuration \"trusted_uri_pattern\"='.*'");
112113
} catch (SQLException throwable) {
113114
fail(throwable.getMessage());
114115
}

integration-test/src/test/java/org/apache/iotdb/db/it/udaf/IoTDBUDAFManagementIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ public void createFunctionWithURITest() throws SQLException {
235235
public void createFunctionWithInvalidURITest() {
236236
try (Connection connection = EnvFactory.getEnv().getConnection();
237237
Statement statement = connection.createStatement()) {
238+
statement.execute("set configuration \"trusted_uri_pattern\"='.*'");
238239
try {
239240
statement.execute(
240241
String.format(

integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDFBlockQueryIT.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,16 @@ public void testUDFSingleRowQuery() {
152152
fail(throwable.getMessage());
153153
}
154154
}
155+
156+
@Test
157+
public void testUntrustedUri() {
158+
try (Connection connection = EnvFactory.getEnv().getConnection();
159+
Statement statement = connection.createStatement()) {
160+
statement.execute(
161+
"CREATE FUNCTION two_sum AS 'org.apache.iotdb.db.query.udf.example.TwoSum' USING URI 'https://alioss.timecho.com/upload/library-udf.jar'");
162+
fail("should fail");
163+
} catch (SQLException throwable) {
164+
assertTrue(throwable.getMessage().contains("701: Untrusted uri "));
165+
}
166+
}
155167
}

integration-test/src/test/java/org/apache/iotdb/db/it/udf/IoTDBUDFManagementIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ public void testCreateFunctionWithURI() throws SQLException {
262262
public void testCreateFunctionWithInvalidURI() {
263263
try (Connection connection = EnvFactory.getEnv().getConnection();
264264
Statement statement = connection.createStatement()) {
265+
statement.execute("set configuration \"trusted_uri_pattern\"='.*'");
265266
try {
266267
statement.execute(
267268
String.format(

integration-test/src/test/java/org/apache/iotdb/pipe/it/autocreate/IoTDBPipeLifeCycleIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ public void testPermission() {
846846
assertNonQueryTestFail(
847847
senderEnv,
848848
"create pipePlugin TestProcessor as 'org.apache.iotdb.db.pipe.example.TestProcessor' USING URI 'xxx'",
849-
"1603: The scheme of URI is not set, please specify the scheme of URI.",
849+
"701: Untrusted uri xxx",
850850
"test",
851851
"test123");
852852
tryExecuteNonQueryWithRetry(senderEnv, "drop pipePlugin TestProcessor", "test", "test123");

iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ showSubscriptions
672672
// AI Model =========================================================================================
673673
// ---- Create Model
674674
createModel
675-
: CREATE MODEL modelName=identifier USING URI modelUri=STRING_LITERAL
675+
: CREATE MODEL modelName=identifier uriClause
676676
;
677677

678678
windowFunction

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
import java.util.Properties;
8787
import java.util.ServiceLoader;
8888
import java.util.Set;
89+
import java.util.regex.Pattern;
8990

9091
public class IoTDBDescriptor {
9192

@@ -2003,6 +2004,28 @@ public synchronized void loadHotModifiedProps(Properties properties)
20032004
} else {
20042005
BinaryAllocator.getInstance().close(true);
20052006
}
2007+
2008+
// update trusted_uri_pattern
2009+
String trustedUriPattern =
2010+
Optional.ofNullable(
2011+
properties.getProperty(
2012+
"trusted_uri_pattern",
2013+
ConfigurationFileUtils.getConfigurationDefaultValue("trusted_uri_pattern")))
2014+
.map(String::trim)
2015+
.orElse(ConfigurationFileUtils.getConfigurationDefaultValue("trusted_uri_pattern"));
2016+
Pattern pattern;
2017+
if (trustedUriPattern != null) {
2018+
try {
2019+
pattern = Pattern.compile(trustedUriPattern);
2020+
} catch (Exception e) {
2021+
LOGGER.warn("Failed to parse trusted_uri_pattern {}", trustedUriPattern);
2022+
pattern = commonDescriptor.getConfig().getTrustedUriPattern();
2023+
}
2024+
} else {
2025+
pattern = commonDescriptor.getConfig().getTrustedUriPattern();
2026+
}
2027+
commonDescriptor.getConfig().setTrustedUriPattern(pattern);
2028+
20062029
} catch (Exception e) {
20072030
if (e instanceof InterruptedException) {
20082031
Thread.currentThread().interrupt();

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigTaskVisitor.java

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.apache.iotdb.db.queryengine.plan.execution.config;
2121

22+
import org.apache.iotdb.db.exception.sql.SemanticException;
2223
import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
2324
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.CountDatabaseTask;
2425
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.CountTimeSlotListTask;
@@ -171,6 +172,8 @@
171172

172173
import org.apache.tsfile.exception.NotImplementedException;
173174

175+
import static org.apache.iotdb.commons.executable.ExecutableManager.isUriTrusted;
176+
174177
public class ConfigTaskVisitor extends StatementVisitor<IConfigTask, MPPQueryContext> {
175178

176179
@Override
@@ -316,7 +319,16 @@ public IConfigTask visitKillQuery(
316319
@Override
317320
public IConfigTask visitCreateFunction(
318321
CreateFunctionStatement createFunctionStatement, MPPQueryContext context) {
319-
return new CreateFunctionTask(createFunctionStatement);
322+
if (!createFunctionStatement.isUsingURI()
323+
|| (createFunctionStatement.getUriString() != null
324+
&& isUriTrusted(createFunctionStatement.getUriString()))) {
325+
// 1. user specified uri and that uri is trusted
326+
// 2. user doesn't specify uri
327+
return new CreateFunctionTask(createFunctionStatement);
328+
} else {
329+
// user specified uri and that uri is not trusted
330+
throw new SemanticException("Untrusted uri " + createFunctionStatement.getUriString());
331+
}
320332
}
321333

322334
@Override
@@ -334,7 +346,16 @@ public IConfigTask visitShowFunctions(
334346
@Override
335347
public IConfigTask visitCreateTrigger(
336348
CreateTriggerStatement createTriggerStatement, MPPQueryContext context) {
337-
return new CreateTriggerTask(createTriggerStatement);
349+
if (!createTriggerStatement.isUsingURI()
350+
|| (createTriggerStatement.getUriString() != null
351+
&& isUriTrusted(createTriggerStatement.getUriString()))) {
352+
// 1. user specified uri and that uri is trusted
353+
// 2. user doesn't specify uri
354+
return new CreateTriggerTask(createTriggerStatement);
355+
} else {
356+
// user specified uri and that uri is not trusted
357+
throw new SemanticException("Untrusted uri " + createTriggerStatement.getUriString());
358+
}
338359
}
339360

340361
@Override
@@ -352,7 +373,15 @@ public IConfigTask visitShowTriggers(
352373
@Override
353374
public IConfigTask visitCreatePipePlugin(
354375
CreatePipePluginStatement createPipePluginStatement, MPPQueryContext context) {
355-
return new CreatePipePluginTask(createPipePluginStatement);
376+
if (createPipePluginStatement.getUriString() != null
377+
&& isUriTrusted(createPipePluginStatement.getUriString())) {
378+
// 1. user specified uri and that uri is trusted
379+
// 2. user doesn't specify uri
380+
return new CreatePipePluginTask(createPipePluginStatement);
381+
} else {
382+
// user specified uri and that uri is not trusted
383+
throw new SemanticException("Untrusted uri " + createPipePluginStatement.getUriString());
384+
}
356385
}
357386

358387
@Override
@@ -598,7 +627,14 @@ public IConfigTask visitShowThrottleQuota(
598627
@Override
599628
public IConfigTask visitCreateModel(
600629
CreateModelStatement createModelStatement, MPPQueryContext context) {
601-
return new CreateModelTask(createModelStatement, context);
630+
if (createModelStatement.getUri() != null && isUriTrusted(createModelStatement.getUri())) {
631+
// 1. user specified uri and that uri is trusted
632+
// 2. user doesn't specify uri
633+
return new CreateModelTask(createModelStatement, context);
634+
} else {
635+
// user specified uri and that uri is not trusted
636+
throw new SemanticException("Untrusted uri " + createModelStatement.getUri());
637+
}
602638
}
603639

604640
@Override

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,6 @@ public SettableFuture<ConfigTaskResult> createFunction(
473473
String jarFilePathUnderTempDir =
474474
UDFExecutableManager.getInstance()
475475
.getDirStringUnderTempRootByRequestId(resource.getRequestId())
476-
+ File.separator
477476
+ jarFileName;
478477
// libRoot should be the path of the specified jar
479478
libRoot = jarFilePathUnderTempDir;
@@ -506,12 +505,15 @@ public SettableFuture<ConfigTaskResult> createFunction(
506505
tCreateFunctionReq.setJarFile(jarFile);
507506
tCreateFunctionReq.setJarMD5(jarMd5);
508507
tCreateFunctionReq.setIsUsingURI(true);
509-
tCreateFunctionReq.setJarName(
510-
String.format(
511-
"%s-%s.%s",
512-
jarFileName.substring(0, jarFileName.lastIndexOf(".")),
513-
jarMd5,
514-
jarFileName.substring(jarFileName.lastIndexOf(".") + 1)));
508+
int index = jarFileName.lastIndexOf(".");
509+
if (index < 0) {
510+
tCreateFunctionReq.setJarName(String.format("%s-%s", jarFileName, jarMd5));
511+
} else {
512+
tCreateFunctionReq.setJarName(
513+
String.format(
514+
"%s-%s.%s",
515+
jarFileName.substring(0, index), jarMd5, jarFileName.substring(index + 1)));
516+
}
515517
}
516518

517519
// try to create instance, this request will fail if creation is not successful
@@ -645,7 +647,6 @@ public SettableFuture<ConfigTaskResult> createTrigger(
645647
String jarFilePathUnderTempDir =
646648
TriggerExecutableManager.getInstance()
647649
.getDirStringUnderTempRootByRequestId(resource.getRequestId())
648-
+ File.separator
649650
+ jarFileName;
650651
// libRoot should be the path of the specified jar
651652
libRoot = jarFilePathUnderTempDir;
@@ -811,7 +812,6 @@ public SettableFuture<ConfigTaskResult> createPipePlugin(
811812
final String jarFilePathUnderTempDir =
812813
PipePluginExecutableManager.getInstance()
813814
.getDirStringUnderTempRootByRequestId(resource.getRequestId())
814-
+ File.separator
815815
+ jarFileName;
816816
// libRoot should be the path of the specified jar
817817
libRoot = jarFilePathUnderTempDir;

0 commit comments

Comments
 (0)