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