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 
22 namespace android {
23 namespace os {
24 namespace incidentd {
25 
encode_field_id(const Privacy * p)26 uint64_t encode_field_id(const Privacy* p) { return (uint64_t)p->type << 32 | p->field_id; }
27 
lookup(const Privacy * p,uint32_t fieldId)28 const 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 
allowDest(const uint8_t dest,const uint8_t policy)38 static 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 
operator <(const PrivacySpec & other) const53 bool PrivacySpec::operator<(const PrivacySpec& other) const { return dest < other.dest; }
54 
CheckPremission(const Privacy * privacy,const uint8_t defaultDest) const55 bool 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 
RequireAll() const60 bool PrivacySpec::RequireAll() const { return dest == android::os::DEST_LOCAL; }
61 
new_spec(int dest)62 PrivacySpec 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