• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2024 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 "uri_permission_manager_stub.h"
17 
18 #include "ability_manager_errors.h"
19 #include "hilog_tag_wrapper.h"
20 
21 namespace OHOS {
22 namespace AAFwk {
23 namespace {
24 const int MAX_URI_COUNT = 500;
25 }
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)26 int UriPermissionManagerStub::OnRemoteRequest(
27     uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
28 {
29     if (data.ReadInterfaceToken() != IUriPermissionManager::GetDescriptor()) {
30         TAG_LOGE(AAFwkTag::URIPERMMGR, "InterfaceToken not equal IUriPermissionManager's descriptor.");
31         return ERR_INVALID_VALUE;
32     }
33     ErrCode errCode = ERR_OK;
34     switch (code) {
35         case UriPermMgrCmd::ON_GRANT_URI_PERMISSION : {
36             return HandleGrantUriPermission(data, reply);
37         }
38         case UriPermMgrCmd::ON_BATCH_GRANT_URI_PERMISSION : {
39             return HandleBatchGrantUriPermission(data, reply);
40         }
41         case UriPermMgrCmd::ON_GRANT_URI_PERMISSION_PRIVILEGED : {
42             return HandleGrantUriPermissionPrivileged(data, reply);
43         }
44         case UriPermMgrCmd::ON_REVOKE_URI_PERMISSION : {
45             return HandleRevokeUriPermission(data, reply);
46         }
47         case UriPermMgrCmd::ON_REVOKE_ALL_URI_PERMISSION : {
48             return HandleRevokeAllUriPermission(data, reply);
49         }
50         case UriPermMgrCmd::ON_REVOKE_URI_PERMISSION_MANUALLY : {
51             return HandleRevokeUriPermissionManually(data, reply);
52         }
53         case UriPermMgrCmd::ON_VERIFY_URI_PERMISSION : {
54             return HandleVerifyUriPermission(data, reply);
55         }
56         case UriPermMgrCmd::ON_CHECK_URI_AUTHORIZATION : {
57             return HandleCheckUriAuthorization(data, reply);
58         }
59         default:
60             return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
61     }
62     return errCode;
63 }
64 
HandleRevokeUriPermission(MessageParcel & data,MessageParcel & reply)65 int UriPermissionManagerStub::HandleRevokeUriPermission(MessageParcel &data, MessageParcel &reply)
66 {
67     auto tokenId = data.ReadUint32();
68     auto abilityId = data.ReadInt32();
69     RevokeUriPermission(tokenId, abilityId);
70     return ERR_OK;
71 }
72 
HandleRevokeAllUriPermission(MessageParcel & data,MessageParcel & reply)73 int UriPermissionManagerStub::HandleRevokeAllUriPermission(MessageParcel &data, MessageParcel &reply)
74 {
75     auto tokenId = data.ReadUint32();
76     int result = RevokeAllUriPermissions(tokenId);
77     reply.WriteInt32(result);
78     return ERR_OK;
79 }
80 
HandleGrantUriPermission(MessageParcel & data,MessageParcel & reply)81 int UriPermissionManagerStub::HandleGrantUriPermission(MessageParcel &data, MessageParcel &reply)
82 {
83     std::unique_ptr<Uri> uri(data.ReadParcelable<Uri>());
84     if (!uri) {
85         TAG_LOGE(AAFwkTag::URIPERMMGR, "To read uri failed.");
86         return ERR_DEAD_OBJECT;
87     }
88     auto flag = data.ReadUint32();
89     auto targetBundleName = data.ReadString();
90     auto appIndex = data.ReadInt32();
91     auto initiatorTokenId = data.ReadUint32();
92     auto abilityId = data.ReadInt32();
93     int result = GrantUriPermission(*uri, flag, targetBundleName, appIndex, initiatorTokenId, abilityId);
94     reply.WriteInt32(result);
95     return ERR_OK;
96 }
97 
HandleBatchGrantUriPermission(MessageParcel & data,MessageParcel & reply)98 int UriPermissionManagerStub::HandleBatchGrantUriPermission(MessageParcel &data, MessageParcel &reply)
99 {
100     auto size = data.ReadUint32();
101     if (size == 0 || size > MAX_URI_COUNT) {
102         TAG_LOGE(AAFwkTag::URIPERMMGR, "uriVec is empty or exceed maximum size %{public}d.", MAX_URI_COUNT);
103         return ERR_URI_LIST_OUT_OF_RANGE;
104     }
105     std::vector<Uri> uriVec;
106     for (uint32_t i = 0; i < size; i++) {
107         std::unique_ptr<Uri> uri(data.ReadParcelable<Uri>());
108         if (!uri) {
109             TAG_LOGE(AAFwkTag::URIPERMMGR, "To read uri failed.");
110             return ERR_DEAD_OBJECT;
111         }
112         uriVec.emplace_back(*uri);
113     }
114     auto flag = data.ReadUint32();
115     auto targetBundleName = data.ReadString();
116     auto appIndex = data.ReadInt32();
117     auto initiatorTokenId = data.ReadUint32();
118     auto abilityId = data.ReadInt32();
119     int result = GrantUriPermission(uriVec, flag, targetBundleName, appIndex, initiatorTokenId, abilityId);
120     reply.WriteInt32(result);
121     return ERR_OK;
122 }
123 
HandleGrantUriPermissionPrivileged(MessageParcel & data,MessageParcel & reply)124 int32_t UriPermissionManagerStub::HandleGrantUriPermissionPrivileged(MessageParcel &data, MessageParcel &reply)
125 {
126     auto size = data.ReadUint32();
127     if (size == 0 || size > MAX_URI_COUNT) {
128         TAG_LOGE(AAFwkTag::URIPERMMGR, "uriVec is empty or exceed maximum size %{public}d.", MAX_URI_COUNT);
129         return ERR_URI_LIST_OUT_OF_RANGE;
130     }
131     std::vector<Uri> uriVec;
132     for (uint32_t i = 0; i < size; i++) {
133         std::unique_ptr<Uri> uri(data.ReadParcelable<Uri>());
134         if (!uri) {
135             TAG_LOGE(AAFwkTag::URIPERMMGR, "To read uri failed.");
136             return ERR_DEAD_OBJECT;
137         }
138         uriVec.emplace_back(*uri);
139     }
140     auto flag = data.ReadUint32();
141     auto targetBundleName = data.ReadString();
142     auto appIndex = data.ReadInt32();
143     auto initiatorTokenId = data.ReadUint32();
144     auto abilityId = data.ReadInt32();
145     int result = GrantUriPermissionPrivileged(uriVec, flag, targetBundleName, appIndex, initiatorTokenId, abilityId);
146     reply.WriteInt32(result);
147     return ERR_OK;
148 }
149 
HandleRevokeUriPermissionManually(MessageParcel & data,MessageParcel & reply)150 int UriPermissionManagerStub::HandleRevokeUriPermissionManually(MessageParcel &data, MessageParcel &reply)
151 {
152     std::unique_ptr<Uri> uri(data.ReadParcelable<Uri>());
153     if (!uri) {
154         TAG_LOGE(AAFwkTag::URIPERMMGR, "To read uri failed.");
155         return ERR_DEAD_OBJECT;
156     }
157     auto bundleName = data.ReadString();
158     auto appIndex = data.ReadInt32();
159     int result = RevokeUriPermissionManually(*uri, bundleName, appIndex);
160     reply.WriteInt32(result);
161     return ERR_OK;
162 }
163 
HandleVerifyUriPermission(MessageParcel & data,MessageParcel & reply)164 int UriPermissionManagerStub::HandleVerifyUriPermission(MessageParcel &data, MessageParcel &reply)
165 {
166     std::unique_ptr<Uri> uri(data.ReadParcelable<Uri>());
167     if (!uri) {
168         TAG_LOGE(AAFwkTag::URIPERMMGR, "To read uri failed.");
169         return ERR_DEAD_OBJECT;
170     }
171     auto flag = data.ReadUint32();
172     auto tokenId = data.ReadUint32();
173     bool result = VerifyUriPermission(*uri, flag, tokenId);
174     reply.WriteBool(result);
175     return ERR_OK;
176 }
177 
HandleCheckUriAuthorization(MessageParcel & data,MessageParcel & reply)178 int32_t UriPermissionManagerStub::HandleCheckUriAuthorization(MessageParcel &data, MessageParcel &reply)
179 {
180     auto size = data.ReadUint32();
181     if (size == 0 || size > MAX_URI_COUNT) {
182         TAG_LOGE(AAFwkTag::URIPERMMGR, "uriVec is empty or exceed maximum size %{public}d.", MAX_URI_COUNT);
183         return ERR_URI_LIST_OUT_OF_RANGE;
184     }
185     std::vector<std::string> uriVec;
186     for (uint32_t i = 0; i < size; i++) {
187         auto uri = data.ReadString();
188         uriVec.emplace_back(uri);
189     }
190     auto flag = data.ReadUint32();
191     auto tokenId = data.ReadUint32();
192     auto result = CheckUriAuthorization(uriVec, flag, tokenId);
193     if (!reply.WriteUint32(result.size())) {
194         TAG_LOGE(AAFwkTag::URIPERMMGR, "Write size of uriVec failed.");
195         return ERR_DEAD_OBJECT;
196     }
197     for (auto res: result) {
198         if (!reply.WriteBool(res)) {
199             TAG_LOGE(AAFwkTag::URIPERMMGR, "Write res failed.");
200             return ERR_DEAD_OBJECT;
201         }
202     }
203     return ERR_OK;
204 }
205 }  // namespace AAFwk
206 }  // namespace OHOS
207