1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker #pragma once 17*d57664e9SAndroid Build Coastguard Worker 18*d57664e9SAndroid Build Coastguard Worker #include "WorkDirectory.h" 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <android/os/BnIncidentAuthListener.h> 21*d57664e9SAndroid Build Coastguard Worker #include <android/os/IIncidentCompanion.h> 22*d57664e9SAndroid Build Coastguard Worker #include <frameworks/base/cmds/incidentd/src/report_file.pb.h> 23*d57664e9SAndroid Build Coastguard Worker 24*d57664e9SAndroid Build Coastguard Worker namespace android { 25*d57664e9SAndroid Build Coastguard Worker namespace os { 26*d57664e9SAndroid Build Coastguard Worker namespace incidentd { 27*d57664e9SAndroid Build Coastguard Worker 28*d57664e9SAndroid Build Coastguard Worker using android::binder::Status; 29*d57664e9SAndroid Build Coastguard Worker using android::os::BnIncidentAuthListener; 30*d57664e9SAndroid Build Coastguard Worker using android::os::IIncidentCompanion; 31*d57664e9SAndroid Build Coastguard Worker 32*d57664e9SAndroid Build Coastguard Worker class ReportHandler; 33*d57664e9SAndroid Build Coastguard Worker 34*d57664e9SAndroid Build Coastguard Worker class Broadcaster : public virtual RefBase { 35*d57664e9SAndroid Build Coastguard Worker public: 36*d57664e9SAndroid Build Coastguard Worker enum broadcast_status_t { 37*d57664e9SAndroid Build Coastguard Worker BROADCASTS_FINISHED = 0, 38*d57664e9SAndroid Build Coastguard Worker BROADCASTS_REPEAT = 1, 39*d57664e9SAndroid Build Coastguard Worker BROADCASTS_BACKOFF = 2 40*d57664e9SAndroid Build Coastguard Worker }; 41*d57664e9SAndroid Build Coastguard Worker 42*d57664e9SAndroid Build Coastguard Worker Broadcaster(const sp<WorkDirectory>& workDirectory); 43*d57664e9SAndroid Build Coastguard Worker 44*d57664e9SAndroid Build Coastguard Worker void setHandler(const sp<ReportHandler>& handler); 45*d57664e9SAndroid Build Coastguard Worker 46*d57664e9SAndroid Build Coastguard Worker /** 47*d57664e9SAndroid Build Coastguard Worker * Reset the beginning timestamp for broadcasts. Call this when 48*d57664e9SAndroid Build Coastguard Worker * the system_server restarts. 49*d57664e9SAndroid Build Coastguard Worker */ 50*d57664e9SAndroid Build Coastguard Worker void reset(); 51*d57664e9SAndroid Build Coastguard Worker 52*d57664e9SAndroid Build Coastguard Worker /** 53*d57664e9SAndroid Build Coastguard Worker * Remove the history record for the broadcasts, including pending authorizations 54*d57664e9SAndroid Build Coastguard Worker * if necessary. 55*d57664e9SAndroid Build Coastguard Worker */ 56*d57664e9SAndroid Build Coastguard Worker void clearBroadcasts(const string& pkg, const string& cls, const string& id); 57*d57664e9SAndroid Build Coastguard Worker void clearPackageBroadcasts(const string& pkg); 58*d57664e9SAndroid Build Coastguard Worker 59*d57664e9SAndroid Build Coastguard Worker /** 60*d57664e9SAndroid Build Coastguard Worker * Send whichever broadcasts have been pending. 61*d57664e9SAndroid Build Coastguard Worker */ 62*d57664e9SAndroid Build Coastguard Worker broadcast_status_t sendBroadcasts(); 63*d57664e9SAndroid Build Coastguard Worker 64*d57664e9SAndroid Build Coastguard Worker private: 65*d57664e9SAndroid Build Coastguard Worker struct ReportId { 66*d57664e9SAndroid Build Coastguard Worker ReportId(); 67*d57664e9SAndroid Build Coastguard Worker ReportId(const ReportId& that); 68*d57664e9SAndroid Build Coastguard Worker ReportId(const string& i, const string& p, const string& c); 69*d57664e9SAndroid Build Coastguard Worker ~ReportId(); 70*d57664e9SAndroid Build Coastguard Worker 71*d57664e9SAndroid Build Coastguard Worker bool operator<(const ReportId& that) const; 72*d57664e9SAndroid Build Coastguard Worker 73*d57664e9SAndroid Build Coastguard Worker string id; 74*d57664e9SAndroid Build Coastguard Worker string pkg; 75*d57664e9SAndroid Build Coastguard Worker string cls; 76*d57664e9SAndroid Build Coastguard Worker }; 77*d57664e9SAndroid Build Coastguard Worker 78*d57664e9SAndroid Build Coastguard Worker class ConsentListener : public BnIncidentAuthListener { 79*d57664e9SAndroid Build Coastguard Worker public: 80*d57664e9SAndroid Build Coastguard Worker ConsentListener(const sp<Broadcaster>& broadcaster, const ReportId& reportId); 81*d57664e9SAndroid Build Coastguard Worker virtual ~ConsentListener(); 82*d57664e9SAndroid Build Coastguard Worker virtual Status onReportApproved(); 83*d57664e9SAndroid Build Coastguard Worker virtual Status onReportDenied(); 84*d57664e9SAndroid Build Coastguard Worker private: 85*d57664e9SAndroid Build Coastguard Worker sp<Broadcaster> mBroadcaster; 86*d57664e9SAndroid Build Coastguard Worker ReportId mId; 87*d57664e9SAndroid Build Coastguard Worker }; 88*d57664e9SAndroid Build Coastguard Worker 89*d57664e9SAndroid Build Coastguard Worker struct ReportStatus { 90*d57664e9SAndroid Build Coastguard Worker ReportStatus(); 91*d57664e9SAndroid Build Coastguard Worker ReportStatus(const ReportStatus& that); 92*d57664e9SAndroid Build Coastguard Worker ~ReportStatus(); 93*d57664e9SAndroid Build Coastguard Worker 94*d57664e9SAndroid Build Coastguard Worker bool approval_sent; 95*d57664e9SAndroid Build Coastguard Worker bool ready_sent; 96*d57664e9SAndroid Build Coastguard Worker sp<ConsentListener> listener; 97*d57664e9SAndroid Build Coastguard Worker }; 98*d57664e9SAndroid Build Coastguard Worker 99*d57664e9SAndroid Build Coastguard Worker sp<ReportHandler> mReportHandler; 100*d57664e9SAndroid Build Coastguard Worker sp<WorkDirectory> mWorkDirectory; 101*d57664e9SAndroid Build Coastguard Worker 102*d57664e9SAndroid Build Coastguard Worker // protected by mLock 103*d57664e9SAndroid Build Coastguard Worker mutex mLock; 104*d57664e9SAndroid Build Coastguard Worker map<ReportId,ReportStatus> mHistory; // what we sent so we don't send it again 105*d57664e9SAndroid Build Coastguard Worker int64_t mLastSent; 106*d57664e9SAndroid Build Coastguard Worker 107*d57664e9SAndroid Build Coastguard Worker void set_last_sent(int64_t timestamp); 108*d57664e9SAndroid Build Coastguard Worker int64_t get_last_sent(); 109*d57664e9SAndroid Build Coastguard Worker void print_report_statuses() const; 110*d57664e9SAndroid Build Coastguard Worker status_t send_approval_broadcasts(const string& id, const string& pkg, const string& cls); 111*d57664e9SAndroid Build Coastguard Worker void report_approved(const ReportId& reportId); 112*d57664e9SAndroid Build Coastguard Worker void report_denied(const ReportId& reportId); 113*d57664e9SAndroid Build Coastguard Worker status_t send_report_ready_broadcasts(const string& id, const string& pkg, const string& cls); 114*d57664e9SAndroid Build Coastguard Worker status_t send_to_dropbox(const sp<ReportFile>& file, const IncidentReportArgs& args); 115*d57664e9SAndroid Build Coastguard Worker bool was_approval_sent(const string& id, const string& pkg, const string& cls); 116*d57664e9SAndroid Build Coastguard Worker void set_approval_sent(const string& id, const string& pkg, const string& cls, 117*d57664e9SAndroid Build Coastguard Worker const sp<ConsentListener>& listener); 118*d57664e9SAndroid Build Coastguard Worker bool was_ready_sent(const string& id, const string& pkg, const string& cls); 119*d57664e9SAndroid Build Coastguard Worker void set_ready_sent(const string& id, const string& pkg, const string& cls); 120*d57664e9SAndroid Build Coastguard Worker sp<IIncidentCompanion> get_incident_companion(); 121*d57664e9SAndroid Build Coastguard Worker }; 122*d57664e9SAndroid Build Coastguard Worker 123*d57664e9SAndroid Build Coastguard Worker 124*d57664e9SAndroid Build Coastguard Worker } // namespace incidentd 125*d57664e9SAndroid Build Coastguard Worker } // namespace os 126*d57664e9SAndroid Build Coastguard Worker } // namespace android 127*d57664e9SAndroid Build Coastguard Worker 128