Skip to content

Commit 238480b

Browse files
committed
Modernize to Jenkins 2.479 and Jakarta EE 9
* Adapter methods are added for old overrides. * Switch to JUnit 5 for tests
1 parent cdd7ffc commit 238480b

12 files changed

+207
-176
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ mvn.out*
77
.settings/
88
.repository/
99
.settings.xml
10+
.idea/

pom.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.jenkins-ci.plugins</groupId>
77
<artifactId>plugin</artifactId>
8-
<version>4.86</version>
8+
<version>5.6</version>
99
<relativePath />
1010
</parent>
1111

@@ -34,8 +34,8 @@
3434
<properties>
3535
<changelist>999999-SNAPSHOT</changelist>
3636
<!-- https://www.jenkins.io/doc/developer/plugin-development/choosing-jenkins-baseline/ -->
37-
<jenkins.baseline>2.440</jenkins.baseline>
38-
<jenkins.version>${jenkins.baseline}.3</jenkins.version>
37+
<jenkins.baseline>2.479</jenkins.baseline>
38+
<jenkins.version>${jenkins.baseline}.1</jenkins.version>
3939
<gitHubRepo>jenkinsci/${project.artifactId}-plugin</gitHubRepo>
4040
</properties>
4141

@@ -44,7 +44,7 @@
4444
<dependency>
4545
<groupId>io.jenkins.tools.bom</groupId>
4646
<artifactId>bom-${jenkins.baseline}.x</artifactId>
47-
<version>3234.v5ca_5154341ef</version>
47+
<version>4023.va_eeb_b_4e45f07</version>
4848
<type>pom</type>
4949
<scope>import</scope>
5050
</dependency>
@@ -68,7 +68,7 @@
6868
<dependency>
6969
<groupId>org.eclipse.jgit</groupId>
7070
<artifactId>org.eclipse.jgit.ssh.apache</artifactId>
71-
<version>6.9.0.202403050737-r</version>
71+
<version>7.0.0.202409031743-r</version>
7272
<scope>test</scope>
7373
</dependency>
7474
<dependency>

src/main/java/org/jenkinsci/plugins/gitserver/CSRFExclusionImpl.java

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22

33
import hudson.Extension;
44
import hudson.security.csrf.CrumbExclusion;
5+
import jakarta.servlet.FilterChain;
6+
import jakarta.servlet.ReadListener;
7+
import jakarta.servlet.ServletException;
8+
import jakarta.servlet.ServletInputStream;
9+
import jakarta.servlet.http.HttpServletRequest;
10+
import jakarta.servlet.http.HttpServletRequestWrapper;
11+
import jakarta.servlet.http.HttpServletResponse;
512
import java.io.IOException;
613
import java.util.Collections;
714
import java.util.Enumeration;
15+
import java.util.Locale;
816
import java.util.Map;
9-
import java.util.Vector;
10-
import javax.servlet.FilterChain;
11-
import javax.servlet.ReadListener;
12-
import javax.servlet.ServletException;
13-
import javax.servlet.ServletInputStream;
14-
import javax.servlet.http.HttpServletRequest;
15-
import javax.servlet.http.HttpServletRequestWrapper;
16-
import javax.servlet.http.HttpServletResponse;
1717

