Skip to content

Commit f24adfc

Browse files
authored
Merge pull request #552 from jglick/ScriptApprovalLoadingTest
`ExtensionList` error after dynamic load
2 parents 4874331 + f1f0bef commit f24adfc

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,12 @@ public synchronized String[] getApprovedScriptHashes() {
971971
@Extension public static final class ApprovedWhitelist extends ProxyWhitelist {
972972

973973
static void configurationChanged() {
974-
ExtensionList.lookupSingleton(ApprovedWhitelist.class).initialized.set(false);
974+
// Do not use lookupSingleton: ScriptApprovalLoadingTest.dynamicLoading
975+
ApprovedWhitelist instance = ExtensionList.lookup(Whitelist.class).get(ApprovedWhitelist.class);
976+
if (instance == null) {
977+
throw new IllegalStateException("Failed to find ApprovedWhitelist");
978+
}
979+
instance.initialized.set(false);
975980
}
976981

977982
private final AtomicBoolean initialized = new AtomicBoolean();
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* The MIT License
3+
*
4+
* Copyright 2024 CloudBees, Inc.
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22+
* THE SOFTWARE.
23+
*/
24+
25+
package org.jenkinsci.plugins.scriptsecurity.scripts;
26+
27+
import java.io.File;
28+
import org.apache.commons.io.FileUtils;
29+
import static org.hamcrest.MatcherAssert.assertThat;
30+
import static org.hamcrest.Matchers.arrayContaining;
31+
import org.junit.Rule;
32+
import org.junit.Test;
33+
import org.jvnet.hudson.test.JenkinsRule;
34+
import org.jvnet.hudson.test.RealJenkinsRule;
35+
36+
public final class ScriptApprovalLoadingTest {
37+
38+
@Rule public final RealJenkinsRule rr = new RealJenkinsRule();
39+
40+
@Test public void dynamicLoading() throws Throwable {
41+
rr.then(ScriptApprovalLoadingTest::_dynamicLoading1);
42+
rr.then(ScriptApprovalLoadingTest::_dynamicLoading2);
43+
}
44+
45+
private static void _dynamicLoading1(JenkinsRule r) throws Throwable {
46+
File plugin = new File(r.jenkins.root, "plugins/script-security.jpl");
47+
FileUtils.copyFile(plugin, new File(plugin + ".bak"));
48+
r.jenkins.pluginManager.getPlugin("script-security").doDoUninstall();
49+
}
50+
51+
private static void _dynamicLoading2(JenkinsRule r) throws Throwable {
52+
File plugin = new File(r.jenkins.root, "plugins/script-security.jpl");
53+
FileUtils.copyFile(new File(plugin + ".bak"), plugin);
54+
r.jenkins.pluginManager.dynamicLoad(plugin);
55+
ScriptApproval sa = ScriptApproval.get();
56+
sa.approveSignature("method java.lang.Object wait");
57+
assertThat(sa.getApprovedSignatures(), arrayContaining("method java.lang.Object wait"));
58+
}
59+
60+
}

0 commit comments

Comments
 (0)