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