Skip to content
This repository was archived by the owner on Jul 21, 2020. It is now read-only.

Commit 274810d

Browse files
authored
Merge pull request #69 from mixer/feat/identifier
feat(*): require client-id header when requesting interactive endpoints
2 parents 05baf74 + 6035f52 commit 274810d

File tree

6 files changed

+27
-21
lines changed

6 files changed

+27
-21
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.mixer</groupId>
88
<artifactId>api</artifactId>
9-
<version>5.0.4-SNAPSHOT</version>
9+
<version>6.0.0-SNAPSHOT</version>
1010

1111
<licenses>
1212
<license>

src/main/java/com/mixer/api/MixerAPI.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ public class MixerAPI {
2727

2828
private static final URI DEFAULT_BASE_PATH = URI.create("https://mixer.com/api/v1/");
2929

30-
public MixerAPI() {
31-
this(null);
30+
public MixerAPI(String clientId) {
31+
this(clientId, null);
3232
}
3333

34-
public MixerAPI(String oauthToken) {
35-
this(DEFAULT_BASE_PATH, oauthToken);
34+
public MixerAPI(String clientId, String oauthToken) {
35+
this(clientId, DEFAULT_BASE_PATH, oauthToken);
3636
}
3737

38-
public MixerAPI(URI basePath, String oauthToken) {
38+
public MixerAPI(String clientId, URI basePath, String oauthToken) {
3939
if (basePath != null) {
4040
this.basePath = basePath;
4141
} else {
@@ -49,7 +49,7 @@ public MixerAPI(URI basePath, String oauthToken) {
4949
.create();
5050

5151
this.executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
52-
this.http = new MixerHttpClient(this, oauthToken);
52+
this.http = new MixerHttpClient(this, clientId, oauthToken);
5353
this.services = new ServiceManager<>();
5454

5555
this.register(new UsersService(this));

src/main/java/com/mixer/api/http/MixerHttpClient.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public class MixerHttpClient {
4747

4848
private String userAgent;
4949
private String oauthToken;
50+
private String clientId;
5051

5152
public static final String X_JWT_HEADER = "X-JWT";
5253
private JSONWebToken jwt;
@@ -57,18 +58,20 @@ public class MixerHttpClient {
5758
public static final int CSRF_STATUS_CODE = 461;
5859
private String csrfToken;
5960

60-
public MixerHttpClient(MixerAPI mixer) {
61-
this(mixer, null);
61+
public MixerHttpClient(MixerAPI mixer, String clientId) {
62+
this(mixer, null, clientId);
6263
}
6364

64-
public MixerHttpClient(MixerAPI mixer, String oauthToken) {
65+
public MixerHttpClient(MixerAPI mixer, String oauthToken, String clientId) {
6566
this.mixer = mixer;
6667
this.cookieStore = new BasicCookieStore();
6768
this.http = this.buildHttpClient();
6869

6970
if (oauthToken != null) {
7071
this.oauthToken = oauthToken;
7172
}
73+
74+
this.clientId = clientId;
7275
}
7376

7477
protected HttpClient buildHttpClient() {
@@ -105,8 +108,7 @@ public ListenableFuture<T> apply(Object o) throws Exception {
105108

106109

107110
public <T> ListenableFuture<T> get(String path, Class<T> type, Map<String, Object> args) {
108-
return this.baseSubmit(this.makeCallable(this.makeRequest(RequestType.GET,
109-
this.buildFromRelativePath(path, args)), type));
111+
return this.baseSubmit(this.makeCallable(this.makeRequest(RequestType.GET, this.buildFromRelativePath(path, args)), type));
110112
}
111113

112114
public <T> ListenableFuture<T> post(String path, Class<T> type, Object... args) {
@@ -155,6 +157,10 @@ private HttpUriRequest makeRequest(RequestType requestType, URI uri, Object... a
155157
if (this.jwt != null) {
156158
requestBuilder.addHeader("Authorization", "JWT " + this.jwtString);
157159
}
160+
161+
if (this.oauthToken == null && this.jwt == null) {
162+
requestBuilder.addHeader("Client-Id", clientId);
163+
}
158164
if (this.csrfToken != null) {
159165
requestBuilder.addHeader(CSRF_TOKEN_HEADER, this.csrfToken);
160166
}

src/test/java/com/mixer/api/test/unit/api/MixerAPITest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
public class MixerAPITest {
1212
@Test
1313
public void itConstructsWithoutParameters() {
14-
MixerAPI mixer = new MixerAPI();
14+
MixerAPI mixer = new MixerAPI("clientId");
1515

1616
Assert.assertEquals(mixer.basePath, URI.create("https://mixer.com/api/v1/"));
1717
Assert.assertNotNull(mixer.gson);
@@ -22,14 +22,14 @@ public void itConstructsWithoutParameters() {
2222
@Test
2323
public void itConstructsWithParameters() {
2424
URI basePath = URI.create("https://localhost:1337/api/v1/");
25-
MixerAPI mixer = new MixerAPI(basePath, "oauthToken");
25+
MixerAPI mixer = new MixerAPI("clientId", basePath, "oauthToken");
2626

2727
Assert.assertEquals(mixer.basePath, basePath);
2828
}
2929

3030
@Test public void itDelegatesToTheServiceManager() {
3131
AbstractMixerService service = Mockito.mock(AbstractMixerService.class);
32-
MixerAPI mixer = new MixerAPI();
32+
MixerAPI mixer = new MixerAPI("clientId");
3333

3434
mixer.register(service);
3535

src/test/java/com/mixer/api/test/unit/http/MixerHttpClientTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,14 @@ public void setup() {
4444

4545
@Test
4646
public void itHandlesCSRF() {
47-
mixerAPI = new MixerAPI();
47+
mixerAPI = new MixerAPI("clientId");
4848
defaultHttpClient = mock(HttpClient.class);
4949

5050
// This is done because Mockito is not able to mock methods that are called within the class'
5151
// Constructor.
5252
class MockableMixerHttpClient extends MixerHttpClient {
5353
private MockableMixerHttpClient(MixerAPI mixer) {
54-
super(mixer);
54+
super(mixer, "clientId");
5555
}
5656

5757
@Override
@@ -105,7 +105,7 @@ private HttpResponse prepareResponse(int expectedResponseStatus, String expected
105105

106106
@Test
107107
public void itHandlesJWT() {
108-
mixerAPI = new MixerAPI();
108+
mixerAPI = new MixerAPI("clientId");
109109
defaultHttpClient = mock(HttpClient.class);
110110

111111
final String jwtString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjU3NDk5NSwiYnR5cCI6ImdyYW50IiwiZ3JvdXBzIjpbeyJpZCI6MSwibmFtZSI6IlVzZXIiLCJVc2VyR3JvdXAiOnsiZ3JvdXBJZCI6MSwidXNlcklkIjo1NzQ5OTV9fV0sImlhdCI6MTQ4MTE0NDQ0NywiZXhwIjoxNTEyNjgwNDQ3LCJpc3MiOiJCZWFtIiwianRpIjoiVGhpcyBpc24ndCBhIHJlYWwgc2Vzc2lvbi4ifQ==.HkL5xq-eivwCk5OgczgIu5s_NFFxdQAKH9Jfb906aT4";
@@ -127,7 +127,7 @@ public void itHandlesJWT() {
127127
// Constructor.
128128
class MockableMixerHttpClient extends MixerHttpClient {
129129
private MockableMixerHttpClient(MixerAPI mixer) {
130-
super(mixer);
130+
super(mixer, "clientId");
131131
}
132132

133133
@Override

src/test/java/com/mixer/api/test/unit/services/AbstractHTTPServiceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
public class AbstractHTTPServiceTest {
1111
@Test public void itFormatsRelativePathNames() {
12-
MixerAPI mixer = new MixerAPI(URI.create("http://localhost:1337/api/v1/"), "oauthToken");
12+
MixerAPI mixer = new MixerAPI("clientId", URI.create("http://localhost:1337/api/v1/"), "oauthToken");
1313
AbstractHTTPService httpService = new SimpleHTTPService(mixer, "foo");
1414

1515
String path = httpService.path("bar");
@@ -18,7 +18,7 @@ public class AbstractHTTPServiceTest {
1818
}
1919

2020
@Test public void itRelativizesAbsolutePaths() {
21-
MixerAPI mixer = new MixerAPI(URI.create("http://localhost:1337/api/v1/"), "oauthToken");
21+
MixerAPI mixer = new MixerAPI("clientId", URI.create("http://localhost:1337/api/v1/"), "oauthToken");
2222
AbstractHTTPService httpService = new SimpleHTTPService(mixer, "foo");
2323

2424
String path = httpService.path("/bar");

0 commit comments

Comments
 (0)