use of org.eclipse.che.api.factory.server.scm.PersonalAccessToken in project che-server by eclipse-che.
the class BitbucketServerAuthorizingFileContentProviderTest method shouldResolveRelativePaths.
@Test(dataProvider = "relativePathsProvider")
public void shouldResolveRelativePaths(String relative, String expected, String branch) throws Exception {
BitbucketUrl url = new BitbucketUrl().withHostName(TEST_HOSTNAME).withProject("proj").withRepository("repo").withDevfileFilenames(Collections.singletonList(".devfile"));
if (branch != null) {
url.withBranch(branch);
}
BitbucketServerAuthorizingFileContentProvider fileContentProvider = new BitbucketServerAuthorizingFileContentProvider(url, urlFetcher, gitCredentialManager, personalAccessTokenManager);
PersonalAccessToken token = new PersonalAccessToken(TEST_HOSTNAME, "user1", "token");
when(personalAccessTokenManager.get(any(Subject.class), anyString())).thenReturn(Optional.of(token));
// when
fileContentProvider.fetchContent(relative);
// then
verify(urlFetcher).fetch(eq(expected), eq("Bearer token"));
}
use of org.eclipse.che.api.factory.server.scm.PersonalAccessToken in project che-server by eclipse-che.
the class BitbucketServerScmFileResolverTest method shouldReturnContentFromUrlFetcher.
@Test
public void shouldReturnContentFromUrlFetcher() throws Exception {
final String rawContent = "raw_content";
final String filename = "devfile.yaml";
when(personalAccessTokenManager.get(any(Subject.class), anyString())).thenReturn(Optional.of(new PersonalAccessToken(SCM_URL, "root", "token123")));
when(urlFetcher.fetch(anyString(), eq("Bearer token123"))).thenReturn(rawContent);
String content = serverScmFileResolver.fileContent("https://foo.bar/scm/test/repo.git", filename);
assertEquals(content, rawContent);
}
use of org.eclipse.che.api.factory.server.scm.PersonalAccessToken in project devspaces-images by redhat-developer.
the class KubernetesGitCredentialManager method createOrReplace.
@Override
public void createOrReplace(PersonalAccessToken personalAccessToken) throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException {
try {
final String namespace = getFirstNamespace();
final KubernetesClient client = clientFactory.create();
// to avoid duplicating secrets we try to reuse existing one by matching
// hostname/username if possible, and update it. Otherwise, create new one.
Optional<Secret> existing = client.secrets().inNamespace(namespace).withLabels(SEARCH_LABELS).list().getItems().stream().filter(s -> s.getMetadata().getAnnotations() != null).filter(s -> Boolean.parseBoolean(s.getMetadata().getAnnotations().get(ANNOTATION_GIT_CREDENTIALS)) && personalAccessToken.getScmProviderUrl().equals(StringUtils.trimEnd(s.getMetadata().getAnnotations().get(ANNOTATION_SCM_URL), '/')) && personalAccessToken.getCheUserId().equals(s.getMetadata().getAnnotations().get(ANNOTATION_CHE_USERID)) && personalAccessToken.getScmUserName().equals(s.getMetadata().getAnnotations().get(ANNOTATION_SCM_USERNAME))).findFirst();
Secret secret = existing.orElseGet(() -> {
Map<String, String> annotations = new HashMap<>(DEFAULT_SECRET_ANNOTATIONS);
annotations.put(ANNOTATION_SCM_URL, personalAccessToken.getScmProviderUrl());
annotations.put(ANNOTATION_SCM_USERNAME, personalAccessToken.getScmUserName());
annotations.put(ANNOTATION_CHE_USERID, personalAccessToken.getCheUserId());
ObjectMeta meta = new ObjectMetaBuilder().withName(NameGenerator.generate(NAME_PATTERN, 5)).withAnnotations(annotations).withLabels(NEW_SECRET_LABELS).build();
return new SecretBuilder().withMetadata(meta).build();
});
URL scmUrl = new URL(personalAccessToken.getScmProviderUrl());
secret.setData(Map.of("credentials", Base64.getEncoder().encodeToString(format("%s://%s:%s@%s%s", scmUrl.getProtocol(), personalAccessToken.getScmTokenName().startsWith(OAUTH_2_PREFIX) ? "oauth2" : personalAccessToken.getScmUserName(), URLEncoder.encode(personalAccessToken.getToken(), UTF_8), scmUrl.getHost(), scmUrl.getPort() != 80 && scmUrl.getPort() != -1 ? ":" + scmUrl.getPort() : "").getBytes())));
client.secrets().inNamespace(namespace).createOrReplace(secret);
} catch (InfrastructureException | MalformedURLException e) {
throw new ScmConfigurationPersistenceException(e.getMessage(), e);
}
}
use of org.eclipse.che.api.factory.server.scm.PersonalAccessToken in project devspaces-images by redhat-developer.
the class KubernetesPersonalAccessTokenManager method fetchAndSave.
@Override
public PersonalAccessToken fetchAndSave(Subject cheUser, String scmServerUrl) throws UnsatisfiedScmPreconditionException, ScmConfigurationPersistenceException, ScmUnauthorizedException, ScmCommunicationException, UnknownScmProviderException {
PersonalAccessToken personalAccessToken = scmPersonalAccessTokenFetcher.fetchPersonalAccessToken(cheUser, scmServerUrl);
save(personalAccessToken);
return personalAccessToken;
}
use of org.eclipse.che.api.factory.server.scm.PersonalAccessToken in project devspaces-images by redhat-developer.
the class KubernetesGitCredentialManagerTest method testCreateAndSaveNewPATGitCredential.
@Test
public void testCreateAndSaveNewPATGitCredential() throws Exception {
KubernetesNamespaceMeta meta = new KubernetesNamespaceMetaImpl("test");
when(namespaceFactory.list()).thenReturn(Collections.singletonList(meta));
when(clientFactory.create()).thenReturn(kubeClient);
when(kubeClient.secrets()).thenReturn(secretsMixedOperation);
when(secretsMixedOperation.inNamespace(eq(meta.getName()))).thenReturn(nonNamespaceOperation);
when(nonNamespaceOperation.withLabels(anyMap())).thenReturn(filterWatchDeletable);
when(filterWatchDeletable.list()).thenReturn(secretList);
when(secretList.getItems()).thenReturn(emptyList());
ArgumentCaptor<Secret> captor = ArgumentCaptor.forClass(Secret.class);
PersonalAccessToken token = new PersonalAccessToken("https://bitbucket.com", "cheUser", "username", "userId", "token-name", "tid-23434", "token123");
// when
kubernetesGitCredentialManager.createOrReplace(token);
// then
verify(nonNamespaceOperation).createOrReplace(captor.capture());
Secret createdSecret = captor.getValue();
assertNotNull(createdSecret);
assertEquals(new String(Base64.getDecoder().decode(createdSecret.getData().get("credentials"))), "https://username:token123@bitbucket.com");
assertTrue(createdSecret.getMetadata().getName().startsWith(NAME_PATTERN));
assertFalse(createdSecret.getMetadata().getName().contains(token.getScmUserName()));
}
Aggregations