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

Commit b573eb86 authored by Steven Lee's avatar Steven Lee
Browse files

Implement consentless bugreport mechanism

When required conditions are met, bugreport could be approved silently:
 1. BugreportMode allows consentless bugreport.
 2. Current build type is "userdebug" or "eng".
 3. Caller has its OP_CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD App-Op ALLOWED.

 - Adds an IsConsentlessBugreportAllowed() function in dumpstate.cpp.
   The function checks BugreportMode and returns false when mode is BUGREPORT_MODE_TELEPHONY:
   BUGREPORT_MODE_TELEPHONY mode bug reports MUST obtain user consent every time.
 - In Dumpstate::MaybeCheckUserConsent(), pass the consentless bugreport allowance info to
   IncidentCompanionService.authorizeReport() through its flags param.

Ignore-AOSP-First: Consentless bugreport is a pixel-only feature at first.

Legal tracker bug: 262936053
Privacy tracker bug: 262936015
Security tracker bug: 265360498

Bug: 259436697
Bug: 262628255
Bug: 263163716
Test: builds
Test: Manual test
Change-Id: If4decae0c92b79d5157f421c0721b6a1db184ad4
parent 243f1f8f
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -2761,6 +2761,11 @@ static inline const char* ModeToString(Dumpstate::BugreportMode mode) {
    }
}

static bool IsConsentlessBugreportAllowed(const Dumpstate::DumpOptions& options) {
    // only BUGREPORT_TELEPHONY does not allow using consentless bugreport
    return !options.telephony_only;
}

static void SetOptionsFromMode(Dumpstate::BugreportMode mode, Dumpstate::DumpOptions* options,
                               bool is_screenshot_requested) {
    // Modify com.android.shell.BugreportProgressService#isDefaultScreenshotRequired as well for
@@ -3332,9 +3337,12 @@ void Dumpstate::MaybeCheckUserConsent(int32_t calling_uid, const std::string& ca
    android::String16 package(calling_package.c_str());
    if (ics != nullptr) {
        MYLOGD("Checking user consent via incidentcompanion service\n");
        int flags = 0x1; // IncidentManager.FLAG_CONFIRMATION_DIALOG
        if (IsConsentlessBugreportAllowed(*options_)) {
            flags |= 0x2; // IncidentManager.FLAG_ALLOW_CONSENTLESS_BUGREPORT
        }
        android::interface_cast<android::os::IIncidentCompanion>(ics)->authorizeReport(
            calling_uid, package, String16(), String16(),
            0x1 /* FLAG_CONFIRMATION_DIALOG */, consent_callback_.get());
            calling_uid, package, String16(), String16(), flags, consent_callback_.get());
    } else {
        MYLOGD("Unable to check user consent; incidentcompanion service unavailable\n");
    }