• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "soft_bus_socket_listener.h"
17 
18 #include "accesstoken_log.h"
19 #include "constant.h"
20 #include "remote_command_manager.h"
21 #include "soft_bus_manager.h"
22 
23 namespace OHOS {
24 namespace Security {
25 namespace AccessToken {
26 namespace {
27 static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "SoftBusSocketListener"};
28 }
29 namespace {
30 static const int32_t MAX_ONBYTES_RECEIVED_DATA_LEN = 1024 * 1024 * 10;
31 } // namespace
32 
33 std::mutex SoftBusSocketListener::socketMutex_;
34 std::map<int32_t, std::string> SoftBusSocketListener::socketBindMap_;
35 
OnBind(int32_t socket,PeerSocketInfo info)36 void SoftBusSocketListener::OnBind(int32_t socket, PeerSocketInfo info)
37 {
38     ACCESSTOKEN_LOG_INFO(LABEL, "socket fd is %{public}d.", socket);
39 
40     if (socket <= Constant::INVALID_SOCKET_FD) {
41         ACCESSTOKEN_LOG_ERROR(LABEL, "socket fb invalid.");
42         return;
43     }
44 
45     std::string peerNetworkId(info.networkId);
46     std::lock_guard<std::mutex> guard(socketMutex_);
47     auto iter = socketBindMap_.find(socket);
48     if (iter == socketBindMap_.end()) {
49         socketBindMap_.insert(std::pair<int32_t, std::string>(socket, peerNetworkId));
50     } else {
51         iter->second = peerNetworkId;
52     }
53 }
54 
OnShutdown(int32_t socket,ShutdownReason reason)55 void SoftBusSocketListener::OnShutdown(int32_t socket, ShutdownReason reason)
56 {
57     ACCESSTOKEN_LOG_INFO(LABEL, "socket fd %{public}d shutdown because %{public}u.", socket, reason);
58 
59     if (socket <= Constant::INVALID_SOCKET_FD) {
60         ACCESSTOKEN_LOG_ERROR(LABEL, "socket fb invalid.");
61         return;
62     }
63 
64     // clear sessionId state
65     std::lock_guard<std::mutex> guard(socketMutex_);
66     auto iter = socketBindMap_.find(socket);
67     if (iter != socketBindMap_.end()) {
68         socketBindMap_.erase(iter);
69     }
70 }
71 
GetNetworkIdBySocket(const int32_t socket,std::string & networkId)72 bool SoftBusSocketListener::GetNetworkIdBySocket(const int32_t socket, std::string& networkId)
73 {
74     if (socket <= Constant::INVALID_SOCKET_FD) {
75         ACCESSTOKEN_LOG_ERROR(LABEL, "socket fb invalid.");
76         return false;
77     }
78 
79     std::lock_guard<std::mutex> guard(socketMutex_);
80     auto iter = socketBindMap_.find(socket);
81     if (iter != socketBindMap_.end()) {
82         networkId = iter->second;
83         return true;
84     }
85     return false;
86 }
87 
OnClientBytes(int32_t socket,const void * data,uint32_t dataLen)88 void SoftBusSocketListener::OnClientBytes(int32_t socket, const void *data, uint32_t dataLen)
89 {
90     ACCESSTOKEN_LOG_INFO(LABEL, "socket fd %{public}d, recv len %{public}d.", socket, dataLen);
91 
92     if ((socket <= Constant::INVALID_SOCKET_FD) || (data == nullptr) ||
93         (dataLen == 0) || (dataLen > MAX_ONBYTES_RECEIVED_DATA_LEN)) {
94         ACCESSTOKEN_LOG_ERROR(LABEL, "params invalid.");
95         return;
96     }
97 
98     std::string networkId;
99     if (!GetNetworkIdBySocket(socket, networkId)) {
100         ACCESSTOKEN_LOG_ERROR(LABEL, "socket invalid, bind service first.");
101         return;
102     }
103 
104     // channel create in SoftBusDeviceConnectionListener::OnDeviceOnline->RemoteCommandManager::NotifyDeviceOnline
105     auto channel = RemoteCommandManager::GetInstance().GetExecutorChannel(networkId);
106     if (channel == nullptr) {
107         ACCESSTOKEN_LOG_ERROR(LABEL, "GetExecutorChannel failed");
108         return;
109     }
110     channel->HandleDataReceived(socket, static_cast<unsigned char *>(const_cast<void *>(data)), dataLen);
111 }
112 
OnServiceBytes(int32_t socket,const void * data,uint32_t dataLen)113 void SoftBusSocketListener::OnServiceBytes(int32_t socket, const void *data, uint32_t dataLen)
114 {
115     ACCESSTOKEN_LOG_INFO(LABEL, "socket fd %{public}d, recv len %{public}d.", socket, dataLen);
116 
117     if ((socket <= Constant::INVALID_SOCKET_FD) || (data == nullptr) ||
118         (dataLen == 0) || (dataLen > MAX_ONBYTES_RECEIVED_DATA_LEN)) {
119         ACCESSTOKEN_LOG_ERROR(LABEL, "params invalid.");
120         return;
121     }
122 
123     std::string networkId;
124     if (SoftBusManager::GetInstance().GetNetworkIdBySocket(socket, networkId)) {
125         // channel create in SoftBusDeviceConnectionListener::OnDeviceOnline->RemoteCommandManager::NotifyDeviceOnline
126         auto channel = RemoteCommandManager::GetInstance().GetExecutorChannel(networkId);
127         if (channel == nullptr) {
128             ACCESSTOKEN_LOG_ERROR(LABEL, "GetExecutorChannel failed");
129             return;
130         }
131         channel->HandleDataReceived(socket, static_cast<unsigned char *>(const_cast<void *>(data)), dataLen);
132     } else {
133         ACCESSTOKEN_LOG_ERROR(LABEL, "unkonow socket.");
134     }
135 }
136 } // namespace AccessToken
137 } // namespace Security
138 } // namespace OHOS
139