1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.aether.util;
20
21 import java.util.Collections;
22 import java.util.HashMap;
23 import java.util.Map;
24
25 import org.eclipse.aether.artifact.Artifact;
26 import org.eclipse.aether.metadata.Metadata;
27
28 import static java.util.Objects.requireNonNull;
29
30
31
32
33
34
35 public final class PathUtils {
36 private PathUtils() {
37
38 }
39
40 private static final Map<String, String> ILLEGAL_PATH_SEGMENT_REPLACEMENTS;
41
42 static {
43 HashMap<String, String> illegalPathSegmentReplacements = new HashMap<>();
44 illegalPathSegmentReplacements.put("\\", "-BACKSLASH-");
45 illegalPathSegmentReplacements.put("/", "-SLASH-");
46 illegalPathSegmentReplacements.put(":", "-COLON-");
47 illegalPathSegmentReplacements.put("\"", "-QUOTE-");
48 illegalPathSegmentReplacements.put("<", "-LT-");
49 illegalPathSegmentReplacements.put(">", "-GT-");
50 illegalPathSegmentReplacements.put("|", "-PIPE-");
51 illegalPathSegmentReplacements.put("?", "-QMARK-");
52 illegalPathSegmentReplacements.put("*", "-ASTERISK-");
53 ILLEGAL_PATH_SEGMENT_REPLACEMENTS = Collections.unmodifiableMap(illegalPathSegmentReplacements);
54 }
55
56
57
58
59
60
61
62
63
64
65 public static String stringToPathSegment(String string) {
66 requireNonNull(string);
67 StringBuilder result = new StringBuilder(string);
68 for (Map.Entry<String, String> entry : ILLEGAL_PATH_SEGMENT_REPLACEMENTS.entrySet()) {
69 String illegal = entry.getKey();
70 int pos = result.indexOf(illegal);
71 while (pos >= 0) {
72 result.replace(pos, pos + illegal.length(), entry.getValue());
73 pos = result.indexOf(illegal);
74 }
75 }
76 return result.toString();
77 }
78
79
80
81
82
83
84
85
86 public static void validatePathComponent(String value, String label) {
87 if (value != null && !value.isEmpty()) {
88
89
90 if (value.equals("..") || value.contains("/") || value.contains("\\")) {
91 throw new IllegalArgumentException(
92 "Invalid " + label + ": must not contain '..', '/' or '\\': " + value);
93 }
94 }
95 }
96
97
98
99
100
101
102
103 public static void validateArtifactComponents(Artifact artifact) {
104 validatePathComponent(artifact.getGroupId(), "groupId");
105 validatePathComponent(artifact.getArtifactId(), "artifactId");
106 validatePathComponent(artifact.getVersion(), "version");
107 validatePathComponent(artifact.getBaseVersion(), "baseVersion");
108 validatePathComponent(artifact.getClassifier(), "classifier");
109 validatePathComponent(artifact.getExtension(), "extension");
110 }
111
112
113
114
115
116
117
118 public static void validateMetadataComponents(Metadata metadata) {
119 validatePathComponent(metadata.getGroupId(), "groupId");
120 validatePathComponent(metadata.getArtifactId(), "artifactId");
121 validatePathComponent(metadata.getVersion(), "version");
122
123 }
124 }