]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-14584 Analysis of the project can fail if path of the file exceeds 400 characte...
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Tue, 3 Jan 2023 21:00:42 +0000 (15:00 -0600)
committersonartech <sonartech@sonarsource.com>
Thu, 5 Jan 2023 20:02:56 +0000 (20:02 +0000)
server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentValidator.java
sonar-core/src/main/java/org/sonar/core/component/ComponentKeys.java
sonar-plugin-api-impl/src/main/java/org/sonar/api/batch/fs/internal/DefaultIndexedFile.java
sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/fs/internal/DefaultIndexedFileTest.java [new file with mode: 0644]

index 8fc1e36618fc844d60d4805025358c55e7610961..ae15fef81d9f3472eb7f22a230df135c10352d10 100644 (file)
@@ -29,7 +29,6 @@ public class ComponentValidator {
   // b_name column is 500 characters wide
   public static final int MAX_COMPONENT_NAME_LENGTH = 500;
   public static final int MAX_COMPONENT_DESCRIPTION_LENGTH = 2_000;
-  private static final int MAX_COMPONENT_TAGS_LENGTH = 500;
   private static final int MAX_COMPONENT_QUALIFIER_LENGTH = 10;
 
   private ComponentValidator() {
@@ -62,16 +61,6 @@ public class ComponentValidator {
     return value;
   }
 
-  public static String checkTags(@Nullable String value) {
-    if (value == null) {
-      return null;
-    }
-
-    checkArgument(value.length() <= MAX_COMPONENT_NAME_LENGTH, "Component tags length (%s) is longer than the maximum authorized (%s). '%s' was provided.",
-      value.length(), MAX_COMPONENT_TAGS_LENGTH, value);
-    return value;
-  }
-
   public static String checkComponentKey(String key) {
     checkArgument(!isNullOrEmpty(key), "Component key can't be empty");
     checkArgument(key.length() <= MAX_COMPONENT_KEY_LENGTH, "Component key length (%s) is longer than the maximum authorized (%s). '%s' was provided.",
index b8003dfc2d6ae79533575554509ab3417fc016b2..4128a54f5854a857cac65ced775aa8b359b93700 100644 (file)
@@ -27,6 +27,9 @@ import static com.google.common.base.Preconditions.checkArgument;
 
 public final class ComponentKeys {
 
+  /**
+   * Should be in sync with DefaultIndexedFile.MAX_KEY_LENGTH
+   */
   public static final int MAX_COMPONENT_KEY_LENGTH = 400;
 
   public static final String ALLOWED_CHARACTERS_MESSAGE = "Allowed characters are alphanumeric, '-', '_', '.' and ':', with at least one non-digit";
index d803e27fc372cbd619ee01836d6be1500f20be9b..2346a8e65d8674c209e7a83ee68037645f916b66 100644 (file)
@@ -38,6 +38,8 @@ import org.sonar.api.utils.PathUtils;
  */
 @Immutable
 public class DefaultIndexedFile extends DefaultInputComponent implements IndexedFile {
+  // should match limit in org.sonar.core.component.ComponentKeys
+  private static final Integer MAX_KEY_LENGTH = 400;
   private static final AtomicInteger intGenerator = new AtomicInteger(0);
 
   private final String projectRelativePath;
@@ -73,6 +75,14 @@ public class DefaultIndexedFile extends DefaultInputComponent implements Indexed
     this.sensorStrategy = sensorStrategy;
     this.absolutePath = absolutePath;
     this.oldRelativeFilePath = oldRelativeFilePath;
+    validateKeyLength();
+  }
+
+  private void validateKeyLength() {
+    String key = key();
+    if (key.length() > MAX_KEY_LENGTH) {
+      throw new IllegalStateException(String.format("Component key (%s) length (%s) is longer than the maximum authorized (%s)", key, key.length(), MAX_KEY_LENGTH));
+    }
   }
 
   @Override
diff --git a/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/fs/internal/DefaultIndexedFileTest.java b/sonar-plugin-api-impl/src/test/java/org/sonar/api/batch/fs/internal/DefaultIndexedFileTest.java
new file mode 100644 (file)
index 0000000..29edc62
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2023 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.api.batch.fs.internal;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.apache.commons.lang.StringUtils;
+import org.assertj.core.api.Assertions;
+import org.junit.Test;
+
+public class DefaultIndexedFileTest {
+  @Test
+  public void fail_to_index_if_file_key_too_long() {
+    String path = StringUtils.repeat("a", 395);
+    String projectKey = "12345";
+    Path baseDir = Paths.get("");
+    Assertions.assertThatThrownBy(() -> new DefaultIndexedFile(projectKey, baseDir, path, null))
+      .isInstanceOf(IllegalStateException.class)
+      .hasMessageEndingWith("length (401) is longer than the maximum authorized (400)");
+  }
+}