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