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

Commit 3ec5cc79 authored by Yi Jin's avatar Yi Jin
Browse files

Modify SystemApi so it can be used by CTS to trigger incident report

Bug: 72502621
Test: Cts/Gts tests covered, see the cls from the same topic
Change-Id: Id0c1cc0fc0054e620de1349dab66513e554b1caa
parent 8a972cf3
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ PrivacySpec::CheckPremission(const Privacy* privacy, const uint8_t defaultDest)
bool
PrivacySpec::RequireAll() const { return dest == android::os::DEST_LOCAL; }

PrivacySpec new_spec_from_args(int dest)
PrivacySpec PrivacySpec::new_spec(int dest)
{
    switch (dest) {
        case android::os::DEST_AUTOMATIC:
@@ -77,4 +77,7 @@ PrivacySpec new_spec_from_args(int dest)
    }
}

PrivacySpec get_default_dropbox_spec() { return PrivacySpec(android::os::DEST_AUTOMATIC); }
 No newline at end of file
PrivacySpec PrivacySpec::get_default_dropbox_spec()
{
    return PrivacySpec(android::os::DEST_AUTOMATIC);
}
+6 −5
Original line number Diff line number Diff line
@@ -65,8 +65,6 @@ public:
    const uint8_t dest;

    PrivacySpec() : dest(DEST_DEFAULT_VALUE) {}
    PrivacySpec(uint8_t dest) : dest(dest) {}

    bool operator<(const PrivacySpec& other) const;

    // check permission of a policy, if returns true, don't strip the data.
@@ -74,9 +72,12 @@ public:

    // if returns true, no data need to be stripped.
    bool RequireAll() const;
};

PrivacySpec new_spec_from_args(int dest);
PrivacySpec get_default_dropbox_spec();
    // Constructs spec using static methods below.
    static PrivacySpec new_spec(int dest);
    static PrivacySpec get_default_dropbox_spec();
private:
    PrivacySpec(uint8_t dest) : dest(dest) {}
};

#endif // PRIVACY_H
+11 −1
Original line number Diff line number Diff line
@@ -64,7 +64,8 @@ ReportRequest::ok()
ReportRequestSet::ReportRequestSet()
    :mRequests(),
     mSections(),
     mMainFd(-1)
     mMainFd(-1),
     mMainDest(-1)
{
}

@@ -86,6 +87,12 @@ ReportRequestSet::setMainFd(int fd)
    mMainFd = fd;
}

void
ReportRequestSet::setMainDest(int dest)
{
    mMainDest = dest;
}

bool
ReportRequestSet::containsSection(int id) {
    return mSections.containsSection(id);
@@ -125,12 +132,14 @@ Reporter::runReport()
    status_t err = NO_ERROR;
    bool needMainFd = false;
    int mainFd = -1;
    int mainDest = -1;
    HeaderSection headers;

    // See if we need the main file
    for (ReportRequestSet::iterator it=batch.begin(); it!=batch.end(); it++) {
        if ((*it)->fd < 0 && mainFd < 0) {
            needMainFd = true;
            mainDest = (*it)->args.dest();
            break;
        }
    }
@@ -154,6 +163,7 @@ Reporter::runReport()

        // Add to the set
        batch.setMainFd(mainFd);
        batch.setMainDest(mainDest);
    }

    // Tell everyone that we're starting.
+3 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ public:

    void add(const sp<ReportRequest>& request);
    void setMainFd(int fd);
    void setMainDest(int dest);

    typedef vector<sp<ReportRequest>>::iterator iterator;

@@ -61,10 +62,12 @@ public:

    int mainFd() { return mMainFd; }
    bool containsSection(int id);
    int mainDest() { return mMainDest; }
private:
    vector<sp<ReportRequest>> mRequests;
    IncidentReportArgs mSections;
    int mMainFd;
    int mMainDest;
};

// ================================================================================
+12 −7
Original line number Diff line number Diff line
@@ -152,36 +152,40 @@ write_report_requests(const int id, const FdBuffer& buffer, ReportRequestSet* re

    // The streaming ones, group requests by spec in order to save unnecessary strip operations
    map<PrivacySpec, vector<sp<ReportRequest>>> requestsBySpec;
    for (ReportRequestSet::iterator it = requests->begin(); it != requests->end(); it++) {
    for (auto it = requests->begin(); it != requests->end(); it++) {
        sp<ReportRequest> request = *it;
        if (!request->ok() || !request->args.containsSection(id)) {
            continue;  // skip invalid request
        }
        PrivacySpec spec = new_spec_from_args(request->args.dest());
        PrivacySpec spec = PrivacySpec::new_spec(request->args.dest());
        requestsBySpec[spec].push_back(request);
    }

    for (map<PrivacySpec, vector<sp<ReportRequest>>>::iterator mit = requestsBySpec.begin(); mit != requestsBySpec.end(); mit++) {
    for (auto mit = requestsBySpec.begin(); mit != requestsBySpec.end(); mit++) {
        PrivacySpec spec = mit->first;
        err = privacyBuffer.strip(spec);
        if (err != NO_ERROR) return err; // it means the privacyBuffer data is corrupted.
        if (privacyBuffer.size() == 0) continue;

        for (vector<sp<ReportRequest>>::iterator it = mit->second.begin(); it != mit->second.end(); it++) {
        for (auto it = mit->second.begin(); it != mit->second.end(); it++) {
            sp<ReportRequest> request = *it;
            err = write_section_header(request->fd, id, privacyBuffer.size());
            if (err != NO_ERROR) { request->err = err; continue; }
            err = privacyBuffer.flush(request->fd);
            if (err != NO_ERROR) { request->err = err; continue; }
            writeable++;
            ALOGD("Section %d flushed %zu bytes to fd %d with spec %d", id, privacyBuffer.size(), request->fd, spec.dest);
            ALOGD("Section %d flushed %zu bytes to fd %d with spec %d", id,
                  privacyBuffer.size(), request->fd, spec.dest);
        }
        privacyBuffer.clear();
    }

    // The dropbox file
    if (requests->mainFd() >= 0) {
        err = privacyBuffer.strip(get_default_dropbox_spec());
        PrivacySpec spec = requests->mainDest() < 0 ?
                PrivacySpec::get_default_dropbox_spec() :
                PrivacySpec::new_spec(requests->mainDest());
        err = privacyBuffer.strip(spec);
        if (err != NO_ERROR) return err; // the buffer data is corrupted.
        if (privacyBuffer.size() == 0) goto DONE;

@@ -190,7 +194,8 @@ write_report_requests(const int id, const FdBuffer& buffer, ReportRequestSet* re
        err = privacyBuffer.flush(requests->mainFd());
        if (err != NO_ERROR) { requests->setMainFd(-1); goto DONE; }
        writeable++;
        ALOGD("Section %d flushed %zu bytes to dropbox %d", id, privacyBuffer.size(), requests->mainFd());
        ALOGD("Section %d flushed %zu bytes to dropbox %d with spec %d", id,
              privacyBuffer.size(), requests->mainFd(), spec.dest);
    }

DONE:
Loading