1 /*
2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "permission_map.h"
16 #include "permission_map_constant.h"
17
18 #include <map>
19 #include <mutex>
20 #include <string>
21 #include <vector>
22
23 namespace OHOS {
24 namespace Security {
25 namespace AccessToken {
26 static bool g_initedPermMap = false;
27 static std::mutex g_lockPermMap;
28
29 class CharArrayCompare {
30 public:
CharArrayCompare()31 CharArrayCompare() {};
32
operator ()(const char * str1,const char * str2) const33 bool operator() (const char* str1, const char* str2) const
34 {
35 if (str1 == str2) {
36 return false;
37 } else {
38 return (strcmp(str1, str2) < 0);
39 }
40 }
41 };
42 std::map<const char*, uint32_t, CharArrayCompare> g_permMap;
43
InitMap()44 static void InitMap()
45 {
46 std::lock_guard<std::mutex> lock(g_lockPermMap);
47 if (g_initedPermMap) {
48 return;
49 }
50 for (uint32_t i = 0; i < MAX_PERM_SIZE; i++) {
51 g_permMap[g_permList[i].permissionName] = i;
52 }
53 g_initedPermMap = true;
54 }
55
TransferPermissionToOpcode(const std::string & permission,uint32_t & opCode)56 bool TransferPermissionToOpcode(const std::string& permission, uint32_t& opCode)
57 {
58 if (!g_initedPermMap) {
59 InitMap();
60 }
61 auto it = g_permMap.find(permission.c_str());
62 if (it == g_permMap.end()) {
63 return false;
64 }
65 opCode = it->second;
66 return true;
67 }
68
TransferOpcodeToPermission(uint32_t opCode,std::string & permission)69 bool TransferOpcodeToPermission(uint32_t opCode, std::string& permission)
70 {
71 if (opCode >= MAX_PERM_SIZE) {
72 return false;
73 }
74 permission = std::string(g_permList[opCode].permissionName);
75 return true;
76 }
77
IsUserGrantPermission(const std::string & permission)78 bool IsUserGrantPermission(const std::string& permission)
79 {
80 uint32_t opCode;
81 if (!TransferPermissionToOpcode(permission, opCode)) {
82 return false; // default is false
83 }
84 return g_permList[opCode].grantMode == USER_GRANT;
85 }
86
IsDefinedPermission(const std::string & permission)87 bool IsDefinedPermission(const std::string& permission)
88 {
89 if (!g_initedPermMap) {
90 InitMap();
91 }
92 auto it = g_permMap.find(permission.c_str());
93 if (it == g_permMap.end()) {
94 return false;
95 }
96 return true;
97 }
98
GetPermissionBriefDef(const std::string & permission,PermissionBriefDef & permissionBriefDef)99 bool GetPermissionBriefDef(const std::string& permission, PermissionBriefDef &permissionBriefDef)
100 {
101 uint32_t opCode;
102 if (!TransferPermissionToOpcode(permission, opCode)) {
103 return false; // default is false
104 }
105 permissionBriefDef = g_permList[opCode];
106 return true;
107 }
108
GetPermissionBriefDef(uint32_t opCode,PermissionBriefDef & permissionBriefDef)109 void GetPermissionBriefDef(uint32_t opCode, PermissionBriefDef &permissionBriefDef)
110 {
111 permissionBriefDef = g_permList[opCode];
112 }
113
ConvertPermissionBriefToDef(const PermissionBriefDef & briefDef,PermissionDef & def)114 void ConvertPermissionBriefToDef(const PermissionBriefDef& briefDef, PermissionDef &def)
115 {
116 def.permissionName = std::string(briefDef.permissionName);
117 def.grantMode = static_cast<int>(briefDef.grantMode);
118 def.availableLevel = briefDef.availableLevel;
119 def.provisionEnable = briefDef.provisionEnable;
120 def.distributedSceneEnable = briefDef.distributedSceneEnable;
121 def.availableType = briefDef.availableType;
122 def.isKernelEffect = briefDef.isKernelEffect;
123 def.hasValue = briefDef.hasValue;
124 }
125
IsPermissionValidForHap(const std::string & permissionName)126 bool IsPermissionValidForHap(const std::string& permissionName)
127 {
128 uint32_t opCode;
129 if (!TransferPermissionToOpcode(permissionName, opCode)) {
130 return false;
131 }
132
133 return g_permList[opCode].availableType != ATokenAvailableTypeEnum::SERVICE;
134 }
135
GetDefPermissionsSize()136 size_t GetDefPermissionsSize()
137 {
138 return MAX_PERM_SIZE;
139 }
140
GetPermDefVersion()141 const char* GetPermDefVersion()
142 {
143 return PERMISSION_DEFINITION_VERSION;
144 }
145 } // namespace AccessToken
146 } // namespace Security
147 } // namespace OHOS
148