Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e2883cd authored by Steve Elliott's avatar Steve Elliott
Browse files

Fix security error in summarization onboarding

Flag: android.app.nm_summarization_onboarding_ui
Fixes: 422987381
Test: manual
Change-Id: I31484b1694b2db4257574264a05a07d37b17fde5
parent 3c1ffcc1
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -16,19 +16,20 @@

package com.android.systemui.statusbar.notification.stack.domain.interactor

import android.app.NotificationManager
import android.app.INotificationManager
import android.service.notification.Adjustment.KEY_SUMMARIZATION
import androidx.core.content.edit
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.util.kotlin.BooleanFlowOperators.allOf
import com.android.systemui.util.kotlin.SharedPreferencesExt.observeBoolean
import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated
import com.android.systemui.utils.coroutines.flow.mapLatestConflated
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
@@ -39,7 +40,8 @@ class SummarizationOnboardingInteractor
constructor(
    notifListRepo: ActiveNotificationListRepository,
    private val sharedPreferencesInteractor: NotificationsSharedPreferencesInteractor,
    private val notificationManager: NotificationManager,
    private val notificationManager: INotificationManager,
    userInteractor: SelectedUserInteractor,
    @Background private val bgDispatcher: CoroutineDispatcher,
) {
    private val notifsPresent: Flow<Boolean> =
@@ -54,9 +56,8 @@ constructor(
            }
            .distinctUntilChanged()

    private val summarizationAvailableAndDisabled: Flow<Boolean> = flow {
        emit(isAvailableAndDisabled())
    }
    private val summarizationAvailableAndDisabled: Flow<Boolean> =
        userInteractor.selectedUser.mapLatestConflated { userId -> isAvailableAndDisabled(userId) }

    val onboardingNeeded: Flow<Boolean> =
        allOf(onboardingUnseen, summarizationAvailableAndDisabled, notifsPresent)
@@ -69,10 +70,11 @@ constructor(
        }
    }

    private suspend fun isAvailableAndDisabled(): Boolean =
    private suspend fun isAvailableAndDisabled(userId: Int): Boolean =
        withContext(bgDispatcher) {
            KEY_SUMMARIZATION !in notificationManager.unsupportedAdjustmentTypes &&
                KEY_SUMMARIZATION !in notificationManager.allowedAssistantAdjustments
                KEY_SUMMARIZATION !in
                    notificationManager.getAllowedAssistantAdjustmentsForUser(userId)
        }
}

+2 −0
Original line number Diff line number Diff line
@@ -20,3 +20,5 @@ import com.android.systemui.kosmos.Kosmos
import org.mockito.kotlin.mock

var Kosmos.notificationManager: NotificationManager by Kosmos.Fixture { mock {} }

var Kosmos.iNotificationManager: INotificationManager by Kosmos.Fixture { mock {} }
+4 −1
Original line number Diff line number Diff line
@@ -16,17 +16,20 @@

package com.android.systemui.statusbar.notification.stack.domain.interactor

import android.app.iNotificationManager
import android.app.notificationManager
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
import com.android.systemui.user.domain.interactor.selectedUserInteractor

val Kosmos.summarizationOnboardingInteractor by
    Kosmos.Fixture {
        SummarizationOnboardingInteractor(
            notifListRepo = activeNotificationListRepository,
            sharedPreferencesInteractor = notificationsSharedPreferencesInteractor,
            notificationManager = notificationManager,
            userInteractor = selectedUserInteractor,
            notificationManager = iNotificationManager,
            bgDispatcher = testDispatcher,
        )
    }
+8 −1
Original line number Diff line number Diff line
@@ -5518,7 +5518,7 @@ public class NotificationManagerService extends SystemService {
        @Override
        public List<String> getAllowedAssistantAdjustmentsForUser(@UserIdInt int userId) {
            checkCallerIsSystem();
            checkCallerIsSystemOrSystemUi();
            return new ArrayList<>(mAssistants.getAllowedAssistantAdjustments(userId));
        }
@@ -11963,6 +11963,13 @@ public class NotificationManagerService extends SystemService {
        throw new SecurityException("Disallowed call for uid " + Binder.getCallingUid());
    }
    private void checkCallerIsSystemOrSystemUi() {
        if (isCallerSystemOrSystemUi()) {
            return;
        }
        throw new SecurityException("Disallowed call for uid " + Binder.getCallingUid());
    }
    private void checkCallerIsSystemOrSystemUiOrShell() {
        checkCallerIsSystemOrSystemUiOrShell(null);
    }