1818
/**
1919
* CSRF exclusion for git-upload-pack.
@@ -23,6 +23,7 @@
2323
* because of the dynamic nature of the URL structure, this doesn't guarantee
2424
* that we have no leak.
2525
*
26+
* <p>
2627
* So to further protect Jenkins, we pass through a fake {@link HttpServletRequest}
2728
* that masks the values of the submission.
2829
*
@@ -39,48 +40,46 @@
3940
*/
4041
@Extension
4142
public class CSRFExclusionImpl extends CrumbExclusion {
43+
private static final String BOGUS = "bogus";
4244

45+
@Override
4346
public boolean process(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
4447
throws IOException, ServletException {
4548
if (!"application/x-git-receive-pack-request".equals(request.getHeader("Content-Type"))) return false;
4649

47-
// String path = request.getPathInfo();
48-
// if(!path.contains("/repo.git/") || !path.endsWith("/git-receive-pack"))
49-
// return false;
50-
5150
HttpServletRequestWrapper w = new HttpServletRequestWrapper(request) {
5251
@Override
5352
public String getQueryString() {
54-
return "bogus";
53+
return BOGUS;
5554
}
5655

5756
@Override
5857
public String getParameter(String name) {
59-
return "bogus";
58+
return BOGUS;
6059
}
6160

6261
@Override
63-
public Map getParameterMap() {
62+
public Map<String, String[]> getParameterMap() {
6463
return Collections.emptyMap();
6564
}
6665

6766
@Override
68-
public Enumeration getParameterNames() {
69-
return new Vector().elements();
67+
public Enumeration<String> getParameterNames() {
68+
return Collections.emptyEnumeration();
7069
}
7170

7271
@Override
7372
public String[] getParameterValues(String name) {
74-
return new String[] {"bogus"};
73+
return new String[] {BOGUS};
7574
}
7675

7776
@Override
7877
public String getMethod() {
79-
return "BOGUS";
78+
return BOGUS.toUpperCase(Locale.ROOT);
8079
}
8180

8281
@Override
83-
public ServletInputStream getInputStream() throws IOException {
82+
public ServletInputStream getInputStream() {
8483
return new ServletInputStream() {
8584
@Override
8685
public boolean isFinished() {
@@ -93,7 +92,7 @@ public boolean isReady() {
9392
}
9493

9594
@Override
96-
public int read() throws IOException {
95+
public int read() {
9796
return -1;
9897
}
9998

src/main/java/org/jenkinsci/plugins/gitserver/ChannelTransport.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public FetchConnection openFetch() throws NotSupportedException, TransportExcept
5353
} catch (IOException e) {
5454
throw new TransportException("Failed to open a fetch connection", e);
5555
} catch (InterruptedException e) {
56+
Thread.currentThread().interrupt();
5657
throw new TransportException("Failed to open a fetch connection", e);
5758
}
5859

@@ -74,6 +75,7 @@ public PushConnection openPush() throws NotSupportedException, TransportExceptio
7475
} catch (IOException e) {
7576
throw new TransportException("Failed to open a fetch connection", e);
7677
} catch (InterruptedException e) {
78+
Thread.currentThread().interrupt();
7779
throw new TransportException("Failed to open a fetch connection", e);
7880
}
7981

@@ -100,15 +102,13 @@ public GitFetchTask(Pipe l2r, Pipe r2l) {
100102
}
101103

102104
public Void invoke(File f, VirtualChannel channel) throws IOException, InterruptedException {
103-
Repository repo = new FileRepositoryBuilder().setWorkTree(f).build();
104-
try {
105+
try (Repository repo = new FileRepositoryBuilder().setWorkTree(f).build()) {
105106
final UploadPack rp = new UploadPack(repo);
106107
rp.upload(new BufferedInputStream(l2r.getIn()), new BufferedOutputStream(r2l.getOut()), null);
107108
return null;
108109
} finally {
109110
IOUtils.closeQuietly(l2r.getIn());
110111
IOUtils.closeQuietly(r2l.getOut());
111-
repo.close();
112112
}
113113
}
114114
}
@@ -123,15 +123,13 @@ public GitPushTask(Pipe l2r, Pipe r2l) {
123123
}
124124

125125
public Void invoke(File f, VirtualChannel channel) throws IOException, InterruptedException {
126-
Repository repo = new FileRepositoryBuilder().setWorkTree(f).build();
127-
try {
126+
try (Repository repo = new FileRepositoryBuilder().setWorkTree(f).build()) {
128127
final ReceivePack rp = new ReceivePack(repo);
129128
rp.receive(new BufferedInputStream(l2r.getIn()), new BufferedOutputStream(r2l.getOut()), null);
130129
return null;
131130
} finally {
132131
IOUtils.closeQuietly(l2r.getIn());
133132
IOUtils.closeQuietly(r2l.getOut());
134-
repo.close();
135133
}
136134
}
137135
}

src/main/java/org/jenkinsci/plugins/gitserver/FileBackedHttpGitRepository.java

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package org.jenkinsci.plugins.gitserver;
22

3+
import jakarta.servlet.http.HttpServletRequest;
34
import java.io.File;
45
import java.io.IOException;
56
import java.io.PrintWriter;
67
import java.io.StringWriter;
7-
import java.util.Collection;
8+
import java.nio.file.FileAlreadyExistsException;
9+
import java.nio.file.Files;
10+
import java.nio.file.Path;
811
import java.util.logging.Level;
912
import java.util.logging.Logger;
10-
import javax.servlet.http.HttpServletRequest;
1113
import jenkins.model.Jenkins;
12-
import org.acegisecurity.Authentication;
1314
import org.eclipse.jgit.api.AddCommand;
1415
import org.eclipse.jgit.api.CommitCommand;
1516
import org.eclipse.jgit.api.Git;
@@ -19,12 +20,11 @@
1920
import org.eclipse.jgit.lib.PersonIdent;
2021
import org.eclipse.jgit.lib.Repository;
2122
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
22-
import org.eclipse.jgit.transport.PostReceiveHook;
23-
import org.eclipse.jgit.transport.ReceiveCommand;
2423
import org.eclipse.jgit.transport.ReceivePack;
2524
import org.eclipse.jgit.transport.UploadPack;
2625
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
2726
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
27+
import org.springframework.security.core.Authentication;
2828

2929
/**
3030
* Convenient subtype of {@link HttpGitRepository} where the repository
@@ -38,19 +38,28 @@ public abstract class FileBackedHttpGitRepository extends HttpGitRepository {
3838
* Directory of the local workspace on the controller.
3939
* There will be "./.git" that hosts the actual repository.
4040
*/
41-
public final File workspace;
41+
public final Path workspace;
4242

43-
protected FileBackedHttpGitRepository(File workspace) {
43+
protected FileBackedHttpGitRepository(Path workspace) {
4444
this.workspace = workspace;
45-
if (!workspace.exists() && !workspace.mkdirs()) {
46-
LOGGER.log(Level.WARNING, "Cannot create a workspace in {0}", workspace);
45+
try {
46+
Files.createDirectory(workspace);
47+
} catch (FileAlreadyExistsException ignored) {
48+
// don't need to worry about this; if it already exists, we don't care!
49+
} catch (IOException e) {
50+
LOGGER.log(Level.WARNING, e, () -> "Cannot create a workspace in " + workspace);
4751
}
4852
}
4953

54+
protected FileBackedHttpGitRepository(File workspace) {
55+
this(workspace.toPath());
56+
}
57+
5058
@Override
5159
public Repository openRepository() throws IOException {
5260
checkPullPermission();
53-
Repository r = new FileRepositoryBuilder().setWorkTree(workspace).build();
61+
Repository r =
62+
new FileRepositoryBuilder().setWorkTree(workspace.toFile()).build();
5463

5564
// if the repository doesn't exist, create it
5665
if (!r.getObjectDatabase().exists()) {
@@ -62,6 +71,7 @@ public Repository openRepository() throws IOException {
6271
/**
6372
* Called when there's no .git directory to create one.
6473
*
74+
* <p>
6575
* This implementation also imports whatever currently in there into the repository.
6676
*/
6777
protected void createInitialRepository(Repository r) throws IOException {
@@ -79,14 +89,15 @@ protected void createInitialRepository(Repository r) throws IOException {
7989
co.setMessage("Initial import of the existing contents");
8090
co.call();
8191
} catch (GitAPIException e) {
82-
LOGGER.log(Level.WARNING, "Initial import of " + workspace + " into Git repository failed", e);
92+
LOGGER.log(Level.WARNING, e, () -> "Initial import of " + workspace + " into Git repository failed");
8393
}
8494
}
8595

8696
/**
8797
* This default implementation allows read access to anyone
8898
* who can access the HTTP URL this repository is bound to.
8999
*
100+
* <p>
90101
* For example, if this object is used as a project action,
91102
* and the project isn't readable to Alice, then Alice won't be
92103
* able to pull from this repository (think of a POSIX file system
@@ -104,7 +115,7 @@ public UploadPack createUploadPack(HttpServletRequest context, Repository db)
104115
@Override
105116
public ReceivePack createReceivePack(HttpServletRequest context, Repository db)
106117
throws ServiceNotEnabledException, ServiceNotAuthorizedException {
107-
Authentication a = Jenkins.getAuthentication();
118+
Authentication a = Jenkins.getAuthentication2();
108119

109120
ReceivePack rp = createReceivePack(db);
110121

@@ -119,15 +130,13 @@ public ReceivePack createReceivePack(Repository db) {
119130
ReceivePack rp = new ReceivePack(db);
120131

121132
// update userContent after the push
122-
rp.setPostReceiveHook(new PostReceiveHook() {
123-
public void onPostReceive(ReceivePack rp, Collection<ReceiveCommand> commands) {
124-
try {
125-
updateWorkspace(rp.getRepository());
126-
} catch (Exception e) {
127-
StringWriter sw = new StringWriter();
128-
e.printStackTrace(new PrintWriter(sw));
129-
rp.sendMessage("Failed to update workspace: " + sw);
130-
}
133+
rp.setPostReceiveHook((rp1, commands) -> {
134+
try {
135+
updateWorkspace(rp1.getRepository());
136+
} catch (Exception e) {
137+
StringWriter sw = new StringWriter();
138+
e.printStackTrace(new PrintWriter(sw));
139+
rp1.sendMessage("Failed to update workspace: " + sw);
131140
}
132141
});
133142
return rp;

0 commit comments

Comments
 (0)