1 /* 2 * Copyright (c) 2022-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 16 #ifndef SERVICES_EDM_INCLUDE_EDM_IPLUGIN_H 17 #define SERVICES_EDM_INCLUDE_EDM_IPLUGIN_H 18 19 #include <iostream> 20 #include <map> 21 #include <string> 22 #include "edm_errors.h" 23 #include "func_code.h" 24 #include "handle_policy_data.h" 25 #include "iplugin_execute_strategy.h" 26 #include "message_parcel.h" 27 28 namespace OHOS { 29 namespace EDM { 30 constexpr int32_t DEFAULT_USER_ID = 100; 31 constexpr const char *NONE_PERMISSION_MATCH = "NA"; 32 33 class IPlugin { 34 public: 35 enum class PluginType { 36 BASIC = 0, 37 EXTENSION, 38 }; 39 40 enum class PermissionType { 41 NORMAL_DEVICE_ADMIN = 0, 42 SUPER_DEVICE_ADMIN, 43 BYOD_DEVICE_ADMIN, 44 UNKNOWN, 45 }; 46 47 enum class ApiType { 48 PUBLIC = 0, 49 SYSTEM, 50 UNKNOWN, 51 }; 52 53 struct PolicyPermissionConfig { 54 std::map<std::string, std::map<PermissionType, std::string>> tagPermissions; 55 std::map<PermissionType, std::string> typePermissions; 56 ApiType apiType; 57 PolicyPermissionConfigPolicyPermissionConfig58 PolicyPermissionConfig() 59 { 60 apiType = ApiType::UNKNOWN; 61 } 62 PolicyPermissionConfigPolicyPermissionConfig63 PolicyPermissionConfig(std::map<std::string, std::map<PermissionType, std::string>> _tagPermissions, 64 ApiType _apiType) : tagPermissions(std::move(_tagPermissions)), apiType(std::move(_apiType)) {} 65 PolicyPermissionConfigPolicyPermissionConfig66 PolicyPermissionConfig(std::string _permission, PermissionType _permissionType, ApiType _apiType) 67 : apiType(std::move(_apiType)) 68 { 69 typePermissions.emplace(_permissionType, _permission); 70 } 71 PolicyPermissionConfigPolicyPermissionConfig72 PolicyPermissionConfig(std::map<PermissionType, std::string> _typePermissions, 73 ApiType _apiType) : typePermissions(std::move(_typePermissions)), apiType(std::move(_apiType)) {} 74 }; 75 76 /* 77 * handle policy 78 * 79 * @param funcCode func code 80 * @param data Data sent from the IPC 81 * @param reply Reply return to the IPC 82 * @param policyData Policy data after processing 83 * @return If the operation is successful, ERR_OK is returned. 84 */ 85 virtual ErrCode OnHandlePolicy(std::uint32_t funcCode, MessageParcel &data, MessageParcel &reply, 86 HandlePolicyData &policyData, int32_t userId) = 0; 87 88 /* 89 * Merge policy data 90 * 91 * @param adminName current admin name 92 * @param policyData in:Current cached policy data,out:comprehensive data of all admins currently cached. 93 * @return If ERR_OK is returned,policyData incoming and outgoing data will be saved to a file. 94 */ 95 virtual ErrCode MergePolicyData(const std::string &adminName, std::string &policyData); 96 virtual void OnHandlePolicyDone(std::uint32_t funcCode, const std::string &adminName, bool isGlobalChanged, 97 int32_t userId) = 0; 98 virtual ErrCode OnAdminRemove(const std::string &adminName, const std::string &policyData, int32_t userId) = 0; 99 virtual void OnAdminRemoveDone(const std::string &adminName, const std::string ¤tJsonData, 100 int32_t userId) = 0; 101 virtual ErrCode WritePolicyToParcel(const std::string &policyData, MessageParcel &reply); 102 virtual ErrCode OnGetPolicy(std::string &policyData, MessageParcel &data, MessageParcel &reply, 103 int32_t userId) = 0; 104 105 std::uint32_t GetCode(); 106 std::string GetPolicyName(); 107 bool NeedSavePolicy(); 108 bool IsGlobalPolicy(); 109 std::vector<PolicyPermissionConfig> GetAllPermission(); 110 std::string GetPermission(FuncOperateType operaType, PermissionType permissionType, std::string permissionTag = ""); 111 IPlugin::PermissionType GetPermissionType(FuncOperateType operaType); 112 IPlugin::ApiType GetApiType(FuncOperateType operaType); 113 void SetExtensionPlugin(std::shared_ptr<IPlugin> extensionPlugin); 114 void ResetExtensionPlugin(); 115 std::shared_ptr<IPlugin> GetExtensionPlugin(); 116 void SetExecuteStrategy(std::shared_ptr<IPluginExecuteStrategy> strategy); 117 std::shared_ptr<IPluginExecuteStrategy> GetExecuteStrategy(); 118 void SetPluginType(IPlugin::PluginType type); 119 IPlugin::PluginType GetPluginType(); 120 virtual ~IPlugin(); 121 122 protected: 123 std::uint32_t policyCode_ = 0; 124 std::string policyName_; 125 PolicyPermissionConfig permissionConfig_; 126 std::map<FuncOperateType, PolicyPermissionConfig> permissionMap_; 127 std::shared_ptr<IPlugin> extensionPlugin_ = nullptr; 128 std::shared_ptr<IPluginExecuteStrategy> strategy_ = std::make_shared<IPluginExecuteStrategy>(); 129 bool needSave_ = true; 130 bool isGlobal_ = true; 131 IPlugin::PluginType type_ = PluginType::BASIC; 132 133 private: 134 std::string CheckAndGetPermissionFromConfig(PermissionType permissionType, const std::string &permissionTag, 135 std::map<std::string, std::map<PermissionType, std::string>> tagPermissions, 136 std::map<PermissionType, std::string> typePermissions); 137 }; 138 } // namespace EDM 139 } // namespace OHOS 140 141 #endif // SERVICES_EDM_INCLUDE_EDM_IPLUGIN_H 142