Skip to content

Commit 1c5de6f

Browse files
rootroot
authored andcommitted
Move sensitive parameter log helpers to StringUtils
1 parent e9a1890 commit 1c5de6f

3 files changed

Lines changed: 38 additions & 36 deletions

File tree

server/src/main/java/com/cloud/api/ApiServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ public void handle(final HttpRequest request, final HttpResponse response, final
522522
if(parameterMap.putIfAbsent(param.getName(), new String[]{param.getValue()}) != null) {
523523
String message = String.format("Query parameter '%s' has multiple values %s. Only the last value will be respected." +
524524
"It is advised to pass only a single parameter", param.getName(),
525-
ApiServlet.formatValuesForLog(param.getName(), (String[]) parameterMap.get(param.getName())));
525+
StringUtils.formatValuesForLog(param.getName(), (String[]) parameterMap.get(param.getName())));
526526
logger.warn(StringUtils.cleanString(message));
527527
}
528528
}

server/src/main/java/com/cloud/api/ApiServlet.java

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.util.HashMap;
2525
import java.util.List;
2626
import java.util.Map;
27-
import java.util.Set;
2827

2928
import javax.inject.Inject;
3029
import javax.servlet.ServletConfig;
@@ -79,20 +78,8 @@ public class ApiServlet extends HttpServlet {
7978
protected static Logger LOGGER = LogManager.getLogger(ApiServlet.class);
8079
private static final Logger ACCESSLOGGER = LogManager.getLogger("apiserver." + ApiServlet.class.getName());
8180
private static final String REPLACEMENT = "_";
82-
private static final String REDACTED = "REDACTED";
8381
private static final String LOGGER_REPLACEMENTS = "[\n\r\t]";
8482

85-
private static final Set<String> SENSITIVE_PARAMETER_KEYWORDS = Set.of(
86-
"password",
87-
"privatekey",
88-
"accesskey",
89-
"secretkey",
90-
"apikey",
91-
"signature",
92-
"sessionkey",
93-
"token"
94-
);
95-
9683
@Inject
9784
ApiServerService apiServer;
9885
@Inject
@@ -174,32 +161,12 @@ private void checkSingleQueryParameterValue(Map<String, String[]> params) {
174161
params.forEach((k, v) -> {
175162
if (v.length > 1) {
176163
String message = String.format("Query parameter '%s' has multiple values %s. Only the last value will be respected." +
177-
"It is advised to pass only a single parameter", k, formatValuesForLog(k, v));
164+
"It is advised to pass only a single parameter", k, StringUtils.formatValuesForLog(k, v));
178165
LOGGER.warn(message);
179166
}
180167
});
181168
}
182169

183-
static boolean isSensitiveParameter(String parameterName) {
184-
if (parameterName == null) {
185-
return false;
186-
}
187-
188-
String lowerCaseParameter = parameterName.toLowerCase();
189-
return SENSITIVE_PARAMETER_KEYWORDS.stream()
190-
.anyMatch(lowerCaseParameter::contains);
191-
}
192-
193-
static String formatValuesForLog(String parameterName, String[] values) {
194-
if (!isSensitiveParameter(parameterName)) {
195-
return Arrays.toString(values);
196-
}
197-
198-
String[] masked = new String[values.length];
199-
Arrays.fill(masked, REDACTED);
200-
return Arrays.toString(masked);
201-
}
202-
203170
void processRequestInContext(final HttpServletRequest req, final HttpServletResponse resp) {
204171
InetAddress remoteAddress = null;
205172
try {

utils/src/main/java/com/cloud/utils/StringUtils.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525

2626
import java.nio.charset.Charset;
2727
import java.util.ArrayList;
28+
import java.util.Arrays;
2829
import java.util.HashMap;
2930
import java.util.List;
30-
import java.util.Map;
31+
import java.util.Locale;
32+
import java.util.Locale;
3133
import java.util.Set;
3234
import java.util.TreeSet;
3335
import java.util.regex.Matcher;
@@ -169,6 +171,39 @@ public static String getMaskedPasswordForDisplay(final String password) {
169171

170172
private static final Pattern REGEX_REDUNDANT_AND = Pattern.compile("(&|%26)(&|%26)+");
171173

174+
private static final String REDACTED = "REDACTED";
175+
176+
private static final Set<String> SENSITIVE_PARAMETER_KEYWORDS = Set.of(
177+
"password",
178+
"privatekey",
179+
"accesskey",
180+
"secretkey",
181+
"apikey",
182+
"signature",
183+
"sessionkey",
184+
"token"
185+
);
186+
187+
public static boolean isSensitiveParameter(final String parameterName) {
188+
if (parameterName == null) {
189+
return false;
190+
}
191+
192+
final String normalized = parameterName.toLowerCase(Locale.ROOT);
193+
return SENSITIVE_PARAMETER_KEYWORDS.stream()
194+
.anyMatch(normalized::contains);
195+
}
196+
197+
public static String formatValuesForLog(final String parameterName, final String[] values) {
198+
if (!isSensitiveParameter(parameterName)) {
199+
return Arrays.toString(values);
200+
}
201+
202+
final String[] masked = new String[values.length];
203+
Arrays.fill(masked, REDACTED);
204+
return Arrays.toString(masked);
205+
}
206+
172207
// Responsible for stripping sensitive content from request and response strings
173208
public static String cleanString(final String stringToClean) {
174209
String cleanResult = "";

0 commit comments

Comments
 (0)