1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "Privacy.h" 18 19#include <android/os/IncidentReportArgs.h> 20#include <stdlib.h> 21 22namespace android { 23namespace os { 24namespace incidentd { 25 26uint64_t encode_field_id(const Privacy* p) { return (uint64_t)p->type << 32 | p->field_id; } 27 28const Privacy* lookup(const Privacy* p, uint32_t fieldId) { 29 if (p->children == NULL) return NULL; 30 for (int i = 0; p->children[i] != NULL; i++) { // NULL-terminated. 31 if (p->children[i]->field_id == fieldId) return p->children[i]; 32 // Incident section gen tool guarantees field ids in ascending order. 33 if (p->children[i]->field_id > fieldId) return NULL; 34 } 35 return NULL; 36} 37 38static bool allowDest(const uint8_t dest, const uint8_t policy) { 39 switch (policy) { 40 case android::os::DEST_LOCAL: 41 return dest == android::os::DEST_LOCAL; 42 case android::os::DEST_EXPLICIT: 43 case DEST_UNSET: 44 return dest == android::os::DEST_LOCAL || dest == android::os::DEST_EXPLICIT || 45 dest == DEST_UNSET; 46 case android::os::DEST_AUTOMATIC: 47 return true; 48 default: 49 return false; 50 } 51} 52 53bool PrivacySpec::operator<(const PrivacySpec& other) const { return dest < other.dest; } 54 55bool PrivacySpec::CheckPremission(const Privacy* privacy, const uint8_t defaultDest) const { 56 uint8_t policy = privacy != NULL ? privacy->dest : defaultDest; 57 return allowDest(dest, policy); 58} 59 60bool PrivacySpec::RequireAll() const { return dest == android::os::DEST_LOCAL; } 61 62PrivacySpec PrivacySpec::new_spec(int dest) { 63 switch (dest) { 64 case android::os::DEST_AUTOMATIC: 65 case android::os::DEST_EXPLICIT: 66 case android::os::DEST_LOCAL: 67 return PrivacySpec(dest); 68 default: 69 return PrivacySpec(android::os::DEST_AUTOMATIC); 70 } 71} 72 73} // namespace incidentd 74} // namespace os 75} // namespace android 76