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

Commit ed3dca68 authored by Narayan Kamath's avatar Narayan Kamath Committed by Android (Google) Code Review
Browse files

Merge "DO NOT MERGE Attribute SOURCE_HOTWORD to OP_RECORD_AUDIO_HOTWORD." into rvc-qpr-dev

parents b197286f d1276440
Loading
Loading
Loading
Loading
+16 −9
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ static String16 resolveCallingPackage(PermissionController& permissionController
}

static bool checkRecordingInternal(const String16& opPackageName, pid_t pid,
        uid_t uid, bool start) {
        uid_t uid, bool start, bool isHotwordSource) {
    // Okay to not track in app ops as audio server or media server is us and if
    // device is rooted security model is considered compromised.
    // system_server loses its RECORD_AUDIO permission when a secondary
@@ -87,16 +87,21 @@ static bool checkRecordingInternal(const String16& opPackageName, pid_t pid,
    }

    AppOpsManager appOps;
    const int32_t op = appOps.permissionToOpCode(sAndroidPermissionRecordAudio);
    const int32_t opRecordAudio = appOps.permissionToOpCode(sAndroidPermissionRecordAudio);

    if (start) {
        const int32_t op = isHotwordSource ?
                AppOpsManager::OP_RECORD_AUDIO_HOTWORD : opRecordAudio;
        if (appOps.startOpNoThrow(op, uid, resolvedOpPackageName, /*startIfModeDefault*/ false)
                != AppOpsManager::MODE_ALLOWED) {
            ALOGE("Request denied by app op: %d", op);
            return false;
        }
    } else {
        if (appOps.checkOp(op, uid, resolvedOpPackageName) != AppOpsManager::MODE_ALLOWED) {
            ALOGE("Request denied by app op: %d", op);
        // Always use OP_RECORD_AUDIO for checks at creation time.
        if (appOps.checkOp(opRecordAudio, uid, resolvedOpPackageName)
                != AppOpsManager::MODE_ALLOWED) {
            ALOGE("Request denied by app op: %d", opRecordAudio);
            return false;
        }
    }
@@ -105,14 +110,15 @@ static bool checkRecordingInternal(const String16& opPackageName, pid_t pid,
}

bool recordingAllowed(const String16& opPackageName, pid_t pid, uid_t uid) {
    return checkRecordingInternal(opPackageName, pid, uid, /*start*/ false);
    return checkRecordingInternal(opPackageName, pid, uid, /*start*/ false,
            /*is_hotword_source*/ false);
}

bool startRecording(const String16& opPackageName, pid_t pid, uid_t uid) {
     return checkRecordingInternal(opPackageName, pid, uid, /*start*/ true);
bool startRecording(const String16& opPackageName, pid_t pid, uid_t uid, bool isHotwordSource) {
     return checkRecordingInternal(opPackageName, pid, uid, /*start*/ true, isHotwordSource);
}

void finishRecording(const String16& opPackageName, uid_t uid) {
void finishRecording(const String16& opPackageName, uid_t uid, bool isHotwordSource) {
    // Okay to not track in app ops as audio server is us and if
    // device is rooted security model is considered compromised.
    if (isAudioServerOrRootUid(uid)) return;
@@ -125,7 +131,8 @@ void finishRecording(const String16& opPackageName, uid_t uid) {
    }

    AppOpsManager appOps;
    const int32_t op = appOps.permissionToOpCode(sAndroidPermissionRecordAudio);
    const int32_t op = isHotwordSource ? AppOpsManager::OP_RECORD_AUDIO_HOTWORD
            : appOps.permissionToOpCode(sAndroidPermissionRecordAudio);
    appOps.finishOp(op, uid, resolvedOpPackageName);
}

+2 −2
Original line number Diff line number Diff line
@@ -79,8 +79,8 @@ static inline bool isAudioServerOrMediaServerUid(uid_t uid) {
}

bool recordingAllowed(const String16& opPackageName, pid_t pid, uid_t uid);
bool startRecording(const String16& opPackageName, pid_t pid, uid_t uid);
void finishRecording(const String16& opPackageName, uid_t uid);
bool startRecording(const String16& opPackageName, pid_t pid, uid_t uid, bool isHotwordSource);
void finishRecording(const String16& opPackageName, uid_t uid, bool isHotwordSource);
bool captureAudioOutputAllowed(pid_t pid, uid_t uid);
bool captureMediaOutputAllowed(pid_t pid, uid_t uid);
bool captureVoiceCommunicationOutputAllowed(pid_t pid, uid_t uid);
+6 −3
Original line number Diff line number Diff line
@@ -572,7 +572,8 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId)
    }

    // check calling permissions
    if (!(startRecording(client->opPackageName, client->pid, client->uid)
    if (!(startRecording(client->opPackageName, client->pid, client->uid,
            client->attributes.source == AUDIO_SOURCE_HOTWORD)
            || client->attributes.source == AUDIO_SOURCE_FM_TUNER)) {
        ALOGE("%s permission denied: recording not allowed for uid %d pid %d",
                __func__, client->uid, client->pid);
@@ -660,7 +661,8 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId)
        client->active = false;
        client->startTimeNs = 0;
        updateUidStates_l();
        finishRecording(client->opPackageName, client->uid);
        finishRecording(client->opPackageName, client->uid,
                        client->attributes.source == AUDIO_SOURCE_HOTWORD);
    }

    return status;
@@ -686,7 +688,8 @@ status_t AudioPolicyService::stopInput(audio_port_handle_t portId)
    updateUidStates_l();

    // finish the recording app op
    finishRecording(client->opPackageName, client->uid);
    finishRecording(client->opPackageName, client->uid,
                    client->attributes.source == AUDIO_SOURCE_HOTWORD);
    AutoCallerClear acc;
    return mAudioPolicyManager->stopInput(portId);
}