From cc7ad71d4135ee0fec25a79ca1e8e78704197418 Mon Sep 17 00:00:00 2001 From: b-mob-notify Date: Mon, 13 Jul 2026 10:06:03 +0000 Subject: [PATCH] =?UTF-8?q?push(core):=20F7PushRegistrar.unregisterBlockin?= =?UTF-8?q?g=20=E2=80=94=20=D1=81=D0=BD=D1=8F=D1=82=D0=B8=D0=B5=20=D1=83?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0=20f7push?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=20logout=20(DELETE=20devices/{id},=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=BA=D1=82=20mail/110);?= =?UTF-8?q?=20compile+detekt=20green?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../f7cloud/core/push/F7PushRegistrar.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/core/push/src/main/java/ru/forbion/f7cloud/core/push/F7PushRegistrar.kt b/core/push/src/main/java/ru/forbion/f7cloud/core/push/F7PushRegistrar.kt index ef97d9e..770cb0a 100644 --- a/core/push/src/main/java/ru/forbion/f7cloud/core/push/F7PushRegistrar.kt +++ b/core/push/src/main/java/ru/forbion/f7cloud/core/push/F7PushRegistrar.kt @@ -81,6 +81,28 @@ object F7PushRegistrar { return code == 0 || code >= 500 || code == 408 || code == 429 } + /** + * Снимает устройство с регистрации в f7push (при logout) ДО очистки локальной сессии. + * Контракт сервера (f7push v0.2.4, подтверждён integrator-b, mail/110): + * `DELETE /ocs/v2.php/apps/f7push/api/v1/devices/{deviceId}`, та же Basic-авторизация + + * `OCS-APIRequest`; идемпотентен (200 `success:true` даже если строки нет). Best-effort: + * ошибку глотаем (сеть могла отвалиться при выходе), возвращаем HTTP-код или 0. + */ + fun unregisterBlocking( + context: Context, + session: AuthSession, + ): Int { + val deviceId = getDeviceId(context) + val endpoint = session.serverUrl.trimEnd('/') + + "/ocs/v2.php/apps/f7push/api/v1/devices/$deviceId" + return try { + deleteRequest(endpoint, session) + } catch (t: Throwable) { + Log.w(TAG, "unregister failed", t) + 0 + } + } + private fun postJson(endpoint: String, session: AuthSession, json: String): Int { val conn = URL(endpoint).openConnection() as HttpURLConnection conn.connectTimeout = 15000 @@ -108,6 +130,25 @@ object F7PushRegistrar { return code } + private fun deleteRequest(endpoint: String, session: AuthSession): Int { + val conn = URL(endpoint).openConnection() as HttpURLConnection + conn.connectTimeout = 15000 + conn.readTimeout = 15000 + conn.requestMethod = "DELETE" + conn.setRequestProperty("Accept", "application/json") + conn.setRequestProperty("OCS-APIRequest", "true") + val basic = android.util.Base64.encodeToString( + "${session.username}:${session.appPassword}".toByteArray(StandardCharsets.UTF_8), + android.util.Base64.NO_WRAP + ) + conn.setRequestProperty("Authorization", "Basic $basic") + + val code = conn.responseCode + drainQuietly(if (code >= 400) conn.errorStream else conn.inputStream) + conn.disconnect() + return code + } + private fun drainQuietly(stream: InputStream?) { if (stream == null) return try {