Skip to content

Commit 0c187c8

Browse files
authored
Merge pull request #2 from thepracticaldeveloper/support_auth
Added support for servers requiring authentication
2 parents d4367b7 + aedba57 commit 0c187c8

File tree

4 files changed

+43
-12
lines changed

4 files changed

+43
-12
lines changed

redeploy.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#!/usr/bin/env bash
22
mvn package
3-
cp -v ./target/*.jar /usr/local/Cellar/sonarqube/7.4/libexec/extensions/plugins
3+
cp -v ./target/*.jar /usr/local/Cellar/sonarqube/7.7/libexec/extensions/plugins
44
sonar restart

src/main/java/io/tpd/quboo/sonarplugin/hooks/QubooConnector.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
import io.tpd.quboo.sonarplugin.pojos.Users;
1111
import io.tpd.quboo.sonarplugin.settings.QubooProperties;
1212
import okhttp3.*;
13-
import org.apache.commons.lang3.StringUtils;
1413
import org.sonar.api.ce.posttask.PostProjectAnalysisTask;
1514
import org.sonar.api.platform.Server;
1615
import org.sonar.api.utils.log.Logger;
1716
import org.sonar.api.utils.log.Loggers;
1817

18+
import java.util.Base64;
19+
1920
import static io.tpd.quboo.sonarplugin.settings.QubooProperties.DEFAULT_ACCESS_KEY;
21+
import static org.apache.commons.lang3.StringUtils.isEmpty;
2022

2123
/**
2224
* Sends stats to the Quboo server after an analysis
@@ -38,12 +40,16 @@ public QubooConnector(final Server server) {
3840
public void finished(ProjectAnalysis analysis) {
3941
final String qubooKey = analysis.getScannerContext().getProperties().get(QubooProperties.ACCESS_KEY);
4042
final String qubooSecret = analysis.getScannerContext().getProperties().get(QubooProperties.SECRET_KEY);
41-
if (!StringUtils.isEmpty(qubooKey) && !DEFAULT_ACCESS_KEY.equals(qubooKey)) {
43+
final String token = analysis.getScannerContext().getProperties().get(QubooProperties.TOKEN_KEY);
44+
if (!isEmpty(token)) {
45+
log.info("A token will be used to connect to SonarQube server");
46+
}
47+
if (!isEmpty(qubooKey) && !DEFAULT_ACCESS_KEY.equals(qubooKey)) {
4248
log.info("Connecting to Quboo with quboo key: " + qubooKey);
4349
try {
44-
final UsersWrapper allUsers = getUsers();
50+
final UsersWrapper allUsers = getUsers(token);
4551
sendUsersToQuboo(allUsers, qubooKey, qubooSecret);
46-
final IssuesWrapper allIssues = getIssues();
52+
final IssuesWrapper allIssues = getIssues(token);
4753
sendIssuesToQuboo(allIssues, qubooKey, qubooSecret);
4854
} catch (final Exception e) {
4955
log.error("Error while trying to connect to Quboo", e);
@@ -65,13 +71,15 @@ private void sendIssuesToQuboo(final IssuesWrapper allIssues, final String quboo
6571
log.info("Response " + response.code() + " | " + body);
6672
}
6773

68-
private IssuesWrapper getIssues() throws Exception {
74+
private IssuesWrapper getIssues(final String token) throws Exception {
6975
int pageNumber = 1;
7076
boolean moreData = true;
7177
IssuesWrapper wrapper = new IssuesWrapper();
7278
while (moreData) {
73-
final Request request = new Request.Builder().url(server.getPublicRootUrl() + "/api/issues/search?assigned=true&ps=200&p=" + pageNumber).get().build();
74-
final Response response = http.newCall(request).execute();
79+
final Request.Builder request = new Request.Builder()
80+
.url(server.getPublicRootUrl() + "/api/issues/search?assigned=true&ps=200&p=" + pageNumber).get();
81+
addAuthorizationIfNeeded(request, token);
82+
final Response response = http.newCall(request.build()).execute();
7583
final String body = response.body().string();
7684
final Issues issues = mapper.readValue(body, Issues.class);
7785
wrapper.filterAndAddIssues(issues, server.getVersion());
@@ -94,14 +102,15 @@ private void sendUsersToQuboo(final UsersWrapper allUsers, final String qubooKey
94102
log.info("Response " + response.code() + " | " + body);
95103
}
96104

97-
private UsersWrapper getUsers() {
105+
private UsersWrapper getUsers(final String token) {
98106
int pageNumber = 1;
99107
boolean moreData = true;
100108
UsersWrapper wrapper = new UsersWrapper();
101109
while (moreData) {
102110
try {
103-
final Request request = new Request.Builder().url(server.getPublicRootUrl() + "/api/users/search?ps=200&p=" + pageNumber).get().build();
104-
final Response response = http.newCall(request).execute();
111+
final Request.Builder request = new Request.Builder().url(server.getPublicRootUrl() + "/api/users/search?ps=200&p=" + pageNumber).get();
112+
addAuthorizationIfNeeded(request, token);
113+
final Response response = http.newCall(request.build()).execute();
105114
final String body = response.body().string();
106115
final Users users = mapper.readValue(body, Users.class);
107116
wrapper.filterAndAddUsers(users, server.getVersion());
@@ -120,4 +129,12 @@ private boolean moreData(final Paging paging, final int elementsInPage) {
120129
return elementsInPage == paging.getPageSize() && paging.getTotal() > paging.getPageSize() * paging.getPageIndex();
121130
}
122131

132+
private Request.Builder addAuthorizationIfNeeded(final Request.Builder requestBuilder, final String token) {
133+
if (!isEmpty(token)) {
134+
final String headerValue = "Basic " + Base64.getEncoder().encodeToString((token + ":").getBytes());
135+
requestBuilder.header("Authorization", headerValue);
136+
}
137+
return requestBuilder;
138+
}
139+
123140
}

src/main/java/io/tpd/quboo/sonarplugin/hooks/QubooSensor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ public void describe(final SensorDescriptor descriptor) {
2222
public void execute(final SensorContext context) {
2323
final Optional<String> key = context.config().get(QubooProperties.ACCESS_KEY);
2424
final Optional<String> secret = context.config().get(QubooProperties.SECRET_KEY);
25+
final Optional<String> token = context.config().get(QubooProperties.TOKEN_KEY);
2526
key.ifPresent(accessKey -> context.addContextProperty(QubooProperties.ACCESS_KEY, accessKey));
2627
secret.ifPresent(s -> context.addContextProperty(QubooProperties.SECRET_KEY, s));
27-
log.info("Access key is "+key.orElse("NOT PRESENT"));
28+
token.ifPresent(s -> context.addContextProperty(QubooProperties.TOKEN_KEY, s));
29+
log.info("Access key is " + key.orElse("NOT PRESENT"));
2830
}
2931
}

src/main/java/io/tpd/quboo/sonarplugin/settings/QubooProperties.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
*/
2020
package io.tpd.quboo.sonarplugin.settings;
2121

