diff options
author | 2019-03-17 18:26:43 -0700 | |
---|---|---|
committer | 2019-03-26 10:17:55 -0700 | |
commit | 1c36d7566d26b0234053e116a89305fed7190770 (patch) | |
tree | e66f4da41f3f8fd5287d6da0729f9dabe4aec237 | |
parent | 42f8ae9276c7ec45c85b00a93d5b629271f81ab5 (diff) |
Add IncidentReport data structure to aidl for IncidentCompanionService and some extra parameters for incidentd.
Test: bit incident_test:* GtsIncidentManagerTestCases:*
Bug: 123543706
Change-Id: I5a697770b07c809311ddee47259e921338c3088c
-rw-r--r-- | cmds/dumpstate/dumpstate.cpp | 4 | ||||
-rw-r--r-- | libs/incidentcompanion/Android.bp | 6 | ||||
-rw-r--r-- | libs/incidentcompanion/binder/android/os/IIncidentCompanion.aidl | 33 | ||||
-rw-r--r-- | libs/incidentcompanion/binder/android/os/IncidentManager.aidl | 20 | ||||
-rw-r--r-- | libs/incidentcompanion/include/android/os/IncidentManager.h | 71 | ||||
-rw-r--r-- | libs/incidentcompanion/src/IncidentManager.cpp | 135 |
6 files changed, 266 insertions, 3 deletions
diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp index 1fbd2b3820..12de2d2c3c 100644 --- a/cmds/dumpstate/dumpstate.cpp +++ b/cmds/dumpstate/dumpstate.cpp @@ -2735,8 +2735,8 @@ void Dumpstate::CheckUserConsent(int32_t calling_uid, const android::String16& c if (ics != nullptr) { MYLOGD("Checking user consent via incidentcompanion service\n"); android::interface_cast<android::os::IIncidentCompanion>(ics)->authorizeReport( - calling_uid, calling_package, 0x1 /* FLAG_CONFIRMATION_DIALOG */, - consent_callback_.get()); + calling_uid, calling_package, String16(), String16(), + 0x1 /* FLAG_CONFIRMATION_DIALOG */, consent_callback_.get()); } else { MYLOGD("Unable to check user consent; incidentcompanion service unavailable\n"); } diff --git a/libs/incidentcompanion/Android.bp b/libs/incidentcompanion/Android.bp index 45eab00fb6..63411b9698 100644 --- a/libs/incidentcompanion/Android.bp +++ b/libs/incidentcompanion/Android.bp @@ -35,8 +35,12 @@ cc_library_static { }, srcs: [ ":incidentcompanion_aidl", + "src/IncidentManager.cpp", + ], + export_include_dirs: [ + "binder", + "include", ], - export_include_dirs: ["binder"], cflags: [ "-Wall", "-Werror", diff --git a/libs/incidentcompanion/binder/android/os/IIncidentCompanion.aidl b/libs/incidentcompanion/binder/android/os/IIncidentCompanion.aidl index 6bf98d2e27..98c28146ad 100644 --- a/libs/incidentcompanion/binder/android/os/IIncidentCompanion.aidl +++ b/libs/incidentcompanion/binder/android/os/IIncidentCompanion.aidl @@ -17,6 +17,7 @@ package android.os; import android.os.IIncidentAuthListener; +import android.os.IncidentManager; /** * Helper service for incidentd and dumpstated to provide user feedback @@ -35,6 +36,10 @@ interface IIncidentCompanion { * returns via the callback whether the application should be trusted. It is up * to the caller to actually implement the restriction to take or not take * the incident or bug report. + * @param receiverClass The class that will be the eventual broacast receiver for the + * INCIDENT_REPORT_READY message. Used as part of the id in incidentd. + * @param reportId The incident report ID. Incidentd should call with this parameter, but + * everyone else should pass null or empty string. * @param flags FLAG_CONFIRMATION_DIALOG (0x1) - to show this as a dialog. Otherwise * a dialog will be shown as a notification. * @param callback Interface to receive results. The results may not come back for @@ -44,6 +49,7 @@ interface IIncidentCompanion { * to send their report. */ oneway void authorizeReport(int callingUid, String callingPackage, + String receiverClass, String reportId, int flags, IIncidentAuthListener callback); /** @@ -52,6 +58,11 @@ interface IIncidentCompanion { oneway void cancelAuthorization(IIncidentAuthListener callback); /** + * Send the report ready broadcast on behalf of incidentd. + */ + oneway void sendReportReadyBroadcast(String pkg, String cls); + + /** * Return the list of pending approvals. */ List<String> getPendingReports(); @@ -69,4 +80,26 @@ interface IIncidentCompanion { * @param uri the report. */ void denyReport(String uri); + + /** + * List the incident reports for the given ComponentName. The receiver + * must be for a package inside the caller. + */ + List<String> getIncidentReportList(String pkg, String cls); + + /** + * Get the IncidentReport object. + */ + IncidentManager.IncidentReport getIncidentReport(String pkg, String cls, String id); + + /** + * Signal that the client is done with this incident report and it can be deleted. + */ + void deleteIncidentReports(String pkg, String cls, String id); + + /** + * Signal that the client is done with all incident reports from this package. + * Especially useful for testing. + */ + void deleteAllIncidentReports(String pkg); } diff --git a/libs/incidentcompanion/binder/android/os/IncidentManager.aidl b/libs/incidentcompanion/binder/android/os/IncidentManager.aidl new file mode 100644 index 0000000000..d17823ef05 --- /dev/null +++ b/libs/incidentcompanion/binder/android/os/IncidentManager.aidl @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.os; + +parcelable IncidentManager.IncidentReport cpp_header "android/os/IncidentManager.h"; + diff --git a/libs/incidentcompanion/include/android/os/IncidentManager.h b/libs/incidentcompanion/include/android/os/IncidentManager.h new file mode 100644 index 0000000000..07b6d82441 --- /dev/null +++ b/libs/incidentcompanion/include/android/os/IncidentManager.h @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2019, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <binder/Parcel.h> +#include <binder/Parcelable.h> +#include <utils/String16.h> + +#include <set> +#include <vector> + +namespace android { +namespace os { + +class IncidentManager : public virtual RefBase { +public: + class IncidentReport : public Parcelable { + public: + IncidentReport(); + virtual ~IncidentReport(); + + virtual status_t writeToParcel(Parcel* out) const; + virtual status_t readFromParcel(const Parcel* in); + + void setTimestampNs(int64_t val) { mTimestampNs = val; } + int64_t getTimestampNs() const { return mTimestampNs; } + int64_t getTimestampMs() const { return mTimestampNs / 1000000; } + + void setPrivacyPolicy(int32_t val) { mPrivacyPolicy = val; } + // This was accidentally published as a long in the java api. + int64_t getPrivacyPolicy() const { return mPrivacyPolicy; } + // Dups the fd, so you retain ownership of the original one. If there is a + // previously set fd, closes that, since this object owns its own fd. + status_t setFileDescriptor(int fd); + + // Does not dup the fd, so ownership is passed to this object. If there is a + // previously set fd, closes that, since this object owns its own fd. + void takeFileDescriptor(int fd); + + // Returns the fd, which you don't own. Call dup if you need a copy. + int getFileDescriptor() const { return mFileDescriptor; } + + private: + int64_t mTimestampNs; + int32_t mPrivacyPolicy; + int mFileDescriptor; + }; + + +private: + // Not implemented for now. + IncidentManager(); + virtual ~IncidentManager(); +}; +} +} + diff --git a/libs/incidentcompanion/src/IncidentManager.cpp b/libs/incidentcompanion/src/IncidentManager.cpp new file mode 100644 index 0000000000..f7c8a5eecc --- /dev/null +++ b/libs/incidentcompanion/src/IncidentManager.cpp @@ -0,0 +1,135 @@ +/** + * Copyright (c) 2016, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <android/os/IncidentManager.h> + +namespace android { +namespace os { + +// ============================================================ +IncidentManager::IncidentReport::IncidentReport() + :mTimestampNs(0), + mPrivacyPolicy(0), + mFileDescriptor(-1) { +} + +IncidentManager::IncidentReport::~IncidentReport() { + if (mFileDescriptor >= 0) { + close(mFileDescriptor); + } +} + +status_t IncidentManager::IncidentReport::writeToParcel(Parcel* out) const { + status_t err; + + err = out->writeInt64(mTimestampNs); + if (err != NO_ERROR) { + return err; + } + + + err = out->writeInt32(mPrivacyPolicy); + if (err != NO_ERROR) { + return err; + } + + if (mFileDescriptor >= 0) { + err = out->writeInt32(1); + if (err != NO_ERROR) { + return err; + } + + err = out->writeDupParcelFileDescriptor(mFileDescriptor); + if (err != NO_ERROR) { + return err; + } + + } else { + err = out->writeInt32(0); + if (err != NO_ERROR) { + return err; + } + } + + return NO_ERROR; +} + +status_t IncidentManager::IncidentReport::readFromParcel(const Parcel* in) { + status_t err; + int32_t hasField; + + err = in->readInt64(&mTimestampNs); + if (err != NO_ERROR) { + return err; + } + + err = in->readInt32(&mPrivacyPolicy); + if (err != NO_ERROR) { + return err; + } + + err = in->readInt32(&hasField); + if (err != NO_ERROR) { + return err; + } + + if (hasField) { + int fd = in->readParcelFileDescriptor(); + if (fd >= 0) { + mFileDescriptor = dup(fd); + if (mFileDescriptor < 0) { + return -errno; + } + } + } + + return NO_ERROR; +} + +status_t IncidentManager::IncidentReport::setFileDescriptor(int fd) { + if (mFileDescriptor >= 0) { + close(mFileDescriptor); + } + if (fd < 0) { + mFileDescriptor = -1; + } else { + mFileDescriptor = dup(fd); + if (mFileDescriptor < 0) { + return -errno; + } + } + return NO_ERROR; +} + +void IncidentManager::IncidentReport::takeFileDescriptor(int fd) { + if (mFileDescriptor >= 0) { + close(mFileDescriptor); + } + if (fd < 0) { + mFileDescriptor = -1; + } else { + mFileDescriptor = fd; + } +} + +// ============================================================ +IncidentManager::~IncidentManager() { +} + +} +} + + |