1 /*
2 * Copyright (c) 2022-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 "networkshare_service.h"
17
18 #include "net_event_report.h"
19 #include "net_manager_center.h"
20 #include "net_manager_constants.h"
21 #include "netmanager_base_permission.h"
22 #include "net_datashare_utils_iface.h"
23 #include "netmgr_ext_log_wrapper.h"
24 #include "networkshare_constants.h"
25 #include "system_ability_definition.h"
26
27 namespace OHOS {
28 namespace NetManagerStandard {
29 const bool REGISTER_LOCAL_RESULT_NETSHARE =
30 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<NetworkShareService>::GetInstance().get());
31
NetworkShareService()32 NetworkShareService::NetworkShareService() : SystemAbility(COMM_NET_TETHERING_MANAGER_SYS_ABILITY_ID, true) {}
33
~NetworkShareService()34 NetworkShareService::~NetworkShareService(){};
35
OnStart()36 void NetworkShareService::OnStart()
37 {
38 if (state_ == STATE_RUNNING) {
39 NETMGR_EXT_LOG_D("OnStart Service state is already running");
40 return;
41 }
42 if (!Init()) {
43 NETMGR_EXT_LOG_E("OnStart init failed");
44 EventInfo eventInfo;
45 eventInfo.operatorType = static_cast<int32_t>(NetworkShareEventOperator::OPERATION_START_SA);
46 eventInfo.errorType = static_cast<int32_t>(NetworkShareEventErrorType::ERROR_START_SA);
47 eventInfo.errorMsg = "Start Network Share Service failed";
48 NetEventReport::SendSetupFaultEvent(eventInfo);
49 return;
50 }
51 state_ = STATE_RUNNING;
52 NETMGR_EXT_LOG_I("OnStart successful");
53 }
54
OnStop()55 void NetworkShareService::OnStop()
56 {
57 NetworkShareTracker::GetInstance().Uninit();
58 state_ = STATE_STOPPED;
59 registerToService_ = false;
60 NETMGR_EXT_LOG_I("OnStop successful");
61 }
62
Dump(int32_t fd,const std::vector<std::u16string> & args)63 int32_t NetworkShareService::Dump(int32_t fd, const std::vector<std::u16string> &args)
64 {
65 NETMGR_EXT_LOG_I("Start Dump, fd: %{public}d", fd);
66 std::string result;
67 GetDumpMessage(result);
68 NETMGR_EXT_LOG_I("Dump content: %{public}s", result.c_str());
69 int32_t ret = dprintf(fd, "%s\n", result.c_str());
70 return ret < 0 ? NETWORKSHARE_ERROR_INTERNAL_ERROR : NETMANAGER_EXT_SUCCESS;
71 }
72
Init()73 bool NetworkShareService::Init()
74 {
75 if (!REGISTER_LOCAL_RESULT_NETSHARE) {
76 NETMGR_EXT_LOG_E("Register to local sa manager failed");
77 return false;
78 }
79 if (!registerToService_) {
80 if (!Publish(DelayedSingleton<NetworkShareService>::GetInstance().get())) {
81 NETMGR_EXT_LOG_E("Register to sa manager failed");
82 return false;
83 }
84 registerToService_ = true;
85 }
86
87 AddSystemAbilityListener(COMM_NETSYS_NATIVE_SYS_ABILITY_ID);
88
89 return NetworkShareTracker::GetInstance().Init();
90 }
91
GetDumpMessage(std::string & message)92 void NetworkShareService::GetDumpMessage(std::string &message)
93 {
94 message.append("Net Sharing Info:\n");
95 int32_t supported = NETWORKSHARE_IS_UNSUPPORTED;
96 NetworkShareTracker::GetInstance().IsNetworkSharingSupported(supported);
97 std::string surpportContent = supported == NETWORKSHARE_IS_SUPPORTED ? "surpported" : "not surpported";
98 message.append("\tIs Sharing Supported: " + surpportContent + "\n");
99 int32_t sharingStatus = NETWORKSHARE_IS_UNSHARING;
100 NetworkShareTracker::GetInstance().IsSharing(sharingStatus);
101 std::string sharingState = sharingStatus ? "is sharing" : "not sharing";
102 message.append("\tSharing State: " + sharingState + "\n");
103 if (sharingStatus) {
104 std::string sharingType;
105 GetSharingType(SharingIfaceType::SHARING_WIFI, "wifi;", sharingType);
106 GetSharingType(SharingIfaceType::SHARING_USB, "usb;", sharingType);
107 GetSharingType(SharingIfaceType::SHARING_BLUETOOTH, "bluetooth;", sharingType);
108 message.append("\tSharing Types: " + sharingType + "\n");
109 }
110
111 std::string wifiShareRegexs;
112 GetShareRegexsContent(SharingIfaceType::SHARING_WIFI, wifiShareRegexs);
113 message.append("\tUsb Regexs: " + wifiShareRegexs + "\n");
114 std::string usbShareRegexs;
115 GetShareRegexsContent(SharingIfaceType::SHARING_USB, usbShareRegexs);
116 message.append("\tWifi Regexs: " + usbShareRegexs + "\n");
117 std::string btpanShareRegexs;
118 GetShareRegexsContent(SharingIfaceType::SHARING_BLUETOOTH, btpanShareRegexs);
119 message.append("\tBluetooth Regexs: " + btpanShareRegexs + "\n");
120 }
121
GetSharingType(const SharingIfaceType & type,const std::string & typeContent,std::string & sharingType)122 void NetworkShareService::GetSharingType(const SharingIfaceType &type, const std::string &typeContent,
123 std::string &sharingType)
124 {
125 SharingIfaceState state;
126 NetworkShareTracker::GetInstance().GetSharingState(type, state);
127 if (state == SharingIfaceState::SHARING_NIC_SERVING) {
128 sharingType += typeContent;
129 }
130 }
131
GetShareRegexsContent(const SharingIfaceType & type,std::string & shareRegexsContent)132 void NetworkShareService::GetShareRegexsContent(const SharingIfaceType &type, std::string &shareRegexsContent)
133 {
134 std::vector<std::string> regexs;
135 NetworkShareTracker::GetInstance().GetSharableRegexs(type, regexs);
136 for_each(regexs.begin(), regexs.end(),
137 [&shareRegexsContent](const std::string ®ex) { shareRegexsContent += regex + ";"; });
138 }
139
IsNetworkSharingSupported(int32_t & supported)140 int32_t NetworkShareService::IsNetworkSharingSupported(int32_t &supported)
141 {
142 NETMGR_EXT_LOG_I("NetworkSharing IsNetworkSharingSupported");
143 if (!NetManagerPermission::IsSystemCaller()) {
144 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
145 }
146 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
147 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
148 }
149 return NetworkShareTracker::GetInstance().IsNetworkSharingSupported(supported);
150 }
151
IsSharing(int32_t & sharingStatus)152 int32_t NetworkShareService::IsSharing(int32_t &sharingStatus)
153 {
154 NETMGR_EXT_LOG_I("NetworkSharing IsSharing");
155 if (!NetManagerPermission::IsSystemCaller()) {
156 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
157 }
158 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
159 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
160 }
161 return NetworkShareTracker::GetInstance().IsSharing(sharingStatus);
162 }
163
UpdateDataSharingType(const SharingIfaceType & type,bool isOpen)164 int32_t NetworkShareService::UpdateDataSharingType(const SharingIfaceType &type, bool isOpen)
165 {
166 int32_t ret = NETMANAGER_ERROR;
167 switch (type) {
168 case SharingIfaceType::SHARING_WIFI:
169 ret = NetDataShareHelperUtilsIface::Update(SHARING_WIFI_URI, KEY_SHARING_WIFI,
170 std::to_string(isOpen));
171 break;
172 case SharingIfaceType::SHARING_USB:
173 ret = NetDataShareHelperUtilsIface::Update(SHARING_USB_URI, KEY_SHARING_USB,
174 std::to_string(isOpen));
175 break;
176 case SharingIfaceType::SHARING_BLUETOOTH:
177 ret = NetDataShareHelperUtilsIface::Update(SHARING_BLUETOOTH_URI, KEY_SHARING_BLUETOOTH,
178 std::to_string(isOpen));
179 break;
180 default:
181 break;
182 }
183 if (ret != NETMANAGER_EXT_SUCCESS) {
184 NETMGR_EXT_LOG_E("Update sharetype:[%{public}d]to datashare failed", static_cast<int32_t>(type));
185 return NETMANAGER_EXT_ERR_INTERNAL;
186 }
187 return ret;
188 }
189
StartNetworkSharing(const SharingIfaceType & type)190 int32_t NetworkShareService::StartNetworkSharing(const SharingIfaceType &type)
191 {
192 NETMGR_EXT_LOG_I("NetworkSharing start sharing,type is %{public}d", type);
193 if (!NetManagerPermission::IsSystemCaller()) {
194 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
195 }
196 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
197 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
198 }
199 int32_t ret = NetworkShareTracker::GetInstance().StartNetworkSharing(type);
200 if (ret == NETMANAGER_EXT_SUCCESS) {
201 ret = UpdateDataSharingType(type, true);
202 }
203 return ret;
204 }
205
StopNetworkSharing(const SharingIfaceType & type)206 int32_t NetworkShareService::StopNetworkSharing(const SharingIfaceType &type)
207 {
208 NETMGR_EXT_LOG_I("NetworkSharing start sharing,type is %{public}d", type);
209 if (!NetManagerPermission::IsSystemCaller()) {
210 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
211 }
212 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
213 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
214 }
215 int32_t ret = NetworkShareTracker::GetInstance().StopNetworkSharing(type);
216 if (ret == NETMANAGER_EXT_SUCCESS) {
217 ret = UpdateDataSharingType(type, false);
218 }
219
220 return ret;
221 }
222
RegisterSharingEvent(sptr<ISharingEventCallback> callback)223 int32_t NetworkShareService::RegisterSharingEvent(sptr<ISharingEventCallback> callback)
224 {
225 NETMGR_EXT_LOG_I("NetworkSharing Register Sharing Event.");
226 if (!NetManagerPermission::IsSystemCaller()) {
227 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
228 }
229 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
230 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
231 }
232 return NetworkShareTracker::GetInstance().RegisterSharingEvent(callback);
233 }
234
UnregisterSharingEvent(sptr<ISharingEventCallback> callback)235 int32_t NetworkShareService::UnregisterSharingEvent(sptr<ISharingEventCallback> callback)
236 {
237 NETMGR_EXT_LOG_I("NetworkSharing UnRegister Sharing Event.");
238 if (!NetManagerPermission::IsSystemCaller()) {
239 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
240 }
241 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
242 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
243 }
244 return NetworkShareTracker::GetInstance().UnregisterSharingEvent(callback);
245 }
246
GetSharableRegexs(SharingIfaceType type,std::vector<std::string> & ifaceRegexs)247 int32_t NetworkShareService::GetSharableRegexs(SharingIfaceType type, std::vector<std::string> &ifaceRegexs)
248 {
249 if (!NetManagerPermission::IsSystemCaller()) {
250 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
251 }
252 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
253 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
254 }
255 return NetworkShareTracker::GetInstance().GetSharableRegexs(type, ifaceRegexs);
256 }
257
GetSharingState(SharingIfaceType type,SharingIfaceState & state)258 int32_t NetworkShareService::GetSharingState(SharingIfaceType type, SharingIfaceState &state)
259 {
260 if (!NetManagerPermission::IsSystemCaller()) {
261 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
262 }
263 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
264 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
265 }
266 return NetworkShareTracker::GetInstance().GetSharingState(type, state);
267 }
268
GetNetSharingIfaces(const SharingIfaceState & state,std::vector<std::string> & ifaces)269 int32_t NetworkShareService::GetNetSharingIfaces(const SharingIfaceState &state, std::vector<std::string> &ifaces)
270 {
271 if (!NetManagerPermission::IsSystemCaller()) {
272 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
273 }
274 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
275 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
276 }
277 return NetworkShareTracker::GetInstance().GetNetSharingIfaces(state, ifaces);
278 }
279
GetStatsRxBytes(int32_t & bytes)280 int32_t NetworkShareService::GetStatsRxBytes(int32_t &bytes)
281 {
282 if (!NetManagerPermission::IsSystemCaller()) {
283 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
284 }
285 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
286 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
287 }
288 return NetworkShareTracker::GetInstance().GetSharedSubSMTraffic(TrafficType::TRAFFIC_RX, bytes);
289 }
290
GetStatsTxBytes(int32_t & bytes)291 int32_t NetworkShareService::GetStatsTxBytes(int32_t &bytes)
292 {
293 if (!NetManagerPermission::IsSystemCaller()) {
294 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
295 }
296 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
297 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
298 }
299 return NetworkShareTracker::GetInstance().GetSharedSubSMTraffic(TrafficType::TRAFFIC_TX, bytes);
300 }
301
GetStatsTotalBytes(int32_t & bytes)302 int32_t NetworkShareService::GetStatsTotalBytes(int32_t &bytes)
303 {
304 if (!NetManagerPermission::IsSystemCaller()) {
305 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
306 }
307 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
308 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
309 }
310 return NetworkShareTracker::GetInstance().GetSharedSubSMTraffic(TrafficType::TRAFFIC_ALL, bytes);
311 }
312
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)313 void NetworkShareService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
314 {
315 NETMGR_EXT_LOG_D("NetworkShareService::OnAddSystemAbility systemAbilityId[%{public}d]", systemAbilityId);
316 if (systemAbilityId == COMM_NETSYS_NATIVE_SYS_ABILITY_ID) {
317 if (hasSARemoved_) {
318 OnNetSysRestart();
319 hasSARemoved_ = false;
320 }
321 }
322 }
323
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)324 void NetworkShareService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
325 {
326 NETMGR_EXT_LOG_D("NetworkShareService::OnRemoveSystemAbility systemAbilityId[%{public}d]", systemAbilityId);
327 if (systemAbilityId == COMM_NETSYS_NATIVE_SYS_ABILITY_ID) {
328 hasSARemoved_ = true;
329 }
330 }
331
OnNetSysRestart()332 void NetworkShareService::OnNetSysRestart()
333 {
334 NETMGR_EXT_LOG_I("NetworkShareService::OnNetSysRestart");
335 NetworkShareTracker::GetInstance().RestartResume();
336 }
337 } // namespace NetManagerStandard
338 } // namespace OHOS
339