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