Skip to content

Commit b4d556a

Browse files
Merge pull request #1573 from seannemann21/show-block-status
Show Block Status if use is blocked
2 parents 8069bb4 + c0d86b7 commit b4d556a

File tree

6 files changed

+145
-0
lines changed

6 files changed

+145
-0
lines changed

app/src/main/java/fr/free/nrw/commons/auth/AuthenticatedActivity.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44

55
import javax.inject.Inject;
66

7+
import fr.free.nrw.commons.R;
78
import fr.free.nrw.commons.mwapi.MediaWikiApi;
89
import fr.free.nrw.commons.theme.NavigationBaseActivity;
10+
import fr.free.nrw.commons.utils.ViewUtil;
11+
import io.reactivex.Observable;
12+
import io.reactivex.android.schedulers.AndroidSchedulers;
13+
import io.reactivex.schedulers.Schedulers;
914

1015
import static fr.free.nrw.commons.auth.AccountUtil.AUTH_COOKIE;
1116

@@ -34,6 +39,8 @@ protected void onCreate(Bundle savedInstanceState) {
3439
if (savedInstanceState != null) {
3540
authCookie = savedInstanceState.getString(AUTH_COOKIE);
3641
}
42+
43+
showBlockStatus();
3744
}
3845

3946
@Override
@@ -45,4 +52,20 @@ protected void onSaveInstanceState(Bundle outState) {
4552
protected abstract void onAuthCookieAcquired(String authCookie);
4653

4754
protected abstract void onAuthFailure();
55+
56+
/**
57+
* Makes API call to check if user is blocked from Commons. If the user is blocked, a snackbar
58+
* is created to notify the user
59+
*/
60+
protected void showBlockStatus()
61+
{
62+
Observable.fromCallable(() -> mediaWikiApi.isUserBlockedFromCommons())
63+
.subscribeOn(Schedulers.io())
64+
.observeOn(AndroidSchedulers.mainThread())
65+
.filter(result -> result)
66+
.subscribe(result -> {
67+
ViewUtil.showSnackbar(findViewById(android.R.id.content), R.string.block_notification);
68+
}
69+
);
70+
}
4871
}

app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ protected void onResume() {
166166
if (sessionManager.getCurrentAccount() != null
167167
&& sessionManager.isUserLoggedIn()
168168
&& sessionManager.getCachedAuthCookie() != null) {
169+
sessionManager.revalidateAuthToken();
169170
startMainActivity();
170171
}
171172
}

app/src/main/java/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApi.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import java.util.Date;
4040
import java.util.List;
4141
import java.util.Locale;
42+
import java.util.TimeZone;
4243
import java.util.concurrent.Callable;
4344

4445
import fr.free.nrw.commons.BuildConfig;
@@ -724,12 +725,48 @@ public Single<Integer> getUploadCount(String userName) {
724725
});
725726
}
726727

728+
/**
729+
* Checks to see if a user is currently blocked from Commons
730+
* @return whether or not the user is blocked from Commons
731+
*/
732+
@Override
733+
public boolean isUserBlockedFromCommons() {
734+
boolean userBlocked = false;
735+
try {
736+
ApiResult result = api.action("query")
737+
.param("action", "query")
738+
.param("format", "xml")
739+
.param("meta", "userinfo")
740+
.param("uiprop", "blockinfo")
741+
.get();
742+
if(result != null) {
743+
String blockEnd = result.getString("/api/query/userinfo/@blockexpiry");
744+
if(blockEnd.equals("infinite"))
745+
{
746+
userBlocked = true;
747+
}
748+
else if (!blockEnd.isEmpty()) {
749+
Date endDate = parseMWDate(blockEnd);
750+
Date current = new Date();
751+
userBlocked = endDate.after(current);
752+
}
753+
754+
}
755+
} catch (Exception e) {
756+
e.printStackTrace();
757+
}
758+
759+
return userBlocked;
760+
}
761+
727762
private Date parseMWDate(String mwDate) {
728763
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH); // Assuming MW always gives me UTC
764+
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
729765
try {
730766
return isoFormat.parse(mwDate);
731767
} catch (ParseException e) {
732768
throw new RuntimeException(e);
733769
}
734770
}
771+
735772
}