22+
import org.sonar.api.PropertyType;
2223
import org.sonar.api.config.PropertyDefinition;
2324

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

3031
public static final String ACCESS_KEY = "sonar.quboo.access-key";
3132
public static final String SECRET_KEY = "sonar.quboo.secret-key";
33+
public static final String TOKEN_KEY = "sonar.quboo.token";
3234
public static final String DEFAULT_ACCESS_KEY = "your-access-key";
3335
public static final String DEFAULT_SECRET_KEY = "your-secret-key";
3436
public static final String CATEGORY = "Quboo";
@@ -44,12 +46,22 @@ public static List<PropertyDefinition> getProperties() {
4446
.description("Your organization account access key to export report summary to Quboo")
4547
.defaultValue(DEFAULT_ACCESS_KEY)
4648
.category(CATEGORY)
49+
.index(1)
4750
.build(),
4851
PropertyDefinition.builder(SECRET_KEY)
4952
.name("Quboo Secret Key")
5053
.description("Your organization account secret key to export report summary to Quboo")
5154
.defaultValue(DEFAULT_SECRET_KEY)
5255
.category(CATEGORY)
56+
.index(2)
57+
.build(),
58+
PropertyDefinition.builder(TOKEN_KEY)
59+
.name("API Token")
60+
.description("You need to enter a valid API token if your SonarQube server requires authentication")
61+
.defaultValue("")
62+
.category(CATEGORY)
63+
.type(PropertyType.PASSWORD)
64+
.index(3)
5365
.build()
5466
);
5567
}

0 commit comments

Comments
 (0)