Этап 1: единый OkHttpClient ч.2 — 401 централизован через interceptor
- UnauthorizedInterceptor (401→UnauthorizedException) в NetworkFactory, флаг throwOnUnauthorized (по умолчанию true). - Удалены 75 ручных проверок if(code==401) throw в 16 репозиториях. - AuthVerifier (login-верификация) исключён: throwOnUnauthorized=false — 401 = 'неверный пароль' со своим сообщением, не session-expired. - Побочно: 401 теперь ловится единообразно ВЕЗДЕ (включая пути, что раньше забывали проверку). - +3 MockWebServer-теста (401 бросает; 200/403 проходят) — всего 18 тестов. Проверено: 18 тестов зелёные + assembleRelease BUILD SUCCESSFUL, APK 53 МБ.
This commit is contained in:
-4
@@ -46,7 +46,6 @@ class CalendarApiClient {
|
||||
.applyOcsJson()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
val json = parseJsonObject(response.body?.string().orEmpty(), "autocomplete attendee")
|
||||
val data = json.optJSONArray("data") ?: json.optJSONObject("ocs")?.optJSONArray("data") ?: return emptyList()
|
||||
return buildList {
|
||||
@@ -77,7 +76,6 @@ class CalendarApiClient {
|
||||
.applyOcsJson()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
val json = parseJsonObject(response.body?.string().orEmpty(), "autocomplete location")
|
||||
val data = json.optJSONArray("data") ?: return emptyList()
|
||||
return buildList {
|
||||
@@ -104,7 +102,6 @@ class CalendarApiClient {
|
||||
.applyOcsJson()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Calendar config failed HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -124,7 +121,6 @@ class CalendarApiClient {
|
||||
.applyOcsJson()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
val json = parseJsonObject(response.body?.string().orEmpty(), "create talk room")
|
||||
val meta = json.ocsMeta()
|
||||
if (!isOcsSuccess(meta)) error("Не удалось создать комнату Talk")
|
||||
|
||||
@@ -79,7 +79,6 @@ class DeckRepository {
|
||||
private fun getJson(client: okhttp3.OkHttpClient, url: String): Any {
|
||||
val request = Request.Builder().url(url).build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Deck API HTTP ${response.code}")
|
||||
}
|
||||
|
||||
-2
@@ -26,7 +26,6 @@ class SupportRepository {
|
||||
.applyOcsJson()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Support config HTTP ${response.code}")
|
||||
}
|
||||
@@ -266,7 +265,6 @@ class SupportRepository {
|
||||
.post(payload.toRequestBody("application/json; charset=utf-8".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) {
|
||||
val body = response.body?.string().orEmpty()
|
||||
val err = runCatching {
|
||||
|
||||
@@ -24,7 +24,6 @@ class FileDownloadRepository(private val context: Context) {
|
||||
.get()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Не удалось скачать файл (HTTP ${response.code})")
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ class FilesApiRepository {
|
||||
val url = "${session.serverUrl.trimEnd('/')}/index.php/apps/files/api/v1/configs"
|
||||
val request = Request.Builder().url(url).get().build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Files config HTTP ${response.code}")
|
||||
}
|
||||
@@ -48,7 +47,6 @@ class FilesApiRepository {
|
||||
.put(value.toRequestBody("text/plain".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Files config save HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -58,7 +56,6 @@ class FilesApiRepository {
|
||||
val url = "${session.serverUrl.trimEnd('/')}/index.php/apps/files/api/v1/stats"
|
||||
val request = Request.Builder().url(url).get().build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
return FilesStorageStats()
|
||||
}
|
||||
@@ -78,7 +75,6 @@ class FilesApiRepository {
|
||||
"?path=$encodedPath&depth=$depth&format=json"
|
||||
val request = Request.Builder().url(url).applyOcsJson().get().build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
return emptyList()
|
||||
}
|
||||
@@ -99,7 +95,6 @@ class FilesApiRepository {
|
||||
val url = "${session.serverUrl.trimEnd('/')}/index.php/apps/files/api/v1/recent/"
|
||||
val request = Request.Builder().url(url).get().build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Recent files HTTP ${response.code}")
|
||||
}
|
||||
@@ -131,7 +126,6 @@ class FilesApiRepository {
|
||||
"?term=$encoded&format=json"
|
||||
val request = Request.Builder().url(url).applyOcsJson().get().build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
return emptyList()
|
||||
}
|
||||
@@ -188,7 +182,6 @@ class FilesApiRepository {
|
||||
.build()
|
||||
val request = Request.Builder().url(url).applyOcsJson().post(body).build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Не удалось создать ссылку (HTTP ${response.code})")
|
||||
}
|
||||
@@ -211,7 +204,6 @@ class FilesApiRepository {
|
||||
"?path=$encodedPath&reshares=true&format=json"
|
||||
val request = Request.Builder().url(url).applyOcsJson().get().build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) return emptyList()
|
||||
val root = parseJsonObject(response.body!!.string(), "общий доступ")
|
||||
val data = root.optJSONObject("ocs")?.opt("data")
|
||||
@@ -247,7 +239,6 @@ class FilesApiRepository {
|
||||
"?format=json&object_type=files&object_id=$fileId&limit=50&sort=desc"
|
||||
val request = Request.Builder().url(url).applyOcsJson().get().build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (response.code == 204 || !response.isSuccessful || response.body == null) return emptyList()
|
||||
val root = parseJsonObject(response.body!!.string(), "события")
|
||||
val data = root.optJSONObject("ocs")?.opt("data")
|
||||
|
||||
-3
@@ -29,7 +29,6 @@ class FilesTemplatesRepository {
|
||||
.post(body)
|
||||
.build()
|
||||
return client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
parseOcsData(response) { data ->
|
||||
CreatedFile(
|
||||
fileId = data.optLong("fileid"),
|
||||
@@ -54,7 +53,6 @@ class FilesTemplatesRepository {
|
||||
.post(body)
|
||||
.build()
|
||||
return client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
parseOcsData(response) { data ->
|
||||
data.optString("template_path")
|
||||
}
|
||||
@@ -74,7 +72,6 @@ class FilesTemplatesRepository {
|
||||
.post(body)
|
||||
.build()
|
||||
return client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
parseOcsData(response) { data ->
|
||||
data.optString("url").ifBlank {
|
||||
error("Не удалось открыть описание папки")
|
||||
|
||||
-1
@@ -25,7 +25,6 @@ class RichdocumentsRepository {
|
||||
.post(body)
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Richdocuments HTTP ${response.code}")
|
||||
}
|
||||
|
||||
@@ -121,7 +121,6 @@ class MailRepository {
|
||||
.put(payload.toRequestBody("application/json".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Mail API HTTP ${response.code}")
|
||||
}
|
||||
@@ -141,7 +140,6 @@ class MailRepository {
|
||||
.delete()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Mail API HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -160,7 +158,6 @@ class MailRepository {
|
||||
.post(payload.toRequestBody("application/json".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Mail API HTTP ${response.code}")
|
||||
}
|
||||
@@ -178,7 +175,6 @@ class MailRepository {
|
||||
.delete()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Mail API HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -221,7 +217,6 @@ class MailRepository {
|
||||
.patch(payload.toString().toRequestBody("application/json".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Mail API HTTP ${response.code}")
|
||||
}
|
||||
@@ -241,7 +236,6 @@ class MailRepository {
|
||||
.put(payload.toRequestBody("application/json".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Mail API HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -261,7 +255,6 @@ class MailRepository {
|
||||
.post("".toRequestBody("application/json".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Не удалось отправить (HTTP ${response.code})")
|
||||
}
|
||||
}
|
||||
@@ -275,7 +268,6 @@ class MailRepository {
|
||||
.delete()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Не удалось удалить (HTTP ${response.code})")
|
||||
}
|
||||
}
|
||||
@@ -301,7 +293,6 @@ class MailRepository {
|
||||
.put(body.toRequestBody("application/json".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Mail API HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -316,7 +307,6 @@ class MailRepository {
|
||||
.post("".toRequestBody("application/json".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Не удалось переместить (HTTP ${response.code})")
|
||||
}
|
||||
}
|
||||
@@ -337,7 +327,6 @@ class MailRepository {
|
||||
.post("".toRequestBody("application/json".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Не удалось отложить (HTTP ${response.code})")
|
||||
}
|
||||
}
|
||||
@@ -358,7 +347,6 @@ class MailRepository {
|
||||
}
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Не удалось изменить метку (HTTP ${response.code})")
|
||||
}
|
||||
}
|
||||
@@ -371,7 +359,6 @@ class MailRepository {
|
||||
.delete()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Mail API HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -387,7 +374,6 @@ class MailRepository {
|
||||
.header("OCS-APIRequest", "true")
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Вложение HTTP ${response.code}")
|
||||
}
|
||||
@@ -422,7 +408,6 @@ class MailRepository {
|
||||
.post(body)
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Не удалось загрузить вложение (HTTP ${response.code})")
|
||||
}
|
||||
@@ -478,7 +463,6 @@ class MailRepository {
|
||||
.post(payload.toString().toRequestBody("application/json".toMediaType()))
|
||||
.build()
|
||||
val messageId = client.newCall(createRequest).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Не удалось создать письмо (HTTP ${response.code})")
|
||||
}
|
||||
@@ -495,7 +479,6 @@ class MailRepository {
|
||||
.post("".toRequestBody("application/json".toMediaType()))
|
||||
.build()
|
||||
client.newCall(sendRequest).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) {
|
||||
error("Не удалось отправить письмо (HTTP ${response.code})")
|
||||
}
|
||||
@@ -738,7 +721,6 @@ class MailRepository {
|
||||
.header("Accept", "application/json")
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (response.code == 412) error("Mail API: CSRF — обновите приложение")
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Mail API HTTP ${response.code}")
|
||||
|
||||
@@ -59,7 +59,6 @@ object TalkAttachmentUploader {
|
||||
.header("Accept", "application/json")
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) return DEFAULT_ATTACHMENT_FOLDER
|
||||
val data = JSONObject(response.body!!.string())
|
||||
.optJSONObject("ocs")
|
||||
@@ -110,7 +109,6 @@ object TalkAttachmentUploader {
|
||||
val url = davFileUrl(session.serverUrl, davUserId, remotePath.trim('/'))
|
||||
val request = Request.Builder().url(url).head().build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
return response.isSuccessful
|
||||
}
|
||||
}
|
||||
@@ -136,7 +134,6 @@ object TalkAttachmentUploader {
|
||||
.method("MKCOL", ByteArray(0).toRequestBody(null))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
// 405 = already exists
|
||||
}
|
||||
}
|
||||
@@ -156,7 +153,6 @@ object TalkAttachmentUploader {
|
||||
.put(bytes.toRequestBody(mediaType))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) {
|
||||
error("Не удалось загрузить файл: HTTP ${response.code}")
|
||||
}
|
||||
@@ -190,7 +186,6 @@ object TalkAttachmentUploader {
|
||||
.post(body)
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) {
|
||||
error("Не удалось отправить вложение в чат: HTTP ${response.code}")
|
||||
}
|
||||
|
||||
@@ -56,7 +56,6 @@ class TalkRepository {
|
||||
.post(payload.toRequestBody("application/json; charset=utf-8".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) {
|
||||
error("Talk read marker failed: HTTP ${response.code}")
|
||||
}
|
||||
@@ -166,7 +165,6 @@ class TalkRepository {
|
||||
builder.delete()
|
||||
}
|
||||
client.newCall(builder.build()).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Talk favorite failed: HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -181,7 +179,6 @@ class TalkRepository {
|
||||
.delete()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Talk mark unread failed: HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -215,7 +212,6 @@ class TalkRepository {
|
||||
.post(payload.toString().toRequestBody("application/json; charset=utf-8".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (response.code != 201 && !response.isSuccessful) {
|
||||
error("Talk send failed: HTTP ${response.code}")
|
||||
}
|
||||
@@ -270,7 +266,6 @@ class TalkRepository {
|
||||
"DELETE" -> builder.delete()
|
||||
}
|
||||
client.newCall(builder.build()).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Talk request failed: HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -288,7 +283,6 @@ class TalkRepository {
|
||||
.put(body)
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Talk edit failed: HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -323,7 +317,6 @@ class TalkRepository {
|
||||
.delete()
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful) error("Talk delete failed: HTTP ${response.code}")
|
||||
}
|
||||
}
|
||||
@@ -351,7 +344,6 @@ class TalkRepository {
|
||||
.post(payload.toRequestBody("application/json; charset=utf-8".toMediaType()))
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Talk request failed: HTTP ${response.code}")
|
||||
}
|
||||
@@ -371,7 +363,6 @@ class TalkRepository {
|
||||
.header("Accept", "application/json")
|
||||
.build()
|
||||
client.newCall(request).execute().use { response ->
|
||||
if (response.code == 401) throw UnauthorizedException()
|
||||
if (!response.isSuccessful || response.body == null) {
|
||||
error("Talk request failed: HTTP ${response.code}")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user