app/src/main/java/fr/free/nrw/commons/mwapi/MediaWikiApi.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ public interface MediaWikiApi {
8585
@NonNull
8686
Single<Integer> getUploadCount(String userName);
8787

88+
boolean isUserBlockedFromCommons();
89+
8890
interface ProgressListener {
8991
void onProgress(long transferred, long total);
9092
}

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@
279279
<string name="error_loading_images">Error occurred while loading images.</string>
280280
<string name="image_uploaded_by">Uploaded by: %1$s</string>
281281

282+
<string name="block_notification">You are blocked from editing Commons</string>
282283
<string name="share_app_title">Share App</string>
283284
<string name="share_coordinates_not_present">Coordinates were not specified during image selection</string>
284285
<string name="error_fetching_nearby_places">Error fetching nearby places.</string>

app/src/test/kotlin/fr/free/nrw/commons/mwapi/ApacheHttpClientMediaWikiApiTest.kt

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import org.robolectric.RobolectricTestRunner
1818
import org.robolectric.RuntimeEnvironment
1919
import org.robolectric.annotation.Config
2020
import java.net.URLDecoder
21+
import java.text.SimpleDateFormat
2122
import java.util.*
2223

2324
@RunWith(RobolectricTestRunner::class)
@@ -225,6 +226,86 @@ class ApacheHttpClientMediaWikiApiTest {
225226
assertEquals(23, testObserver.values()[0])
226227
}
227228

229+
@Test
230+
fun isUserBlockedFromCommonsForInfinitelyBlockedUser() {
231+
server.enqueue(MockResponse().setBody("<?xml version=\"1.0\"?><api><query><userinfo id=\"1000\" name=\"testusername\" blockid=\"3000\" blockedby=\"blockerusername\" blockedbyid=\"1001\" blockreason=\"testing\" blockedtimestamp=\"2018-05-24T15:32:09Z\" blockexpiry=\"infinite\"></userinfo></query></api>"))
232+
233+
val result = testObject.isUserBlockedFromCommons();
234+
235+
assertBasicRequestParameters(server, "GET").let { userBlockedRequest ->
236+
parseQueryParams(userBlockedRequest).let { body ->
237+
assertEquals("xml", body["format"])
238+
assertEquals("query", body["action"])
239+
assertEquals("userinfo", body["meta"])
240+
assertEquals("blockinfo", body["uiprop"])
241+
}
242+
}
243+
244+
assertTrue(result)
245+
}
246+
247+
@Test
248+
fun isUserBlockedFromCommonsForTimeBlockedUser() {
249+
val currentDate = Date()
250+
val expiredDate = Date(currentDate.time + 10000)
251+
val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
252+
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"))
253+
server.enqueue(MockResponse().setBody("<?xml version=\"1.0\"?><api><query><userinfo id=\"1000\" name=\"testusername\" blockid=\"3000\" blockedby=\"blockerusername\" blockedbyid=\"1001\" blockreason=\"testing\" blockedtimestamp=\"2018-05-24T15:32:09Z\" blockexpiry=\"" + dateFormat.format(expiredDate) + "\"></userinfo></query></api>"))
254+
255+
val result = testObject.isUserBlockedFromCommons();
256+
257+
assertBasicRequestParameters(server, "GET").let { userBlockedRequest ->
258+
parseQueryParams(userBlockedRequest).let { body ->
259+
assertEquals("xml", body["format"])
260+
assertEquals("query", body["action"])
261+
assertEquals("userinfo", body["meta"])
262+
assertEquals("blockinfo", body["uiprop"])
263+
}
264+
}
265+
266+
assertTrue(result)
267+
}
268+
269+
@Test
270+
fun isUserBlockedFromCommonsForExpiredBlockedUser() {
271+
val currentDate = Date()
272+
val expiredDate = Date(currentDate.time - 10000)
273+
val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
274+
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"))
275+
server.enqueue(MockResponse().setBody("<?xml version=\"1.0\"?><api><query><userinfo id=\"1000\" name=\"testusername\" blockid=\"3000\" blockedby=\"blockerusername\" blockedbyid=\"1001\" blockreason=\"testing\" blockedtimestamp=\"2018-05-24T15:32:09Z\" blockexpiry=\"" + dateFormat.format(expiredDate) + "\"></userinfo></query></api>"))
276+
277+
val result = testObject.isUserBlockedFromCommons();
278+
279+
assertBasicRequestParameters(server, "GET").let { userBlockedRequest ->
280+
parseQueryParams(userBlockedRequest).let { body ->
281+
assertEquals("xml", body["format"])
282+
assertEquals("query", body["action"])
283+
assertEquals("userinfo", body["meta"])
284+
assertEquals("blockinfo", body["uiprop"])
285+
}
286+
}
287+
288+
assertFalse(result)
289+
}
290+
291+
@Test
292+
fun isUserBlockedFromCommonsForNotBlockedUser() {
293+
server.enqueue(MockResponse().setBody("<?xml version=\"1.0\"?><api><query><userinfo id=\"1000\" name=\"testusername\"></userinfo></query></api>"))
294+
295+
val result = testObject.isUserBlockedFromCommons();
296+
297+
assertBasicRequestParameters(server, "GET").let { userBlockedRequest ->
298+
parseQueryParams(userBlockedRequest).let { body ->
299+
assertEquals("xml", body["format"])
300+
assertEquals("query", body["action"])
301+
assertEquals("userinfo", body["meta"])
302+
assertEquals("blockinfo", body["uiprop"])
303+
}
304+
}
305+
306+
assertFalse(result)
307+
}
308+
228309
private fun assertBasicRequestParameters(server: MockWebServer, method: String): RecordedRequest = server.takeRequest().let {
229310
assertEquals("/", it.requestUrl.encodedPath())
230311
assertEquals(method, it.method)

0 commit comments

Comments
 (0)