• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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