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