diff --git a/.changes/1.0.7.md b/.changes/1.0.7.md new file mode 100644 index 0000000..3865213 --- /dev/null +++ b/.changes/1.0.7.md @@ -0,0 +1,4 @@ +## 1.0.7 - 2024-04-10 +### 🐛 Bug Fix + +- Fixed the Jenkins job output masking issue. \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 01b220f..61a6e74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), and is generated by [Changie](https://github.com/miniscruff/changie). +## 1.0.7 - 2024-04-10 +### 🐛 Bug Fix + +- Fixed the Jenkins job output masking issue. ## 1.0.6 - 2024-01-10 ### 🐛 Bug Fix diff --git a/Taskfile.yml b/Taskfile.yml index 16fa582..cc3435d 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -18,7 +18,7 @@ tasks: bump: desc: bump the version using changie cmds: - - changie batch 1.0.6 + - changie batch 1.0.7 - changie merge - git add .changes/* - git add CHANGELOG.md diff --git a/pom.xml b/pom.xml index 331dab7..1035b6e 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ io.jenkins.plugins thycotic-secret-server - 1.0.6 + 1.0.7 hpi diff --git a/src/main/java/com/thycotic/secrets/jenkins/ServerBuildWrapper.java b/src/main/java/com/thycotic/secrets/jenkins/ServerBuildWrapper.java index ec995cf..7d2dc96 100644 --- a/src/main/java/com/thycotic/secrets/jenkins/ServerBuildWrapper.java +++ b/src/main/java/com/thycotic/secrets/jenkins/ServerBuildWrapper.java @@ -5,7 +5,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import com.thycotic.secrets.server.spring.Secret; import com.thycotic.secrets.server.spring.SecretServer; @@ -29,8 +28,6 @@ import hudson.model.TaskListener; import hudson.tasks.BuildWrapperDescriptor; import jenkins.tasks.SimpleBuildWrapper; -import org.jenkinsci.plugins.credentialsbinding.masking.SecretPatterns; -import java.util.stream.Collectors; public class ServerBuildWrapper extends SimpleBuildWrapper { private static final String USERNAME_PROPERTY = "secret_server.oauth2.username"; @@ -57,8 +54,7 @@ public void setSecrets(final List secrets) { @Override public ConsoleLogFilter createLoggerDecorator(final Run build) { - List values = valuesToMask.stream().filter(Objects::nonNull).collect(Collectors.toList()); - return new ServerConsoleLogFilter(build.getCharset().name(), !values.isEmpty() ? SecretPatterns.getAggregateSecretPattern(values) : null); + return new ServerConsoleLogFilter(build.getCharset().name(), valuesToMask); } @Override diff --git a/src/main/java/com/thycotic/secrets/jenkins/ServerConsoleLogFilter.java b/src/main/java/com/thycotic/secrets/jenkins/ServerConsoleLogFilter.java index ac49ac8..5f69cfc 100644 --- a/src/main/java/com/thycotic/secrets/jenkins/ServerConsoleLogFilter.java +++ b/src/main/java/com/thycotic/secrets/jenkins/ServerConsoleLogFilter.java @@ -6,23 +6,44 @@ import java.io.OutputStream; import java.io.Serializable; import java.io.IOException; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; import java.util.regex.Pattern; import org.jenkinsci.plugins.credentialsbinding.masking.SecretPatterns; +import java.util.regex.PatternSyntaxException; // borrowed from https://github.com/jenkinsci/azure-keyvault-plugin/blob/master/src/main/java/org/jenkinsci/plugins/azurekeyvaultplugin/MaskingConsoleLogFilter.java public class ServerConsoleLogFilter extends ConsoleLogFilter implements Serializable { private static final long serialVersionUID = 1L; private final String charsetName; - private final Pattern valuesToMask; + private final List valuesToMask; - public ServerConsoleLogFilter(final String charsetName, final Pattern valuesToMask) { + public ServerConsoleLogFilter(final String charsetName, final List valuesToMask) { this.charsetName = charsetName; this.valuesToMask = valuesToMask; } @Override public OutputStream decorateLogger(Run run, final OutputStream logger) throws IOException, InterruptedException { - return new SecretPatterns.MaskingOutputStream(logger, () -> valuesToMask, charsetName); + return new SecretPatterns.MaskingOutputStream(logger, () -> { + List values = valuesToMask.stream().filter(Objects::nonNull).collect(Collectors.toList()); + if (!values.isEmpty()) { + return ServerConsoleLogFilter.getAggregateSecretPattern(values); + } else { + return null; + } + },charsetName); + } + + public static Pattern getAggregateSecretPattern(List patterns) { + String aggregatedPattern = String.join("|", patterns); + try { + return Pattern.compile(aggregatedPattern); + } catch (PatternSyntaxException e) { + System.err.println("Error compiling pattern: " + e.getMessage()); + return null; + } } }