I created an Atlassian connect add-on using the Atlassian Spring Boot Starter. I created the following descriptor (atlassian-connect.json):
{
"key": "${addon.key}",
"baseUrl": "${addon.base-url}",
"name": "Mahesh Hello World",
"description": "Mahesh Hello World",
"authentication": {
"type": "jwt"
},
"lifecycle": {
"installed": "/installed",
"uninstalled": "/uninstalled"
},
"modules": {
"webhooks": [
{
"event": "pullrequest:created",
"url": "/bitbucket-hook"
}
],
"webPanel": [
{
"url": "/connect-example?repoPath={repo_path}",
"name": {
"value": "Example Web Panel"
},
"location": "org.bitbucket.repository.overview.informationPanel",
"key": "example-web-panel"
}
]
},
"scopes": ["account", "repository:admin", "pullrequest"]
}
As seen, there is one webhook registered for the pullrequest:created event. The Spring Rest Controller webhook listener is based on this link
As per the above link, docs for atlassian-connect-spring-boot states the following :
"Provides a Spring Boot starter for building Atlassian Connect add-ons for JIRA (Software, Service Desk and Core) and Confluence."
Apparently this means Bitbucket Cloud is not supported out of the box. So the link provides a solution to create your own JWT tokens based on another link
In addition to classes mentioned in this link, I created my Rest Controller (webhook listener) as follows:
@PostMapping("bitbucket-hook")
public void webhook(@AuthenticationPrincipal AtlassianHostUser hostUser, @RequestBody String repository, HttpServletResponse httpServletResponse)
throws ClientProtocolException, IOException, URISyntaxException, InterruptedException {
log.info(repository);
AccessTokenResponse accessToken = new AccessToken(hostUser.getHost().getSharedSecret(), hostUser.getHost().getClientKey(), "mahesh-hello-world-9").getAccessToken();
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer " + accessToken.getAccess_token());
HttpEntity<String> branchRequest = new HttpEntity<String>(headers);
ResponseEntity<String> response = restTemplate.exchange("https://api.bitbucket.org/2.0/repositories/maheshr-sacumen-ws/bitbucket-test-code/refs/branches/master", HttpMethod.GET, branchRequest, String.class);
String branchObject = response.getBody();
JsonObject targetJsonObject = JsonParser.parseString(branchObject).getAsJsonObject().get("target").getAsJsonObject();
String hash = targetJsonObject.get("hash").getAsString();
log.info(hash);
headers = new HttpHeaders();
accessToken = new AccessToken(hostUser.getHost().getSharedSecret(), hostUser.getHost().getClientKey(), "mahesh-hello-world-9").getAccessToken();
headers.add("Authorization", "Bearer " + accessToken.getAccess_token());
headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> map= new LinkedMultiValueMap<>();
map.add("message", "This is a test commit");
map.add("author", "Mahesh Chandran <mahesh.kr@sacumen.com>");
map.add("parents", hash);
map.add("branch", "master");
map.add("test.yml", new FileSystemResource("/home/sacumen/Code/atlassian/bitbucket-test-code/test.yml"));
HttpEntity<MultiValueMap<String, Object>> pushRequest
= new HttpEntity<>(map, headers);
response = restTemplate.exchange("https://api.bitbucket.org/2.0/repositories/maheshr-sacumen-ws/bitbucket-test-code/src", HttpMethod.POST, pushRequest, String.class);
log.info(response.getStatusCode().toString());
}
But I get the following error:
org.springframework.web.client.HttpClientErrorException: 403 Forbidden
I have given repo read/write/admin rights for the OAuth consumer which I created in Bitbucket.
The same endpoints work well and pushes the files successfully from Postman. The only difference I can make out is that in Postman, I use client_credentials with the Client ID and Client Secret corresponding to the OAuth consumer. I don't see this used as far as I can think.
Can someone look into the code and let me know if there is a solution, given this approach.
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.