Skip to content

Commit bb402e3

Browse files
committed
SECURITY-3447
1 parent df2fc45 commit bb402e3

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

src/main/java/org/jenkinsci/plugins/scriptsecurity/scripts/ClasspathEntry.java

+4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.io.File;
2929
import java.io.Serializable;
3030

31+
import jenkins.model.Jenkins;
3132
import org.apache.commons.lang.StringUtils;
3233
import org.kohsuke.accmod.Restricted;
3334
import org.kohsuke.accmod.restrictions.NoExternalUse;
@@ -204,6 +205,9 @@ public String getDisplayName() {
204205
}
205206

206207
public FormValidation doCheckPath(@QueryParameter String value, @QueryParameter String oldPath, @QueryParameter boolean shouldBeApproved) {
208+
if(!Jenkins.get().hasPermission(Jenkins.ADMINISTER)) {
209+
return FormValidation.ok();
210+
}
207211
if (StringUtils.isBlank(value)) {
208212
return FormValidation.warning("Enter a file path or URL."); // TODO I18N
209213
}

src/test/java/org/jenkinsci/plugins/scriptsecurity/scripts/ClasspathEntryTest.java

+37-2
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,50 @@
2929
import java.io.File;
3030
import java.net.MalformedURLException;
3131
import java.net.URL;
32+
import java.nio.file.Files;
33+
import java.nio.file.Path;
3234

35+
import jenkins.model.Jenkins;
36+
import org.htmlunit.html.HtmlPage;
3337
import org.junit.Rule;
3438
import org.junit.Test;
3539
import org.junit.rules.TemporaryFolder;
3640

41+
import static org.hamcrest.Matchers.containsString;
42+
import static org.hamcrest.Matchers.emptyString;
3743
import static org.junit.Assert.*;
38-
import org.jvnet.hudson.test.Issue;
44+
45+
import org.jvnet.hudson.test.*;
3946

4047
public class ClasspathEntryTest {
4148
@Rule public TemporaryFolder rule = new TemporaryFolder();
42-
49+
@Rule public JenkinsRule jr = new JenkinsRule();
50+
51+
@Issue("SECURITY-3447")
52+
@Test
53+
public void testDoCheckPath() throws Exception {
54+
jr.jenkins.setSecurityRealm(jr.createDummySecurityRealm());
55+
jr.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy().
56+
grant(Jenkins.ADMINISTER).everywhere().to("admin")
57+
.grant(Jenkins.READ).everywhere().to("dev"));
58+
Path path = Files.createTempDirectory("temp dir");
59+
try(JenkinsRule.WebClient webClient = jr.createWebClient()) {
60+
webClient.login("admin");
61+
final HtmlPage adminPage = webClient.goTo("descriptor/org.jenkinsci.plugins.scriptsecurity.scripts.ClasspathEntry/checkPath?value=" + path.toUri());
62+
final String adminContent = adminPage.asXml();
63+
assertThat(adminContent, containsString("Class directories are not allowed as classpath entries."));
64+
}
65+
try (JenkinsRule.WebClient devWebClient = jr.createWebClient()) {
66+
devWebClient.login("dev");
67+
final HtmlPage devPage = devWebClient.goTo("descriptor/org.jenkinsci.plugins.scriptsecurity.scripts.ClasspathEntry/checkPath?value=" + path.toUri());
68+
final String devContent = devPage.asNormalizedText();
69+
assertThat(devContent, emptyString());
70+
}
71+
Files.deleteIfExists(path);
72+
73+
}
74+
75+
@WithoutJenkins
4376
@Test public void pathURLConversion() throws Exception {
4477
if (!Functions.isWindows()) {
4578
assertRoundTrip("/tmp/x.jar", "file:/tmp/x.jar");
@@ -54,6 +87,7 @@ private static void assertRoundTrip(String path, String url) throws Exception {
5487
assertEquals(url, ClasspathEntry.pathToURL(path).toString());
5588
}
5689

90+
@WithoutJenkins
5791
@Test public void classDirDetected() throws Exception {
5892
final File tmpDir = rule.newFolder();
5993
assertTrue("Existing directory must be detected", ClasspathEntry.isClassDirectoryURL(tmpDir.toURI().toURL()));
@@ -67,6 +101,7 @@ private static void assertRoundTrip(String path, String url) throws Exception {
67101
assertFalse("Generic URLs ending in / are not considered class directories", ClasspathEntry.isClassDirectoryURL(new URL("http://example.com/file")));
68102
}
69103

104+
@WithoutJenkins
70105
@Issue("JENKINS-37599")
71106
@Test public void pathToURL() throws Exception {
72107
ClasspathEntry ignore = new ClasspathEntry("http://nowhere.net/");

0 commit comments

Comments
 (0)