Skip to content

Commit b08e705

Browse files
authored
Add AWS regexp pattern (#62)
New feature that enhances the replacement functionality in the DefaultRegexpPairs. It allows for more flexible replacements by supporting dynamic replacement of matched groups from the regular expression pattern. - checkbox for explicit AWS usage - Refactored LogFileFilterOutputStream to handle multiple DefaultRegexpPairs --------- Authored-by: Fredrik Lysén <[email protected]>
1 parent 956359a commit b08e705

File tree

8 files changed

+155
-13
lines changed

8 files changed

+155
-13
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,4 @@ fabric.properties
8080

8181
# Android studio 3.1+ serialized cache file
8282
.idea/caches/build_file_checksums.ser
83+
/.idea/

src/main/java/com/tsystems/sbs/DefaultRegexpPairs.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,18 @@ public final class DefaultRegexpPairs {
1919
new RegexpPair("password=\\S*", "password=********") //PASSWORD MASKING
2020
));
2121

22+
private final static List<RegexpPair> DEFAULT_REGEXES_AWS
23+
= Collections.<RegexpPair>unmodifiableList(
24+
Arrays.<RegexpPair>asList(
25+
new RegexpPair("(AWS_[a-zA-Z_]+=)(\\S+)", "$1********"), // AWS RegExp MASKING
26+
new RegexpPair("(aws_[a-zA-Z_]+=)(\\S+)", "$1********")
27+
));
28+
2229
public static List<RegexpPair> getDefaultRegexes() {
2330
return DEFAULT_REGEXES;
2431
}
32+
33+
public static List<RegexpPair> getDefaultRegexesAWS() {
34+
return DEFAULT_REGEXES_AWS;
35+
}
2536
}

