Skip to content

Commit

Permalink
Added support for servers requiring authentication
Browse files Browse the repository at this point in the history
  • Loading branch information
mechero committed May 26, 2019
1 parent d4367b7 commit aedba57
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 12 deletions.
2 changes: 1 addition & 1 deletion redeploy.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash
mvn package
cp -v ./target/*.jar /usr/local/Cellar/sonarqube/7.4/libexec/extensions/plugins
cp -v ./target/*.jar /usr/local/Cellar/sonarqube/7.7/libexec/extensions/plugins
sonar restart
37 changes: 27 additions & 10 deletions src/main/java/io/tpd/quboo/sonarplugin/hooks/QubooConnector.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@
import io.tpd.quboo.sonarplugin.pojos.Users;
import io.tpd.quboo.sonarplugin.settings.QubooProperties;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
import org.sonar.api.ce.posttask.PostProjectAnalysisTask;
import org.sonar.api.platform.Server;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;

import java.util.Base64;

import static io.tpd.quboo.sonarplugin.settings.QubooProperties.DEFAULT_ACCESS_KEY;
import static org.apache.commons.lang3.StringUtils.isEmpty;

/**
* Sends stats to the Quboo server after an analysis
Expand All @@ -38,12 +40,16 @@ public QubooConnector(final Server server) {
public void finished(ProjectAnalysis analysis) {
final String qubooKey = analysis.getScannerContext().getProperties().get(QubooProperties.ACCESS_KEY);
final String qubooSecret = analysis.getScannerContext().getProperties().get(QubooProperties.SECRET_KEY);
if (!StringUtils.isEmpty(qubooKey) && !DEFAULT_ACCESS_KEY.equals(qubooKey)) {
final String token = analysis.getScannerContext().getProperties().get(QubooProperties.TOKEN_KEY);
if (!isEmpty(token)) {
log.info("A token will be used to connect to SonarQube server");
}
if (!isEmpty(qubooKey) && !DEFAULT_ACCESS_KEY.equals(qubooKey)) {
log.info("Connecting to Quboo with quboo key: " + qubooKey);
try {
final UsersWrapper allUsers = getUsers();
final UsersWrapper allUsers = getUsers(token);
sendUsersToQuboo(allUsers, qubooKey, qubooSecret);
final IssuesWrapper allIssues = getIssues();
final IssuesWrapper allIssues = getIssues(token);
sendIssuesToQuboo(allIssues, qubooKey, qubooSecret);
} catch (final Exception e) {
log.error("Error while trying to connect to Quboo", e);
Expand All @@ -65,13 +71,15 @@ private void sendIssuesToQuboo(final IssuesWrapper allIssues, final String quboo
log.info("Response " + response.code() + " | " + body);
}

private IssuesWrapper getIssues() throws Exception {
private IssuesWrapper getIssues(final String token) throws Exception {
int pageNumber = 1;
boolean moreData = true;
IssuesWrapper wrapper = new IssuesWrapper();
while (moreData) {
final Request request = new Request.Builder().url(server.getPublicRootUrl() + "/api/issues/search?assigned=true&ps=200&p=" + pageNumber).get().build();
final Response response = http.newCall(request).execute();
final Request.Builder request = new Request.Builder()
.url(server.getPublicRootUrl() + "/api/issues/search?assigned=true&ps=200&p=" + pageNumber).get();
addAuthorizationIfNeeded(request, token);
final Response response = http.newCall(request.build()).execute();
final String body = response.body().string();
final Issues issues = mapper.readValue(body, Issues.class);
wrapper.filterAndAddIssues(issues, server.getVersion());
Expand All @@ -94,14 +102,15 @@ private void sendUsersToQuboo(final UsersWrapper allUsers, final String qubooKey
log.info("Response " + response.code() + " | " + body);
}

private UsersWrapper getUsers() {
private UsersWrapper getUsers(final String token) {
int pageNumber = 1;
boolean moreData = true;
UsersWrapper wrapper = new UsersWrapper();
while (moreData) {
try {
final Request request = new Request.Builder().url(server.getPublicRootUrl() + "/api/users/search?ps=200&p=" + pageNumber).get().build();
final Response response = http.newCall(request).execute();
final Request.Builder request = new Request.Builder().url(server.getPublicRootUrl() + "/api/users/search?ps=200&p=" + pageNumber).get();
addAuthorizationIfNeeded(request, token);
final Response response = http.newCall(request.build()).execute();
final String body = response.body().string();
final Users users = mapper.readValue(body, Users.class);
wrapper.filterAndAddUsers(users, server.getVersion());
Expand All @@ -120,4 +129,12 @@ private boolean moreData(final Paging paging, final int elementsInPage) {
return elementsInPage == paging.getPageSize() && paging.getTotal() > paging.getPageSize() * paging.getPageIndex();
}

private Request.Builder addAuthorizationIfNeeded(final Request.Builder requestBuilder, final String token) {
if (!isEmpty(token)) {
final String headerValue = "Basic " + Base64.getEncoder().encodeToString((token + ":").getBytes());
requestBuilder.header("Authorization", headerValue);
}
return requestBuilder;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ public void describe(final SensorDescriptor descriptor) {
public void execute(final SensorContext context) {
final Optional<String> key = context.config().get(QubooProperties.ACCESS_KEY);
final Optional<String> secret = context.config().get(QubooProperties.SECRET_KEY);
final Optional<String> token = context.config().get(QubooProperties.TOKEN_KEY);
key.ifPresent(accessKey -> context.addContextProperty(QubooProperties.ACCESS_KEY, accessKey));
secret.ifPresent(s -> context.addContextProperty(QubooProperties.SECRET_KEY, s));
log.info("Access key is "+key.orElse("NOT PRESENT"));
token.ifPresent(s -> context.addContextProperty(QubooProperties.TOKEN_KEY, s));
log.info("Access key is " + key.orElse("NOT PRESENT"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
*/
package io.tpd.quboo.sonarplugin.settings;

import org.sonar.api.PropertyType;
import org.sonar.api.config.PropertyDefinition;

import java.util.List;
Expand All @@ -29,6 +30,7 @@ public class QubooProperties {

public static final String ACCESS_KEY = "sonar.quboo.access-key";
public static final String SECRET_KEY = "sonar.quboo.secret-key";
public static final String TOKEN_KEY = "sonar.quboo.token";
public static final String DEFAULT_ACCESS_KEY = "your-access-key";
public static final String DEFAULT_SECRET_KEY = "your-secret-key";
public static final String CATEGORY = "Quboo";
Expand All @@ -44,12 +46,22 @@ public static List<PropertyDefinition> getProperties() {
.description("Your organization account access key to export report summary to Quboo")
.defaultValue(DEFAULT_ACCESS_KEY)
.category(CATEGORY)
.index(1)
.build(),
PropertyDefinition.builder(SECRET_KEY)
.name("Quboo Secret Key")
.description("Your organization account secret key to export report summary to Quboo")
.defaultValue(DEFAULT_SECRET_KEY)
.category(CATEGORY)
.index(2)
.build(),
PropertyDefinition.builder(TOKEN_KEY)
.name("API Token")
.description("You need to enter a valid API token if your SonarQube server requires authentication")
.defaultValue("")
.category(CATEGORY)
.type(PropertyType.PASSWORD)
.index(3)
.build()
);
}
Expand Down

0 comments on commit aedba57

Please sign in to comment.