Skip to content

Commit bc584fb

Browse files
committed
fix: http proxy wasn't used by git commands
1 parent 8c6b596 commit bc584fb

File tree

4 files changed

+23
-52
lines changed

4 files changed

+23
-52
lines changed

workspace-manager/src/main/kotlin/org/modelix/services/gitconnector/GitFetchTask.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class GitFetchTask(scope: CoroutineScope, val repo: GitRepositoryConfig) : TaskI
2222
if (password.isNotEmpty()) {
2323
cmd.applyCredentials(username, password)
2424
}
25+
cmd.configureHttpProxy()
2526

2627
val refs = withContext(Dispatchers.IO) {
2728
cmd.call()

workspace-manager/src/main/kotlin/org/modelix/services/gitconnector/GitImportTask.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.modelix.services.gitconnector
22

33
import io.kubernetes.client.openapi.models.V1Container
4+
import io.kubernetes.client.openapi.models.V1EnvVar
45
import io.kubernetes.client.openapi.models.V1Job
56
import kotlinx.coroutines.CoroutineScope
67
import kotlinx.coroutines.delay
@@ -71,6 +72,9 @@ class GitImportTaskUsingKubernetesJob(
7172
addContainersItem(V1Container().apply {
7273
name = "importer"
7374
image = System.getenv("GIT_IMPORT_IMAGE")
75+
System.getenv("MODELIX_HTTP_PROXY")?.let {
76+
addEnvItem(V1EnvVar().name("MODELIX_HTTP_PROXY").value(it))
77+
}
7478
args = listOf(
7579
"git-import-remote",
7680
remote.url,

workspace-manager/src/main/kotlin/org/modelix/services/gitconnector/JGitExtensions.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import java.net.PasswordAuthentication
1616
import java.net.Proxy
1717
import java.net.URL
1818

19-
fun <C : GitCommand<T>, T, E : TransportCommand<C, T>> E.applyCredentials(username: String, password: String): E {
19+
fun <C : GitCommand<T>, T, E : TransportCommand<C, T>> E.applyCredentials(username: String?, password: String): E {
2020
val cmd = this
2121
cmd.setCredentialsProvider(UsernamePasswordCredentialsProvider(username, password))
2222
cmd.setTransportConfigCallback { transport ->
@@ -37,6 +37,15 @@ fun <C : GitCommand<T>, T, E : TransportCommand<C, T>> E.applyCredentials(userna
3737
return cmd
3838
}
3939

40+
fun <C : GitCommand<T>, T, E : TransportCommand<C, T>> E.configureHttpProxy(): E {
41+
val proxy = System.getenv("MODELIX_HTTP_PROXY") ?: return this
42+
// see https://github.com/openjdk/jdk/blob/e783c524c17e1d1a3fff4b6370e222134e66edc8/src/java.base/share/classes/sun/net/spi/DefaultProxySelector.java#L80
43+
// and https://github.com/eclipse-jgit/jgit/blob/a762badfcecd3c200bb29b8ad5806546c7db8eaa/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java#L292
44+
System.setProperty("http.proxy", proxy)
45+
System.setProperty("https.proxy", proxy)
46+
return this
47+
}
48+
4049
/**
4150
* The credentialsProvider only works with WWW-Authenticate: Basic, but not with WWW-Authenticate: Negotiate.
4251
* This is handled by the JDK.

workspace-manager/src/main/kotlin/org/modelix/workspace/manager/GitRepositoryManager.kt

Lines changed: 8 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,10 @@ import org.eclipse.jgit.api.Git
1717
import org.eclipse.jgit.api.GitCommand
1818
import org.eclipse.jgit.api.TransportCommand
1919
import org.eclipse.jgit.errors.RepositoryNotFoundException
20-
import org.eclipse.jgit.transport.Transport
21-
import org.eclipse.jgit.transport.TransportHttp
22-
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider
23-
import org.eclipse.jgit.transport.http.HttpConnection
24-
import org.eclipse.jgit.transport.http.HttpConnectionFactory
25-
import org.eclipse.jgit.transport.http.JDKHttpConnection
26-
import org.eclipse.jgit.transport.http.JDKHttpConnectionFactory
20+
import org.modelix.services.gitconnector.applyCredentials
21+
import org.modelix.services.gitconnector.configureHttpProxy
2722
import org.modelix.workspaces.GitRepository
2823
import java.io.File
29-
import java.net.Authenticator
30-
import java.net.HttpURLConnection
31-
import java.net.PasswordAuthentication
32-
import java.net.Proxy
33-
import java.net.URL
3424
import java.util.zip.ZipOutputStream
3525

3626
class GitRepositoryManager(val config: GitRepository, val workspaceDirectory: File) {
@@ -45,7 +35,7 @@ class GitRepositoryManager(val config: GitRepository, val workspaceDirectory: Fi
4535
val existed = repoDirectory.exists()
4636
val git = openRepo()
4737
if (existed) {
48-
applyCredentials(git.fetch()).call()
38+
git.fetch().applyCredentials().configureHttpProxy().call()
4939
git.checkout().setName(config.commitHash ?: ("origin/" + config.branch)).call()
5040
// if (config.commitHash == null) {
5141
// applyCredentials(git.pull()).call()
@@ -66,51 +56,18 @@ class GitRepositoryManager(val config: GitRepository, val workspaceDirectory: Fi
6656
}
6757
}
6858

69-
private fun <C : GitCommand<T>, T, E : TransportCommand<C, T>> applyCredentials(cmd: E): E {
59+
private fun <C : GitCommand<T>, T, E : TransportCommand<C, T>> E.applyCredentials(): E {
7060
val credentials = config.credentials
7161
if (credentials != null) {
72-
cmd.setCredentialsProvider(UsernamePasswordCredentialsProvider(credentials.user, credentials.password))
73-
cmd.setTransportConfigCallback { transport ->
74-
transport?.setAuthenticator(object : Authenticator() {
75-
override fun getPasswordAuthentication(): PasswordAuthentication {
76-
return PasswordAuthentication(credentials.user, credentials.password.toCharArray())
77-
}
78-
})
79-
}
80-
}
81-
return cmd
82-
}
83-
84-
/**
85-
* The credentialsProvider only works with WWW-Authenticate: Basic, but not with WWW-Authenticate: Negotiate.
86-
* This is handled by the JDK.
87-
*/
88-
private fun Transport.setAuthenticator(authenticator: Authenticator) {
89-
val transport = this as TransportHttp
90-
val originalFactory = transport.httpConnectionFactory as JDKHttpConnectionFactory
91-
transport.httpConnectionFactory = object : HttpConnectionFactory {
92-
override fun create(url: URL?): HttpConnection {
93-
return modify(originalFactory.create(url))
94-
}
95-
96-
override fun create(url: URL?, proxy: Proxy?): HttpConnection {
97-
return modify(originalFactory.create(url, proxy))
98-
}
99-
100-
fun modify(conn: HttpConnection): HttpConnection {
101-
val jdkConn = conn as JDKHttpConnection
102-
val field = jdkConn.javaClass.getDeclaredField("wrappedUrlConnection")
103-
field.isAccessible = true
104-
val wrapped = field.get(jdkConn) as HttpURLConnection
105-
wrapped.setAuthenticator(authenticator)
106-
return conn
107-
}
62+
applyCredentials(credentials.user, credentials.password)
10863
}
64+
return this
10965
}
11066

11167
private fun cloneRepo(): Git {
11268
val cmd = Git.cloneRepository()
113-
applyCredentials(cmd)
69+
cmd.applyCredentials()
70+
cmd.configureHttpProxy()
11471
cmd.setURI(config.url)
11572
cmd.setBranch(config.branch)
11673
val directory = repoDirectory

0 commit comments

Comments
 (0)