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 "hilog_wrapper.h"
19
20 namespace OHOS {
21 namespace AAFwk {
22 namespace {
23 const int MAX_URI_COUNT = 500;
24 }
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)25 int UriPermissionManagerStub::OnRemoteRequest(
26 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
27 {
28 if (data.ReadInterfaceToken() != IUriPermissionManager::GetDescriptor()) {
29 HILOG_ERROR("InterfaceToken not equal IUriPermissionManager's descriptor.");
30 return ERR_INVALID_VALUE;
31 }
32 ErrCode errCode = ERR_OK;
33 switch (code) {
34 case UriPermMgrCmd::ON_GRANT_URI_PERMISSION : {
35 return HandleGrantUriPermission(data, reply);
36 }
37 case UriPermMgrCmd::ON_BATCH_GRANT_URI_PERMISSION : {
38 return HandleBatchGrantUriPermission(data, reply);
39 }
40 case UriPermMgrCmd::ON_REVOKE_URI_PERMISSION : {
41 return HandleRevokeUriPermission(data, reply);
42 }
43 case UriPermMgrCmd::ON_REVOKE_ALL_URI_PERMISSION : {
44 return HandleRevokeAllUriPermission(data, reply);
45 }
46 case UriPermMgrCmd::ON_REVOKE_URI_PERMISSION_MANUALLY : {
47 return HandleRevokeUriPermissionManually(data, reply);
48 }
49 case UriPermMgrCmd::ON_CHECK_PERSISTABLE_URIPERMISSION_PROXY : {
50 return HandleCheckPerSiSTableUriPermissionProxy(data, reply);
51 }
52 case UriPermMgrCmd::ON_VERIFY_URI_PERMISSION : {
53 return HandleVerifyUriPermission(data, reply);
54 }
55 case UriPermMgrCmd::ON_BATCH_GRANT_URI_PERMISSION_FOR_2_IN_1 : {
56 return HandleBatchGrantUriPermissionFor2In1(data, reply);
57 }
58 case UriPermMgrCmd::ON_IS_Authorization_URI_ALLOWED : {
59 return HandleIsAuthorizationUriAllowed(data, reply);
60 }
61 default:
62 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
63 }
64 return errCode;
65 }
66
HandleRevokeUriPermission(MessageParcel & data,MessageParcel & reply)67 int UriPermissionManagerStub::HandleRevokeUriPermission(MessageParcel &data, MessageParcel &reply)
68 {
69 auto tokenId = data.ReadInt32();
70 RevokeUriPermission(tokenId);
71 return ERR_OK;
72 }
73
HandleRevokeAllUriPermission(MessageParcel & data,MessageParcel & reply)74 int UriPermissionManagerStub::HandleRevokeAllUriPermission(MessageParcel &data, MessageParcel &reply)
75 {
76 auto tokenId = data.ReadInt32();
77 int result = RevokeAllUriPermissions(tokenId);
78 reply.WriteInt32(result);
79 return ERR_OK;
80 }
81
HandleGrantUriPermission(MessageParcel & data,MessageParcel & reply)82 int UriPermissionManagerStub::HandleGrantUriPermission(MessageParcel &data, MessageParcel &reply)
83 {
84 std::unique_ptr<Uri> uri(data.ReadParcelable<Uri>());
85 if (!uri) {
86 HILOG_ERROR("To read uri failed.");
87 return ERR_DEAD_OBJECT;
88 }
89 auto flag = data.ReadInt32();
90 auto targetBundleName = data.ReadString();
91 auto appIndex = data.ReadInt32();
92 auto initiatorTokenId = data.ReadUint32();
93 int result = GrantUriPermission(*uri, flag, targetBundleName, appIndex, initiatorTokenId);
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 HILOG_ERROR("size is invalid.");
103 return ERR_DEAD_OBJECT;
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 HILOG_ERROR("To read uri failed.");
110 return ERR_DEAD_OBJECT;
111 }
112 uriVec.emplace_back(*uri);
113 }
114 auto flag = data.ReadInt32();
115 auto targetBundleName = data.ReadString();
116 auto appIndex = data.ReadInt32();
117 auto initiatorTokenId = data.ReadUint32();
118 int result = GrantUriPermission(uriVec, flag, targetBundleName, appIndex, initiatorTokenId);
119 reply.WriteInt32(result);
120 return ERR_OK;
121 }
122
HandleRevokeUriPermissionManually(MessageParcel & data,MessageParcel & reply)123 int UriPermissionManagerStub::HandleRevokeUriPermissionManually(MessageParcel &data, MessageParcel &reply)
124 {
125 std::unique_ptr<Uri> uri(data.ReadParcelable<Uri>());
126 if (!uri) {
127 HILOG_ERROR("To read uri failed.");
128 return ERR_DEAD_OBJECT;
129 }
130 auto bundleName = data.ReadString();
131 int result = RevokeUriPermissionManually(*uri, bundleName);
132 reply.WriteInt32(result);
133 return ERR_OK;
134 }
135
HandleCheckPerSiSTableUriPermissionProxy(MessageParcel & data,MessageParcel & reply)136 int UriPermissionManagerStub::HandleCheckPerSiSTableUriPermissionProxy(MessageParcel &data, MessageParcel &reply)
137 {
138 std::unique_ptr<Uri> uri(data.ReadParcelable<Uri>());
139 if (!uri) {
140 HILOG_ERROR("To read uri failed.");
141 return ERR_DEAD_OBJECT;
142 }
143 auto flag = data.ReadInt32();
144 auto tokenId = data.ReadInt32();
145 bool result = CheckPersistableUriPermissionProxy(*uri, flag, tokenId);
146 reply.WriteBool(result);
147 return ERR_OK;
148 }
149
HandleVerifyUriPermission(MessageParcel & data,MessageParcel & reply)150 int UriPermissionManagerStub::HandleVerifyUriPermission(MessageParcel &data, MessageParcel &reply)
151 {
152 std::unique_ptr<Uri> uri(data.ReadParcelable<Uri>());
153 if (!uri) {
154 HILOG_ERROR("To read uri failed.");
155 return ERR_DEAD_OBJECT;
156 }
157 auto flag = data.ReadInt32();
158 auto tokenId = data.ReadInt32();
159 bool result = VerifyUriPermission(*uri, flag, tokenId);
160 reply.WriteBool(result);
161 return ERR_OK;
162 }
163
HandleBatchGrantUriPermissionFor2In1(MessageParcel & data,MessageParcel & reply)164 int UriPermissionManagerStub::HandleBatchGrantUriPermissionFor2In1(MessageParcel &data, MessageParcel &reply)
165 {
166 auto size = data.ReadUint32();
167 if (size == 0 || size > MAX_URI_COUNT) {
168 HILOG_ERROR("size is invalid.");
169 return ERR_DEAD_OBJECT;
170 }
171 std::vector<Uri> uriVec;
172 for (uint32_t i = 0; i < size; i++) {
173 std::unique_ptr<Uri> uri(data.ReadParcelable<Uri>());
174 if (uri == nullptr) {
175 HILOG_ERROR("To read uri failed.");
176 return ERR_DEAD_OBJECT;
177 }
178 uriVec.emplace_back(*uri);
179 }
180 auto flag = data.ReadInt32();
181 auto targetBundleName = data.ReadString();
182 auto appIndex = data.ReadInt32();
183 auto isSystemAppCall = data.ReadBool();
184 int result = GrantUriPermissionFor2In1(uriVec, flag, targetBundleName, appIndex, isSystemAppCall);
185 reply.WriteInt32(result);
186 return ERR_OK;
187 }
188
HandleIsAuthorizationUriAllowed(MessageParcel & data,MessageParcel & reply)189 int UriPermissionManagerStub::HandleIsAuthorizationUriAllowed(MessageParcel &data, MessageParcel &reply)
190 {
191 auto fromTokenId = data.ReadInt32();
192 bool result = IsAuthorizationUriAllowed(fromTokenId);
193 reply.WriteBool(result);
194 return ERR_OK;
195 }
196 } // namespace AAFwk
197 } // namespace OHOS
198