1 /*
2 * Copyright (c) 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 #include "clipboard_policy_plugin.h"
17
18 #include "cJSON.h"
19 #include "edm_bundle_manager_impl.h"
20 #include "edm_ipc_interface_code.h"
21 #include "iplugin_manager.h"
22 #include "ipolicy_manager.h"
23 #include "pasteboard_client.h"
24
25 namespace OHOS {
26 namespace EDM {
27 const bool REGISTER_RESULT = IPluginManager::GetInstance()->AddPlugin(ClipboardPolicyPlugin::GetPlugin());
28 const int32_t MAX_PASTEBOARD_POLICY_NUM = 100;
29
InitPlugin(std::shared_ptr<IPluginTemplate<ClipboardPolicyPlugin,std::map<int32_t,ClipboardInfo>>> ptr)30 void ClipboardPolicyPlugin::InitPlugin(
31 std::shared_ptr<IPluginTemplate<ClipboardPolicyPlugin, std::map<int32_t, ClipboardInfo>>> ptr)
32 {
33 EDMLOGI("ClipboardPolicyPlugin InitPlugin...");
34 ptr->InitAttribute(EdmInterfaceCode::CLIPBOARD_POLICY,
35 PolicyName::POLICY_CLIPBOARD_POLICY, EdmPermission::PERMISSION_ENTERPRISE_MANAGE_SECURITY,
36 IPlugin::PermissionType::SUPER_DEVICE_ADMIN, true);
37 ptr->SetSerializer(ClipboardSerializer::GetInstance());
38 ptr->SetOnHandlePolicyListener(&ClipboardPolicyPlugin::OnSetPolicy, FuncOperateType::SET);
39 ptr->SetOnAdminRemoveListener(&ClipboardPolicyPlugin::OnAdminRemove);
40 ptr->SetOtherServiceStartListener(&ClipboardPolicyPlugin::OnOtherServiceStart);
41 }
42
OnSetPolicy(std::map<int32_t,ClipboardInfo> & data,std::map<int32_t,ClipboardInfo> & currentData,std::map<int32_t,ClipboardInfo> & mergeData,int32_t userId)43 ErrCode ClipboardPolicyPlugin::OnSetPolicy(std::map<int32_t, ClipboardInfo> &data,
44 std::map<int32_t, ClipboardInfo> ¤tData, std::map<int32_t, ClipboardInfo> &mergeData, int32_t userId)
45 {
46 EDMLOGI("ClipboardPolicyPlugin OnSetPolicy.");
47 if (data.empty()) {
48 EDMLOGD("ClipboardPolicyPlugin data is empty.");
49 return EdmReturnErrCode::PARAM_ERROR;
50 }
51 std::map<int32_t, ClipboardInfo> afterHandle = currentData;
52 auto it = data.begin();
53 ErrCode ret;
54 if (it->second.policy == ClipboardPolicy::UNKNOWN) {
55 EDMLOGE("OnSetPolicy ClipboardPolicy is UNKNOWN.");
56 return EdmReturnErrCode::PARAM_ERROR;
57 }
58 if (it->second.policy == ClipboardPolicy::DEFAULT) {
59 ret = DeleteHandle(data, afterHandle);
60 } else {
61 ret = UpdateHandle(data, afterHandle);
62 }
63 if (ret != ERR_OK) {
64 EDMLOGE("OnSetPolicy ClipboardPolicy PARAM_ERROR.");
65 return EdmReturnErrCode::PARAM_ERROR;
66 }
67 it = data.begin();
68 std::map<int32_t, ClipboardInfo> afterMerge = mergeData;
69 for (const auto& pair : afterHandle) {
70 if (afterMerge.find(pair.first) == afterMerge.end() ||
71 static_cast<int32_t>(pair.second.policy) < static_cast<int32_t>(afterMerge[pair.first].policy)) {
72 afterMerge[pair.first] = pair.second;
73 }
74 }
75 if (afterMerge.size() > MAX_PASTEBOARD_POLICY_NUM) {
76 return EdmReturnErrCode::PARAM_ERROR;
77 }
78 if (mergeData.find(it->first) != mergeData.end()) {
79 data[it->first] = afterMerge[it->first];
80 }
81 if (FAILED(HandlePasteboardPolicy(data))) {
82 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
83 }
84 currentData = afterHandle;
85 mergeData = afterMerge;
86 return ERR_OK;
87 }
88
DeleteHandle(std::map<int32_t,ClipboardInfo> & data,std::map<int32_t,ClipboardInfo> & afterHandle)89 ErrCode ClipboardPolicyPlugin::DeleteHandle(std::map<int32_t, ClipboardInfo> &data,
90 std::map<int32_t, ClipboardInfo> &afterHandle)
91 {
92 auto it = data.begin();
93 ClipboardInfo info = it->second;
94 int32_t tokenId = it->first;
95 if (it->first == 0) {
96 for (const auto& pair: afterHandle) {
97 if (pair.second.userId == (it->second).userId && pair.second.bundleName == (it->second).bundleName) {
98 tokenId = pair.first;
99 }
100 }
101 if (tokenId == 0) {
102 auto bundleMgr = std::make_shared<EdmBundleManagerImpl>();
103 tokenId = bundleMgr->GetTokenId((it->second).bundleName, (it->second).userId);
104 }
105 data.erase(it->first);
106 data.insert(std::make_pair(tokenId, info));
107 }
108 afterHandle.erase(tokenId);
109 return ERR_OK;
110 }
111
UpdateHandle(std::map<int32_t,ClipboardInfo> & data,std::map<int32_t,ClipboardInfo> & afterHandle)112 ErrCode ClipboardPolicyPlugin::UpdateHandle(std::map<int32_t, ClipboardInfo> &data, std::map<int32_t,
113 ClipboardInfo> &afterHandle)
114 {
115 auto it = data.begin();
116 ClipboardInfo info = it->second;
117 if (it->first == 0) {
118 if ((it->second).bundleName.empty() || (it->second).userId == -1) {
119 return EdmReturnErrCode::PARAM_ERROR;
120 }
121 auto bundleMgr = std::make_shared<EdmBundleManagerImpl>();
122 int32_t tokenId = bundleMgr->GetTokenId((it->second).bundleName, (it->second).userId);
123 if (tokenId == 0) {
124 return EdmReturnErrCode::PARAM_ERROR;
125 }
126 info = it->second;
127 data.erase(it);
128 data.insert(std::make_pair(tokenId, info));
129 it = data.begin();
130 } else {
131 auto iter = afterHandle.find(it->first);
132 if (iter != afterHandle.end()) {
133 info = {(it->second).policy, (iter->second).userId, (iter->second).bundleName};
134 }
135 }
136 afterHandle[it->first] = info;
137 return ERR_OK;
138 }
139
OnAdminRemove(const std::string & adminName,std::map<int32_t,ClipboardInfo> & data,std::map<int32_t,ClipboardInfo> & mergeData,int32_t userId)140 ErrCode ClipboardPolicyPlugin::OnAdminRemove(const std::string &adminName,
141 std::map<int32_t, ClipboardInfo> &data, std::map<int32_t, ClipboardInfo> &mergeData, int32_t userId)
142 {
143 EDMLOGI("ClipboardPolicyPlugin OnAdminRemove.");
144 for (auto &iter : data) {
145 if (mergeData.find(iter.first) != mergeData.end()) {
146 data[iter.first] = mergeData[iter.first];
147 } else {
148 ClipboardInfo info = {ClipboardPolicy::DEFAULT, -1, ""};
149 data[iter.first] = info;
150 }
151 EDMLOGI("ClipboardPolicyPlugin HandlePasteboardPolicy.%{public}d, %{public}d", iter.first,
152 static_cast<int32_t>(data[iter.first].policy));
153 }
154 return HandlePasteboardPolicy(data);
155 }
156
HandlePasteboardPolicy(std::map<int32_t,ClipboardInfo> & data)157 ErrCode ClipboardPolicyPlugin::HandlePasteboardPolicy(std::map<int32_t, ClipboardInfo> &data)
158 {
159 EDMLOGI("ClipboardUtils handlePasteboardPolicy.");
160 auto pasteboardClient = MiscServices::PasteboardClient::GetInstance();
161 if (pasteboardClient == nullptr) {
162 EDMLOGE("HandlePasteboardPolicy PasteboardClient null");
163 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
164 }
165 std::map<uint32_t, MiscServices::ShareOption> setMap;
166 std::vector<uint32_t> removeVector;
167 for (const auto &item : data) {
168 switch (item.second.policy) {
169 case ClipboardPolicy::DEFAULT:
170 removeVector.emplace_back(item.first);
171 break;
172 case ClipboardPolicy::IN_APP:
173 setMap.insert(std::make_pair(item.first, MiscServices::ShareOption::InApp));
174 break;
175 case ClipboardPolicy::LOCAL_DEVICE:
176 setMap.insert(std::make_pair(item.first, MiscServices::ShareOption::LocalDevice));
177 break;
178 case ClipboardPolicy::CROSS_DEVICE:
179 setMap.insert(std::make_pair(item.first, MiscServices::ShareOption::CrossDevice));
180 break;
181 default:
182 break;
183 }
184 }
185 ErrCode setRet = ERR_OK;
186 ErrCode rmRet = ERR_OK;
187 if (!setMap.empty()) {
188 setRet = pasteboardClient->SetGlobalShareOption(setMap);
189 }
190 if (!removeVector.empty()) {
191 rmRet = pasteboardClient->RemoveGlobalShareOption(removeVector);
192 }
193 if (setRet != ERR_OK || rmRet != ERR_OK) {
194 return EdmReturnErrCode::SYSTEM_ABNORMALLY;
195 }
196 return ERR_OK;
197 }
198
OnOtherServiceStart(int32_t systemAbilityId)199 void ClipboardPolicyPlugin::OnOtherServiceStart(int32_t systemAbilityId)
200 {
201 std::string policyData;
202 IPolicyManager::GetInstance()->GetPolicy("", PolicyName::POLICY_CLIPBOARD_POLICY,
203 policyData, EdmConstants::DEFAULT_USER_ID);
204 auto clipboardSerializer_ = ClipboardSerializer::GetInstance();
205 std::map<int32_t, ClipboardInfo> policyMap;
206 clipboardSerializer_->Deserialize(policyData, policyMap);
207 HandlePasteboardPolicy(policyMap);
208 }
209 } // namespace EDM
210 } // namespace OHOS