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::string _permission, PermissionType _permissionType, ApiType _apiType) 64 : apiType(std::move(_apiType)) 65 { 66 typePermissions.emplace(_permissionType, _permission); 67 } 68 PolicyPermissionConfigPolicyPermissionConfig69 PolicyPermissionConfig(std::map<std::string, std::map<PermissionType, std::string>> _tagPermissions, 70 ApiType _apiType) : tagPermissions(std::move(_tagPermissions)), apiType(std::move(_apiType)) {} 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 GetOthersMergePolicyData(const std::string &adminName, int32_t userId, 96 std::string &othersMergePolicyData); 97 virtual void OnHandlePolicyDone(std::uint32_t funcCode, const std::string &adminName, bool isGlobalChanged, 98 int32_t userId) = 0; 99 virtual ErrCode OnAdminRemove(const std::string &adminName, const std::string &policyData, 100 const std::string &mergeJsonData, int32_t userId) = 0; 101 virtual void OnAdminRemoveDone(const std::string &adminName, const std::string ¤tJsonData, 102 int32_t userId) = 0; 103 virtual ErrCode WritePolicyToParcel(const std::string &policyData, MessageParcel &reply); 104 virtual ErrCode OnGetPolicy(std::string &policyData, MessageParcel &data, MessageParcel &reply, 105 int32_t userId) = 0; OnOtherServiceStart(int32_t systemAbilityId)106 virtual void OnOtherServiceStart(int32_t systemAbilityId) {}; 107 108 std::uint32_t GetCode(); 109 std::string GetPolicyName(); 110 std::uint32_t GetBasicPluginCode(); 111 void SetBasicPluginCode(std::uint32_t basicPluginCode); 112 bool NeedSavePolicy(); 113 bool IsGlobalPolicy(); 114 std::vector<PolicyPermissionConfig> GetAllPermission(); 115 std::string GetPermission(FuncOperateType operaType, PermissionType permissionType, std::string permissionTag = ""); 116 IPlugin::ApiType GetApiType(FuncOperateType operaType); 117 void SetExtensionPlugin(std::shared_ptr<IPlugin> extensionPlugin); 118 void ResetExtensionPlugin(); 119 std::shared_ptr<IPlugin> GetExtensionPlugin(); 120 void SetExecuteStrategy(std::shared_ptr<IPluginExecuteStrategy> strategy); 121 std::shared_ptr<IPluginExecuteStrategy> GetExecuteStrategy(); 122 void SetPluginType(IPlugin::PluginType type); 123 IPlugin::PluginType GetPluginType(); 124 virtual ~IPlugin(); 125 126 protected: 127 std::uint32_t policyCode_ = 0; 128 std::string policyName_; 129 std::uint32_t basicPluginCode_ = 0; 130 PolicyPermissionConfig permissionConfig_; 131 std::map<FuncOperateType, PolicyPermissionConfig> permissionMap_; 132 std::shared_ptr<IPlugin> extensionPlugin_ = nullptr; 133 std::shared_ptr<IPluginExecuteStrategy> strategy_ = std::make_shared<IPluginExecuteStrategy>(); 134 bool needSave_ = true; 135 bool isGlobal_ = true; 136 IPlugin::PluginType type_ = PluginType::BASIC; 137 138 private: 139 std::string CheckAndGetPermissionFromConfig(PermissionType permissionType, const std::string &permissionTag, 140 std::map<std::string, std::map<PermissionType, std::string>> tagPermissions, 141 std::map<PermissionType, std::string> typePermissions); 142 }; 143 } // namespace EDM 144 } // namespace OHOS 145 146 #endif // SERVICES_EDM_INCLUDE_EDM_IPLUGIN_H 147