1 /*
2 * Copyright (c) 2022 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 "auth_request.h"
17
18 #include <securec.h>
19
20 #include "auth_common.h"
21 #include "softbus_adapter_mem.h"
22 #include "softbus_def.h"
23
24 static ListNode g_authRequestList = {&g_authRequestList, &g_authRequestList};
25
FindAuthRequestByRequestId(uint64_t requestId)26 static AuthRequest *FindAuthRequestByRequestId(uint64_t requestId)
27 {
28 AuthRequest *item = NULL;
29 LIST_FOR_EACH_ENTRY(item, &g_authRequestList, AuthRequest, node) {
30 if (item->requestId == requestId) {
31 return item;
32 }
33 }
34 return NULL;
35 }
36
GetAuthRequestWaitNum(AuthRequest * request)37 static uint32_t GetAuthRequestWaitNum(AuthRequest *request)
38 {
39 uint32_t num = 0;
40 AuthRequest *item = NULL;
41 LIST_FOR_EACH_ENTRY(item, &g_authRequestList, AuthRequest, node) {
42 if (item->type == request->type &&
43 CompareConnInfo(&request->connInfo, &item->connInfo, true)) {
44 num++;
45 }
46 }
47 return num;
48 }
49
AddAuthRequest(const AuthRequest * request)50 NO_SANITIZE("cfi") uint32_t AddAuthRequest(const AuthRequest *request)
51 {
52 CHECK_NULL_PTR_RETURN_VALUE(request, 0);
53 AuthRequest *newRequest = SoftBusCalloc(sizeof(AuthRequest));
54 if (newRequest == NULL) {
55 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "malloc AuthRequest fail.");
56 return 0;
57 }
58 *newRequest = *request;
59 if (!RequireAuthLock()) {
60 SoftBusFree(newRequest);
61 return 0;
62 }
63 ListTailInsert(&g_authRequestList, &newRequest->node);
64 uint32_t waitNum = GetAuthRequestWaitNum(newRequest);
65 ReleaseAuthLock();
66 return waitNum;
67 }
68
GetAuthRequest(uint32_t requestId,AuthRequest * request)69 NO_SANITIZE("cfi") int32_t GetAuthRequest(uint32_t requestId, AuthRequest *request)
70 {
71 CHECK_NULL_PTR_RETURN_VALUE(request, SOFTBUS_INVALID_PARAM);
72 if (!RequireAuthLock()) {
73 return SOFTBUS_LOCK_ERR;
74 }
75 AuthRequest *item = FindAuthRequestByRequestId(requestId);
76 if (item == NULL) {
77 ReleaseAuthLock();
78 return SOFTBUS_NOT_FIND;
79 }
80 *request = *item;
81 ReleaseAuthLock();
82 return SOFTBUS_OK;
83 }
84
GetAuthRequestNoLock(uint32_t requestId,AuthRequest * request)85 NO_SANITIZE("cfi") int32_t GetAuthRequestNoLock(uint32_t requestId, AuthRequest *request)
86 {
87 CHECK_NULL_PTR_RETURN_VALUE(request, SOFTBUS_INVALID_PARAM);
88 AuthRequest *item = FindAuthRequestByRequestId(requestId);
89 if (item == NULL) {
90 return SOFTBUS_NOT_FIND;
91 }
92 *request = *item;
93 return SOFTBUS_OK;
94 }
95
FindAuthRequestByConnInfo(const AuthConnInfo * connInfo,AuthRequest * request)96 NO_SANITIZE("cfi") int32_t FindAuthRequestByConnInfo(const AuthConnInfo *connInfo, AuthRequest *request)
97 {
98 CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
99 CHECK_NULL_PTR_RETURN_VALUE(request, SOFTBUS_INVALID_PARAM);
100 if (!RequireAuthLock()) {
101 return SOFTBUS_LOCK_ERR;
102 }
103 AuthRequest *item = NULL;
104 LIST_FOR_EACH_ENTRY(item, &g_authRequestList, AuthRequest, node) {
105 if (item->type != REQUEST_TYPE_VERIFY ||
106 !CompareConnInfo(&item->connInfo, connInfo, true)) {
107 continue;
108 }
109 *request = *item;
110 ReleaseAuthLock();
111 return SOFTBUS_OK;
112 }
113 ReleaseAuthLock();
114 return SOFTBUS_NOT_FIND;
115 }
116
DelAuthRequest(uint32_t requestId)117 NO_SANITIZE("cfi") void DelAuthRequest(uint32_t requestId)
118 {
119 if (!RequireAuthLock()) {
120 return;
121 }
122 AuthRequest *item = FindAuthRequestByRequestId(requestId);
123 if (item == NULL) {
124 ReleaseAuthLock();
125 return;
126 }
127 ListDelete(&item->node);
128 SoftBusFree(item);
129 ReleaseAuthLock();
130 }
131
ClearAuthRequest(void)132 NO_SANITIZE("cfi") void ClearAuthRequest(void)
133 {
134 if (!RequireAuthLock()) {
135 return;
136 }
137 AuthRequest *item = NULL;
138 AuthRequest *next = NULL;
139 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_authRequestList, AuthRequest, node) {
140 ListDelete(&item->node);
141 SoftBusFree(item);
142 }
143 ListInit(&g_authRequestList);
144 ReleaseAuthLock();
145 }
146
CheckVerifyCallback(const AuthVerifyCallback * verifyCb)147 NO_SANITIZE("cfi") bool CheckVerifyCallback(const AuthVerifyCallback *verifyCb)
148 {
149 if (verifyCb == NULL) {
150 return false;
151 }
152 if (verifyCb->onVerifyPassed == NULL || verifyCb->onVerifyFailed == NULL) {
153 return false;
154 }
155 return true;
156 }
157
CheckAuthConnCallback(const AuthConnCallback * connCb)158 NO_SANITIZE("cfi") bool CheckAuthConnCallback(const AuthConnCallback *connCb)
159 {
160 if (connCb == NULL) {
161 return false;
162 }
163 if (connCb->onConnOpened == NULL || connCb->onConnOpenFailed == NULL) {
164 return false;
165 }
166 return true;
167 }
168
PerformVerifyCallback(uint32_t requestId,int32_t result,int64_t authId,const NodeInfo * info)169 void PerformVerifyCallback(uint32_t requestId, int32_t result, int64_t authId, const NodeInfo *info)
170 {
171 AuthRequest request;
172 if (GetAuthRequest(requestId, &request) != SOFTBUS_OK) {
173 return;
174 }
175 if (!CheckVerifyCallback(&request.verifyCb)) {
176 return;
177 }
178 if (result == SOFTBUS_OK) {
179 request.verifyCb.onVerifyPassed(request.requestId, authId, info);
180 } else {
181 request.verifyCb.onVerifyFailed(request.requestId, result);
182 }
183 }
184
PerformAuthConnCallback(uint32_t requestId,int32_t result,int64_t authId)185 NO_SANITIZE("cfi") void PerformAuthConnCallback(uint32_t requestId, int32_t result, int64_t authId)
186 {
187 AuthRequest request;
188 if (GetAuthRequest(requestId, &request) != SOFTBUS_OK) {
189 return;
190 }
191 if (!CheckAuthConnCallback(&request.connCb)) {
192 return;
193 }
194 if (result == SOFTBUS_OK) {
195 request.connCb.onConnOpened(request.requestId, authId);
196 } else {
197 request.connCb.onConnOpenFailed(request.requestId, result);
198 }
199 }
200