Skip to content

Commit 237fd9f

Browse files
committed
Fix: Django session handling
1 parent e530891 commit 237fd9f

5 files changed

Lines changed: 115 additions & 5 deletions

File tree

claimManagement/src/main/java/org/openimis/imisclaims/Global.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import static org.openimis.imisclaims.BuildConfig.RAR_PASSWORD;
6161

6262
import org.openimis.imisclaims.tools.Log;
63+
import org.openimis.imisclaims.network.util.PersistentCookieJar;
6364

6465
public class Global extends Application {
6566
private static final String SHPREF_NAME = "SHPref";
@@ -76,6 +77,7 @@ public class Global extends Application {
7677
private static final String _DefaultRarPassword = RAR_PASSWORD;
7778
private Token JWTToken;
7879
private String[] permissions;
80+
private PersistentCookieJar cookieJar;
7981

8082
public static boolean isRunningTest() {
8183
try {
@@ -129,6 +131,14 @@ public void setUserId(int userId) {
129131
UserId = userId;
130132
}
131133

134+
public void setCookieJar(PersistentCookieJar jar) {
135+
this.cookieJar = jar;
136+
}
137+
138+
public PersistentCookieJar getCookieJar() {
139+
return cookieJar;
140+
}
141+
132142
public void setOfficerName(String officerName) {
133143
OfficerName = officerName;
134144
}
@@ -153,10 +163,20 @@ public String getCsrfToken(){
153163
}
154164

155165
public boolean isLoggedIn() {
156-
boolean isLoggedIn = getJWTToken().isTokenValidJWT();
166+
long expiry = getDefaultSharedPreferences()
167+
.getLong("session_expiry", 0);
168+
169+
boolean isLoggedIn = getJWTToken().isTokenValidJWT()
170+
&& expiry > System.currentTimeMillis();
171+
157172
if (!isLoggedIn) {
158173
getJWTToken().clearToken();
174+
175+
if (cookieJar != null) {
176+
cookieJar.clear();
177+
}
159178
}
179+
160180
return isLoggedIn;
161181
}
162182

claimManagement/src/main/java/org/openimis/imisclaims/network/okhttp/AuthorizationInterceptor.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import okhttp3.Interceptor;
1515
import okhttp3.Request;
1616
import okhttp3.Response;
17+
import okhttp3.ResponseBody;
1718

1819
public class AuthorizationInterceptor implements Interceptor {
1920

@@ -34,10 +35,21 @@ public Response intercept(@NonNull Chain chain) throws IOException {
3435
Request.Builder builder = chain.request().newBuilder();
3536
builder.addHeader("Authorization", "bearer " + token.getTokenText().trim());
3637
builder.addHeader("User-Agent", USER_AGENT);
38+
if (csrfToken != null && !csrfToken.trim().isEmpty()) {
39+
builder.addHeader("X-CSRFToken", csrfToken);
40+
}
3741
Response response = chain.proceed(builder.build());
38-
if (response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
42+
ResponseBody body = response.peekBody(Long.MAX_VALUE);
43+
String bodyString = body.string();
44+
45+
if (bodyString.contains("'csrftoken'") || response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
46+
3947
global.getJWTToken().clearToken();
40-
}
48+
49+
if (global.getCookieJar() != null) {
50+
global.getCookieJar().clear();
51+
}
52+
response = chain.proceed(chain.request());}
4153
return response;
4254
}
4355
return chain.proceed(chain.request());

claimManagement/src/main/java/org/openimis/imisclaims/network/request/GetHealthfacilityGraphQLRequest.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,16 @@
1212
public class GetHealthfacilityGraphQLRequest extends BaseGraphQLRequest{
1313
@NonNull
1414
@WorkerThread
15-
public List<GetHealthFacilityQuery.Edge> get (@NonNull String HfCode) throws Exception {
16-
return makeSynchronous(new GetHealthFacilityQuery(Input.fromNullable(HfCode))).getData().healthFacilities().edges();
15+
public List<GetHealthFacilityQuery.Edge> get(@NonNull String hfCode) throws Exception {
16+
17+
GetHealthFacilityQuery.Data data =
18+
makeSynchronous(new GetHealthFacilityQuery(Input.fromNullable(hfCode)))
19+
.getData();
20+
21+
if (data == null || data.healthFacilities() == null || data.healthFacilities().edges() == null) {
22+
return java.util.Collections.emptyList();
23+
}
24+
25+
return data.healthFacilities().edges();
1726
}
1827
}

claimManagement/src/main/java/org/openimis/imisclaims/network/util/OkHttpUtils.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.openimis.imisclaims.BuildConfig;
88
import org.openimis.imisclaims.Global;
99
import org.openimis.imisclaims.network.okhttp.AuthorizationInterceptor;
10+
import org.openimis.imisclaims.network.util.PersistentCookieJar;
1011

1112
import javax.net.ssl.SSLContext;
1213
import javax.net.ssl.TrustManager;
@@ -23,12 +24,17 @@ private OkHttpUtils() {
2324
throw new IllegalAccessError("This constructor is private");
2425
}
2526

27+
2628
@NonNull
2729
public static OkHttpClient getDefaultOkHttpClient() {
2830
if (client == null) {
2931
synchronized (OkHttpUtils.class) {
3032
if (client == null) {
3133
OkHttpClient.Builder builder = new OkHttpClient.Builder();
34+
PersistentCookieJar cookieJar =
35+
new PersistentCookieJar(Global.getGlobal().getDefaultSharedPreferences());
36+
Global.getGlobal().setCookieJar(cookieJar);
37+
builder.cookieJar(cookieJar);
3238
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
3339
interceptor.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.BASIC);
3440
builder.addInterceptor(interceptor);
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.openimis.imisclaims.network.util;
2+
3+
import android.content.SharedPreferences;
4+
5+
import androidx.annotation.NonNull;
6+
7+
import okhttp3.Cookie;
8+
import okhttp3.CookieJar;
9+
import okhttp3.HttpUrl;
10+
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
public class PersistentCookieJar implements CookieJar {
15+
16+
private final SharedPreferences prefs;
17+
18+
public PersistentCookieJar(SharedPreferences prefs) {
19+
this.prefs = prefs;
20+
}
21+
22+
@Override
23+
public void saveFromResponse(@NonNull HttpUrl url, List<Cookie> cookies) {
24+
25+
for (Cookie cookie : cookies) {
26+
if ("openimis_session".equals(cookie.name())) {
27+
28+
prefs.edit()
29+
.putString("session_value", cookie.value())
30+
.putLong("session_expiry", cookie.expiresAt())
31+
.apply();
32+
}
33+
}
34+
}
35+
36+
@NonNull
37+
@Override
38+
public List<Cookie> loadForRequest(HttpUrl url) {
39+
40+
String value = prefs.getString("session_value", null);
41+
long expiry = prefs.getLong("session_expiry", -1);
42+
43+
if (value == null || expiry == -1) {
44+
return new ArrayList<>();
45+
}
46+
47+
Cookie cookie = new Cookie.Builder()
48+
.name("openimis_session")
49+
.value(value)
50+
.domain(url.host())
51+
.path("/")
52+
.expiresAt(expiry)
53+
.build();
54+
55+
List<Cookie> cookies = new ArrayList<>();
56+
cookies.add(cookie);
57+
return cookies;
58+
}
59+
60+
public void clear() {
61+
prefs.edit().clear().apply();
62+
}
63+
}

0 commit comments

Comments
 (0)