• 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 "session_manager.h"
17 
18 #define LOG_TAG "SessionManager"
19 
20 #include <algorithm>
21 
22 #include "auth_delegate.h"
23 #include "checker/checker_manager.h"
24 #include "log_print.h"
25 #include "metadata/meta_data_manager.h"
26 #include "metadata/store_meta_data.h"
27 #include "user_delegate.h"
28 #include "utils/anonymous.h"
29 #include "utils/converter.h"
30 #include "types.h"
31 #include "device_manager_adapter.h"
32 namespace OHOS::DistributedData {
33 using namespace OHOS::DistributedKv;
34 using DmAdapter = OHOS::DistributedData::DeviceManagerAdapter;
35 using Account = AccountDelegate;
GetInstance()36 SessionManager &SessionManager::GetInstance()
37 {
38     static SessionManager instance;
39     return instance;
40 }
41 
GetSession(const SessionPoint & local,const std::string & targetDeviceId) const42 Session SessionManager::GetSession(const SessionPoint &local, const std::string &targetDeviceId) const
43 {
44     ZLOGD("begin. peer device:%{public}s", Anonymous::Change(targetDeviceId).c_str());
45     Session session;
46     session.appId = local.appId;
47     session.storeId = local.storeId;
48     session.sourceUserId = local.userId;
49     session.sourceDeviceId = local.deviceId;
50     session.targetDeviceId = targetDeviceId;
51     session.accountId = local.accountId;
52     auto users = UserDelegate::GetInstance().GetRemoteUserStatus(targetDeviceId);
53     // system service
54     if (local.userId == UserDelegate::SYSTEM_USER) {
55         session.targetUserIds.push_back(UserDelegate::SYSTEM_USER);
56     }
57 
58     AclParams aclParams;
59     if (!GetSendAuthParams(local, targetDeviceId, aclParams)) {
60         ZLOGE("get send auth params failed:%{public}s", Anonymous::Change(targetDeviceId).c_str());
61         return session;
62     }
63 
64     std::vector<uint32_t> targetUsers {};
65     for (const auto &user : users) {
66         aclParams.accCallee.userId = user.id;
67         auto [isPermitted, isSameAccount] = AuthDelegate::GetInstance()->CheckAccess(local.userId, user.id,
68             targetDeviceId, aclParams);
69         ZLOGD("targetDeviceId:%{public}s, user.id:%{public}d, isPermitted:%{public}d, isSameAccount: %{public}d",
70             Anonymous::Change(targetDeviceId).c_str(), user.id, isPermitted, isSameAccount);
71         if (isPermitted) {
72             auto it = std::find(session.targetUserIds.begin(), session.targetUserIds.end(), user.id);
73             if (it == session.targetUserIds.end() && isSameAccount) {
74                 session.targetUserIds.push_back(user.id);
75             }
76             if (it == session.targetUserIds.end() && !isSameAccount) {
77                 targetUsers.push_back(user.id);
78             }
79         }
80     }
81     session.targetUserIds.insert(session.targetUserIds.end(), targetUsers.begin(), targetUsers.end());
82     ZLOGD("access to peer users:%{public}s", DistributedData::Serializable::Marshall(session.targetUserIds).c_str());
83     return session;
84 }
85 
GetSendAuthParams(const SessionPoint & local,const std::string & targetDeviceId,AclParams & aclParams) const86 bool SessionManager::GetSendAuthParams(const SessionPoint &local, const std::string &targetDeviceId,
87     AclParams &aclParams) const
88 {
89     std::vector<StoreMetaData> metaData;
90     if (!MetaDataManager::GetInstance().LoadMeta(StoreMetaData::GetPrefix({ local.deviceId }), metaData)) {
91         ZLOGE("load meta failed, deviceId:%{public}s, user:%{public}d", Anonymous::Change(local.deviceId).c_str(),
92             local.userId);
93         return false;
94     }
95     for (const auto &storeMeta : metaData) {
96         if (storeMeta.appId == local.appId && storeMeta.storeId == local.storeId) {
97             aclParams.accCaller.bundleName = storeMeta.bundleName;
98             aclParams.accCaller.accountId = local.accountId;
99             aclParams.accCaller.userId = local.userId;
100             aclParams.accCaller.networkId = DmAdapter::GetInstance().ToNetworkID(local.deviceId);
101 
102             aclParams.accCallee.networkId = DmAdapter::GetInstance().ToNetworkID(targetDeviceId);
103             aclParams.authType = storeMeta.authType;
104             return true;
105         }
106     }
107     ZLOGE("get params failed,appId:%{public}s,localDevId:%{public}s,tarDevid:%{public}s,user:%{public}d,",
108         local.appId.c_str(), Anonymous::Change(local.deviceId).c_str(),
109         Anonymous::Change(targetDeviceId).c_str(), local.userId);
110     return false;
111 }
112 
GetRecvAuthParams(const SessionPoint & local,const SessionPoint & peer,bool accountFlag,AclParams & aclParams) const113 bool SessionManager::GetRecvAuthParams(const SessionPoint &local, const SessionPoint &peer, bool accountFlag,
114     AclParams &aclParams) const
115 {
116     std::vector<StoreMetaData> metaData;
117     if (!MetaDataManager::GetInstance().LoadMeta(StoreMetaData::GetPrefix({ peer.deviceId }), metaData)) {
118         ZLOGE("load meta failed, deviceId:%{public}s, user:%{public}d", Anonymous::Change(peer.deviceId).c_str(),
119             peer.userId);
120         return false;
121     }
122     for (const auto &storeMeta : metaData) {
123         if (storeMeta.appId == local.appId) {
124             auto accountId = AccountDelegate::GetInstance()->GetCurrentAccountId();
125             aclParams.accCaller.bundleName = storeMeta.bundleName;
126             aclParams.accCaller.accountId = accountId;
127             aclParams.accCaller.userId = local.userId;
128             aclParams.accCaller.networkId = DmAdapter::GetInstance().ToNetworkID(local.deviceId);
129 
130             aclParams.accCallee.accountId = accountFlag ? peer.accountId : accountId;
131             aclParams.accCallee.userId = peer.userId;
132             aclParams.accCallee.networkId = DmAdapter::GetInstance().ToNetworkID(peer.deviceId);
133             aclParams.authType = storeMeta.authType;
134             return true;
135         }
136     }
137 
138     ZLOGE("get params failed,appId:%{public}s,tarDevid:%{public}s,user:%{public}d,peer:%{public}d",
139         local.appId.c_str(), Anonymous::Change(peer.deviceId).c_str(), local.userId, peer.userId);
140     return false;
141 }
142 
CheckSession(const SessionPoint & local,const SessionPoint & peer,bool accountFlag) const143 bool SessionManager::CheckSession(const SessionPoint &local, const SessionPoint &peer, bool accountFlag) const
144 {
145     AclParams aclParams;
146     if (!GetRecvAuthParams(local, peer, accountFlag, aclParams)) {
147         ZLOGE("get recv auth params failed:%{public}s", Anonymous::Change(peer.deviceId).c_str());
148         return false;
149     }
150     auto [isPermitted, isSameAccount] = AuthDelegate::GetInstance()->CheckAccess(local.userId,
151         peer.userId, peer.deviceId, aclParams);
152     ZLOGD("peer.deviceId:%{public}s, peer.userId:%{public}d, isPermitted:%{public}d, isSameAccount: %{public}d",
153         Anonymous::Change(peer.deviceId).c_str(), peer.userId, isPermitted, isSameAccount);
154     if (isPermitted && local.userId != UserDelegate::SYSTEM_USER) {
155         isPermitted = Account::GetInstance()->IsUserForeground(local.userId);
156     }
157     return isPermitted;
158 }
159 
Marshal(json & node) const160 bool Session::Marshal(json &node) const
161 {
162     bool ret = true;
163     ret = SetValue(node[GET_NAME(sourceDeviceId)], sourceDeviceId) && ret;
164     ret = SetValue(node[GET_NAME(targetDeviceId)], targetDeviceId) && ret;
165     ret = SetValue(node[GET_NAME(sourceUserId)], sourceUserId) && ret;
166     ret = SetValue(node[GET_NAME(targetUserIds)], targetUserIds) && ret;
167     ret = SetValue(node[GET_NAME(appId)], appId) && ret;
168     ret = SetValue(node[GET_NAME(storeId)], storeId) && ret;
169     ret = SetValue(node[GET_NAME(accountId)], accountId) && ret;
170     return ret;
171 }
172 
Unmarshal(const json & node)173 bool Session::Unmarshal(const json &node)
174 {
175     bool ret = true;
176     ret = GetValue(node, GET_NAME(sourceDeviceId), sourceDeviceId) && ret;
177     ret = GetValue(node, GET_NAME(targetDeviceId), targetDeviceId) && ret;
178     ret = GetValue(node, GET_NAME(sourceUserId), sourceUserId) && ret;
179     ret = GetValue(node, GET_NAME(targetUserIds), targetUserIds) && ret;
180     ret = GetValue(node, GET_NAME(appId), appId) && ret;
181     ret = GetValue(node, GET_NAME(storeId), storeId) && ret;
182     ret = GetValue(node, GET_NAME(accountId), accountId) && ret;
183     return ret;
184 }
185 } // namespace OHOS::DistributedData
186