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