diff --git a/infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManager.java b/infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManager.java index 2ddd31079c..f0774468a5 100644 --- a/infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManager.java +++ b/infrastructures/infrastructure-factory/src/main/java/org/eclipse/che/api/factory/server/scm/kubernetes/KubernetesPersonalAccessTokenManager.java @@ -190,13 +190,13 @@ private Optional doGetPersonalAccessToken( || trimmedUrl.equals(StringUtils.trimEnd(scmServerUrl, '/')))) { String token = new String(Base64.getDecoder().decode(secret.getData().get("token"))).trim(); - String providerName = annotations.get(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME); + String tokenName = annotations.get(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_NAME); String tokenId = annotations.get(ANNOTATION_SCM_PERSONAL_ACCESS_TOKEN_ID); String organization = annotations.get(ANNOTATION_SCM_ORGANIZATION); Optional scmUsername = scmPersonalAccessTokenFetcher.getScmUsername( new PersonalAccessTokenParams( - trimmedUrl, providerName, tokenId, token, organization)); + trimmedUrl, tokenName, tokenId, token, organization)); if (scmUsername.isPresent()) { PersonalAccessToken personalAccessToken = new PersonalAccessToken( @@ -204,7 +204,7 @@ private Optional doGetPersonalAccessToken( annotations.get(ANNOTATION_CHE_USERID), organization, scmUsername.get(), - providerName, + tokenName, tokenId, token); return Optional.of(personalAccessToken); diff --git a/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsPersonalAccessTokenFetcher.java b/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsPersonalAccessTokenFetcher.java index 0b8c278ebd..9cd7953ffe 100644 --- a/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsPersonalAccessTokenFetcher.java +++ b/wsmaster/che-core-api-factory-azure-devops/src/main/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsPersonalAccessTokenFetcher.java @@ -82,7 +82,8 @@ public PersonalAccessToken fetchPersonalAccessToken(Subject cheSubject, String s try { oAuthToken = oAuthAPI.getToken(AzureDevOps.PROVIDER_NAME); - String tokenName = NameGenerator.generate(OAUTH_2_PREFIX, 5); + String tokenName = + NameGenerator.generate(OAUTH_2_PREFIX, 5) + "_" + AzureDevOps.PROVIDER_NAME; String tokenId = NameGenerator.generate("id-", 5); Optional> valid = isValid( @@ -173,4 +174,8 @@ private String getLocalAuthenticateUrl() { private Boolean isValidScmServerUrl(String scmServerUrl) { return azureDevOpsScmApiEndpoint.equals(trimEnd(scmServerUrl, '/')); } + + public String getProviderName() { + return AzureDevOps.PROVIDER_NAME; + } } diff --git a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcher.java b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcher.java index b22878ee63..4e961b6e9f 100644 --- a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcher.java +++ b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcher.java @@ -51,7 +51,9 @@ public class BitbucketServerPersonalAccessTokenFetcher implements PersonalAccess private static final Logger LOG = LoggerFactory.getLogger(BitbucketServerPersonalAccessTokenFetcher.class); - private static final String TOKEN_NAME_TEMPLATE = "che-token-<%s>-<%s>"; + private static final String PROVIDER_NAME = "bitbucket-server"; + + private static final String TOKEN_NAME_TEMPLATE = "che-token-<%s>-<%s>_" + PROVIDER_NAME; public static final Set DEFAULT_TOKEN_SCOPE = ImmutableSet.of("PROJECT_WRITE", "REPO_WRITE"); private final BitbucketServerApiClient bitbucketServerApiClient; @@ -178,4 +180,8 @@ public Optional> isValid(PersonalAccessTokenParams params) return Optional.empty(); } } + + public String getProviderName() { + return PROVIDER_NAME; + } } diff --git a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerUrl.java b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerUrl.java index 458f332daf..eaef5f7e99 100644 --- a/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerUrl.java +++ b/wsmaster/che-core-api-factory-bitbucket-server/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerUrl.java @@ -24,7 +24,7 @@ /** Representation of a bitbucket Server URL, allowing to get details from it. */ public class BitbucketServerUrl extends DefaultFactoryUrl { - private final String NAME = "bitbucket"; + private final String NAME = "bitbucket-server"; /** Hostname of bitbucket URL */ private String hostName; diff --git a/wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerAuthorizingFactoryParametersResolverTest.java b/wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerAuthorizingFactoryParametersResolverTest.java index 664d0749d2..540dbd7393 100644 --- a/wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerAuthorizingFactoryParametersResolverTest.java +++ b/wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerAuthorizingFactoryParametersResolverTest.java @@ -173,7 +173,7 @@ public void shouldSetScmInfoIntoDevfileV2() throws Exception { // then ScmInfo scmInfo = factory.getScmInfo(); assertNotNull(scmInfo); - assertEquals(scmInfo.getScmProviderName(), "bitbucket"); + assertEquals(scmInfo.getScmProviderName(), "bitbucket-server"); assertEquals(scmInfo.getRepositoryUrl(), "http://bitbucket.2mcl.com/scm/~test/repo.git"); assertEquals(scmInfo.getBranch(), "foobar"); } diff --git a/wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcherTest.java b/wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcherTest.java index acdfa4d90c..1915b2f5de 100644 --- a/wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcherTest.java +++ b/wsmaster/che-core-api-factory-bitbucket-server/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketServerPersonalAccessTokenFetcherTest.java @@ -82,7 +82,7 @@ public void setup() throws MalformedURLException { 234345345, 23534534, 90, - "che-token--", + "che-token--_bitbucket-server", "2340590skdf3<0>945i0923i4jasoidfj934ui50", bitbucketUser, ImmutableSet.of("PROJECT_WRITE", "REPO_WRITE")); @@ -92,7 +92,7 @@ public void setup() throws MalformedURLException { 234345345, 23534534, 90, - "che-token--", + "che-token--_bitbucket-server", "34545<0>945i0923i4jasoidfj934ui50", bitbucketUser, ImmutableSet.of("REPO_READ")); @@ -102,7 +102,7 @@ public void setup() throws MalformedURLException { 234345345, 23534534, 90, - "che-token--", + "che-token--_bitbucket-server", "3456\\<0>945//i0923i4jasoidfj934ui50", bitbucketUser, ImmutableSet.of("PROJECT_READ", "REPO_READ")); @@ -147,7 +147,7 @@ public void shouldBeAbleToFetchPersonalAccessToken() when(bitbucketServerApiClient.getPersonalAccessTokens()).thenReturn(Collections.emptyList()); when(bitbucketServerApiClient.createPersonalAccessTokens( - eq("che-token--"), + eq("che-token--_bitbucket-server"), eq(ImmutableSet.of("PROJECT_WRITE", "REPO_WRITE")))) .thenReturn(bitbucketPersonalAccessToken); // when @@ -170,7 +170,7 @@ public void shouldDeleteExistedCheTokenBeforeCreatingNew() when(bitbucketServerApiClient.getPersonalAccessTokens()) .thenReturn(ImmutableList.of(bitbucketPersonalAccessToken, bitbucketPersonalAccessToken2)); when(bitbucketServerApiClient.createPersonalAccessTokens( - eq("che-token--"), + eq("che-token--_bitbucket-server"), eq(ImmutableSet.of("PROJECT_WRITE", "REPO_WRITE")))) .thenReturn(bitbucketPersonalAccessToken3); // when @@ -194,7 +194,7 @@ public void shouldRethrowUnExceptionsOnCreatePersonalAccessTokens() doThrow(ScmBadRequestException.class) .when(bitbucketServerApiClient) .createPersonalAccessTokens( - eq("che-token--"), + eq("che-token--_bitbucket-server"), eq(ImmutableSet.of("PROJECT_WRITE", "REPO_WRITE"))); // when diff --git a/wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketPersonalAccessTokenFetcher.java b/wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketPersonalAccessTokenFetcher.java index 7ea861c2ee..0381d4444a 100644 --- a/wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketPersonalAccessTokenFetcher.java +++ b/wsmaster/che-core-api-factory-bitbucket/src/main/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketPersonalAccessTokenFetcher.java @@ -92,7 +92,8 @@ public PersonalAccessToken fetchPersonalAccessToken(Subject cheSubject, String s } try { oAuthToken = oAuthAPI.getToken(OAUTH_PROVIDER_NAME); - String tokenName = NameGenerator.generate(OAUTH_PROVIDER_NAME, 5); + String tokenName = NameGenerator.generate(OAUTH_PROVIDER_NAME, 5) + "_" + OAUTH_PROVIDER_NAME; + ; String tokenId = NameGenerator.generate("id-", 5); Optional> valid = isValid( @@ -185,4 +186,8 @@ private boolean isValidScope(Set scopes) { && (scopes.contains(DEFAULT_ACCOUNT_READ_TOKEN_SCOPE) || scopes.contains(DEFAULT_ACCOUNT_WRITE_TOKEN_SCOPE)); } + + public String getProviderName() { + return OAUTH_PROVIDER_NAME; + } } diff --git a/wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketPersonalAccessTokenFetcherTest.java b/wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketPersonalAccessTokenFetcherTest.java index 9dce3efc19..49172929d9 100644 --- a/wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketPersonalAccessTokenFetcherTest.java +++ b/wsmaster/che-core-api-factory-bitbucket/src/test/java/org/eclipse/che/api/factory/server/bitbucket/BitbucketPersonalAccessTokenFetcherTest.java @@ -148,6 +148,7 @@ public void shouldReturnToken() throws Exception { bitbucketPersonalAccessTokenFetcher.fetchPersonalAccessToken( subject, BitbucketApiClient.BITBUCKET_SERVER); assertNotNull(token); + assertTrue(token.getScmTokenName().endsWith("_bitbucket")); } @Test diff --git a/wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/AbstractGithubPersonalAccessTokenFetcher.java b/wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/AbstractGithubPersonalAccessTokenFetcher.java index 5b8e0dd387..29049bdb51 100644 --- a/wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/AbstractGithubPersonalAccessTokenFetcher.java +++ b/wsmaster/che-core-api-factory-github-common/src/main/java/org/eclipse/che/api/factory/server/github/AbstractGithubPersonalAccessTokenFetcher.java @@ -41,7 +41,7 @@ public abstract class AbstractGithubPersonalAccessTokenFetcher private final OAuthAPI oAuthAPI; /** GitHub API client. */ - private GithubApiClient githubApiClient; + private final GithubApiClient githubApiClient; /** Name of this OAuth provider as found in OAuthAPI. */ private final String providerName; @@ -124,6 +124,10 @@ public abstract class AbstractGithubPersonalAccessTokenFetcher this.providerName = providerName; } + public String getProviderName() { + return this.providerName; + } + @Override public PersonalAccessToken fetchPersonalAccessToken(Subject cheSubject, String scmServerUrl) throws ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException { @@ -135,7 +139,7 @@ public PersonalAccessToken fetchPersonalAccessToken(Subject cheSubject, String s } try { oAuthToken = oAuthAPI.getToken(providerName); - String tokenName = NameGenerator.generate(OAUTH_2_PREFIX, 5); + String tokenName = NameGenerator.generate(OAUTH_2_PREFIX, 5) + "_" + providerName; String tokenId = NameGenerator.generate("id-", 5); Optional> valid = isValid( @@ -205,17 +209,13 @@ public Optional isValid(PersonalAccessToken personalAccessToken) { @Override public Optional> isValid(PersonalAccessTokenParams params) { - if (githubApiClient == null || !githubApiClient.isConnected(params.getScmProviderUrl())) { - if (providerName.equals(params.getScmTokenName())) { - githubApiClient = new GithubApiClient(params.getScmProviderUrl()); - } else { - LOG.debug("not a valid url {} for current fetcher ", params.getScmProviderUrl()); - return Optional.empty(); - } - } + GithubApiClient apiClient = + githubApiClient.isConnected(params.getScmProviderUrl()) + ? githubApiClient + : new GithubApiClient(params.getScmProviderUrl()); try { if (params.getScmTokenName() != null && params.getScmTokenName().startsWith(OAUTH_2_PREFIX)) { - Pair pair = githubApiClient.getTokenScopes(params.getToken()); + Pair pair = apiClient.getTokenScopes(params.getToken()); return Optional.of( Pair.of( containsScopes(pair.second, DEFAULT_TOKEN_SCOPES) ? Boolean.TRUE : Boolean.FALSE, @@ -223,7 +223,7 @@ public Optional> isValid(PersonalAccessTokenParams params) } else { // TODO: add PAT scope validation // No REST API for PAT-s in Github found yet. Just try to do some action. - GithubUser user = githubApiClient.getUser(params.getToken()); + GithubUser user = apiClient.getUser(params.getToken()); return Optional.of(Pair.of(Boolean.TRUE, user.getLogin())); } } catch (ScmItemNotFoundException | ScmCommunicationException | ScmBadRequestException e) { diff --git a/wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcherTest.java b/wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcherTest.java index 431da4d8ee..409d02b059 100644 --- a/wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcherTest.java +++ b/wsmaster/che-core-api-factory-github/src/test/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcherTest.java @@ -196,6 +196,7 @@ public void shouldReturnToken() throws Exception { PersonalAccessToken token = githubPATFetcher.fetchPersonalAccessToken(subject, wireMockServer.url("/")); assertNotNull(token); + assertTrue(token.getScmTokenName().endsWith("_github")); } @Test diff --git a/wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcher.java b/wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcher.java index aaf4811edd..33b5530d92 100644 --- a/wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcher.java +++ b/wsmaster/che-core-api-factory-gitlab/src/main/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcher.java @@ -106,7 +106,8 @@ public PersonalAccessToken fetchPersonalAccessToken(Subject cheSubject, String s OAuthToken oAuthToken; try { oAuthToken = oAuthAPI.getToken(OAUTH_PROVIDER_NAME); - String tokenName = NameGenerator.generate(OAUTH_2_PREFIX, 5); + String tokenName = NameGenerator.generate(OAUTH_2_PREFIX, 5) + "_" + OAUTH_PROVIDER_NAME; + ; String tokenId = NameGenerator.generate("id-", 5); Optional> valid = isValid( @@ -232,4 +233,8 @@ private GitlabApiClient getApiClient(String scmServerUrl) { ? new GitlabApiClient(scmServerUrl) : null; } + + public String getProviderName() { + return OAUTH_PROVIDER_NAME; + } } diff --git a/wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcherTest.java b/wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcherTest.java index cb5e0e0446..94f65dc73f 100644 --- a/wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcherTest.java +++ b/wsmaster/che-core-api-factory-gitlab/src/test/java/org/eclipse/che/api/factory/server/gitlab/GitlabOAuthTokenFetcherTest.java @@ -137,6 +137,7 @@ public void shouldReturnToken() throws Exception { PersonalAccessToken token = oAuthTokenFetcher.fetchPersonalAccessToken(subject, wireMockServer.url("/")); assertNotNull(token); + assertTrue(token.getScmTokenName().endsWith("_gitlab")); } @Test( diff --git a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/PersonalAccessTokenFetcher.java b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/PersonalAccessTokenFetcher.java index 70f8bd0a70..235fa3bad2 100644 --- a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/PersonalAccessTokenFetcher.java +++ b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/PersonalAccessTokenFetcher.java @@ -55,6 +55,9 @@ PersonalAccessToken fetchPersonalAccessToken(Subject cheUser, String scmServerUr Optional isValid(PersonalAccessToken personalAccessToken) throws ScmCommunicationException, ScmUnauthorizedException; + /** Returns the scm provider name for which this fetcher is applicable. */ + String getProviderName(); + /** * Checks whether the provided personal access token is valid by fetching user info from the scm * provider. Also checks whether the token has expected scope of permissions if the provider API diff --git a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/ScmPersonalAccessTokenFetcher.java b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/ScmPersonalAccessTokenFetcher.java index b600b29bd4..e785148b9c 100644 --- a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/ScmPersonalAccessTokenFetcher.java +++ b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/scm/ScmPersonalAccessTokenFetcher.java @@ -81,11 +81,15 @@ public boolean isValid(PersonalAccessToken personalAccessToken) * fetchers return an scm username, return it. Otherwise, return null. */ public Optional getScmUsername(PersonalAccessTokenParams params) - throws UnknownScmProviderException, ScmUnauthorizedException, ScmCommunicationException { + throws UnknownScmProviderException { + String providerName = + params.getScmTokenName().indexOf("_") > 0 + ? params.getScmTokenName().split("_")[1] + : params.getScmTokenName(); for (PersonalAccessTokenFetcher fetcher : personalAccessTokenFetchers) { - Optional> isValid = fetcher.isValid(params); - if (isValid.isPresent() && isValid.get().first) { - return Optional.of(isValid.get().second); + if (fetcher.getProviderName().equals(providerName)) { + Optional> isValidOptional = fetcher.isValid(params); + return isValidOptional.map(p -> p.second); } } return Optional.empty();