Add local notification when client receives HTTP 403

Also corrects typo in method name.
This commit is contained in:
Nicholas
2023-01-02 17:20:42 -05:00
committed by GitHub
parent 52062679d4
commit 7959343661
9 changed files with 59 additions and 7 deletions

View File

@@ -23,6 +23,6 @@ public class UnauthorizedReminder extends Reminder {
}
public static boolean isEligible(Context context) {
return TextSecurePreferences.isUnauthorizedRecieved(context);
return TextSecurePreferences.isUnauthorizedReceived(context);
}
}

View File

@@ -26,7 +26,7 @@ final class LogSectionKeyPreferences implements LogSection {
.append("Media Quality : ").append(SignalStore.settings().getSentMediaQuality()).append("\n")
.append("Client Deprecated : ").append(SignalStore.misc().isClientDeprecated()).append("\n")
.append("Push Registered : ").append(SignalStore.account().isRegistered()).append("\n")
.append("Unauthorized Received: ").append(TextSecurePreferences.isUnauthorizedRecieved(context)).append("\n")
.append("Unauthorized Received: ").append(TextSecurePreferences.isUnauthorizedReceived(context)).append("\n")
.append("self.isRegistered() : ").append(SignalStore.account().getAci() == null ? "false" : Recipient.self().isRegistered()).append("\n")
.append("Thread Trimming : ").append(getThreadTrimmingString()).append("\n")
.append("Censorship Setting : ").append(SignalStore.settings().getCensorshipCircumventionEnabled()).append("\n")

View File

@@ -85,7 +85,6 @@ public final class SignalWebSocketHealthMonitor implements HealthMonitor {
break;
case AUTHENTICATION_FAILED:
TextSecurePreferences.setUnauthorizedReceived(context, true);
EventBus.getDefault().post(new ReminderUpdateEvent());
break;
case FAILED:
if (SignalStore.proxy().isProxyEnabled()) {

View File

@@ -0,0 +1,22 @@
package org.thoughtcrime.securesms.net
import android.content.Context
import okhttp3.Interceptor
import okhttp3.Response
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.util.TextSecurePreferences
class UnregisteredInterceptor(val context: Context) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val response = chain.proceed(chain.request())
if (response.code() == 403) {
TextSecurePreferences.setUnauthorizedReceived(context, true)
}
return response
}
companion object {
val TAG = Log.tag(UnregisteredInterceptor::class.java)
}
}

View File

@@ -24,6 +24,7 @@ public final class NotificationIds {
public static final int STORY_THREAD = 700000;
public static final int MESSAGE_DELIVERY_FAILURE = 800000;
public static final int STORY_MESSAGE_DELIVERY_FAILURE = 900000;
public static final int UNREGISTERED_NOTIFICATION_ID = 20230102;
private NotificationIds() { }

View File

@@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.net.RemoteDeprecationDetectorInterceptor
import org.thoughtcrime.securesms.net.SequentialDns
import org.thoughtcrime.securesms.net.StandardUserAgentInterceptor
import org.thoughtcrime.securesms.net.StaticDns
import org.thoughtcrime.securesms.net.UnregisteredInterceptor
import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter
import org.thoughtcrime.securesms.util.Base64
import org.whispersystems.signalservice.api.push.TrustStore
@@ -141,7 +142,8 @@ open class SignalServiceNetworkAccess(context: Context) {
StandardUserAgentInterceptor(),
RemoteDeprecationDetectorInterceptor(),
DeprecatedClientPreventionInterceptor(),
DeviceTransferBlockingInterceptor.getInstance()
DeviceTransferBlockingInterceptor.getInstance(),
UnregisteredInterceptor(context),
)
private val zkGroupServerPublicParams: ByteArray = try {

View File

@@ -209,7 +209,7 @@ public class RecipientDetails {
RegisteredState registeredState = settings.getRegistered();
if (isSelf) {
if (SignalStore.account().isRegistered() && !TextSecurePreferences.isUnauthorizedRecieved(context)) {
if (SignalStore.account().isRegistered() && !TextSecurePreferences.isUnauthorizedReceived(context)) {
registeredState = RegisteredState.REGISTERED;
} else {
registeredState = RegisteredState.NOT_REGISTERED;

View File

@@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.util;
import android.app.PendingIntent;
import android.content.Context;
import android.content.SharedPreferences;
import android.hardware.Camera.CameraInfo;
@@ -11,9 +12,11 @@ import androidx.annotation.ArrayRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.preference.PreferenceManager;
import org.greenrobot.eventbus.EventBus;
import org.signal.core.util.PendingIntentFlags;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
import org.thoughtcrime.securesms.R;
@@ -21,13 +24,16 @@ import org.thoughtcrime.securesms.backup.BackupProtos;
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.events.ReminderUpdateEvent;
import org.thoughtcrime.securesms.jobmanager.impl.SqlCipherMigrationConstraintObserver;
import org.thoughtcrime.securesms.keyvalue.SettingsValues;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.lock.RegistrationLockReminders;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.notifications.NotificationIds;
import org.thoughtcrime.securesms.preferences.widgets.NotificationPrivacyPreference;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.registration.RegistrationNavigationActivity;
import java.util.ArrayList;
import java.util.Arrays;
@@ -443,7 +449,7 @@ public class TextSecurePreferences {
}
public static void setUnauthorizedReceived(Context context, boolean value) {
boolean previous = isUnauthorizedRecieved(context);
boolean previous = isUnauthorizedReceived(context);
setBooleanPreference(context, UNAUTHORIZED_RECEIVED, value);
if (previous != value) {
@@ -453,9 +459,14 @@ public class TextSecurePreferences {
if (value) {
clearLocalCredentials(context);
}
if (value && !previous) {
showUnregisteredNotification(context);
EventBus.getDefault().post(new ReminderUpdateEvent());
}
}
public static boolean isUnauthorizedRecieved(Context context) {
public static boolean isUnauthorizedReceived(Context context) {
return getBooleanPreference(context, UNAUTHORIZED_RECEIVED, false);
}
@@ -1157,6 +1168,20 @@ public class TextSecurePreferences {
return preferences;
}
private static void showUnregisteredNotification(Context context) {
PendingIntent reRegistrationIntent = PendingIntent.getActivity(context,
0,
RegistrationNavigationActivity.newIntentForReRegistration(context),
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntentFlags.immutable());
final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationChannels.getInstance().FAILURES)
.setSmallIcon(R.drawable.ic_signal_logo_large)
.setContentText(context.getString(R.string.LoggedOutNotification_you_have_been_logged_out))
.setContentIntent(reRegistrationIntent)
.setOnlyAlertOnce(true)
.setAutoCancel(true);
NotificationManagerCompat.from(context).notify(NotificationIds.UNREGISTERED_NOTIFICATION_ID, builder.build());
}
// NEVER rename these -- they're persisted by name
public enum MediaKeyboardMode {
EMOJI, STICKER, GIF