Skip to content

Commit 0463a67

Browse files
losmateusz1sschuberth
authored andcommitted
feat(gradle): Support HTTP header authentication for repositories
Add support for Gradle `HttpHeaderAuthentication` defined for private repositories inside `settings.gradle`. Signed-off-by: Mateusz Los <mateusz.los@extern.wenovate.de>
1 parent 33f9795 commit 0463a67

5 files changed

Lines changed: 51 additions & 9 deletions

File tree

plugins/package-managers/gradle-model/src/main/kotlin/GradleModel.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,6 @@ interface OrtRepository {
7070
val url: String
7171
val username: String?
7272
val password: String?
73+
val headerName: String?
74+
val headerValue: String?
7375
}

plugins/package-managers/gradle-plugin/src/main/kotlin/GradleModelExtensions.kt

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import org.gradle.api.artifacts.repositories.ArtifactRepository
2727
import org.gradle.api.artifacts.repositories.AuthenticationSupported
2828
import org.gradle.api.artifacts.repositories.UrlArtifactRepository
2929
import org.gradle.api.attributes.AttributeContainer
30+
import org.gradle.api.credentials.HttpHeaderCredentials
31+
import org.gradle.authentication.http.HttpHeaderAuthentication
3032
import org.gradle.internal.deprecation.DeprecatableConfiguration
3133
import org.gradle.util.GradleVersion
3234

@@ -71,10 +73,28 @@ internal fun RepositoryHandler.associateNamesWithUrlsTo(repositories: MutableMap
7173
* Convert this [UrlArtifactRepository] to an [OrtRepository] by extracting the relevant properties.
7274
*/
7375
internal fun UrlArtifactRepository.toOrtRepository(): OrtRepository {
74-
val credentials = (this as? AuthenticationSupported)?.credentials
75-
return OrtRepositoryImpl(
76-
url = url.toString(),
77-
username = credentials?.username,
78-
password = credentials?.password
79-
)
76+
val authSupported = this as? AuthenticationSupported
77+
78+
val isHttpHeaderAuth = authSupported?.authentication
79+
?.any { it is HttpHeaderAuthentication } == true
80+
81+
return if (isHttpHeaderAuth) {
82+
val headerCredentials = authSupported?.getCredentials(HttpHeaderCredentials::class.java)
83+
OrtRepositoryImpl(
84+
url = url.toString(),
85+
username = null,
86+
password = null,
87+
headerName = headerCredentials?.name,
88+
headerValue = headerCredentials?.value
89+
)
90+
} else {
91+
val credentials = authSupported?.credentials
92+
OrtRepositoryImpl(
93+
url = url.toString(),
94+
username = credentials?.username,
95+
password = credentials?.password,
96+
headerName = null,
97+
headerValue = null
98+
)
99+
}
80100
}

plugins/package-managers/gradle-plugin/src/main/kotlin/OrtModelImpl.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,5 +81,7 @@ internal class OrtVcsModelImpl(
8181
internal class OrtRepositoryImpl(
8282
override val url: String,
8383
override val username: String?,
84-
override val password: String?
84+
override val password: String?,
85+
override val headerName: String?,
86+
override val headerValue: String?
8587
) : OrtRepository, Serializable

plugins/package-managers/gradle/src/main/kotlin/Gradle.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,13 @@ private fun getGradleProperties(): Map<String, String> =
338338
*/
339339
private fun OrtRepository.toRemoteRepository(): RemoteRepository =
340340
RemoteRepository.Builder(url, "default", url).apply {
341-
if (username != null) {
341+
if (headerName != null && headerValue != null) {
342+
setAuthentication(
343+
AuthenticationBuilder().apply {
344+
addString(headerName, headerValue)
345+
}.build()
346+
)
347+
} else if (username != null) {
342348
setAuthentication(
343349
AuthenticationBuilder().apply {
344350
addUsername(username)

plugins/package-managers/gradle/src/main/resources/init.gradle

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import org.gradle.api.internal.artifacts.DefaultProjectComponentIdentifier
2626
import org.gradle.api.internal.artifacts.repositories.DefaultFlatDirArtifactRepository
2727
import org.gradle.api.internal.artifacts.repositories.DefaultIvyArtifactRepository
2828
import org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository
29+
import org.gradle.authentication.http.HttpHeaderAuthentication
30+
import org.gradle.api.credentials.HttpHeaderCredentials
2931
import org.gradle.internal.build.BuildState
3032
import org.gradle.tooling.provider.model.ToolingModelBuilder
3133
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
@@ -85,6 +87,8 @@ interface OrtRepository {
8587
String getUrl()
8688
String getUsername()
8789
String getPassword()
90+
String getHeaderName()
91+
String getHeaderValue()
8892
}
8993

9094
@ToString(includeNames = true)
@@ -127,6 +131,8 @@ class OrtRepositoryImpl implements OrtRepository, Serializable {
127131
String url = ''
128132
String username = null
129133
String password = null
134+
String headerName = null
135+
String headerValue = null
130136
}
131137

132138
class OrtDependencyTreeGradlePlugin extends AbstractOrtDependencyTreePlugin<Gradle> {
@@ -239,7 +245,13 @@ class AbstractOrtDependencyTreePlugin<T> implements Plugin<T> {
239245

240246
List<OrtRepository> repositories = project.repositories.findResults {
241247
if (it instanceof DefaultMavenArtifactRepository) {
242-
new OrtRepositoryImpl(it.url.toString(), it.credentials?.username, it.credentials?.password)
248+
def isHttpHeader = it.authentication.any { auth -> auth instanceof HttpHeaderAuthentication }
249+
if (isHttpHeader) {
250+
def headerCreds = it.getCredentials(HttpHeaderCredentials)
251+
new OrtRepositoryImpl(it.url.toString(), null, null, headerCreds?.name, headerCreds?.value)
252+
} else {
253+
new OrtRepositoryImpl(it.url.toString(), it.credentials?.username, it.credentials?.password, null, null)
254+
}
243255
} else if (it instanceof DefaultFlatDirArtifactRepository) {
244256
warnings.add('Project uses a flat dir repository which is not supported by the analyzer. ' +
245257
"Dependencies from this repository will be ignored: ${it.dirs}".toString())

0 commit comments

Comments
 (0)