• 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 
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