1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_PERMISSION_H_
#define COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_PERMISSION_H_
#include <memory>
#include <optional>
#include <utility>
#include <variant>
#include <vector>
#include "base/component_export.h"
#include "base/values.h"
#include "components/services/app_service/public/cpp/macros.h"
namespace apps {
// The types of permissions in App Service.
ENUM(PermissionType,
kUnknown,
kCamera,
kLocation,
kMicrophone,
kNotifications,
kContacts,
kStorage,
kPrinting,
kFileHandling)
ENUM(TriState,
// Access to the permission is allowed.
kAllow,
// Access to the permission is blocked.
kBlock,
// The app can ask the user whether to allow the permission. Some
// Publishers may allow temporary permission access while in the kAsk state
// (e.g. "Only this time" for ARC apps).
kAsk)
struct COMPONENT_EXPORT(APP_TYPES) Permission {
// The value of a permission can be a TriState or a bool, depending on how the
// publisher represents permissions.
using PermissionValue = std::variant<bool, TriState>;
Permission(PermissionType permission_type,
PermissionValue value,
bool is_managed,
std::optional<std::string> details = std::nullopt);
Permission(const Permission&) = delete;
Permission& operator=(const Permission&) = delete;
~Permission();
friend bool operator==(const Permission&, const Permission&) = default;
std::unique_ptr<Permission> Clone() const;
// Checks whether this is equal to permission enabled. If it is TriState, only
// Allow represent permission enabled.
bool IsPermissionEnabled() const;
std::string ToString() const;
PermissionType permission_type;
PermissionValue value;
// If the permission is managed by an enterprise policy.
bool is_managed;
// Human-readable string to provide more detail about the state of a
// permission. May be displayed next to the permission value in UI surfaces.
// e.g. a kLocation permission might have `details` of "While in use" or
// "Approximate location only".
std::optional<std::string> details;
};
using PermissionPtr = std::unique_ptr<Permission>;
using Permissions = std::vector<PermissionPtr>;
// Creates a deep copy of `source_permissions`.
COMPONENT_EXPORT(APP_TYPES)
Permissions ClonePermissions(const Permissions& source_permissions);
COMPONENT_EXPORT(APP_TYPES)
bool IsEqual(const Permissions& source, const Permissions& target);
// Converts `permission` to base::Value::Dict, e.g.:
// {
// "PermissionType": 3,
// "TriState": 2,
// "is_managed": false,
// "details": "xyz",
// }
COMPONENT_EXPORT(APP_TYPES)
base::Value::Dict ConvertPermissionToDict(const PermissionPtr& permission);
// Converts base::Value::Dict to PermissionPtr.
COMPONENT_EXPORT(APP_TYPES)
PermissionPtr ConvertDictToPermission(const base::Value::Dict& dict);
// Converts `permissions` to base::Value::List, e.g.:
// {
// {
// "PermissionType": 3,
// "TriState": 2,
// "is_managed": false,
// "details": "xyz",
// },
// {
// "PermissionType": 1,
// "Value": true,
// "is_managed": true,
// },
// }
COMPONENT_EXPORT(APP_TYPES)
base::Value::List ConvertPermissionsToList(const Permissions& permissions);
// Converts base::Value::List to Permissions.
COMPONENT_EXPORT(APP_TYPES)
Permissions ConvertListToPermissions(const base::Value::List* list);
} // namespace apps
#endif // COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_PERMISSION_H_
|