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