Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qohosapppermissions.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include <QtCore/private/qohoscommon_p.h>
6#include <QtCore/private/qohoslogger_p.h>
7#include <optional>
8#include <qohosplugincore.h>
9
11
13
14namespace {
15
16void tryGetBundleAccessTokenIdWithConsumer(
17 QtOhos::JsState &jsState, QOhosConsumer<QtOhos::JsState &, std::optional<int>> resultConsumer)
18{
19 auto bundleFlags = jsState.eval<QNapi::Number>(
20 "@ohos.bundle.bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION");
21
22 jsState.evalToPromiseOrRejectOnThrow(
23 "@ohos.bundle.bundleManager.getBundleInfoForSelf(*)", {bundleFlags})
24 .withContext(std::move(resultConsumer))
25 .onThenWithContext([](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
26 QNapi::Object bundleInfo = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
27 resultConsumer(
28 cbInfo.jsState(),
29 std::optional<int>(bundleInfo.eval<QNapi::Number>("appInfo.accessTokenId")));
30 })
31 .onCatchWithContext([](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
32 QtOhos::logJsCallbackError(cbInfo, "Got error from getBundleInfoForSelf()");
33 resultConsumer(cbInfo.jsState(), {});
34 });
35}
36
37void checkAppPermissionStatusGrantedWithConsumer(
38 QtOhos::JsState &jsState, int bundleAccessToken, const std::string &permissionName,
39 QOhosConsumer<QtOhos::JsState &, bool> resultConsumer)
40{
41 jsState.evalToPromiseOrRejectOnThrow(
42 "@ohos.abilityAccessCtrl.createAtManager().checkAccessToken(*)",
43 {bundleAccessToken, permissionName})
44 .withContext(std::move(resultConsumer))
45 .onThenWithContext([](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
46 auto status = cbInfo.getFirstArg<QNapi::Number>(Q_FUNC_INFO);
47 auto permissionGrantedStatus = cbInfo.jsState().eval<QNapi::Number>(
48 "@ohos.abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED");
49 resultConsumer(cbInfo.jsState(), status == permissionGrantedStatus);
50 })
51 .onCatchWithContext([](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
52 QtOhos::logJsCallbackError(cbInfo, "Got error from checkAccessToken()");
53 resultConsumer(cbInfo.jsState(), false);
54 });
55}
56
57}
58
60 QtOhos::JsState &jsState, const std::string &permissionName,
61 QOhosConsumer<QtOhos::JsState &, bool> resultConsumer)
62{
63 tryGetBundleAccessTokenIdWithConsumer(
64 jsState,
65 [permissionName, resultConsumer = std::move(resultConsumer)](
66 QtOhos::JsState &jsState, std::optional<int> bundleAccessTokenId) mutable {
67 if (bundleAccessTokenId.has_value()) {
68 checkAppPermissionStatusGrantedWithConsumer(
69 jsState, bundleAccessTokenId.value(), permissionName,
70 std::move(resultConsumer));
71 } else {
72 qOhosPrintfError(
73 "Cannot check permission: '%s': cannot get bundle access token id.",
74 permissionName.c_str());
75 resultConsumer(jsState, false);
76 }
77 });
78}
79
81 QtOhos::JsState &jsState, const std::string &permissionName,
82 QOhosConsumer<QtOhos::JsState &, bool> resultConsumer)
83{
84 return requestAppPermissionFromUser(
85 jsState, jsState.defaultQAbilityPeer(), permissionName,
86 std::move(resultConsumer));
87}
88
90 QtOhos::JsState &jsState, std::shared_ptr<QtOhos::QAbilityPeer> abilityPeer,
91 const std::string &permissionName,
92 QOhosConsumer<QtOhos::JsState &, bool> resultConsumer)
93{
94 requestAppPermissionsFromUserWithResult(
95 jsState, abilityPeer, {permissionName},
96 [resultConsumer = std::move(resultConsumer)](QtOhos::JsState &jsState, std::vector<QOhosAppPermissions::AppPermissionResult> result) {
97 resultConsumer(jsState, result.size() == 1 && result.front().permissionGranted);
98 });
99}
100
102 QtOhos::JsState &jsState, const std::vector<std::string> &permissionNames,
103 QOhosConsumer<QtOhos::JsState &, std::vector<AppPermissionResult>> resultConsumer)
104{
105 requestAppPermissionsFromUserWithResult(
106 jsState, jsState.defaultQAbilityPeer(), permissionNames,
107 std::move(resultConsumer));
108}
109
111 QtOhos::JsState &jsState, std::shared_ptr<QtOhos::QAbilityPeer> abilityPeer,
112 const std::vector<std::string> &permissionNames,
113 QOhosConsumer<QtOhos::JsState &, std::vector<AppPermissionResult>> resultConsumer)
114{
115 jsState.evalToPromiseOrRejectOnThrow(
116 "@ohos.abilityAccessCtrl.createAtManager().requestPermissionsFromUser(*)",
117 {
118 abilityPeer->qAbility().eval<QNapi::Object>("context"),
119 QNapi::makeArray(
120 jsState.env(),
121 std::vector<QNapi::ValueWrapper>(permissionNames.begin(), permissionNames.end()))
122 })
123 .withContext(std::move(resultConsumer))
124 .onThenWithContext(
125 [permissionNames](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
126 QNapi::Object resultObj = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
127
128 auto resultPermissionsNames =
129 QNapi::getArrayElements<std::vector<std::string>, QNapi::String>(
130 resultObj.get<QNapi::Array>("permissions"));
131 auto resultAuthResults =
132 QNapi::getArrayElements<std::vector<int>, QNapi::Number>(
133 resultObj.get<QNapi::Array>("authResults"));
134
135 auto dialogShownResultsOrEmpty = QNapi::getOptionalPropOrEmpty<QNapi::Array>(resultObj, "dialogShownResults");
136 auto dialogShownResultsVector =
137 !dialogShownResultsOrEmpty.IsEmpty()
138 ? QNapi::getArrayElements<std::vector<bool>, QNapi::Boolean>(dialogShownResultsOrEmpty)
139 : std::vector<bool>();
140
141 int permissionGrantedStatus = cbInfo.jsState().eval<QNapi::Number>(
142 "@ohos.abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED");
143
144 const std::size_t totalPermissions = permissionNames.size();
145 std::vector<AppPermissionResult> appPermissionResults(
146 totalPermissions,
147 AppPermissionResult {
148 .permissionGranted = false,
149 .dialogShown = false
150 });
151 if (resultPermissionsNames.size() == totalPermissions && resultAuthResults.size() == totalPermissions
152 && dialogShownResultsVector.size() == totalPermissions) {
153 for (const auto &permissionName : permissionNames) {
154 const auto it = std::find(resultPermissionsNames.begin(), resultPermissionsNames.end(), permissionName);
155 if (it != resultPermissionsNames.end()) {
156 const int index = std::distance(resultPermissionsNames.begin(), it);
157 appPermissionResults[index].permissionGranted = (resultAuthResults[index] == permissionGrantedStatus);
158 appPermissionResults[index].dialogShown = dialogShownResultsVector[index];
159 }
160 }
161 }
162 resultConsumer(cbInfo.jsState(), appPermissionResults);
163 })
164 .onCatchWithContext(
165 [permissionNames](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
166 QtOhos::logJsCallbackError(cbInfo, "Got error from requestPermissionsFromUser()");
167 const std::size_t totalPermissions = permissionNames.size();
168 std::vector<AppPermissionResult> appPermissionResults(
169 totalPermissions,
170 AppPermissionResult {
171 .permissionGranted = false,
172 .dialogShown = false
173 });
174 resultConsumer(cbInfo.jsState(), appPermissionResults);
175 });
176}
177
179 QtOhos::JsState &jsState, const std::vector<std::string> &permissionNames,
180 QOhosConsumer<QtOhos::JsState &, std::vector<bool>> resultConsumer)
181{
182 requestAppPermissionsOnSetting(
183 jsState, jsState.defaultQAbilityPeer(), permissionNames, std::move(resultConsumer));
184}
185
187 QtOhos::JsState &jsState, std::shared_ptr<QtOhos::QAbilityPeer> abilityPeer,
188 const std::vector<std::string> &permissionNames,
189 QOhosConsumer<QtOhos::JsState &, std::vector<bool>> resultConsumer)
190{
191 jsState.evalToPromiseOrRejectOnThrow(
192 "@ohos.abilityAccessCtrl.createAtManager().requestPermissionOnSetting(*)",
193 {
194 abilityPeer->qAbility().eval<QNapi::Object>("context"),
195 QNapi::makeArray(
196 jsState.env(),
197 std::vector<QNapi::ValueWrapper>(permissionNames.begin(), permissionNames.end()))
198 })
199 .withContext(std::move(resultConsumer))
200 .onThenWithContext(
201 [permissionNames](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
202 QNapi::Array resultArray = cbInfo.getFirstArg<QNapi::Array>(Q_FUNC_INFO);
203
204 auto resultAuthResults = QNapi::getArrayElements<std::vector<int>, QNapi::Number>(resultArray);
205
206 int permissionGrantedStatus = cbInfo.jsState().eval<QNapi::Number>(
207 "@ohos.abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED");
208
209 const std::size_t totalPermissions = permissionNames.size();
210 std::vector<bool> settingsPermissionResults(totalPermissions, false);
211 if (resultAuthResults.size() == totalPermissions) {
212 for (std::size_t permIndex = 0; permIndex < totalPermissions; permIndex++)
213 settingsPermissionResults[permIndex] = (resultAuthResults[permIndex] == permissionGrantedStatus);
214 }
215
216 resultConsumer(cbInfo.jsState(), settingsPermissionResults);
217 })
218 .onCatchWithContext(
219 [permissionNames](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
220 QtOhos::logJsCallbackError(cbInfo, "Got error from requestPermissionOnSetting()");
221 std::vector<bool> settingsPermissionResults(permissionNames.size(), false);
222 resultConsumer(cbInfo.jsState(), settingsPermissionResults);
223 });
224}
225
226}
227
228QT_END_NAMESPACE
JsState & jsState() const
virtual std::shared_ptr< QAbilityPeer > defaultQAbilityPeer()=0
void requestAppPermissionsOnSetting(QtOhos::JsState &jsState, std::shared_ptr< QtOhos::QAbilityPeer > abilityPeer, const std::vector< std::string > &permissionNames, QOhosConsumer< QtOhos::JsState &, std::vector< bool > > resultConsumer)
void requestAppPermissionsFromUserWithResult(QtOhos::JsState &jsState, const std::vector< std::string > &permissionNames, QOhosConsumer< QtOhos::JsState &, std::vector< AppPermissionResult > > resultConsumer)
void requestAppPermissionsOnSetting(QtOhos::JsState &jsState, const std::vector< std::string > &permissionNames, QOhosConsumer< QtOhos::JsState &, std::vector< bool > > resultConsumer)
void checkAppPermissionGrantedWithConsumer(QtOhos::JsState &jsState, const std::string &permissionName, QOhosConsumer< QtOhos::JsState &, bool > resultConsumer)
void requestAppPermissionsFromUserWithResult(QtOhos::JsState &jsState, std::shared_ptr< QtOhos::QAbilityPeer > abilityPeer, const std::vector< std::string > &permissionNames, QOhosConsumer< QtOhos::JsState &, std::vector< AppPermissionResult > > resultConsumer)
void requestAppPermissionFromUser(QtOhos::JsState &jsState, std::shared_ptr< QtOhos::QAbilityPeer > abilityPeer, const std::string &permissionName, QOhosConsumer< QtOhos::JsState &, bool > resultConsumer)
void requestAppPermissionFromUser(QtOhos::JsState &jsState, const std::string &permissionName, QOhosConsumer< QtOhos::JsState &, bool > resultConsumer)
Combined button and popup list for selecting options.