1 /*
2 * Copyright (C) 2023-2025 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 "save_trusted_info.h"
17
18 #include "common_defs.h"
19 #include "group_data_manager.h"
20 #include "device_auth_defines.h"
21 #include "hc_dev_info.h"
22 #include "hc_log.h"
23 #include "hc_types.h"
24 #include "string_util.h"
25
26 #define PEER_TO_PEER_GROUP 256
27 #define DEFAULT_EXPIRE_TIME 90
28 #define SELF_CREATED 0
29
30 #define START_CMD_EVENT_NAME "StartCmd"
31 #define FAIL_EVENT_NAME "CmdFail"
32
33 #define FIELD_GROUP_NAME "groupName"
34 #define FIELD_USER_TYPE_CLIENT "userTypeC"
35 #define FIELD_USER_TYPE_SERVER "userTypeS"
36 #define FIELD_AUTH_ID_CLIENT "authIdC"
37 #define FIELD_AUTH_ID_SERVER "authIdS"
38 #define FIELD_UDID_CLIENT "udidC"
39 #define FIELD_UDID_SERVER "udidS"
40 #define FIELD_USER_ID_CLIENT "userIdC"
41 #define FIELD_USER_ID_SERVER "userIdS"
42
43 #define FIELD_EVENT "event"
44 #define FIELD_ERR_CODE "errCode"
45 #define FIELD_ERR_MSG "errMsg"
46
47 typedef struct {
48 bool isGroupExistSelf;
49 bool isGroupExistPeer;
50 bool isBind;
51 int32_t osAccountId;
52 int32_t credType;
53 int32_t userTypeSelf;
54 int32_t userTypePeer;
55 int32_t visibility;
56 char *groupId;
57 char *groupName;
58 char *appId;
59 char *authIdSelf;
60 char *authIdPeer;
61 char *udidSelf;
62 char *udidPeer;
63 char *userIdSelf;
64 char *userIdPeer;
65 } CmdParams;
66
67 typedef struct {
68 BaseCmd base;
69 CmdParams params;
70 } SaveTrustedInfoCmd;
71
72 typedef enum {
73 START_EVENT = 0,
74 CLIENT_SEND_INFO_EVENT,
75 SERVER_SEND_INFO_EVENT,
76 FAIL_EVENT,
77 UNKNOWN_EVENT,
78 } EventEnum;
79
80 typedef enum {
81 CREATE_AS_CLIENT_STATE = 0,
82 CREATE_AS_SERVER_STATE,
83 CLIENT_START_REQ_STATE,
84 /* FINISH STATE */
85 CLIENT_FINISH_STATE,
86 SERVER_FINISH_STATE,
87 /* FAIL STATE */
88 FAIL_STATE
89 } StateEnum;
90
91 typedef struct {
92 int32_t curState;
93 int32_t eventType;
94 int32_t (*stateProcessFunc)(BaseCmd *self, const CJson *inputEvent, CJson **outputEvent);
95 void (*exceptionHandleFunc)(int32_t errorCode, CJson **outputEvent);
96 int32_t nextState;
97 } CmdStateNode;
98
GetGroupEntryById(int32_t osAccountId,const char * groupId)99 static TrustedGroupEntry *GetGroupEntryById(int32_t osAccountId, const char *groupId)
100 {
101 GroupEntryVec groupEntryVec = CreateGroupEntryVec();
102 QueryGroupParams params = InitQueryGroupParams();
103 params.groupId = groupId;
104 if (QueryGroups(osAccountId, ¶ms, &groupEntryVec) != HC_SUCCESS) {
105 LOGE("Failed to query groups!");
106 ClearGroupEntryVec(&groupEntryVec);
107 return NULL;
108 }
109 uint32_t index;
110 TrustedGroupEntry **entry;
111 FOR_EACH_HC_VECTOR(groupEntryVec, index, entry) {
112 TrustedGroupEntry *returnEntry = DeepCopyGroupEntry(*entry);
113 ClearGroupEntryVec(&groupEntryVec);
114 return returnEntry;
115 }
116 ClearGroupEntryVec(&groupEntryVec);
117 return NULL;
118 }
119
CheckGroupValidity(const CmdParams * params)120 static int32_t CheckGroupValidity(const CmdParams *params)
121 {
122 #ifdef DEV_AUTH_SAVE_TRUST_INFO_TEST
123 (void)params;
124 return HC_SUCCESS;
125 #else
126 if (params->isBind) {
127 return HC_SUCCESS;
128 }
129 TrustedGroupEntry *entry = GetGroupEntryById(params->osAccountId, params->groupId);
130 if (entry == NULL) {
131 LOGE("Auth expand process, group not exist!");
132 return HC_ERR_GROUP_NOT_EXIST;
133 }
134 DestroyGroupEntry(entry);
135 return HC_SUCCESS;
136 #endif
137 }
138
ClientSendTrustedInfoProcEvent(CmdParams * params)139 static int32_t ClientSendTrustedInfoProcEvent(CmdParams *params)
140 {
141 char udid[INPUT_UDID_LEN] = { 0 };
142 int32_t res = HcGetUdid((uint8_t *)udid, INPUT_UDID_LEN);
143 if (res != HC_SUCCESS) {
144 LOGE("Failed to get local udid! res: %" LOG_PUB "d", res);
145 return res;
146 }
147 if (DeepCopyString(udid, ¶ms->udidSelf) != HC_SUCCESS) {
148 LOGE("copy udid fail.");
149 return HC_ERR_ALLOC_MEMORY;
150 }
151 res = CheckGroupValidity(params);
152 if (res != HC_SUCCESS) {
153 return res;
154 }
155 TrustedGroupEntry *entry = GetGroupEntryById(params->osAccountId, params->groupId);
156 if (entry == NULL) {
157 params->isGroupExistSelf = false;
158 return HC_SUCCESS;
159 }
160 params->isGroupExistSelf = true;
161 if (DeepCopyString(StringGet(&entry->name), ¶ms->groupName) != HC_SUCCESS) {
162 LOGE("Copy groupName failed!");
163 DestroyGroupEntry(entry);
164 return HC_ERR_ALLOC_MEMORY;
165 }
166 if ((entry->type != PEER_TO_PEER_GROUP) &&
167 (DeepCopyString(StringGet(&entry->userId), ¶ms->userIdSelf) != HC_SUCCESS)) {
168 LOGE("Copy userIdSelf failed!");
169 DestroyGroupEntry(entry);
170 return HC_ERR_ALLOC_MEMORY;
171 }
172 DestroyGroupEntry(entry);
173 return HC_SUCCESS;
174 }
175
ClientSendTrustedInfoBuildEvent(const CmdParams * params,CJson ** outputEvent)176 static int32_t ClientSendTrustedInfoBuildEvent(const CmdParams *params, CJson **outputEvent)
177 {
178 CJson *json = CreateJson();
179 if (json == NULL) {
180 LOGE("create json failed.");
181 return HC_ERR_JSON_CREATE;
182 }
183 if (AddIntToJson(json, FIELD_EVENT, CLIENT_SEND_INFO_EVENT) != HC_SUCCESS) {
184 LOGE("add eventName to json fail.");
185 FreeJson(json);
186 return HC_ERR_JSON_ADD;
187 }
188 if (AddStringToJson(json, FIELD_AUTH_ID_CLIENT, params->authIdSelf) != HC_SUCCESS) {
189 LOGE("add authIdC to json fail.");
190 FreeJson(json);
191 return HC_ERR_JSON_ADD;
192 }
193 if (AddStringToJson(json, FIELD_UDID_CLIENT, params->udidSelf) != HC_SUCCESS) {
194 LOGE("add udidC to json fail.");
195 FreeJson(json);
196 return HC_ERR_JSON_ADD;
197 }
198 if (AddIntToJson(json, FIELD_USER_TYPE_CLIENT, params->userTypeSelf) != HC_SUCCESS) {
199 LOGE("add userTypeC to json fail.");
200 FreeJson(json);
201 return HC_ERR_JSON_ADD;
202 }
203 if (params->isGroupExistSelf) {
204 if (AddStringToJson(json, FIELD_GROUP_NAME, params->groupName) != HC_SUCCESS) {
205 LOGE("add groupName to json fail.");
206 FreeJson(json);
207 return HC_ERR_JSON_ADD;
208 }
209 }
210 if (params->userIdSelf != NULL) {
211 if (AddStringToJson(json, FIELD_USER_ID_CLIENT, params->userIdSelf) != HC_SUCCESS) {
212 LOGE("add userIdC to json fail.");
213 FreeJson(json);
214 return HC_ERR_JSON_ADD;
215 }
216 }
217 *outputEvent = json;
218 return HC_SUCCESS;
219 }
220
ServerSendTrustedInfoParseEvent(const CJson * inputEvent,CmdParams * params)221 static int32_t ServerSendTrustedInfoParseEvent(const CJson *inputEvent, CmdParams *params)
222 {
223 const char *authId = GetStringFromJson(inputEvent, FIELD_AUTH_ID_CLIENT);
224 if (authId == NULL) {
225 LOGE("Get authIdC from inputEvent failed.");
226 return HC_ERR_JSON_GET;
227 }
228 const char *udid = GetStringFromJson(inputEvent, FIELD_UDID_CLIENT);
229 if (udid == NULL) {
230 LOGE("Get udidC from inputEvent failed.");
231 return HC_ERR_JSON_GET;
232 }
233 int32_t userTypeC;
234 if (GetIntFromJson(inputEvent, FIELD_USER_TYPE_CLIENT, &userTypeC) != HC_SUCCESS) {
235 LOGE("Get userTypeC from inputEvent failed.");
236 return HC_ERR_JSON_GET;
237 }
238 if (DeepCopyString(authId, &(params->authIdPeer)) != HC_SUCCESS) {
239 LOGE("Deep copy groupId failed.");
240 return HC_ERR_MEMORY_COPY;
241 }
242 if (DeepCopyString(udid, &(params->udidPeer)) != HC_SUCCESS) {
243 LOGE("Deep copy groupId failed.");
244 return HC_ERR_MEMORY_COPY;
245 }
246 const char *groupName = GetStringFromJson(inputEvent, FIELD_GROUP_NAME);
247 if (groupName != NULL) {
248 if (DeepCopyString(groupName, &(params->groupName)) != HC_SUCCESS) {
249 LOGE("Copy groupName failed.");
250 return HC_ERR_MEMORY_COPY;
251 }
252 params->isGroupExistPeer = true;
253 } else {
254 params->isGroupExistPeer = false;
255 }
256 const char *userId = GetStringFromJson(inputEvent, FIELD_USER_ID_CLIENT);
257 if (userId != NULL) {
258 if (DeepCopyString(userId, &(params->userIdPeer)) != HC_SUCCESS) {
259 LOGE("Deep copy userId failed.");
260 return HC_ERR_MEMORY_COPY;
261 }
262 }
263 params->userTypePeer = userTypeC;
264 return HC_SUCCESS;
265 }
266
GenerateGroupParams(const CmdParams * params,TrustedGroupEntry * groupParams)267 static int32_t GenerateGroupParams(const CmdParams *params, TrustedGroupEntry *groupParams)
268 {
269 if (!StringSetPointer(&groupParams->name, params->groupName)) {
270 LOGE("Failed to copy groupName!");
271 return HC_ERR_MEMORY_COPY;
272 }
273 if (!StringSetPointer(&groupParams->id, params->groupId)) {
274 LOGE("Failed to copy groupId!");
275 return HC_ERR_MEMORY_COPY;
276 }
277 HcString ownerName = CreateString();
278 if (!StringSetPointer(&ownerName, params->appId)) {
279 LOGE("Failed to copy groupOwner!");
280 DeleteString(&ownerName);
281 return HC_ERR_MEMORY_COPY;
282 }
283 if (groupParams->managers.pushBackT(&groupParams->managers, ownerName) == NULL) {
284 LOGE("Failed to push owner to vec!");
285 DeleteString(&ownerName);
286 return HC_ERR_MEMORY_COPY;
287 }
288 groupParams->visibility = params->visibility;
289 groupParams->type = PEER_TO_PEER_GROUP;
290 groupParams->expireTime = DEFAULT_EXPIRE_TIME;
291 return HC_SUCCESS;
292 }
293
GeneratePeerDevParams(const CmdParams * params,TrustedDeviceEntry * devParams)294 static int32_t GeneratePeerDevParams(const CmdParams *params, TrustedDeviceEntry *devParams)
295 {
296 if (!StringSetPointer(&devParams->groupId, params->groupId)) {
297 LOGE("Failed to copy groupId!");
298 return HC_ERR_MEMORY_COPY;
299 }
300 if (!StringSetPointer(&devParams->udid, params->udidPeer)) {
301 LOGE("Failed to copy udid!");
302 return HC_ERR_MEMORY_COPY;
303 }
304 if (!StringSetPointer(&devParams->authId, params->authIdPeer)) {
305 LOGE("Failed to copy authId!");
306 return HC_ERR_MEMORY_COPY;
307 }
308 if (params->userIdPeer != NULL && !StringSetPointer(&devParams->userId, params->userIdPeer)) {
309 LOGE("Failed to copy serviceType!");
310 return HC_ERR_MEMORY_COPY;
311 }
312 if (!StringSetPointer(&devParams->serviceType, params->groupId)) {
313 LOGE("Failed to copy serviceType!");
314 return HC_ERR_MEMORY_COPY;
315 }
316 devParams->credential = params->credType;
317 devParams->devType = params->userTypePeer;
318 devParams->source = SELF_CREATED;
319 return HC_SUCCESS;
320 }
321
GenerateSelfDevParams(const CmdParams * params,TrustedDeviceEntry * devParams)322 static int32_t GenerateSelfDevParams(const CmdParams *params, TrustedDeviceEntry *devParams)
323 {
324 if (!StringSetPointer(&devParams->udid, params->udidSelf)) {
325 LOGE("Failed to copy udid!");
326 return HC_ERR_MEMORY_COPY;
327 }
328 if (!StringSetPointer(&devParams->authId, params->authIdSelf)) {
329 LOGE("Failed to copy authId!");
330 return HC_ERR_MEMORY_COPY;
331 }
332 if (!StringSetPointer(&devParams->groupId, params->groupId)) {
333 LOGE("Failed to copy groupId!");
334 return HC_ERR_MEMORY_COPY;
335 }
336 if (!StringSetPointer(&devParams->serviceType, params->groupId)) {
337 LOGE("Failed to copy serviceType!");
338 return HC_ERR_MEMORY_COPY;
339 }
340 devParams->devType = params->userTypeSelf;
341 devParams->source = SELF_CREATED;
342 devParams->credential = params->credType;
343 return HC_SUCCESS;
344 }
345
AddTrustedGroup(const CmdParams * params)346 static int32_t AddTrustedGroup(const CmdParams *params)
347 {
348 TrustedGroupEntry *groupParams = CreateGroupEntry();
349 if (groupParams == NULL) {
350 LOGE("Failed to allocate groupParams memory!");
351 return HC_ERR_ALLOC_MEMORY;
352 }
353 int32_t res = GenerateGroupParams(params, groupParams);
354 if (res != HC_SUCCESS) {
355 DestroyGroupEntry(groupParams);
356 return res;
357 }
358 res = AddGroup(params->osAccountId, groupParams);
359 DestroyGroupEntry(groupParams);
360 if (res != HC_SUCCESS) {
361 LOGE("Failed to add the group to the database!");
362 }
363 return res;
364 }
365
IsAcrossAccount(const CmdParams * params)366 static bool IsAcrossAccount(const CmdParams *params)
367 {
368 if (params->userIdSelf == NULL || params->userIdPeer == NULL) {
369 LOGW("userIdSelf or userIdPeer is null");
370 return false;
371 }
372 if (!params->isBind && !IsStrEqual(params->userIdSelf, params->userIdPeer)) {
373 LOGI("No peer-to-peer binding and SelfUserId is not equal to PeerUserId, don't need to add peerDevice!");
374 return true;
375 }
376 return false;
377 }
378
AddPeerTrustedDevice(const CmdParams * params)379 static int32_t AddPeerTrustedDevice(const CmdParams *params)
380 {
381 if (IsAcrossAccount(params)) {
382 return HC_SUCCESS;
383 }
384 TrustedDeviceEntry *devParams = CreateDeviceEntry();
385 if (devParams == NULL) {
386 LOGE("Failed to allocate devParams memory!");
387 return HC_ERR_ALLOC_MEMORY;
388 }
389 int32_t res = GeneratePeerDevParams(params, devParams);
390 if (res != HC_SUCCESS) {
391 DestroyDeviceEntry(devParams);
392 return res;
393 }
394 res = AddTrustedDevice(params->osAccountId, devParams);
395 DestroyDeviceEntry(devParams);
396 if (res != HC_SUCCESS) {
397 LOGE("Failed to add the peer trust device to the database!");
398 } else {
399 LOGI("add trusted device success.");
400 PRINT_SENSITIVE_DATA("GroupId", params->groupId);
401 PRINT_SENSITIVE_DATA("PeerAuthId", params->authIdPeer);
402 PRINT_SENSITIVE_DATA("PeerUdid", params->udidPeer);
403 }
404 return res;
405 }
406
AddSelfTrustedDevice(const CmdParams * params)407 static int32_t AddSelfTrustedDevice(const CmdParams *params)
408 {
409 TrustedDeviceEntry *devParams = CreateDeviceEntry();
410 if (devParams == NULL) {
411 LOGE("Failed to allocate devParams memory!");
412 return HC_ERR_ALLOC_MEMORY;
413 }
414 int32_t res = GenerateSelfDevParams(params, devParams);
415 if (res != HC_SUCCESS) {
416 DestroyDeviceEntry(devParams);
417 return res;
418 }
419 res = AddTrustedDevice(params->osAccountId, devParams);
420 DestroyDeviceEntry(devParams);
421 if (res != HC_SUCCESS) {
422 LOGE("Failed to add the self trust device to the database!");
423 }
424 return res;
425 }
426
CreatePeerToPeerGroup(const CmdParams * params)427 static int32_t CreatePeerToPeerGroup(const CmdParams *params)
428 {
429 int32_t res = AddTrustedGroup(params);
430 if (res != HC_SUCCESS) {
431 return res;
432 }
433 return AddSelfTrustedDevice(params);
434 }
435
GetTrustedDeviceEntryById(int32_t osAccountId,const char * udid,const char * groupId)436 static TrustedDeviceEntry *GetTrustedDeviceEntryById(int32_t osAccountId, const char *udid, const char *groupId)
437 {
438 DeviceEntryVec deviceEntryVec = CreateDeviceEntryVec();
439 QueryDeviceParams params = InitQueryDeviceParams();
440 params.groupId = groupId;
441 params.udid = udid;
442 if (QueryDevices(osAccountId, ¶ms, &deviceEntryVec) != HC_SUCCESS) {
443 LOGE("Error occurs, query trusted devices failed!");
444 ClearDeviceEntryVec(&deviceEntryVec);
445 return NULL;
446 }
447 uint32_t index;
448 TrustedDeviceEntry **deviceEntry;
449 FOR_EACH_HC_VECTOR(deviceEntryVec, index, deviceEntry) {
450 TrustedDeviceEntry *returnEntry = DeepCopyDeviceEntry(*deviceEntry);
451 ClearDeviceEntryVec(&deviceEntryVec);
452 return returnEntry;
453 }
454 ClearDeviceEntryVec(&deviceEntryVec);
455 return NULL;
456 }
457
IsDeviceImportedByCloud(const CmdParams * params)458 static bool IsDeviceImportedByCloud(const CmdParams *params)
459 {
460 TrustedDeviceEntry *peerDeviceEntry = GetTrustedDeviceEntryById(params->osAccountId, params->udidPeer,
461 params->groupId);
462 if (peerDeviceEntry == NULL) {
463 return false;
464 }
465 uint8_t source = peerDeviceEntry->source;
466 DestroyDeviceEntry(peerDeviceEntry);
467 return source == IMPORTED_FROM_CLOUD;
468 }
469
ServerSendTrustedInfoProcEvent(CmdParams * params)470 static int32_t ServerSendTrustedInfoProcEvent(CmdParams *params)
471 {
472 char udid[INPUT_UDID_LEN] = { 0 };
473 int32_t res = HcGetUdid((uint8_t *)udid, INPUT_UDID_LEN);
474 if (res != HC_SUCCESS) {
475 LOGE("Failed to get local udid! res: %" LOG_PUB "d", res);
476 return res;
477 }
478 if (DeepCopyString(udid, ¶ms->udidSelf) != HC_SUCCESS) {
479 LOGE("copy udid fail.");
480 return HC_ERR_ALLOC_MEMORY;
481 }
482 res = CheckGroupValidity(params);
483 if (res != HC_SUCCESS) {
484 return res;
485 }
486 TrustedGroupEntry *entry = GetGroupEntryById(params->osAccountId, params->groupId);
487 if (entry == NULL) {
488 params->isGroupExistSelf = false;
489 res = CreatePeerToPeerGroup(params);
490 if (res != HC_SUCCESS) {
491 LOGE("Failed to add the group to the database!");
492 return res;
493 }
494 } else {
495 params->isGroupExistSelf = true;
496 if ((params->groupName == NULL) &&
497 (DeepCopyString(StringGet(&entry->name), ¶ms->groupName) != HC_SUCCESS)) {
498 LOGE("copy groupName fail.");
499 DestroyGroupEntry(entry);
500 return HC_ERR_ALLOC_MEMORY;
501 }
502 if ((entry->type != PEER_TO_PEER_GROUP) &&
503 (DeepCopyString(StringGet(&entry->userId), ¶ms->userIdSelf) != HC_SUCCESS)) {
504 LOGE("copy userIdSelf fail.");
505 DestroyGroupEntry(entry);
506 return HC_ERR_ALLOC_MEMORY;
507 }
508 DestroyGroupEntry(entry);
509 }
510 if (!IsDeviceImportedByCloud(params)) {
511 res = AddPeerTrustedDevice(params);
512 if (res != HC_SUCCESS) {
513 return res;
514 }
515 } else {
516 LOGI("Peer trusted device is imported from cloud, so there is no need to add it again.");
517 }
518 return SaveOsAccountDb(params->osAccountId);
519 }
520
ServerSendTrustedInfoBuildEvent(const CmdParams * params,CJson ** outputEvent)521 static int32_t ServerSendTrustedInfoBuildEvent(const CmdParams *params, CJson **outputEvent)
522 {
523 CJson *json = CreateJson();
524 if (json == NULL) {
525 LOGE("create json failed.");
526 return HC_ERR_JSON_CREATE;
527 }
528 if (AddIntToJson(json, FIELD_EVENT, SERVER_SEND_INFO_EVENT) != HC_SUCCESS) {
529 LOGE("add eventName to json fail.");
530 FreeJson(json);
531 return HC_ERR_JSON_ADD;
532 }
533 if (AddStringToJson(json, FIELD_AUTH_ID_SERVER, params->authIdSelf) != HC_SUCCESS) {
534 LOGE("add authIdS to json fail.");
535 FreeJson(json);
536 return HC_ERR_JSON_ADD;
537 }
538 if (AddStringToJson(json, FIELD_UDID_SERVER, params->udidSelf) != HC_SUCCESS) {
539 LOGE("add udidS to json fail.");
540 FreeJson(json);
541 return HC_ERR_JSON_ADD;
542 }
543 if (AddIntToJson(json, FIELD_USER_TYPE_SERVER, params->userTypeSelf) != HC_SUCCESS) {
544 LOGE("add userTypeS to json fail.");
545 FreeJson(json);
546 return HC_ERR_JSON_ADD;
547 }
548 if (!params->isGroupExistPeer) {
549 if (AddStringToJson(json, FIELD_GROUP_NAME, params->groupName) != HC_SUCCESS) {
550 LOGE("add groupName to json fail.");
551 FreeJson(json);
552 return HC_ERR_JSON_ADD;
553 }
554 }
555 if (params->userIdSelf != NULL) {
556 if (AddStringToJson(json, FIELD_USER_ID_SERVER, params->userIdSelf) != HC_SUCCESS) {
557 LOGE("add userIdS to json fail.");
558 FreeJson(json);
559 return HC_ERR_JSON_ADD;
560 }
561 }
562 *outputEvent = json;
563 return HC_SUCCESS;
564 }
565
ClientFinishProcParseEvent(const CJson * inputEvent,CmdParams * params)566 static int32_t ClientFinishProcParseEvent(const CJson *inputEvent, CmdParams *params)
567 {
568 if (!params->isGroupExistSelf) {
569 const char *groupName = GetStringFromJson(inputEvent, FIELD_GROUP_NAME);
570 if (groupName == NULL) {
571 LOGE("get groupName from json fail.");
572 return HC_ERR_JSON_GET;
573 }
574 if (DeepCopyString(groupName, &(params->groupName)) != HC_SUCCESS) {
575 LOGE("copy groupName fail.");
576 return HC_ERR_MEMORY_COPY;
577 }
578 }
579 const char *authId = GetStringFromJson(inputEvent, FIELD_AUTH_ID_SERVER);
580 if (authId == NULL) {
581 LOGE("get authIdS from json fail.");
582 return HC_ERR_JSON_GET;
583 }
584 const char *udid = GetStringFromJson(inputEvent, FIELD_UDID_SERVER);
585 if (udid == NULL) {
586 LOGE("get udidS from json fail.");
587 return HC_ERR_JSON_GET;
588 }
589 int32_t userTypeS;
590 if (GetIntFromJson(inputEvent, FIELD_USER_TYPE_SERVER, &userTypeS) != HC_SUCCESS) {
591 LOGE("get userTypeS from json fail.");
592 return HC_ERR_JSON_GET;
593 }
594 if (DeepCopyString(authId, &(params->authIdPeer)) != HC_SUCCESS) {
595 LOGE("copy groupId fail.");
596 return HC_ERR_MEMORY_COPY;
597 }
598 if (DeepCopyString(udid, &(params->udidPeer)) != HC_SUCCESS) {
599 LOGE("copy groupId fail.");
600 return HC_ERR_MEMORY_COPY;
601 }
602 const char *userId = GetStringFromJson(inputEvent, FIELD_USER_ID_SERVER);
603 if (userId != NULL) {
604 if (DeepCopyString(userId, &(params->userIdPeer)) != HC_SUCCESS) {
605 LOGE("copy userId fail.");
606 return HC_ERR_MEMORY_COPY;
607 }
608 }
609 params->userTypePeer = userTypeS;
610 return HC_SUCCESS;
611 }
612
ClientFinishProcProcEvent(const CmdParams * params)613 static int32_t ClientFinishProcProcEvent(const CmdParams *params)
614 {
615 int32_t res;
616 if (!params->isGroupExistSelf) {
617 res = CreatePeerToPeerGroup(params);
618 if (res != HC_SUCCESS) {
619 LOGE("Failed to add the group to the database!");
620 return res;
621 }
622 }
623 if (!IsDeviceImportedByCloud(params)) {
624 res = AddPeerTrustedDevice(params);
625 if (res != HC_SUCCESS) {
626 return res;
627 }
628 }
629 return SaveOsAccountDb(params->osAccountId);
630 }
631
NotifyPeerError(int32_t errorCode,CJson ** outputEvent)632 static void NotifyPeerError(int32_t errorCode, CJson **outputEvent)
633 {
634 CJson *json = CreateJson();
635 if (json == NULL) {
636 LOGE("create json failed.");
637 return;
638 }
639 if (AddIntToJson(json, FIELD_EVENT, FAIL_EVENT) != HC_SUCCESS) {
640 LOGE("Add eventName to event json failed.");
641 FreeJson(json);
642 return;
643 }
644 if (AddIntToJson(json, FIELD_ERR_CODE, errorCode) != HC_SUCCESS) {
645 LOGE("add errorCode to event json failed.");
646 FreeJson(json);
647 return;
648 }
649 *outputEvent = json;
650 return;
651 }
652
ReturnError(int32_t errorCode,CJson ** outputEvent)653 static void ReturnError(int32_t errorCode, CJson **outputEvent)
654 {
655 (void)errorCode;
656 (void)outputEvent;
657 return;
658 }
659
ThrowException(BaseCmd * self,const CJson * baseEvent,CJson ** outputEvent)660 static int32_t ThrowException(BaseCmd *self, const CJson *baseEvent, CJson **outputEvent)
661 {
662 (void)self;
663 (void)outputEvent;
664 int32_t peerErrorCode = HC_ERR_PEER_ERROR;
665 (void)GetIntFromJson(baseEvent, FIELD_ERR_CODE, &peerErrorCode);
666 LOGE("An exception occurred in the peer cmd. [Code]: %" LOG_PUB "d", peerErrorCode);
667 return peerErrorCode;
668 }
669
ClientSendTrustedInfo(BaseCmd * self,const CJson * inputEvent,CJson ** outputEvent)670 static int32_t ClientSendTrustedInfo(BaseCmd *self, const CJson *inputEvent, CJson **outputEvent)
671 {
672 (void)inputEvent;
673 SaveTrustedInfoCmd *impl = (SaveTrustedInfoCmd *)self;
674 int32_t res = ClientSendTrustedInfoProcEvent(&impl->params);
675 if (res != HC_SUCCESS) {
676 return res;
677 }
678 return ClientSendTrustedInfoBuildEvent(&impl->params, outputEvent);
679 }
680
ServerSendTrustedInfo(BaseCmd * self,const CJson * inputEvent,CJson ** outputEvent)681 static int32_t ServerSendTrustedInfo(BaseCmd *self, const CJson *inputEvent, CJson **outputEvent)
682 {
683 SaveTrustedInfoCmd *impl = (SaveTrustedInfoCmd *)self;
684 int32_t res = ServerSendTrustedInfoParseEvent(inputEvent, &impl->params);
685 if (res != HC_SUCCESS) {
686 return res;
687 }
688 res = ServerSendTrustedInfoProcEvent(&impl->params);
689 if (res != HC_SUCCESS) {
690 return res;
691 }
692 return ServerSendTrustedInfoBuildEvent(&impl->params, outputEvent);
693 }
694
ClientFinishProc(BaseCmd * self,const CJson * inputEvent,CJson ** outputEvent)695 static int32_t ClientFinishProc(BaseCmd *self, const CJson *inputEvent, CJson **outputEvent)
696 {
697 (void)outputEvent;
698 SaveTrustedInfoCmd *impl = (SaveTrustedInfoCmd *)self;
699 int32_t res = ClientFinishProcParseEvent(inputEvent, &impl->params);
700 if (res != HC_SUCCESS) {
701 return res;
702 }
703 return ClientFinishProcProcEvent(&impl->params);
704 }
705
706 static const CmdStateNode STATE_MACHINE[] = {
707 { CREATE_AS_CLIENT_STATE, START_EVENT, ClientSendTrustedInfo, NotifyPeerError, CLIENT_START_REQ_STATE },
708 { CREATE_AS_SERVER_STATE, CLIENT_SEND_INFO_EVENT, ServerSendTrustedInfo, NotifyPeerError, SERVER_FINISH_STATE },
709 { CREATE_AS_SERVER_STATE, FAIL_EVENT, ThrowException, ReturnError, FAIL_STATE },
710 { CLIENT_START_REQ_STATE, SERVER_SEND_INFO_EVENT, ClientFinishProc, ReturnError, CLIENT_FINISH_STATE },
711 { CLIENT_START_REQ_STATE, FAIL_EVENT, ThrowException, ReturnError, FAIL_STATE },
712 };
713
DecodeEvent(const CJson * receviedMsg)714 static int32_t DecodeEvent(const CJson *receviedMsg)
715 {
716 if (receviedMsg == NULL) {
717 return START_EVENT;
718 }
719 int32_t event;
720 if (GetIntFromJson(receviedMsg, FIELD_EVENT, &event) != HC_SUCCESS) {
721 LOGE("Error occurs, get event from receviedMsg failed.");
722 return UNKNOWN_EVENT;
723 }
724 if (START_EVENT <= event && event <= UNKNOWN_EVENT) {
725 return event;
726 }
727 LOGE("Invalid event type.");
728 return UNKNOWN_EVENT;
729 }
730
SwitchState(BaseCmd * self,const CJson * receviedMsg,CJson ** returnSendMsg,CmdState * returnState)731 static int32_t SwitchState(BaseCmd *self, const CJson *receviedMsg, CJson **returnSendMsg, CmdState *returnState)
732 {
733 int32_t eventType = DecodeEvent(receviedMsg);
734 for (uint32_t i = 0; i < sizeof(STATE_MACHINE) / sizeof(STATE_MACHINE[0]); i++) {
735 if ((STATE_MACHINE[i].curState == self->curState) && (STATE_MACHINE[i].eventType == eventType)) {
736 int32_t res = STATE_MACHINE[i].stateProcessFunc(self, receviedMsg, returnSendMsg);
737 if (res != HC_SUCCESS) {
738 STATE_MACHINE[i].exceptionHandleFunc(res, returnSendMsg);
739 self->curState = self->failState;
740 return res;
741 }
742 LOGI("Event: %" LOG_PUB "d, CurState: %" LOG_PUB "d, NextState: %" LOG_PUB "d.", eventType, self->curState,
743 STATE_MACHINE[i].nextState);
744 self->curState = STATE_MACHINE[i].nextState;
745 *returnState = (self->curState == self->finishState) ? CMD_STATE_FINISH : CMD_STATE_CONTINUE;
746 return HC_SUCCESS;
747 }
748 }
749 LOGI("Invalid event type. Ignore process. [Event]: %" LOG_PUB "d, [CurState]: %" LOG_PUB "d.",
750 eventType, self->curState);
751 return HC_SUCCESS;
752 }
753
StartSaveTrustedInfoCmd(BaseCmd * self,CJson ** returnSendMsg)754 static int32_t StartSaveTrustedInfoCmd(BaseCmd *self, CJson **returnSendMsg)
755 {
756 if ((self == NULL) || (returnSendMsg == NULL)) {
757 LOGE("Incorrect params!");
758 return HC_ERR_INVALID_PARAMS;
759 }
760 if (self->curState != self->beginState) {
761 LOGE("The protocol has ended, and the state switch cannot continue!");
762 return HC_ERR_UNSUPPORTED_OPCODE;
763 }
764 CmdState state;
765 return SwitchState(self, NULL, returnSendMsg, &state);
766 }
767
ProcessSaveTrustedInfoCmd(BaseCmd * self,const CJson * receviedMsg,CJson ** returnSendMsg,CmdState * returnState)768 static int32_t ProcessSaveTrustedInfoCmd(BaseCmd *self, const CJson *receviedMsg,
769 CJson **returnSendMsg, CmdState *returnState)
770 {
771 if ((self == NULL) || (receviedMsg == NULL) || (returnSendMsg == NULL) || (returnState == NULL)) {
772 LOGE("Incorrect params!");
773 return HC_ERR_INVALID_PARAMS;
774 }
775 if ((self->curState == self->finishState) || (self->curState == self->failState)) {
776 LOGE("The protocol has ended, and the state switch cannot continue!");
777 return HC_ERR_UNSUPPORTED_OPCODE;
778 }
779 return SwitchState(self, receviedMsg, returnSendMsg, returnState);
780 }
781
DestroySaveTrustedInfoCmd(BaseCmd * self)782 static void DestroySaveTrustedInfoCmd(BaseCmd *self)
783 {
784 if (self == NULL) {
785 LOGD("self is null.");
786 return;
787 }
788 SaveTrustedInfoCmd *impl = (SaveTrustedInfoCmd *)self;
789 HcFree(impl->params.groupId);
790 impl->params.groupId = NULL;
791 HcFree(impl->params.groupName);
792 impl->params.groupName = NULL;
793 HcFree(impl->params.appId);
794 impl->params.appId = NULL;
795 HcFree(impl->params.authIdSelf);
796 impl->params.authIdSelf = NULL;
797 HcFree(impl->params.authIdPeer);
798 impl->params.authIdPeer = NULL;
799 HcFree(impl->params.udidSelf);
800 impl->params.udidSelf = NULL;
801 HcFree(impl->params.udidPeer);
802 impl->params.udidPeer = NULL;
803 HcFree(impl->params.userIdSelf);
804 impl->params.userIdSelf = NULL;
805 HcFree(impl->params.userIdPeer);
806 impl->params.userIdPeer = NULL;
807 HcFree(impl);
808 }
809
IsSaveTrustedInfoParamsValid(const SaveTrustedInfoParams * params)810 static inline bool IsSaveTrustedInfoParamsValid(const SaveTrustedInfoParams *params)
811 {
812 return ((params != NULL) && (params->appId != NULL) && (params->authId != NULL) && (params->groupId != NULL));
813 }
814
InitSaveTrustedInfoCmd(SaveTrustedInfoCmd * instance,const SaveTrustedInfoParams * params,bool isCaller,int32_t strategy)815 static int32_t InitSaveTrustedInfoCmd(SaveTrustedInfoCmd *instance, const SaveTrustedInfoParams *params,
816 bool isCaller, int32_t strategy)
817 {
818 if (DeepCopyString(params->appId, &(instance->params.appId)) != HC_SUCCESS) {
819 LOGE("copy appId fail.");
820 return HC_ERR_ALLOC_MEMORY;
821 }
822 if (DeepCopyString(params->authId, &(instance->params.authIdSelf)) != HC_SUCCESS) {
823 LOGE("copy authId fail.");
824 return HC_ERR_ALLOC_MEMORY;
825 }
826 if (DeepCopyString(params->groupId, &(instance->params.groupId)) != HC_SUCCESS) {
827 LOGE("copy groupId fail.");
828 return HC_ERR_ALLOC_MEMORY;
829 }
830 instance->params.isGroupExistSelf = false;
831 instance->params.isGroupExistPeer = false;
832 instance->params.isBind = params->isBind;
833 instance->params.osAccountId = params->osAccountId;
834 instance->params.credType = params->credType;
835 instance->params.userTypeSelf = params->userType;
836 instance->params.visibility = params->visibility;
837 instance->base.type = SAVE_TRUSTED_INFO_CMD_TYPE;
838 instance->base.strategy = strategy;
839 instance->base.isCaller = isCaller;
840 instance->base.beginState = isCaller ? CREATE_AS_CLIENT_STATE : CREATE_AS_SERVER_STATE;
841 instance->base.finishState = isCaller ? CLIENT_FINISH_STATE : SERVER_FINISH_STATE;
842 instance->base.failState = FAIL_STATE;
843 instance->base.curState = instance->base.beginState;
844 instance->base.start = StartSaveTrustedInfoCmd;
845 instance->base.process = ProcessSaveTrustedInfoCmd;
846 instance->base.destroy = DestroySaveTrustedInfoCmd;
847 return HC_SUCCESS;
848 }
849
CreateSaveTrustedInfoCmd(const void * baseParams,bool isCaller,int32_t strategy)850 BaseCmd *CreateSaveTrustedInfoCmd(const void *baseParams, bool isCaller, int32_t strategy)
851 {
852 const SaveTrustedInfoParams *params = (const SaveTrustedInfoParams *)baseParams;
853 if (!IsSaveTrustedInfoParamsValid(params)) {
854 LOGE("invalid params.");
855 return NULL;
856 }
857 SaveTrustedInfoCmd *instance = (SaveTrustedInfoCmd *)HcMalloc(sizeof(SaveTrustedInfoCmd), 0);
858 if (instance == NULL) {
859 LOGE("allocate instance memory fail.");
860 return NULL;
861 }
862 int32_t res = InitSaveTrustedInfoCmd(instance, params, isCaller, strategy);
863 if (res != HC_SUCCESS) {
864 DestroySaveTrustedInfoCmd((BaseCmd *)instance);
865 return NULL;
866 }
867 return (BaseCmd *)instance;
868 }
869