Skip to content

Commit 07a8c8e

Browse files
authored
Merge pull request #203 from mngoe/OP-2347
Op 2347
2 parents 47af614 + 91a5bc1 commit 07a8c8e

File tree

5 files changed

+95
-0
lines changed

5 files changed

+95
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,4 @@ app/release/output.json
6565
# Custom product flavours
6666

6767
*custom-flavours.gradle
68+
*.aab

app/src/main/java/org/openimis/imispolicies/network/okhttp/AuthorizationInterceptor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import androidx.annotation.NonNull;
44

5+
import org.apache.commons.lang3.StringUtils;
56
import org.openimis.imispolicies.MainActivity;
67
import org.openimis.imispolicies.repository.LoginRepository;
78

@@ -13,6 +14,7 @@
1314
import okhttp3.Response;
1415

1516
public class AuthorizationInterceptor implements Interceptor {
17+
private static final String REQUESTED_WITH = "mobile";
1618

1719
@NonNull
1820
private final LoginRepository repository;
@@ -25,11 +27,16 @@ public AuthorizationInterceptor(@NonNull LoginRepository repository) {
2527
@Override
2628
public Response intercept(@NonNull Chain chain) throws IOException {
2729
String token = repository.getFhirToken();
30+
String csrfToken = repository.getCsrfToken();
2831
if (token == null) {
2932
return chain.proceed(chain.request());
3033
}
3134
Request.Builder builder = chain.request().newBuilder();
3235
builder.addHeader("Authorization", "bearer " + token.trim());
36+
builder.addHeader("X-Requested-With", REQUESTED_WITH);
37+
if(!StringUtils.isEmpty(csrfToken)){
38+
builder.addHeader("X-CSRFToken", csrfToken);
39+
}
3340
Response response = chain.proceed(builder.build());
3441
if (response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
3542
repository.saveFhirToken(null, null, null);
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.openimis.imispolicies.network.request;
2+
3+
import android.media.session.MediaSession;
4+
5+
import androidx.annotation.NonNull;
6+
import androidx.annotation.WorkerThread;
7+
8+
import com.apollographql.apollo.api.internal.QueryDocumentMinifier;
9+
10+
import org.json.JSONObject;
11+
import org.openimis.imispolicies.BuildConfig;
12+
import org.openimis.imispolicies.Global;
13+
import org.openimis.imispolicies.ToRestApi;
14+
import org.openimis.imispolicies.tools.Log;
15+
16+
import java.util.Objects;
17+
18+
import okhttp3.MediaType;
19+
import okhttp3.OkHttpClient;
20+
import okhttp3.Request;
21+
import okhttp3.RequestBody;
22+
import okhttp3.Response;
23+
24+
public class GetCsrfTokenGraphQLMutation extends BaseGraphQLRequest {
25+
26+
private static final String URI = BuildConfig.API_BASE_URL + "api/graphql";
27+
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
28+
protected Global global;
29+
30+
31+
@WorkerThread
32+
@NonNull
33+
public Response get(@NonNull String jwtToken) throws Exception {
34+
35+
String QUERY_DOCUMENT = QueryDocumentMinifier.minify(
36+
"mutation {"
37+
+ " getCsrfToken {"
38+
+ " csrfToken"
39+
+ " } "
40+
+ " } "
41+
);
42+
43+
JSONObject json = new JSONObject();
44+
json.put("query", QUERY_DOCUMENT);
45+
OkHttpClient.Builder builder = new OkHttpClient.Builder();
46+
OkHttpClient httpClient = builder.build();
47+
RequestBody body = RequestBody.create(json.toString(), JSON);
48+
Request request = new Request.Builder()
49+
.url(URI)
50+
.addHeader("Authorization","bearer " + jwtToken)
51+
.post(body)
52+
.build();
53+
54+
Response response = httpClient.newCall(request).execute();
55+
int responseCode = response.code();
56+
57+
Log.i("HTTP_POST", URI + " - " + responseCode);
58+
Log.i("GetCsrfToken", QUERY_DOCUMENT);
59+
60+
String responsePhrase = Objects.requireNonNull(response.body()).string();
61+
Log.i("RESPONSE", String.format("response: %d %s", responseCode, responsePhrase));
62+
63+
return response;
64+
65+
}
66+
}

app/src/main/java/org/openimis/imispolicies/repository/LoginRepository.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class LoginRepository {
2525
private static final String FHIR_TOKEN = "fhir_token";
2626
private static final String FHIR_VALIDITY = "fhir_validity";
2727
private static final String FHIR_OFFICER_CODE = "fhir_officer_code";
28+
private static final String CSRF_TOKEN = "csrf_token";
2829

2930
private final SharedPreferences prefs;
3031
private final boolean isPaymentEnabled;
@@ -70,6 +71,9 @@ public String getFhirToken() {
7071
return getToken(FHIR_TOKEN, FHIR_VALIDITY, FHIR_OFFICER_CODE);
7172
}
7273

74+
@Nullable
75+
public String getCsrfToken() { return prefs.getString(CSRF_TOKEN, null);}
76+
7377
/**
7478
* Logic taken from [Token.java]
7579
*/
@@ -167,4 +171,13 @@ public void logout() {
167171
saveFhirToken(null, null, null);
168172
saveRestToken(null, null, null);
169173
}
174+
175+
public void saveCsrfToken( @Nullable String csrfToken){
176+
SharedPreferences.Editor editor = prefs.edit();
177+
if (StringUtils.isEmpty(csrfToken)) {
178+
editor.remove(CSRF_TOKEN);
179+
} else {
180+
editor.putString(CSRF_TOKEN, csrfToken);
181+
}
182+
}
170183
}

app/src/main/java/org/openimis/imispolicies/usecase/Login.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,19 @@
1111
import org.openimis.imispolicies.network.dto.LoginDto;
1212
import org.openimis.imispolicies.network.dto.TokenDto;
1313
import org.openimis.imispolicies.network.exception.HttpException;
14+
import org.openimis.imispolicies.network.request.GetCsrfTokenGraphQLMutation;
1415
import org.openimis.imispolicies.network.request.LoginRequest;
1516
import org.openimis.imispolicies.repository.LoginRepository;
17+
import org.openimis.imispolicies.tools.Log;
1618

1719
import java.net.HttpURLConnection;
1820
import java.util.Date;
21+
import java.util.Objects;
1922

2023
import cz.msebera.android.httpclient.HttpEntity;
2124
import cz.msebera.android.httpclient.HttpResponse;
2225
import cz.msebera.android.httpclient.util.EntityUtils;
26+
import okhttp3.Response;
2327

2428
public class Login {
2529

@@ -55,7 +59,11 @@ public void execute(@NonNull String username, @NonNull String password) throws E
5559
}
5660
try {
5761
TokenDto token = request.post(new LoginDto(username.trim(), password));
62+
Response response = new GetCsrfTokenGraphQLMutation().get(token.getToken());
63+
String csrfToken = Objects.requireNonNull(response.body()).toString();
64+
Log.e("response token", response.body().toString());
5865
repository.saveFhirToken(token.getToken(), new Date(token.getExpiresOn()), officerCode);
66+
repository.saveCsrfToken(csrfToken);
5967
if (isPaymentEnabled) {
6068
token = loginToRestApi(username, password);
6169
repository.saveRestToken(token.getToken(), new Date(token.getExpiresOn()), officerCode);

0 commit comments

Comments
 (0)