Skip to content

Commit b36b47e

Browse files
committed
Honor token field in BitbucketServerRepositoryProvider
Signed-off-by: jorgee <jorge.ejarque@seqera.io>
1 parent f540396 commit b36b47e

2 files changed

Lines changed: 121 additions & 1 deletion

File tree

modules/nextflow/src/main/groovy/nextflow/scm/BitbucketServerRepositoryProvider.groovy

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import groovy.json.JsonSlurper
2121
import groovy.transform.Memoized
2222
import groovy.util.logging.Slf4j
2323
import nextflow.exception.AbortOperationException
24+
import org.eclipse.jgit.transport.CredentialsProvider
25+
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider
2426

2527
import java.nio.charset.StandardCharsets
2628

@@ -64,6 +66,29 @@ final class BitbucketServerRepositoryProvider extends RepositoryProvider {
6466
@Override
6567
String getName() { "BitBucketServer" }
6668

69+
@Override
70+
boolean hasCredentials() {
71+
return getToken() || (getUser() && getPassword())
72+
}
73+
74+
@Override
75+
protected String[] getAuth() {
76+
if( getToken() )
77+
return new String[] { "Authorization", "Bearer " + getToken() }
78+
if( getUser() && getPassword() ) {
79+
final authString = "${getUser()}:${getPassword()}".bytes.encodeBase64().toString()
80+
return new String[] { "Authorization", "Basic " + authString }
81+
}
82+
return null
83+
}
84+
85+
@Override
86+
CredentialsProvider getGitCredentials() {
87+
if( getToken() )
88+
return new UsernamePasswordCredentialsProvider(getUser() ?: '', getToken())
89+
return new UsernamePasswordCredentialsProvider(getUser(), getPassword())
90+
}
91+
6792
@Override
6893
String getEndpointUrl() {
6994
return "${config.endpoint}/rest/api/1.0/projects/${project}/repos/${repository}"

modules/nextflow/src/test/groovy/nextflow/scm/BitbucketServerRepositoryProviderTest.groovy

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package nextflow.scm
1818

19+
import org.eclipse.jgit.transport.CredentialItem
20+
import org.eclipse.jgit.transport.URIish
1921
import spock.lang.Ignore
2022
import spock.lang.Requires
2123
import spock.lang.Specification
@@ -106,7 +108,11 @@ class BitbucketServerRepositoryProviderTest extends Specification {
106108
def 'should list branches' () {
107109
given:
108110
def token = System.getenv('NXF_BITBUCKET_SERVER_ACCESS_TOKEN')
109-
def config = new ProviderConfig('bbs', [server:'http://slurm.seqera.io:7990', platform:'bitbucketsever']).setAuth(token)
111+
def items = token.tokenize(':')
112+
113+
def config = items > 1
114+
? new ProviderConfig('bbs', [server:'http://slurm.seqera.io:7990', platform:'bitbucketsever']).setUser(items[0]).setToken(items[1])
115+
: new ProviderConfig('bbs', [server:'http://slurm.seqera.io:7990', platform:'bitbucketsever']).setToken(token)
110116
and:
111117
def repo = new BitbucketServerRepositoryProvider('scm/hello/hello', config)
112118

@@ -131,6 +137,95 @@ class BitbucketServerRepositoryProviderTest extends Specification {
131137
result.contains( new RepositoryProvider.TagInfo('v1.0', 'c62df3d9c2464adcaa0fb6c978c8e32e2672b191') )
132138
}
133139

140+
@Unroll
141+
def 'should validate hasCredentials' () {
142+
given:
143+
def provider = new BitbucketServerRepositoryProvider('proj/repo', PROVIDER)
144+
145+
expect:
146+
provider.hasCredentials() == EXPECTED
147+
148+
where:
149+
EXPECTED | PROVIDER
150+
false | new ProviderConfig('bbs', [platform:'bitbucketserver'])
151+
false | new ProviderConfig('bbs', [platform:'bitbucketserver']).setUser('foo')
152+
false | new ProviderConfig('bbs', [platform:'bitbucketserver']).setPassword('bar')
153+
true | new ProviderConfig('bbs', [platform:'bitbucketserver']).setToken('xyz')
154+
true | new ProviderConfig('bbs', [platform:'bitbucketserver']).setUser('foo').setPassword('bar')
155+
true | new ProviderConfig('bbs', [platform:'bitbucketserver']).setUser('foo').setToken('xyz')
156+
true | new ProviderConfig('bbs', [platform:'bitbucketserver']).setUser('foo').setPassword('bar').setToken('xyz')
157+
}
158+
159+
@Unroll
160+
def 'should validate getAuth' () {
161+
given:
162+
def provider = new BitbucketServerRepositoryProvider('proj/repo', PROVIDER)
163+
164+
expect:
165+
provider.getAuth() == EXPECTED as String[]
166+
167+
where:
168+
EXPECTED | PROVIDER
169+
null | new ProviderConfig('bbs', [platform:'bitbucketserver'])
170+
["Authorization", "Bearer xyz"] | new ProviderConfig('bbs', [platform:'bitbucketserver']).setToken('xyz')
171+
["Authorization", "Basic ${"foo:bar".bytes.encodeBase64()}"] | new ProviderConfig('bbs', [platform:'bitbucketserver']).setUser('foo').setPassword('bar')
172+
["Authorization", "Bearer xyz"] | new ProviderConfig('bbs', [platform:'bitbucketserver']).setUser('foo').setToken('xyz')
173+
["Authorization", "Bearer xyz"] | new ProviderConfig('bbs', [platform:'bitbucketserver']).setUser('foo').setPassword('bar').setToken('xyz')
174+
}
175+
176+
def 'should pass token as password in getGitCredentials' () {
177+
given:
178+
def config = new ProviderConfig('bbs', [platform:'bitbucketserver'])
179+
.setUser('foo')
180+
.setToken('xyz')
181+
def provider = new BitbucketServerRepositoryProvider('proj/repo', config)
182+
def user = new CredentialItem.Username()
183+
def pass = new CredentialItem.Password()
184+
185+
when:
186+
def creds = provider.getGitCredentials()
187+
creds.get(new URIish('https://bitbucket.server.com/scm/proj/repo.git'), user, pass)
188+
189+
then:
190+
user.value == 'foo'
191+
new String(pass.value) == 'xyz'
192+
}
193+
194+
def 'should use token-only in getGitCredentials when no user is set' () {
195+
given:
196+
def config = new ProviderConfig('bbs', [platform:'bitbucketserver'])
197+
.setAuth('xyz')
198+
def provider = new BitbucketServerRepositoryProvider('proj/repo', config)
199+
def user = new CredentialItem.Username()
200+
def pass = new CredentialItem.Password()
201+
202+
when:
203+
def creds = provider.getGitCredentials()
204+
creds.get(new URIish('https://bitbucket.server.com/scm/proj/repo.git'), user, pass)
205+
206+
then:
207+
user.value == ''
208+
new String(pass.value) == 'xyz'
209+
}
210+
211+
def 'should fall back to password in getGitCredentials when token absent' () {
212+
given:
213+
def config = new ProviderConfig('bbs', [platform:'bitbucketserver'])
214+
.setUser('foo')
215+
.setPassword('bar')
216+
def provider = new BitbucketServerRepositoryProvider('proj/repo', config)
217+
def user = new CredentialItem.Username()
218+
def pass = new CredentialItem.Password()
219+
220+
when:
221+
def creds = provider.getGitCredentials()
222+
creds.get(new URIish('https://bitbucket.server.com/scm/proj/repo.git'), user, pass)
223+
224+
then:
225+
user.value == 'foo'
226+
new String(pass.value) == 'bar'
227+
}
228+
134229
@Requires( { System.getenv('NXF_BITBUCKET_SERVER_ACCESS_TOKEN') } )
135230
def 'should list root directory contents'() {
136231
given:

0 commit comments

Comments
 (0)