Skip to content

Commit 4eb3d59

Browse files
mwinter69jakub-bochenski
authored andcommitted
remove dependency to maskpasswords (#48)
* remove dependency to MaskPasswords instead we use a high ordinal which ensures we get initialized first * add a test for maskpasswords * fix import * use ConsoleLogFilter instead of a BuildWrapper in combination with a high ordinal we ensure that we get filtered output. * verify that passwords are always masked wrong order of build wrapper mask passwords only configured globally * use ConsoleLogFilter also for pipeline * improve javadoc of BuildWrapper clearly state that is only a marker for the ConsoleLogFilter
1 parent 9dbdbba commit 4eb3d59

File tree

7 files changed

+247
-125
lines changed

7 files changed

+247
-125
lines changed

pom.xml

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,6 @@
109109
<scope>compile</scope>
110110
</dependency>
111111

112-
<dependency>
113-
<groupId>org.jenkins-ci.plugins</groupId>
114-
<artifactId>mask-passwords</artifactId>
115-
<version>2.8</version>
116-
<optional>true</optional>
117-
</dependency>
118112

119113
<dependency>
120114
<groupId>org.jenkins-ci.plugins</groupId>
@@ -139,11 +133,23 @@
139133
<version>2.0.0-beta.5</version>
140134
<scope>test</scope>
141135
</dependency>
136+
<dependency>
137+
<groupId>org.jenkins-ci.plugins</groupId>
138+
<artifactId>mask-passwords</artifactId>
139+
<version>2.10.1</version>
140+
<scope>test</scope>
141+
</dependency>
142+
<dependency>
143+
<groupId>org.jenkins-ci.plugins</groupId>
144+
<artifactId>envinject</artifactId>
145+
<version>2.1.5</version>
146+
<scope>test</scope>
147+
</dependency>
142148
<dependency>
143149
<groupId>org.jenkins-ci.plugins.workflow</groupId>
144150
<artifactId>workflow-step-api</artifactId>
145151
<version>1.15</version>
146-
<optional>true</optional>
152+
<optional>true</optional>
147153
</dependency>
148154
</dependencies>
149155

src/main/java/jenkins/plugins/logstash/LogstashBuildWrapper.java

Lines changed: 33 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -24,100 +24,65 @@
2424

2525
package jenkins.plugins.logstash;
2626

27+
import java.io.IOException;
28+
29+
import org.kohsuke.stapler.DataBoundConstructor;
30+
2731
import hudson.Extension;
2832
import hudson.Launcher;
29-
import hudson.model.BuildListener;
3033
import hudson.model.AbstractBuild;
3134
import hudson.model.AbstractProject;
32-
import hudson.model.BuildableItemWithBuildWrappers;
35+
import hudson.model.BuildListener;
3336
import hudson.tasks.BuildWrapper;
3437
import hudson.tasks.BuildWrapperDescriptor;
3538

36-
import java.io.IOException;
37-
import java.io.OutputStream;
38-
import java.util.ArrayList;
39-
import java.util.List;
40-
41-
import org.kohsuke.stapler.DataBoundConstructor;
42-
43-
import com.michelin.cio.hudson.plugins.maskpasswords.MaskPasswordsBuildWrapper;
44-
import com.michelin.cio.hudson.plugins.maskpasswords.MaskPasswordsBuildWrapper.VarPasswordPair;
45-
import com.michelin.cio.hudson.plugins.maskpasswords.MaskPasswordsConfig;
46-
4739
/**
48-
* Build wrapper that decorates the build's logger to insert a
40+
*
41+
* This BuildWrapper is only a marker and has no other functionality.
42+
* The {@link LogstashConsoleLogFilter} uses this BuildWrapper to decide if it should send the log to an indexer.
43+
* We have to keep this for backward compatibility as in the past this BuildWrapper was used instead.
44+
* Using a ConsoleLogFilter allows to remove the dependency to the maskpasswords plugin.
4945
*
5046
* @author K Jonathan Harker
5147
*/
52-
public class LogstashBuildWrapper extends BuildWrapper {
48+
public class LogstashBuildWrapper extends BuildWrapper
49+
{
5350

5451
/**
5552
* Create a new {@link LogstashBuildWrapper}.
5653
*/
5754
@DataBoundConstructor
58-
public LogstashBuildWrapper() {}
59-
60-
/**
61-
* {@inheritDoc}
62-
*/
63-
@Override
64-
public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException {
65-
66-
return new Environment() {};
67-
}
55+
public LogstashBuildWrapper()
56+
{}
6857

6958
/**
7059
* {@inheritDoc}
7160
*/
7261
@Override
73-
public OutputStream decorateLogger(AbstractBuild build, OutputStream logger) {
74-
LogstashWriter logstash = getLogStashWriter(build, logger);
75-
76-
LogstashOutputStream los = new LogstashOutputStream(logger, logstash);
77-
78-
if (build.getProject() instanceof BuildableItemWithBuildWrappers) {
79-
BuildableItemWithBuildWrappers project = (BuildableItemWithBuildWrappers) build.getProject();
80-
for (BuildWrapper wrapper: project.getBuildWrappersList()) {
81-
if (wrapper instanceof MaskPasswordsBuildWrapper) {
82-
List<VarPasswordPair> allPasswordPairs = new ArrayList<VarPasswordPair>();
83-
84-
MaskPasswordsBuildWrapper maskPasswordsWrapper = (MaskPasswordsBuildWrapper) wrapper;
85-
List<VarPasswordPair> jobPasswordPairs = maskPasswordsWrapper.getVarPasswordPairs();
86-
if (jobPasswordPairs != null) {
87-
allPasswordPairs.addAll(jobPasswordPairs);
88-
}
89-
90-
MaskPasswordsConfig config = MaskPasswordsConfig.getInstance();
91-
List<VarPasswordPair> globalPasswordPairs = config.getGlobalVarPasswordPairs();
92-
if (globalPasswordPairs != null) {
93-
allPasswordPairs.addAll(globalPasswordPairs);
94-
}
95-
96-
return los.maskPasswords(allPasswordPairs);
97-
}
98-
}
99-
}
100-
101-
return los;
62+
public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener)
63+
throws IOException, InterruptedException
64+
{
65+
return new Environment()
66+
{
67+
};
10268
}
10369

10470
@Override
105-
public DescriptorImpl getDescriptor() {
106-
return (DescriptorImpl) super.getDescriptor();
107-
}
108-
109-
// Method to encapsulate calls for unit-testing
110-
LogstashWriter getLogStashWriter(AbstractBuild<?, ?> build, OutputStream errorStream) {
111-
return new LogstashWriter(build, errorStream, null, build.getCharset());
71+
public DescriptorImpl getDescriptor()
72+
{
73+
return (DescriptorImpl)super.getDescriptor();
11274
}
11375

11476
/**
11577
* Registers {@link LogstashBuildWrapper} as a {@link BuildWrapper}.
11678
*/
117-
@Extension
118-
public static class DescriptorImpl extends BuildWrapperDescriptor {
79+
// We need a high ordinal so that we are in the list of BuildWrappers before the MaskPasswords
80+
@Extension(ordinal = 10000)
81+
public static class DescriptorImpl extends BuildWrapperDescriptor
82+
{
11983

120-
public DescriptorImpl() {
84+
public DescriptorImpl()
85+
{
12186
super(LogstashBuildWrapper.class);
12287
load();
12388
}
@@ -126,15 +91,17 @@ public DescriptorImpl() {
12691
* {@inheritDoc}
12792
*/
12893
@Override
129-
public String getDisplayName() {
94+
public String getDisplayName()
95+
{
13096
return Messages.DisplayName();
13197
}
13298

13399
/**
134100
* {@inheritDoc}
135101
*/
136102
@Override
137-
public boolean isApplicable(AbstractProject<?, ?> item) {
103+
public boolean isApplicable(AbstractProject<?, ?> item)
104+
{
138105
return true;
139106
}
140107
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package jenkins.plugins.logstash;
2+
3+
import java.io.IOException;
4+
import java.io.OutputStream;
5+
import java.io.Serializable;
6+
7+
import hudson.Extension;
8+
import hudson.console.ConsoleLogFilter;
9+
import hudson.model.AbstractBuild;
10+
import hudson.model.BuildableItemWithBuildWrappers;
11+
import hudson.model.Run;
12+
import hudson.tasks.BuildWrapper;
13+
14+
@Extension(ordinal = 1000)
15+
public class LogstashConsoleLogFilter extends ConsoleLogFilter implements Serializable
16+
{
17+
18+
private transient Run<?, ?> run;
19+
public LogstashConsoleLogFilter() {};
20+
21+
public LogstashConsoleLogFilter(Run<?, ?> run)
22+
{
23+
this.run = run;
24+
}
25+
private static final long serialVersionUID = 1L;
26+
27+
@Override
28+
public OutputStream decorateLogger(Run build, OutputStream logger) throws IOException, InterruptedException
29+
{
30+
if (build != null && build instanceof AbstractBuild<?, ?>)
31+
{
32+
if (isLogstashEnabled(build))
33+
{
34+
LogstashWriter logstash = getLogStashWriter(build, logger);
35+
return new LogstashOutputStream(logger, logstash);
36+
}
37+
else
38+
{
39+
return logger;
40+
}
41+
}
42+
if (run != null)
43+
{
44+
LogstashWriter logstash = getLogStashWriter(run, logger);
45+
return new LogstashOutputStream(logger, logstash);
46+
}
47+
else
48+
{
49+
return logger;
50+
}
51+
}
52+
53+
LogstashWriter getLogStashWriter(Run<?, ?> build, OutputStream errorStream)
54+
{
55+
return new LogstashWriter(build, errorStream, null, build.getCharset());
56+
}
57+
58+
private boolean isLogstashEnabled(Run<?, ?> build)
59+
{
60+
if (build.getParent() instanceof BuildableItemWithBuildWrappers)
61+
{
62+
BuildableItemWithBuildWrappers project = (BuildableItemWithBuildWrappers)build.getParent();
63+
for (BuildWrapper wrapper : project.getBuildWrappersList())
64+
{
65+
if (wrapper instanceof LogstashBuildWrapper)
66+
{
67+
return true;
68+
}
69+
}
70+
}
71+
return false;
72+
}
73+
74+
}

src/main/java/jenkins/plugins/logstash/LogstashOutputStream.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,6 @@
2929

3030
import java.io.IOException;
3131
import java.io.OutputStream;
32-
import java.util.ArrayList;
33-
import java.util.List;
34-
35-
import com.michelin.cio.hudson.plugins.maskpasswords.MaskPasswordsBuildWrapper.VarPasswordPair;
36-
import com.michelin.cio.hudson.plugins.maskpasswords.MaskPasswordsOutputStream;
3732

3833
/**
3934
* Output stream that writes each line to the provided delegate output stream
@@ -58,14 +53,6 @@ LogstashWriter getLogstashWriter()
5853
return logstash;
5954
}
6055

61-
public MaskPasswordsOutputStream maskPasswords(List<VarPasswordPair> passwords) {
62-
List<String> passwordStrings = new ArrayList<String>();
63-
for (VarPasswordPair password: passwords) {
64-
passwordStrings.add(password.getPassword());
65-
}
66-
return new MaskPasswordsOutputStream(this, passwordStrings);
67-
}
68-
6956
@Override
7057
protected void eol(byte[] b, int len) throws IOException {
7158
delegate.write(b, 0, len);

src/main/java/jenkins/plugins/logstash/pipeline/LogstashStep.java

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package jenkins.plugins.logstash.pipeline;
22

33
import java.io.IOException;
4-
import java.io.OutputStream;
5-
import java.io.Serializable;
64

75
import javax.annotation.Nonnull;
86

@@ -16,11 +14,9 @@
1614

1715
import hudson.Extension;
1816
import hudson.console.ConsoleLogFilter;
19-
import hudson.model.AbstractBuild;
2017
import hudson.model.Run;
2118
import jenkins.YesNoMaybe;
22-
import jenkins.plugins.logstash.LogstashOutputStream;
23-
import jenkins.plugins.logstash.LogstashWriter;
19+
import jenkins.plugins.logstash.LogstashConsoleLogFilter;
2420

2521
/**
2622
* Pipeline plug-in step for logstash.
@@ -90,29 +86,4 @@ public boolean takesImplicitBlockArgument() {
9086
return true;
9187
}
9288
}
93-
94-
private static class LogstashConsoleLogFilter extends ConsoleLogFilter
95-
implements Serializable {
96-
97-
private static final long serialVersionUID = 1;
98-
private transient Run<?, ?> run;
99-
100-
/**
101-
* Create a new {@link LogstashConsoleLogFilter} for the given build.
102-
*
103-
* @param build
104-
*/
105-
LogstashConsoleLogFilter(Run<?, ?> run) {
106-
this.run = run;
107-
}
108-
109-
/** {@inheritDoc} */
110-
@SuppressWarnings("rawtypes")
111-
@Override
112-
public OutputStream decorateLogger(AbstractBuild _ignore, OutputStream logger)
113-
throws IOException, InterruptedException {
114-
LogstashWriter writer = new LogstashWriter(run, logger, null, run.getCharset());
115-
return new LogstashOutputStream(logger, writer);
116-
}
117-
}
11889
}

0 commit comments

Comments
 (0)