diff --git a/wsmaster/che-core-api-factory-azure-devops/pom.xml b/wsmaster/che-core-api-factory-azure-devops/pom.xml
index 9ca8e9dad8..c971cf9f14 100644
--- a/wsmaster/che-core-api-factory-azure-devops/pom.xml
+++ b/wsmaster/che-core-api-factory-azure-devops/pom.xml
@@ -140,5 +140,10 @@
testng
test
+
+ org.wiremock
+ wiremock-standalone
+ test
+
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 14aa9f62dc..0b8c278ebd 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
@@ -89,12 +89,7 @@ public class AzureDevOpsPersonalAccessTokenFetcher implements PersonalAccessToke
new PersonalAccessTokenParams(
scmServerUrl, tokenName, tokenId, oAuthToken.getToken(), null));
if (valid.isEmpty()) {
- throw new ScmCommunicationException(
- "Unable to verify if current token is a valid Azure DevOps token. Token's scm-url needs to be '"
- + azureDevOpsScmApiEndpoint
- + "' and was '"
- + scmServerUrl
- + "'");
+ throw buildScmUnauthorizedException(cheSubject);
} else if (!valid.get().first) {
throw new ScmCommunicationException(
"Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: "
@@ -108,14 +103,7 @@ public class AzureDevOpsPersonalAccessTokenFetcher implements PersonalAccessToke
tokenId,
oAuthToken.getToken());
} catch (UnauthorizedException e) {
- throw new ScmUnauthorizedException(
- cheSubject.getUserName()
- + " is not authorized in "
- + AzureDevOps.PROVIDER_NAME
- + " OAuth provider.",
- AzureDevOps.PROVIDER_NAME,
- "2.0",
- getLocalAuthenticateUrl());
+ throw buildScmUnauthorizedException(cheSubject);
} catch (NotFoundException nfe) {
throw new UnknownScmProviderException(nfe.getMessage(), scmServerUrl);
} catch (ServerException | ForbiddenException | BadRequestException | ConflictException e) {
@@ -124,6 +112,17 @@ public class AzureDevOpsPersonalAccessTokenFetcher implements PersonalAccessToke
}
}
+ private ScmUnauthorizedException buildScmUnauthorizedException(Subject cheSubject) {
+ return new ScmUnauthorizedException(
+ cheSubject.getUserName()
+ + " is not authorized in "
+ + AzureDevOps.PROVIDER_NAME
+ + " OAuth provider.",
+ AzureDevOps.PROVIDER_NAME,
+ "2.0",
+ getLocalAuthenticateUrl());
+ }
+
@Override
public Optional isValid(PersonalAccessToken personalAccessToken) {
if (!isValidScmServerUrl(personalAccessToken.getScmProviderUrl())) {
diff --git a/wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsPersonalAccessTokenFetcherTest.java b/wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsPersonalAccessTokenFetcherTest.java
index 5068f24504..3d05c00d53 100644
--- a/wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsPersonalAccessTokenFetcherTest.java
+++ b/wsmaster/che-core-api-factory-azure-devops/src/test/java/org/eclipse/che/api/factory/server/azure/devops/AzureDevOpsPersonalAccessTokenFetcherTest.java
@@ -11,17 +11,33 @@
*/
package org.eclipse.che.api.factory.server.azure.devops;
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
+import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
+import static java.net.HttpURLConnection.HTTP_FORBIDDEN;
+import static org.eclipse.che.dto.server.DtoFactory.newDto;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.Assert.*;
+import com.github.tomakehurst.wiremock.WireMockServer;
+import com.github.tomakehurst.wiremock.client.WireMock;
+import com.github.tomakehurst.wiremock.common.Slf4jNotifier;
+import com.google.common.net.HttpHeaders;
import org.eclipse.che.api.auth.shared.dto.OAuthToken;
import org.eclipse.che.api.factory.server.scm.PersonalAccessToken;
+import org.eclipse.che.api.factory.server.scm.exception.ScmUnauthorizedException;
import org.eclipse.che.commons.subject.Subject;
+import org.eclipse.che.commons.subject.SubjectImpl;
import org.eclipse.che.security.oauth.OAuthAPI;
import org.mockito.Mock;
import org.mockito.testng.MockitoTestNGListener;
+import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@@ -34,13 +50,33 @@ public class AzureDevOpsPersonalAccessTokenFetcherTest {
@Mock private OAuthAPI oAuthAPI;
@Mock private OAuthToken oAuthToken;
@Mock private AzureDevOpsUser azureDevOpsUser;
+
+ final int httpPort = 3301;
+ WireMockServer wireMockServer;
+ WireMock wireMock;
+
+ final String azureOauthToken = "token";
private AzureDevOpsPersonalAccessTokenFetcher personalAccessTokenFetcher;
@BeforeMethod
protected void start() {
+ wireMockServer =
+ new WireMockServer(wireMockConfig().notifier(new Slf4jNotifier(false)).port(httpPort));
+ wireMockServer.start();
+ WireMock.configureFor("localhost", httpPort);
+ wireMock = new WireMock("localhost", httpPort);
personalAccessTokenFetcher =
new AzureDevOpsPersonalAccessTokenFetcher(
- "localhost", "https://dev.azure.com", new String[] {}, azureDevOpsApiClient, oAuthAPI);
+ "localhost",
+ "http://localhost:3301",
+ new String[] {},
+ new AzureDevOpsApiClient(wireMockServer.url("/")),
+ oAuthAPI);
+ }
+
+ @AfterMethod
+ void stop() {
+ wireMockServer.stop();
}
@Test
@@ -55,6 +91,9 @@ public class AzureDevOpsPersonalAccessTokenFetcherTest {
@Test
public void fetchPersonalAccessTokenShouldReturnToken() throws Exception {
+ personalAccessTokenFetcher =
+ new AzureDevOpsPersonalAccessTokenFetcher(
+ "localhost", "https://dev.azure.com", new String[] {}, azureDevOpsApiClient, oAuthAPI);
when(oAuthAPI.getToken(AzureDevOps.PROVIDER_NAME)).thenReturn(oAuthToken);
when(azureDevOpsApiClient.getUserWithOAuthToken(any())).thenReturn(azureDevOpsUser);
when(azureDevOpsUser.getEmailAddress()).thenReturn("user-email");
@@ -65,4 +104,20 @@ public class AzureDevOpsPersonalAccessTokenFetcherTest {
assertNotNull(personalAccessToken);
}
+
+ @Test(
+ expectedExceptions = ScmUnauthorizedException.class,
+ expectedExceptionsMessageRegExp =
+ "Username is not authorized in azure-devops OAuth provider.")
+ public void shouldThrowUnauthorizedExceptionIfTokenIsNotValid() throws Exception {
+ Subject subject = new SubjectImpl("Username", "id1", "token", false);
+ OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(azureOauthToken).withScope("");
+ when(oAuthAPI.getToken(anyString())).thenReturn(oAuthToken);
+ stubFor(
+ get(urlEqualTo("/_apis/profile/profiles/me?api-version=7.0"))
+ .withHeader(HttpHeaders.AUTHORIZATION, equalTo("token " + azureOauthToken))
+ .willReturn(aResponse().withStatus(HTTP_FORBIDDEN)));
+
+ personalAccessTokenFetcher.fetchPersonalAccessToken(subject, wireMockServer.url("/"));
+ }
}
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 6e8bf10e7e..7ea861c2ee 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
@@ -99,12 +99,7 @@ public class BitbucketPersonalAccessTokenFetcher implements PersonalAccessTokenF
new PersonalAccessTokenParams(
scmServerUrl, tokenName, tokenId, oAuthToken.getToken(), null));
if (valid.isEmpty()) {
- throw new ScmCommunicationException(
- "Unable to verify if current token is a valid Bitbucket token. Token's scm-url needs to be '"
- + BitbucketApiClient.BITBUCKET_SERVER
- + "' and was '"
- + scmServerUrl
- + "'");
+ throw buildScmUnauthorizedException(cheSubject);
} else if (!valid.get().first) {
throw new ScmCommunicationException(
"Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: "
@@ -120,14 +115,7 @@ public class BitbucketPersonalAccessTokenFetcher implements PersonalAccessTokenF
tokenId,
oAuthToken.getToken());
} catch (UnauthorizedException e) {
- throw new ScmUnauthorizedException(
- cheSubject.getUserName()
- + " is not authorized in "
- + OAUTH_PROVIDER_NAME
- + " OAuth provider.",
- OAUTH_PROVIDER_NAME,
- "2.0",
- getLocalAuthenticateUrl());
+ throw buildScmUnauthorizedException(cheSubject);
} catch (NotFoundException nfe) {
throw new UnknownScmProviderException(nfe.getMessage(), scmServerUrl);
} catch (ServerException | ForbiddenException | BadRequestException | ConflictException e) {
@@ -136,6 +124,17 @@ public class BitbucketPersonalAccessTokenFetcher implements PersonalAccessTokenF
}
}
+ private ScmUnauthorizedException buildScmUnauthorizedException(Subject cheSubject) {
+ return new ScmUnauthorizedException(
+ cheSubject.getUserName()
+ + " is not authorized in "
+ + OAUTH_PROVIDER_NAME
+ + " OAuth provider.",
+ OAUTH_PROVIDER_NAME,
+ "2.0",
+ getLocalAuthenticateUrl());
+ }
+
@Override
public Optional isValid(PersonalAccessToken personalAccessToken) {
if (!bitbucketApiClient.isConnected(personalAccessToken.getScmProviderUrl())) {
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 d5ffdd471c..9dce3efc19 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
@@ -212,4 +212,20 @@ public class BitbucketPersonalAccessTokenFetcherTest {
assertFalse(bitbucketPersonalAccessTokenFetcher.isValid(params).isPresent());
}
+
+ @Test(
+ expectedExceptions = ScmUnauthorizedException.class,
+ expectedExceptionsMessageRegExp = "Username is not authorized in bitbucket OAuth provider.")
+ public void shouldThrowUnauthorizedExceptionIfTokenIsNotValid() throws Exception {
+ Subject subject = new SubjectImpl("Username", "id1", "token", false);
+ OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(bitbucketOauthToken).withScope("");
+ when(oAuthAPI.getToken(anyString())).thenReturn(oAuthToken);
+ stubFor(
+ get(urlEqualTo("/user"))
+ .withHeader(HttpHeaders.AUTHORIZATION, equalTo("token " + bitbucketOauthToken))
+ .willReturn(aResponse().withStatus(HTTP_FORBIDDEN)));
+
+ bitbucketPersonalAccessTokenFetcher.fetchPersonalAccessToken(
+ subject, BitbucketApiClient.BITBUCKET_SERVER);
+ }
}
diff --git a/wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcher.java b/wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcher.java
index a3921b7691..2508a0020d 100644
--- a/wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcher.java
+++ b/wsmaster/che-core-api-factory-github/src/main/java/org/eclipse/che/api/factory/server/github/GithubPersonalAccessTokenFetcher.java
@@ -159,12 +159,7 @@ public class GithubPersonalAccessTokenFetcher implements PersonalAccessTokenFetc
new PersonalAccessTokenParams(
scmServerUrl, tokenName, tokenId, oAuthToken.getToken(), null));
if (valid.isEmpty()) {
- throw new ScmCommunicationException(
- "Unable to verify if current token is a valid GitHub token. Token's scm-url needs to be '"
- + GithubApiClient.GITHUB_SAAS_ENDPOINT
- + "' and was '"
- + scmServerUrl
- + "'");
+ throw buildScmUnauthorizedException(cheSubject);
} else if (!valid.get().first) {
throw new ScmCommunicationException(
"Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: "
@@ -178,14 +173,7 @@ public class GithubPersonalAccessTokenFetcher implements PersonalAccessTokenFetc
tokenId,
oAuthToken.getToken());
} catch (UnauthorizedException e) {
- throw new ScmUnauthorizedException(
- cheSubject.getUserName()
- + " is not authorized in "
- + OAUTH_PROVIDER_NAME
- + " OAuth provider.",
- OAUTH_PROVIDER_NAME,
- "2.0",
- getLocalAuthenticateUrl());
+ throw buildScmUnauthorizedException(cheSubject);
} catch (NotFoundException nfe) {
throw new UnknownScmProviderException(nfe.getMessage(), scmServerUrl);
} catch (ServerException | ForbiddenException | BadRequestException | ConflictException e) {
@@ -194,6 +182,17 @@ public class GithubPersonalAccessTokenFetcher implements PersonalAccessTokenFetc
}
}
+ private ScmUnauthorizedException buildScmUnauthorizedException(Subject cheSubject) {
+ return new ScmUnauthorizedException(
+ cheSubject.getUserName()
+ + " is not authorized in "
+ + OAUTH_PROVIDER_NAME
+ + " OAuth provider.",
+ OAUTH_PROVIDER_NAME,
+ "2.0",
+ getLocalAuthenticateUrl());
+ }
+
@Override
@Deprecated
public Optional isValid(PersonalAccessToken personalAccessToken) {
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 48149f62ec..431da4d8ee 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
@@ -161,6 +161,21 @@ public class GithubPersonalAccessTokenFetcherTest {
githubPATFetcher.fetchPersonalAccessToken(subject, wireMockServer.url("/"));
}
+ @Test(
+ expectedExceptions = ScmUnauthorizedException.class,
+ expectedExceptionsMessageRegExp = "Username is not authorized in github OAuth provider.")
+ public void shouldThrowUnauthorizedExceptionIfTokenIsNotValid() throws Exception {
+ Subject subject = new SubjectImpl("Username", "id1", "token", false);
+ OAuthToken oAuthToken = newDto(OAuthToken.class).withToken(githubOauthToken).withScope("");
+ when(oAuthAPI.getToken(anyString())).thenReturn(oAuthToken);
+ stubFor(
+ get(urlEqualTo("/api/v3/user"))
+ .withHeader(HttpHeaders.AUTHORIZATION, equalTo("token " + githubOauthToken))
+ .willReturn(aResponse().withStatus(HTTP_FORBIDDEN)));
+
+ githubPATFetcher.fetchPersonalAccessToken(subject, wireMockServer.url("/"));
+ }
+
@Test
public void shouldReturnToken() throws Exception {
Subject subject = new SubjectImpl("Username", "id1", "token", false);
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 b7802d9156..aaf4811edd 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
@@ -112,10 +112,12 @@ public class GitlabOAuthTokenFetcher implements PersonalAccessTokenFetcher {
isValid(
new PersonalAccessTokenParams(
scmServerUrl, tokenName, tokenId, oAuthToken.getToken(), null));
- if (valid.isEmpty() || !valid.get().first) {
+ if (valid.isEmpty()) {
+ throw buildScmUnauthorizedException(cheSubject);
+ } else if (!valid.get().first) {
throw new ScmCommunicationException(
- "Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: "
- + DEFAULT_TOKEN_SCOPES.toString());
+ "Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: "
+ + DEFAULT_TOKEN_SCOPES);
}
return new PersonalAccessToken(
scmServerUrl,
@@ -125,14 +127,7 @@ public class GitlabOAuthTokenFetcher implements PersonalAccessTokenFetcher {
tokenId,
oAuthToken.getToken());
} catch (UnauthorizedException e) {
- throw new ScmUnauthorizedException(
- cheSubject.getUserName()
- + " is not authorized in "
- + OAUTH_PROVIDER_NAME
- + " OAuth provider.",
- OAUTH_PROVIDER_NAME,
- "2.0",
- getLocalAuthenticateUrl());
+ throw buildScmUnauthorizedException(cheSubject);
} catch (NotFoundException nfe) {
throw new UnknownScmProviderException(nfe.getMessage(), scmServerUrl);
} catch (ServerException | ForbiddenException | BadRequestException | ConflictException e) {
@@ -141,6 +136,17 @@ public class GitlabOAuthTokenFetcher implements PersonalAccessTokenFetcher {
}
}
+ private ScmUnauthorizedException buildScmUnauthorizedException(Subject cheSubject) {
+ return new ScmUnauthorizedException(
+ cheSubject.getUserName()
+ + " is not authorized in "
+ + OAUTH_PROVIDER_NAME
+ + " OAuth provider.",
+ OAUTH_PROVIDER_NAME,
+ "2.0",
+ getLocalAuthenticateUrl());
+ }
+
@Override
public Optional isValid(PersonalAccessToken personalAccessToken) {
GitlabApiClient gitlabApiClient = getApiClient(personalAccessToken.getScmProviderUrl());
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 3d46072f6f..cb5e0e0446 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
@@ -17,6 +17,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
+import static java.net.HttpURLConnection.HTTP_FORBIDDEN;
import static org.eclipse.che.dto.server.DtoFactory.newDto;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
@@ -75,7 +76,7 @@ public class GitlabOAuthTokenFetcherTest {
@Test(
expectedExceptions = ScmCommunicationException.class,
expectedExceptionsMessageRegExp =
- "Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: \\[api, write_repository\\]")
+ "Current token doesn't have the necessary privileges. Please make sure Che app scopes are correct and containing at least: \\[api, write_repository]")
public void shouldThrowExceptionOnInsufficientTokenScopes() throws Exception {
Subject subject = new SubjectImpl("Username", "id1", "token", false);
OAuthToken oAuthToken = newDto(OAuthToken.class).withToken("oauthtoken").withScope("api repo");
@@ -185,4 +186,19 @@ public class GitlabOAuthTokenFetcherTest {
assertTrue(valid.isPresent());
assertTrue(valid.get().first);
}
+
+ @Test(
+ expectedExceptions = ScmUnauthorizedException.class,
+ expectedExceptionsMessageRegExp = "Username is not authorized in gitlab OAuth provider.")
+ public void shouldThrowUnauthorizedExceptionIfTokenIsNotValid() throws Exception {
+ Subject subject = new SubjectImpl("Username", "id1", "token", false);
+ OAuthToken oAuthToken = newDto(OAuthToken.class).withToken("token").withScope("");
+ when(oAuthAPI.getToken(anyString())).thenReturn(oAuthToken);
+ stubFor(
+ get(urlEqualTo("/api/v4/user"))
+ .withHeader(HttpHeaders.AUTHORIZATION, equalTo("token token"))
+ .willReturn(aResponse().withStatus(HTTP_FORBIDDEN)));
+
+ oAuthTokenFetcher.fetchPersonalAccessToken(subject, wireMockServer.url("/"));
+ }
}
diff --git a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java
index 1008711cf9..3dc449de97 100644
--- a/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java
+++ b/wsmaster/che-core-api-factory/src/main/java/org/eclipse/che/api/factory/server/FactoryService.java
@@ -153,7 +153,8 @@ public class FactoryService extends Service {
singletonMap(URL_PARAMETER_NAME, url));
if (!authorisationRequestManager.isStored(factoryParametersResolver.getProviderName())) {
personalAccessTokenManager.getAndStore(
- factoryParametersResolver.parseFactoryUrl(url).getHostName());
+ // get the provider URL from the factory URL
+ factoryParametersResolver.parseFactoryUrl(url).getProviderUrl());
}
} catch (ScmCommunicationException
| ScmConfigurationPersistenceException
diff --git a/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java b/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java
index 56d5571881..0f9fd72867 100644
--- a/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java
+++ b/wsmaster/che-core-api-factory/src/test/java/org/eclipse/che/api/factory/server/FactoryServiceTest.java
@@ -95,6 +95,8 @@ public class FactoryServiceTest {
private static final DtoFactory DTO = DtoFactory.getInstance();
+ private final String scmServerUrl = "https://hostName.com";
+
@Mock private FactoryAcceptValidator acceptValidator;
@Mock private PreferenceManager preferenceManager;
@Mock private UserManager userManager;
@@ -240,7 +242,7 @@ public class FactoryServiceTest {
FactoryParametersResolver factoryParametersResolver = mock(FactoryParametersResolver.class);
RemoteFactoryUrl remoteFactoryUrl = mock(RemoteFactoryUrl.class);
when(factoryParametersResolver.parseFactoryUrl(eq("someUrl"))).thenReturn(remoteFactoryUrl);
- when(remoteFactoryUrl.getHostName()).thenReturn("hostName");
+ when(remoteFactoryUrl.getProviderUrl()).thenReturn(scmServerUrl);
doReturn(factoryParametersResolver).when(dummyHolder).getFactoryParametersResolver(anyMap());
service =
new FactoryService(
@@ -258,7 +260,7 @@ public class FactoryServiceTest {
.post(SERVICE_PATH + "/token/refresh");
// then
- verify(personalAccessTokenManager).getAndStore(eq("hostName"));
+ verify(personalAccessTokenManager).getAndStore(eq(scmServerUrl));
}
@Test
@@ -284,7 +286,7 @@ public class FactoryServiceTest {
.post(SERVICE_PATH + "/token/refresh");
// then
- verify(personalAccessTokenManager, never()).getAndStore(eq("hostName"));
+ verify(personalAccessTokenManager, never()).getAndStore(eq(scmServerUrl));
}
@Test