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