• 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 "pin_holder.h"
17 
18 #include "dm_anonymous.h"
19 #include "dm_crypto.h"
20 #include "dm_log.h"
21 #include "dm_radar_helper.h"
22 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
23 #include "multiple_user_connector.h"
24 #endif
25 
26 namespace OHOS {
27 namespace DistributedHardware {
28 constexpr int32_t SESSION_SIDE_SERVER = 0;
29 constexpr int32_t SESSION_ID_INVALID = -1;
30 constexpr int32_t REPLY_SUCCESS = 0;
31 constexpr int32_t REPLY_FAILED = -1;
32 
33 constexpr int32_t MSG_TYPE_CREATE_PIN_HOLDER = 600;
34 constexpr int32_t MSG_TYPE_CREATE_PIN_HOLDER_RESP = 601;
35 constexpr int32_t MSG_TYPE_DESTROY_PIN_HOLDER = 650;
36 constexpr int32_t MSG_TYPE_DESTROY_PIN_HOLDER_RESP = 651;
37 constexpr int32_t MSG_TYPE_PIN_HOLDER_CHANGE = 700;
38 constexpr int32_t MSG_TYPE_PIN_HOLDER_CHANGE_RESP = 701;
39 constexpr int32_t MSG_TYPE_PIN_CLOSE_SESSION = 800;
40 
41 constexpr const char* PINHOLDER_CREATE_TIMEOUT_TASK = "deviceManagerTimer:pinholdercreate";
42 constexpr int32_t PIN_HOLDER_SESSION_CREATE_TIMEOUT = 60;
43 
44 constexpr const char* TAG_PIN_TYPE = "PIN_TYPE";
45 constexpr const char* TAG_PAYLOAD = "PAYLOAD";
46 constexpr const char* TAG_REPLY = "REPLY";
47 constexpr const char* TAG_REMOTE_DEVICE_ID = "REMOTE_DEVICE_ID";
48 
49 constexpr int32_t DM_OK = 0;
50 constexpr int32_t ERR_DM_FAILED = 96929744;
51 constexpr int32_t ERR_DM_TIME_OUT = 96929745;
52 constexpr int32_t ERR_DM_CREATE_PIN_HOLDER_BUSY = 96929821;
53 constexpr const char* TAG_MSG_TYPE = "MSG_TYPE";
54 constexpr const char* TAG_DM_VERSION = "DM_VERSION";
55 constexpr const char* DM_CONNECTION_DISCONNECTED = "DM_CONNECTION_DISCONNECTED";
56 constexpr int32_t DEVICE_UUID_LENGTH = 65;
57 constexpr int32_t ERR_DM_INPUT_PARA_INVALID = 96929749;
58 constexpr int32_t ERR_DM_BIND_PEER_UNSUPPORTED = 96929802;
PinHolder(std::shared_ptr<IDeviceManagerServiceListener> listener)59 PinHolder::PinHolder(std::shared_ptr<IDeviceManagerServiceListener> listener): listener_(listener)
60 {
61     if (session_ == nullptr) {
62         session_ = std::make_shared<PinHolderSession>();
63     }
64     if (timer_ == nullptr) {
65         timer_ = std::make_shared<DmTimer>();
66     }
67     sinkState_ = SINK_INIT;
68     sourceState_ = SOURCE_INIT;
69 }
70 
~PinHolder()71 PinHolder::~PinHolder()
72 {
73     if (timer_ != nullptr) {
74         timer_->DeleteAll();
75         timer_ = nullptr;
76     }
77 }
78 
RegisterPinHolderCallback(const std::string & pkgName)79 int32_t PinHolder::RegisterPinHolderCallback(const std::string &pkgName)
80 {
81     if (session_ == nullptr) {
82         LOGE("RegisterPinHolderCallback session is nullptr.");
83         return ERR_DM_FAILED;
84     }
85     int32_t userId = -1;
86 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
87     MultipleUserConnector::GetCallerUserId(userId);
88 #endif
89     processInfo_.userId = userId;
90     processInfo_.pkgName = pkgName;
91     session_->RegisterSessionCallback(shared_from_this());
92     return DM_OK;
93 }
94 
UnRegisterPinHolderCallback(const std::string & pkgName)95 int32_t PinHolder::UnRegisterPinHolderCallback(const std::string &pkgName)
96 {
97     if (session_ == nullptr) {
98         LOGE("session is nullptr.");
99         return ERR_DM_FAILED;
100     }
101     session_->UnRegisterSessionCallback();
102     LOGI("success.");
103     return DM_OK;
104 }
105 
CreatePinHolder(const std::string & pkgName,const PeerTargetId & targetId,DmPinType pinType,const std::string & payload)106 int32_t PinHolder::CreatePinHolder(const std::string &pkgName,
107     const PeerTargetId &targetId, DmPinType pinType, const std::string &payload)
108 {
109     LOGI("CreatePinHolder.");
110     if (processInfo_.pkgName.empty() || processInfo_.pkgName != pkgName) {
111         LOGE("CreatePinHolder pkgName: %{public}s is not register callback.", pkgName.c_str());
112         return ERR_DM_FAILED;
113     }
114     int32_t ret = CheckTargetIdVaild(targetId);
115     if (ret != DM_OK) {
116         LOGE("CreatePinHolder targetId is invalid.");
117         return ret;
118     }
119     if (listener_ == nullptr || session_ == nullptr) {
120         LOGE("CreatePinHolder listener or session is nullptr.");
121         return ERR_DM_FAILED;
122     }
123     if (sourceState_ != SOURCE_INIT) {
124         LOGE("CreatePinHolder failed, state is %{public}d.", sourceState_);
125         return ERR_DM_FAILED;
126     }
127     if (sessionId_ != SESSION_ID_INVALID) {
128         LOGI("CreatePinHolder session already create, sessionId: %{public}d.", sessionId_);
129         CreateGeneratePinHolderMsg();
130         return DM_OK;
131     }
132 
133     sessionId_ = session_->OpenSessionServer(targetId);
134     int32_t stageRes =
135         sessionId_ > 0 ? static_cast<int32_t>(StageRes::STAGE_SUCC) : static_cast<int32_t>(StageRes::STAGE_FAIL);
136     DmRadarHelper::GetInstance().ReportCreatePinHolder(
137         processInfo_.pkgName, sessionId_, targetId.deviceId, sessionId_, stageRes);
138     if (sessionId_ < 0) {
139         LOGE("[SOFTBUS]open session error, sessionId: %{public}d.", sessionId_);
140         listener_->OnCreateResult(processInfo_, sessionId_);
141         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT,
142             sessionId_, "");
143         sessionId_ = SESSION_ID_INVALID;
144         return sessionId_;
145     }
146     pinType_ = pinType;
147     payload_ = payload;
148     return DM_OK;
149 }
150 
DestroyPinHolder(const std::string & pkgName,const PeerTargetId & targetId,DmPinType pinType,const std::string & payload)151 int32_t PinHolder::DestroyPinHolder(const std::string &pkgName, const PeerTargetId &targetId, DmPinType pinType,
152     const std::string &payload)
153 {
154     LOGI("DestroyPinHolder.");
155     if (listener_ == nullptr || session_ == nullptr) {
156         LOGE("DestroyPinHolder listener or session is nullptr.");
157         return ERR_DM_FAILED;
158     }
159     if (processInfo_.pkgName.empty() || pkgName != processInfo_.pkgName) {
160         LOGE("DestroyPinHolder pkgName: %{public}s is not register callback.", pkgName.c_str());
161         return ERR_DM_FAILED;
162     }
163     int32_t ret = CheckTargetIdVaild(targetId);
164     if (ret != DM_OK) {
165         LOGE("DestroyPinHolder targetId is invalid.");
166         return ret;
167     }
168     if (sessionId_ == SESSION_ID_INVALID) {
169         LOGI("DestroyPinHolder session already destroy.");
170         listener_->OnDestroyResult(processInfo_, ret);
171         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY_RESULT, ret, "");
172         return ret;
173     }
174     if (sourceState_ != SOURCE_CREATE) {
175         LOGE("DestroyPinHolder failed, state is %{public}d.", sourceState_);
176         return ERR_DM_FAILED;
177     }
178     if (timer_ != nullptr) {
179         timer_->DeleteTimer(PINHOLDER_CREATE_TIMEOUT_TASK);
180     }
181 
182     JsonObject jsonObj;
183     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_DESTROY_PIN_HOLDER;
184     jsonObj[TAG_PIN_TYPE] = pinType;
185     jsonObj[TAG_PAYLOAD] = payload;
186     pinType_ = pinType;
187     std::string message = jsonObj.Dump();
188     LOGI("DestroyPinHolder, message type is: %{public}d, pin type is: %{public}d.", MSG_TYPE_DESTROY_PIN_HOLDER,
189         pinType);
190     ret = session_->SendData(sessionId_, message);
191     int32_t stageRes =
192         ret == DM_OK ? static_cast<int32_t>(StageRes::STAGE_SUCC) : static_cast<int32_t>(StageRes::STAGE_FAIL);
193     DmRadarHelper::GetInstance().ReportDestroyPinHolder(processInfo_.pkgName, targetId.deviceId, ret, stageRes);
194     if (ret != DM_OK) {
195         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
196         listener_->OnDestroyResult(processInfo_, ERR_DM_FAILED);
197         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY_RESULT, ERR_DM_FAILED, "");
198         return ret;
199     }
200     return ret;
201 }
202 
CreateGeneratePinHolderMsg()203 int32_t PinHolder::CreateGeneratePinHolderMsg()
204 {
205     if (listener_ == nullptr || session_ == nullptr) {
206         LOGE("CreateGeneratePinHolderMsg listener or session is nullptr.");
207         return ERR_DM_FAILED;
208     }
209     if (timer_ != nullptr) {
210         timer_->DeleteAll();
211         timer_->StartTimer(std::string(PINHOLDER_CREATE_TIMEOUT_TASK), PIN_HOLDER_SESSION_CREATE_TIMEOUT,
212             [this] (std::string name) {
213                 PinHolder::CloseSession(name);
214             });
215     }
216     JsonObject jsonObj;
217     jsonObj[TAG_PIN_TYPE] = pinType_;
218     jsonObj[TAG_PAYLOAD] = payload_;
219     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_CREATE_PIN_HOLDER;
220     jsonObj[TAG_DM_VERSION] = "";
221     std::string message = jsonObj.Dump();
222     LOGI("CreateGeneratePinHolderMsg, message type is: %{public}d, pin type is: %{public}d.",
223         MSG_TYPE_CREATE_PIN_HOLDER, pinType_);
224     int32_t ret = session_->SendData(sessionId_, message);
225     int32_t bizStage = static_cast<int32_t>(PinHolderStage::SEND_CREATE_PIN_HOLDER_MSG);
226     DmRadarHelper::GetInstance().ReportSendOrReceiveHolderMsg(bizStage,
227         std::string("CreateGeneratePinHolderMsg"), "");
228     if (ret != DM_OK) {
229         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
230         listener_->OnCreateResult(processInfo_, ret);
231         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT, ret, "");
232         return ret;
233     }
234     return ret;
235 }
236 
ParseMsgType(const std::string & message)237 int32_t PinHolder::ParseMsgType(const std::string &message)
238 {
239     JsonObject jsonObject(message);
240     if (jsonObject.IsDiscarded()) {
241         LOGE("ParseMsgType DecodeRequest jsonStr error");
242         return ERR_DM_FAILED;
243     }
244     if (!IsInt32(jsonObject, TAG_MSG_TYPE)) {
245         LOGE("ParseMsgType err json string.");
246         return ERR_DM_FAILED;
247     }
248     int32_t msgType = jsonObject[TAG_MSG_TYPE].Get<int32_t>();
249     return msgType;
250 }
251 
ProcessCloseSessionMsg(const std::string & message)252 void PinHolder::ProcessCloseSessionMsg(const std::string &message)
253 {
254     if (listener_ == nullptr || session_ == nullptr) {
255         LOGE("ProcessCloseSessionMsg listener or session is nullptr.");
256         return;
257     }
258     LOGI("CloseSessionMsg, message type is: %{public}d.", MSG_TYPE_PIN_CLOSE_SESSION);
259     session_->CloseSessionServer(sessionId_);
260     sessionId_ = SESSION_ID_INVALID;
261     sourceState_ = SOURCE_INIT;
262     sinkState_ = SINK_INIT;
263     listener_->OnCreateResult(processInfo_, ERR_DM_CREATE_PIN_HOLDER_BUSY);
264 }
265 
ProcessCreateMsg(const std::string & message)266 void PinHolder::ProcessCreateMsg(const std::string &message)
267 {
268     if (listener_ == nullptr || session_ == nullptr) {
269         LOGE("ProcessCreateMsg listener or session is nullptr.");
270         return;
271     }
272     JsonObject jsonObject(message);
273     if (jsonObject.IsDiscarded()) {
274         LOGE("ProcessCreateMsg DecodeRequest jsonStr error");
275         return;
276     }
277     if (!IsInt32(jsonObject, TAG_PIN_TYPE) || !IsString(jsonObject, TAG_PAYLOAD)) {
278         LOGE("ProcessCreateMsg err json string.");
279         return;
280     }
281     DmPinType pinType = static_cast<DmPinType>(jsonObject[TAG_PIN_TYPE].Get<int32_t>());
282     std::string payload = jsonObject[TAG_PAYLOAD].Get<std::string>();
283     isRemoteSupported_ = jsonObject.Contains(TAG_DM_VERSION);
284     int32_t bizStage = static_cast<int32_t>(PinHolderStage::RECEIVE_CREATE_PIN_HOLDER_MSG);
285     DmRadarHelper::GetInstance().ReportSendOrReceiveHolderMsg(bizStage, std::string("ProcessCreateMsg"), "");
286     JsonObject jsonObj;
287     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_CREATE_PIN_HOLDER_RESP;
288     if (sinkState_ != SINK_INIT) {
289         jsonObj[TAG_REPLY] = REPLY_FAILED;
290     } else {
291         jsonObj[TAG_REPLY] = REPLY_SUCCESS;
292         sinkState_ = SINK_CREATE;
293         sourceState_ = SOURCE_CREATE;
294         listener_->OnPinHolderCreate(processInfo_, remoteDeviceId_, pinType, payload);
295         JsonObject jsonContent;
296         jsonContent[TAG_PIN_TYPE] = pinType;
297         jsonContent[TAG_PAYLOAD] = payload;
298         jsonContent[TAG_REMOTE_DEVICE_ID] = remoteDeviceId_;
299         std::string content = jsonContent.Dump();
300         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE, DM_OK, content);
301     }
302     jsonObj[TAG_DM_VERSION] = "";
303 
304     std::string msg = jsonObj.Dump();
305     LOGI("ProcessCreateMsg, message type is: %{public}d.", MSG_TYPE_CREATE_PIN_HOLDER_RESP);
306     int32_t ret = session_->SendData(sessionId_, msg);
307     if (ret != DM_OK) {
308         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
309         return;
310     }
311 }
312 
ProcessCreateRespMsg(const std::string & message)313 void PinHolder::ProcessCreateRespMsg(const std::string &message)
314 {
315     JsonObject jsonObject(message);
316     if (jsonObject.IsDiscarded()) {
317         LOGE("ProcessCreateRespMsg DecodeRequest jsonStr error.");
318         return;
319     }
320     if (!IsInt32(jsonObject, TAG_REPLY)) {
321         LOGE("ProcessCreateRespMsg err json string.");
322         return;
323     }
324     isRemoteSupported_ = jsonObject.Contains(TAG_DM_VERSION);
325     int32_t reply = jsonObject[TAG_REPLY].Get<int32_t>();
326     if (listener_ == nullptr || session_ == nullptr) {
327         LOGE("ProcessCreateRespMsg listener or session is nullptr.");
328         return;
329     }
330     if (reply == REPLY_SUCCESS) {
331         listener_->OnCreateResult(processInfo_, DM_OK);
332         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT, DM_OK, "");
333         sourceState_ = SOURCE_CREATE;
334         sinkState_ = SINK_CREATE;
335     } else {
336         LOGE("ProcessCreateRespMsg remote state is wrong.");
337         listener_->OnCreateResult(processInfo_, ERR_DM_FAILED);
338         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT, ERR_DM_FAILED, "");
339         session_->CloseSessionServer(sessionId_);
340         sessionId_ = SESSION_ID_INVALID;
341         destroyState_ = STATE_REMOTE_WRONG;
342         sourceState_ = SOURCE_INIT;
343         sinkState_ = SINK_INIT;
344     }
345 }
346 
ProcessDestroyMsg(const std::string & message)347 void PinHolder::ProcessDestroyMsg(const std::string &message)
348 {
349     if (listener_ == nullptr || session_ == nullptr) {
350         LOGE("ProcessDestroyMsg listener or session is nullptr.");
351         return;
352     }
353     JsonObject jsonObject(message);
354     if (jsonObject.IsDiscarded()) {
355         LOGE("ProcessDestroyMsg DecodeRequest jsonStr error.");
356         return;
357     }
358     if (!IsInt32(jsonObject, TAG_PIN_TYPE) || !IsString(jsonObject, TAG_PAYLOAD)) {
359         LOGE("ProcessDestroyMsg err json string.");
360         return;
361     }
362     DmPinType pinType = static_cast<DmPinType>(jsonObject[TAG_PIN_TYPE].Get<int32_t>());
363     std::string payload = jsonObject[TAG_PAYLOAD].Get<std::string>();
364     int32_t bizStage = static_cast<int32_t>(PinHolderStage::RECEIVE_DESTROY_PIN_HOLDER_MSG);
365     DmRadarHelper::GetInstance().ReportSendOrReceiveHolderMsg(bizStage, std::string("ProcessDestroyMsg"), "");
366     JsonObject jsonObj;
367     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_DESTROY_PIN_HOLDER_RESP;
368     if (sinkState_ != SINK_CREATE) {
369         jsonObj[TAG_REPLY] = REPLY_FAILED;
370     } else {
371         jsonObj[TAG_REPLY] = REPLY_SUCCESS;
372         sinkState_ = SINK_INIT;
373         sourceState_ = SOURCE_INIT;
374         if (!isDestroy_.load()) {
375             listener_->OnPinHolderDestroy(processInfo_, pinType, payload);
376             JsonObject jsonContent;
377             jsonContent[TAG_PIN_TYPE] = pinType;
378             jsonContent[TAG_PAYLOAD] = payload;
379             std::string content = jsonContent.Dump();
380             listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY, DM_OK, content);
381             isDestroy_.store(true);
382         }
383     }
384 
385     std::string msg = jsonObj.Dump();
386     LOGI("ProcessDestroyMsg, message type is: %{public}d.", MSG_TYPE_DESTROY_PIN_HOLDER_RESP);
387     int32_t ret = session_->SendData(sessionId_, msg);
388     if (ret != DM_OK) {
389         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
390         return;
391     }
392 }
393 
CloseSession(const std::string & name)394 void PinHolder::CloseSession(const std::string &name)
395 {
396     LOGI("PinHolder::CloseSession start timer name %{public}s.", name.c_str());
397     if (session_ == nullptr) {
398         LOGE("CloseSession session is nullptr.");
399         return;
400     }
401     JsonObject jsonObj;
402     jsonObj[DM_CONNECTION_DISCONNECTED] = true;
403     std::string payload = jsonObj.Dump();
404     if (listener_ != nullptr && !isDestroy_.load()) {
405         listener_->OnPinHolderDestroy(processInfo_, pinType_, payload);
406         JsonObject jsonContent;
407         jsonContent[TAG_PIN_TYPE] = pinType_;
408         jsonContent[TAG_PAYLOAD] = payload;
409         std::string content = jsonContent.Dump();
410         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY, ERR_DM_TIME_OUT, content);
411         isDestroy_.store(true);
412     }
413     session_->CloseSessionServer(sessionId_);
414     if (timer_ != nullptr) {
415         timer_->DeleteAll();
416     }
417     destroyState_ = STATE_TIME_OUT;
418     sessionId_ = SESSION_ID_INVALID;
419     sinkState_ = SINK_INIT;
420     sourceState_ = SOURCE_INIT;
421     remoteDeviceId_ = "";
422     isRemoteSupported_ = false;
423 }
424 
ProcessDestroyResMsg(const std::string & message)425 void PinHolder::ProcessDestroyResMsg(const std::string &message)
426 {
427     JsonObject jsonObject(message);
428     if (jsonObject.IsDiscarded()) {
429         LOGE("ProcessDestroyResMsg DecodeRequest jsonStr error.");
430         return;
431     }
432     if (!IsInt32(jsonObject, TAG_REPLY)) {
433         LOGE("ProcessDestroyResMsg err json string.");
434         return;
435     }
436     int32_t reply = jsonObject[TAG_REPLY].Get<int32_t>();
437     if (listener_ == nullptr || session_ == nullptr) {
438         LOGE("ProcessDestroyResMsg listener or session is nullptr.");
439         return;
440     }
441     if (reply == REPLY_SUCCESS) {
442         listener_->OnDestroyResult(processInfo_, DM_OK);
443         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY_RESULT, DM_OK, "");
444         sourceState_ = SOURCE_INIT;
445         sinkState_ = SINK_INIT;
446         if (timer_ != nullptr) {
447             timer_->DeleteAll();
448         }
449     } else {
450         LOGE("ProcessDestroyResMsg remote state is wrong.");
451         listener_->OnDestroyResult(processInfo_, ERR_DM_FAILED);
452         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY_RESULT, ERR_DM_FAILED, "");
453         sinkState_ = SINK_INIT;
454         sourceState_ = SOURCE_INIT;
455     }
456     session_->CloseSessionServer(sessionId_);
457     sessionId_ = SESSION_ID_INVALID;
458     remoteDeviceId_ = "";
459 }
460 
OnDataReceived(int32_t sessionId,std::string message)461 void PinHolder::OnDataReceived(int32_t sessionId, std::string message)
462 {
463     int32_t msgType = ParseMsgType(message);
464     LOGI("OnDataReceived, msgType: %{public}d.", msgType);
465     int32_t sessionSide = GetSessionSide(sessionId);
466     if (sessionSide == SESSION_SIDE_SERVER && sessionId != sessionId_) {
467         LOGE("another session opened, close this sessionId: %{public}d.", sessionId);
468         JsonObject jsonObj;
469         jsonObj[TAG_MSG_TYPE] = MSG_TYPE_PIN_CLOSE_SESSION;
470         std::string msg = jsonObj.Dump();
471         int32_t ret = session_->SendData(sessionId, msg);
472         if (ret != DM_OK) {
473             LOGE("[SOFTBUS] SendBytes failed. ret: %{public}d.", ret);
474             listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT, ERR_DM_FAILED, "");
475         }
476         return;
477     }
478     switch (msgType) {
479         case MSG_TYPE_PIN_CLOSE_SESSION:
480             ProcessCloseSessionMsg(message);
481             break;
482         case MSG_TYPE_CREATE_PIN_HOLDER:
483             ProcessCreateMsg(message);
484             break;
485         case MSG_TYPE_CREATE_PIN_HOLDER_RESP:
486             ProcessCreateRespMsg(message);
487             break;
488         case MSG_TYPE_DESTROY_PIN_HOLDER:
489             ProcessDestroyMsg(message);
490             break;
491         case MSG_TYPE_DESTROY_PIN_HOLDER_RESP:
492             ProcessDestroyResMsg(message);
493             break;
494         case MSG_TYPE_PIN_HOLDER_CHANGE:
495             ProcessChangeMsg(message);
496             break;
497         case MSG_TYPE_PIN_HOLDER_CHANGE_RESP:
498             ProcessChangeRespMsg(message);
499             break;
500         default:
501             break;
502     }
503 }
504 
GetPeerDeviceId(int32_t sessionId,std::string & udidHash)505 void PinHolder::GetPeerDeviceId(int32_t sessionId, std::string &udidHash)
506 {
507     char peerDeviceId[DEVICE_UUID_LENGTH] = {0};
508     int32_t ret = ::GetPeerDeviceId(sessionId, &peerDeviceId[0], DEVICE_UUID_LENGTH);
509     if (ret != DM_OK) {
510         LOGE("[SOFTBUS]GetPeerDeviceId failed for session: %{public}d.", sessionId);
511         udidHash = "";
512         return;
513     }
514     std::string deviceId = peerDeviceId;
515     char udidHashTmp[DM_MAX_DEVICE_ID_LEN] = {0};
516     if (Crypto::GetUdidHash(deviceId, reinterpret_cast<uint8_t *>(udidHashTmp)) != DM_OK) {
517         LOGE("get udidhash by udid: %{public}s failed.", GetAnonyString(deviceId).c_str());
518         udidHash = "";
519         return;
520     }
521     udidHash = udidHashTmp;
522     LOGI("GetPeerDeviceId udid hash: %{public}s success.", GetAnonyString(udidHash).c_str());
523 }
524 
OnSessionOpened(int32_t sessionId,int32_t sessionSide,int32_t result)525 void PinHolder::OnSessionOpened(int32_t sessionId, int32_t sessionSide, int32_t result)
526 {
527     isDestroy_.store(false);
528     destroyState_ = STATE_UNKNOW;
529     char peerDeviceId[DEVICE_UUID_LENGTH] = {0};
530     int32_t ret = ::GetPeerDeviceId(sessionId, &peerDeviceId[0], DEVICE_UUID_LENGTH);
531     if (ret != DM_OK) {
532         LOGE("[SOFTBUS]GetPeerDeviceId failed for session: %{public}d.", sessionId);
533     }
534     LOGI("OnSessionOpened, peerDeviceId: %{public}s.", GetAnonyString(peerDeviceId).c_str());
535     DmRadarHelper::GetInstance().ReportSendOrReceiveHolderMsg(static_cast<int32_t>(PinHolderStage::SESSION_OPENED),
536         std::string("OnSessionOpened"), std::string(peerDeviceId));
537     if (sessionSide == SESSION_SIDE_SERVER) {
538         LOGI("[SOFTBUS]onSesssionOpened success, side is sink. sessionId: %{public}d.", sessionId);
539         GetPeerDeviceId(sessionId, remoteDeviceId_);
540         if (sessionId_ == SESSION_ID_INVALID) {
541             sessionId_ = sessionId;
542         }
543         return;
544     }
545     sessionId_ = sessionId;
546     if (result == DM_OK) {
547         CreateGeneratePinHolderMsg();
548         return;
549     }
550     LOGE("[SOFTBUS]onSesssionOpened failed. sessionId: %{public}d.", sessionId);
551     sessionId_ = SESSION_ID_INVALID;
552     if (listener_ != nullptr) {
553         listener_->OnCreateResult(processInfo_, result);
554         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::CREATE_RESULT, result, "");
555     }
556     return;
557 }
558 
OnSessionClosed(int32_t sessionId)559 void PinHolder::OnSessionClosed(int32_t sessionId)
560 {
561     if (sessionId != sessionId_) {
562         return;
563     }
564     LOGI("[SOFTBUS]OnSessionClosed sessionId: %{public}d.", sessionId);
565     sessionId_ = SESSION_ID_INVALID;
566     sinkState_ = SINK_INIT;
567     sourceState_ = SOURCE_INIT;
568     remoteDeviceId_ = "";
569     isRemoteSupported_ = false;
570     JsonObject jsonObj;
571     jsonObj[DM_CONNECTION_DISCONNECTED] = true;
572     std::string payload = jsonObj.Dump();
573     if (listener_ != nullptr && !isDestroy_.load()) {
574         listener_->OnPinHolderDestroy(processInfo_, pinType_, payload);
575         JsonObject jsonContent;
576         jsonContent[TAG_PIN_TYPE] = pinType_;
577         jsonContent[TAG_PAYLOAD] = payload;
578         std::string content = jsonContent.Dump();
579         if (destroyState_ == STATE_UNKNOW) {
580             listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY, sessionId, content);
581         } else if (destroyState_ == STATE_REMOTE_WRONG) {
582             listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY, ERR_DM_FAILED, content);
583         } else if (destroyState_ == STATE_TIME_OUT) {
584             listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::DESTROY, ERR_DM_TIME_OUT, content);
585         }
586         isDestroy_.store(true);
587     }
588     if (timer_ != nullptr) {
589         timer_->DeleteAll();
590     }
591     return;
592 }
593 
CheckTargetIdVaild(const PeerTargetId & targetId)594 int32_t PinHolder::CheckTargetIdVaild(const PeerTargetId &targetId)
595 {
596     if (targetId.deviceId.empty() && targetId.brMac.empty() && targetId.bleMac.empty() && targetId.wifiIp.empty()) {
597         LOGE("CheckTargetIdVaild failed. targetId is empty.");
598         return ERR_DM_INPUT_PARA_INVALID;
599     }
600     return DM_OK;
601 }
602 
NotifyPinHolderEvent(const std::string & pkgName,const std::string & event)603 int32_t PinHolder::NotifyPinHolderEvent(const std::string &pkgName, const std::string &event)
604 {
605     LOGI("NotifyPinHolderEvent.");
606     if (listener_ == nullptr || session_ == nullptr) {
607         LOGE("NotifyPinHolderEvent listener or session is nullptr.");
608         return ERR_DM_FAILED;
609     }
610     if (processInfo_.pkgName.empty() || pkgName != processInfo_.pkgName || event.empty()) {
611         LOGE("NotifyPinHolderEvent pkgName: %{public}s is not register callback.", pkgName.c_str());
612         return ERR_DM_FAILED;
613     }
614     if (sessionId_ == SESSION_ID_INVALID) {
615         LOGE("NotifyPinHolderEvent session invalid.");
616         return ERR_DM_FAILED;
617     }
618     if (!isRemoteSupported_) {
619         LOGE("NotifyPinHolderEvent failed, remote not support.");
620         return ERR_DM_BIND_PEER_UNSUPPORTED;
621     }
622     JsonObject jsonObject(event);
623     if (jsonObject.IsDiscarded() || !IsInt32(jsonObject, TAG_PIN_TYPE)) {
624         LOGE("ProcessChangeMsg DecodeRequest jsonStr error.");
625         return ERR_DM_FAILED;
626     }
627     if (timer_ != nullptr) {
628         timer_->DeleteAll();
629         timer_->StartTimer(std::string(PINHOLDER_CREATE_TIMEOUT_TASK), PIN_HOLDER_SESSION_CREATE_TIMEOUT,
630             [this] (std::string name) {
631                 PinHolder::CloseSession(name);
632             });
633     }
634     DmPinType pinType = static_cast<DmPinType>(jsonObject[TAG_PIN_TYPE].Get<int32_t>());
635     JsonObject jsonObj;
636     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_PIN_HOLDER_CHANGE;
637     jsonObj[TAG_PIN_TYPE] = pinType;
638     std::string message = jsonObj.Dump();
639     LOGI("NotifyPinHolderEvent, message type is: %{public}d, pin type is: %{public}d.",
640         MSG_TYPE_PIN_HOLDER_CHANGE, pinType);
641     int32_t ret = session_->SendData(sessionId_, message);
642     if (ret != DM_OK) {
643         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
644         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::PIN_TYPE_CHANGE_RESULT, ERR_DM_FAILED, "");
645         return ERR_DM_FAILED;
646     }
647     return ret;
648 }
649 
ProcessChangeMsg(const std::string & message)650 void PinHolder::ProcessChangeMsg(const std::string &message)
651 {
652     if (listener_ == nullptr || session_ == nullptr) {
653         LOGE("ProcessChangeMsg listener or session is nullptr.");
654         return;
655     }
656     JsonObject jsonObject(message);
657     if (jsonObject.IsDiscarded()) {
658         LOGE("ProcessChangeMsg DecodeRequest jsonStr error.");
659         return;
660     }
661     if (!IsInt32(jsonObject, TAG_PIN_TYPE)) {
662         LOGE("ProcessChangeMsg err json string.");
663         return;
664     }
665     DmPinType pinType = static_cast<DmPinType>(jsonObject[TAG_PIN_TYPE].Get<int32_t>());
666 
667     JsonObject jsonObj;
668     jsonObj[TAG_MSG_TYPE] = MSG_TYPE_PIN_HOLDER_CHANGE_RESP;
669     if (sinkState_ != SINK_CREATE) {
670         jsonObj[TAG_REPLY] = REPLY_FAILED;
671     } else {
672         jsonObj[TAG_REPLY] = REPLY_SUCCESS;
673         JsonObject jsonContent;
674         jsonContent[TAG_PIN_TYPE] = pinType;
675         std::string content = jsonContent.Dump();
676         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::PIN_TYPE_CHANGE, DM_OK, content);
677         if (timer_ != nullptr) {
678             timer_->DeleteAll();
679             timer_->StartTimer(std::string(PINHOLDER_CREATE_TIMEOUT_TASK), PIN_HOLDER_SESSION_CREATE_TIMEOUT,
680                 [this] (std::string name) {
681                     PinHolder::CloseSession(name);
682                 });
683         }
684     }
685 
686     std::string msg = jsonObj.Dump();
687     LOGI("ProcessChangeMsg, message type is: %{public}d.", MSG_TYPE_PIN_HOLDER_CHANGE_RESP);
688     int32_t ret = session_->SendData(sessionId_, msg);
689     if (ret != DM_OK) {
690         LOGE("[SOFTBUS]SendBytes failed, ret: %{public}d.", ret);
691         return;
692     }
693 }
694 
ProcessChangeRespMsg(const std::string & message)695 void PinHolder::ProcessChangeRespMsg(const std::string &message)
696 {
697     JsonObject jsonObject(message);
698     if (jsonObject.IsDiscarded()) {
699         LOGE("ProcessChangeRespMsg DecodeRequest jsonStr error.");
700         return;
701     }
702     if (!IsInt32(jsonObject, TAG_REPLY)) {
703         LOGE("ProcessChangeRespMsg err json string.");
704         return;
705     }
706     int32_t reply = jsonObject[TAG_REPLY].Get<int32_t>();
707     if (listener_ == nullptr || session_ == nullptr) {
708         LOGE("ProcessChangeRespMsg listener or session is nullptr.");
709         return;
710     }
711     if (reply == REPLY_SUCCESS) {
712         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::PIN_TYPE_CHANGE_RESULT, DM_OK, "");
713     } else {
714         LOGE("ProcessChangeRespMsg remote state is wrong.");
715         listener_->OnPinHolderEvent(processInfo_, DmPinHolderEvent::PIN_TYPE_CHANGE_RESULT, ERR_DM_FAILED, "");
716     }
717 }
718 } // namespace DistributedHardware
719 } // namespace OHOS