src/main/java/com/tsystems/sbs/LogFileFilterConfig.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public static LogFileFilterConfig get() {
4545
* Determines whether the regexp replacements which come fixed with the plugin are enabled.
4646
*/
4747
private boolean enabledDefaultRegexp;
48+
private boolean enabledDefaultRegexpAWS;
4849

4950
/**
5051
* Represents the custom regexp pairs specified by the user in the global settings.
@@ -70,12 +71,22 @@ public boolean isEnabledDefaultRegexp() {
7071
return enabledDefaultRegexp;
7172
}
7273

74+
public boolean isEnabledDefaultRegexpAWS() {
75+
return enabledDefaultRegexpAWS;
76+
}
77+
7378
@DataBoundSetter
7479
public void setEnabledDefaultRegexp(boolean enabledDefaultRegexp) {
7580
this.enabledDefaultRegexp = enabledDefaultRegexp;
7681
save();
7782
}
7883

84+
@DataBoundSetter
85+
public void setEnabledDefaultRegexpAWS(boolean enabledDefaultRegexpAWS) {
86+
this.enabledDefaultRegexpAWS = enabledDefaultRegexpAWS;
87+
save();
88+
}
89+
7990
public List<RegexpPair> getRegexpPairs() {
8091
return regexpPairs;
8192
}

src/main/java/com/tsystems/sbs/LogFileFilterOutputStream.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.io.IOException;
77
import java.io.OutputStream;
88
import java.nio.charset.Charset;
9+
import java.util.ArrayList;
910
import java.util.Collections;
1011
import java.util.List;
1112
import java.util.logging.Level;
@@ -29,6 +30,7 @@ public class LogFileFilterOutputStream extends LineTransformationOutputStream {
2930
//Global settings
3031
private final boolean isEnabledGlobally;
3132
private final boolean isEnabledDefaultRegexp;
33+
private final boolean isEnabledDefaultRegexpAWS;
3234
private final List<RegexpPair> defaultRegexpPairs;
3335
private final List<RegexpPair> customRegexpPairs;
3436
private final String jobName;
@@ -47,19 +49,27 @@ public LogFileFilterOutputStream(OutputStream out, Charset charset, String jobNa
4749
}
4850

4951
isEnabledGlobally = config.isEnabledGlobally();
50-
isEnabledDefaultRegexp = config.isEnabledDefaultRegexp();
51-
if (isEnabledGlobally) {
52-
//Load regexes
53-
customRegexpPairs = config.getRegexpPairs();
54-
if (isEnabledDefaultRegexp) {
55-
defaultRegexpPairs = DefaultRegexpPairs.getDefaultRegexes();
56-
} else {
57-
defaultRegexpPairs = Collections.<RegexpPair>emptyList();
58-
}
59-
} else {
60-
customRegexpPairs = Collections.<RegexpPair>emptyList();
61-
defaultRegexpPairs = Collections.<RegexpPair>emptyList();
62-
}
52+
isEnabledDefaultRegexp = config.isEnabledDefaultRegexp();
53+
isEnabledDefaultRegexpAWS = config.isEnabledDefaultRegexpAWS();
54+
55+
if (isEnabledGlobally) {
56+
// Load regexes
57+
customRegexpPairs = config.getRegexpPairs();
58+
defaultRegexpPairs = new ArrayList<>();
59+
if (isEnabledDefaultRegexp) {
60+
defaultRegexpPairs.addAll(DefaultRegexpPairs.getDefaultRegexes());
61+
}
62+
if (isEnabledDefaultRegexpAWS) {
63+
defaultRegexpPairs.addAll(DefaultRegexpPairs.getDefaultRegexesAWS());
64+
}
65+
// Log defaultRegexpPairs
66+
for (RegexpPair pair : defaultRegexpPairs) {
67+
LOGGER.log(Level.INFO, pair.toString());
68+
}
69+
} else {
70+
customRegexpPairs = Collections.<RegexpPair>emptyList();
71+
defaultRegexpPairs = Collections.<RegexpPair>emptyList();
72+
}
6373
}
6474

6575
@Override

src/main/java/com/tsystems/sbs/RegexpPair.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.tsystems.sbs;
22

3+
import edu.umd.cs.findbugs.annotations.NonNull;
34
import hudson.Extension;
45
import hudson.model.AbstractDescribableImpl;
56
import hudson.model.Descriptor;
@@ -23,6 +24,11 @@ public class RegexpPair extends AbstractDescribableImpl<RegexpPair> implements S
2324
private String replacement;
2425
private transient Pattern compiledRegexp;
2526

27+
@Override
28+
public String toString() {
29+
return "RegexpPair{pattern=" + regexp + ", replacement=" + replacement + "}";
30+
}
31+
2632
@DataBoundConstructor
2733
public RegexpPair(String regexp, String replacement) {
2834
this.regexp = regexp;

src/main/resources/com/tsystems/sbs/LogFileFilterConfig/config.jelly

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
<f:entry title="Enable default regexp" field="enabledDefaultRegexp">
2525
<f:checkbox checked="${it.enabledDefaultRegexp}" />
2626
</f:entry>
27+
28+
<f:entry title="Enable Amazon AWS regexp" field="enabledDefaultRegexpAWS">
29+
<f:checkbox checked="${it.enabledDefaultRegexpAWS}" />
30+
</f:entry>
2731

2832
<!-- Defines the regexp patterns to filter the console logs -->
2933
<f:entry title="Custom regexp pairs" field="regexpPairs">
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<!--THIS FILE IS AUTOGENERATED FROM THE global.properties FILE-->
2+
<div>
3+
4+
<style>
5+
.log-file-filter-plugin th, .log-file-filter-plugin td{
6+
border: solid 1px black;
7+
border-collapse: collapse;
8+
padding: 10px
9+
}
10+
</style>
11+
12+
<p>These are the default regular expressions and their respective replacements. These expressions are fixed and come with the plugin.</p>
13+
<table class="log-file-filter-plugin">
14+
<!-- Table header -->
15+
<tr><th>Description</th><th>Regexp</th><th>Replacement</th><th>Sample</th></tr>
16+
17+
<!-- Table rows (regexes) -->
18+
<tr>
19+
<td>Masks AWS credential and token</td>
20+
<td>(AWS_[a-zA-Z_]+=)(\S+)</td>
21+
<td>$1********</td>
22+
<td>
23+
<ul>
24+
<li>AWS_ACCESS_KEY_ID=A7OTR4HWEGX2SKQMRAXI -> AWS_ACCESS_KEY_ID=********</li>
25+
<li>AWS_SECRET_ACCESS_KEY=agfkjgsakfjhsgad -> AWS_SECRET_ACCESS_KEY=********</li>
26+
<li>AWS_SESSION_TOKEN=ThGHJJHF7jdfnjsdzf -> AWS_SESSION_TOKEN=********</li>
27+
</ul>
28+
</td>
29+
</tr>
30+
</table>
31+
</div>
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.tsystems.sbs;
2+
3+
import hudson.console.LineTransformationOutputStream;
4+
import org.junit.Test;
5+
6+
import java.util.List;
7+
import java.util.regex.Matcher;
8+
import java.util.regex.Pattern;
9+
10+
import static org.codehaus.groovy.runtime.ResourceGroovyMethods.filterLine;
11+
import static org.hamcrest.MatcherAssert.assertThat;
12+
import static org.hamcrest.Matchers.greaterThan;
13+
import static org.hamcrest.Matchers.is;
14+
import static org.junit.Assert.assertEquals;
15+
16+
17+
public class DefaultRegexpPairsAWSTest {
18+
private List<RegexpPair> getDefaultRegexpPairs() {
19+
return DefaultRegexpPairs.getDefaultRegexesAWS();
20+
}
21+
@Test
22+
public void testDefaultPairsList() {
23+
List<RegexpPair> defaultRegexpPairs = getDefaultRegexpPairs();
24+
assertThat(defaultRegexpPairs.size(), greaterThan(0));
25+
26+
}
27+
28+
@Test
29+
public void testDefaultPairs() {
30+
List<RegexpPair> defaultRegexpPairs = getDefaultRegexpPairs();
31+
32+
// Define the input string
33+
String input = "AWS_ACCESS_KEY_ID=R2RHTXG7QKSRWMOHEIAMH4A AWS_SECRET_ACCESS_KEY=/lD8T9bXuZUW/F/8MutOB1vDXK2uG/gNHUe/d8bG AWS_SESSION_TOKEN=Z1XKqTnKIHd7eLJhBZb9QWVcG0Rj3f8z1uYgO4Xm6vNiD5F7cM9pAa/2SsPqRrTtEoUyHwC+DxGJlWbVfNkOYK6hI3eX1L0j2+//////////";
34+
String expected = "AWS_ACCESS_KEY_ID=******** AWS_SECRET_ACCESS_KEY=******** AWS_SESSION_TOKEN=********";
35+
36+
37+
StringBuilder replacedInput = new StringBuilder(input);
38+
39+
for (RegexpPair pair : defaultRegexpPairs) {
40+
String pattern = pair.getRegexp();
41+
String replacement = pair.getReplacement();
42+
43+
Pattern regexPattern = Pattern.compile(pattern);
44+
Matcher matcher = regexPattern.matcher(replacedInput);
45+
46+
while (matcher.find()) {
47+
String matchedPattern = matcher.group();
48+
String replacedString = replacement;
49+
50+
// Replace all occurrences of $n with the matched groups
51+
for (int i = 1; i <= matcher.groupCount(); i++) {
52+
String group = matcher.group(i);
53+
replacedString = replacedString.replace("$" + i, group);
54+
}
55+
56+
replacedInput.replace(matcher.start(), matcher.end(), replacedString);
57+
matcher.region(matcher.start() + replacedString.length(), replacedInput.length());
58+
}
59+
}
60+
61+
String replacedInputString = replacedInput.toString();
62+
System.out.println("Replaced input result: " + replacedInputString);
63+
64+
// Test the behavior
65+
assertEquals(expected, replacedInputString);
66+
}
67+
}
68+

0 commit comments

Comments
 (0)