2016-01-30 16:49:18 +05:30
|
|
|
// Copyright (c) 2016 GitHub, Inc.
|
|
|
|
// Use of this source code is governed by the MIT license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
2021-11-22 08:34:31 +01:00
|
|
|
#ifndef ELECTRON_SHELL_BROWSER_ELECTRON_PERMISSION_MANAGER_H_
|
|
|
|
#define ELECTRON_SHELL_BROWSER_ELECTRON_PERMISSION_MANAGER_H_
|
2016-01-30 16:49:18 +05:30
|
|
|
|
2018-09-12 19:25:56 -05:00
|
|
|
#include <memory>
|
2016-03-08 23:32:59 +09:00
|
|
|
#include <vector>
|
2016-01-30 16:49:18 +05:30
|
|
|
|
2017-11-23 14:02:43 +01:00
|
|
|
#include "base/containers/id_map.h"
|
2024-07-29 12:42:57 -05:00
|
|
|
#include "base/functional/callback_forward.h"
|
2024-07-25 04:25:45 -05:00
|
|
|
#include "base/values.h"
|
2018-10-02 14:53:10 -07:00
|
|
|
#include "content/public/browser/permission_controller_delegate.h"
|
2016-01-30 16:49:18 +05:30
|
|
|
|
2016-02-01 03:05:34 +05:30
|
|
|
namespace content {
|
|
|
|
class WebContents;
|
|
|
|
}
|
|
|
|
|
2024-07-29 12:42:57 -05:00
|
|
|
namespace gin_helper {
|
|
|
|
class Dictionary;
|
|
|
|
} // namespace gin_helper
|
|
|
|
|
|
|
|
namespace v8 {
|
|
|
|
class Object;
|
|
|
|
template <typename T>
|
|
|
|
class Local;
|
|
|
|
} // namespace v8
|
|
|
|
|
2019-06-19 14:23:04 -07:00
|
|
|
namespace electron {
|
2016-01-30 16:49:18 +05:30
|
|
|
|
2024-07-25 04:25:45 -05:00
|
|
|
class ElectronBrowserContext;
|
|
|
|
|
2020-02-04 12:19:40 -08:00
|
|
|
class ElectronPermissionManager : public content::PermissionControllerDelegate {
|
2016-01-30 16:49:18 +05:30
|
|
|
public:
|
2020-02-04 12:19:40 -08:00
|
|
|
ElectronPermissionManager();
|
|
|
|
~ElectronPermissionManager() override;
|
2016-01-30 16:49:18 +05:30
|
|
|
|
2021-11-03 12:41:45 +01:00
|
|
|
// disable copy
|
|
|
|
ElectronPermissionManager(const ElectronPermissionManager&) = delete;
|
|
|
|
ElectronPermissionManager& operator=(const ElectronPermissionManager&) =
|
|
|
|
delete;
|
|
|
|
|
2023-05-30 12:35:25 -04:00
|
|
|
using USBProtectedClasses = std::vector<uint8_t>;
|
|
|
|
|
2019-05-03 11:30:48 -07:00
|
|
|
using StatusCallback =
|
|
|
|
base::OnceCallback<void(blink::mojom::PermissionStatus)>;
|
|
|
|
using StatusesCallback = base::OnceCallback<void(
|
|
|
|
const std::vector<blink::mojom::PermissionStatus>&)>;
|
2022-09-26 10:19:58 -04:00
|
|
|
using PairCallback = base::OnceCallback<void(base::Value::Dict)>;
|
2021-05-06 15:01:04 -07:00
|
|
|
using RequestHandler = base::RepeatingCallback<void(content::WebContents*,
|
2022-05-17 12:48:40 -04:00
|
|
|
blink::PermissionType,
|
2021-05-06 15:01:04 -07:00
|
|
|
StatusCallback,
|
|
|
|
const base::Value&)>;
|
|
|
|
using CheckHandler =
|
|
|
|
base::RepeatingCallback<bool(content::WebContents*,
|
2022-05-17 12:48:40 -04:00
|
|
|
blink::PermissionType,
|
2021-05-06 15:01:04 -07:00
|
|
|
const GURL& requesting_origin,
|
|
|
|
const base::Value&)>;
|
2016-01-30 16:49:18 +05:30
|
|
|
|
2021-09-23 07:00:11 -04:00
|
|
|
using DeviceCheckHandler =
|
|
|
|
base::RepeatingCallback<bool(const v8::Local<v8::Object>&)>;
|
2023-05-30 12:35:25 -04:00
|
|
|
|
|
|
|
using ProtectedUSBHandler = base::RepeatingCallback<USBProtectedClasses(
|
|
|
|
const v8::Local<v8::Object>&)>;
|
|
|
|
|
2022-09-26 10:19:58 -04:00
|
|
|
using BluetoothPairingHandler =
|
|
|
|
base::RepeatingCallback<void(gin_helper::Dictionary, PairCallback)>;
|
2021-09-23 07:00:11 -04:00
|
|
|
|
2025-04-22 15:53:29 -04:00
|
|
|
void RequestPermissionWithDetails(
|
|
|
|
blink::mojom::PermissionDescriptorPtr permission,
|
|
|
|
content::RenderFrameHost* render_frame_host,
|
|
|
|
const GURL& requesting_origin,
|
|
|
|
bool user_gesture,
|
|
|
|
base::Value::Dict details,
|
|
|
|
StatusCallback response_callback);
|
2022-09-07 09:46:37 +02:00
|
|
|
|
2023-09-05 21:17:56 -04:00
|
|
|
// Handler to dispatch permission requests in JS.
|
|
|
|
void SetPermissionRequestHandler(const RequestHandler& handler);
|
|
|
|
void SetPermissionCheckHandler(const CheckHandler& handler);
|
|
|
|
void SetDevicePermissionHandler(const DeviceCheckHandler& handler);
|
|
|
|
void SetProtectedUSBHandler(const ProtectedUSBHandler& handler);
|
|
|
|
void SetBluetoothPairingHandler(const BluetoothPairingHandler& handler);
|
2022-06-01 08:12:47 +02:00
|
|
|
|
2022-09-26 10:19:58 -04:00
|
|
|
void CheckBluetoothDevicePair(gin_helper::Dictionary details,
|
|
|
|
PairCallback pair_callback) const;
|
|
|
|
|
2022-05-17 12:48:40 -04:00
|
|
|
bool CheckPermissionWithDetails(blink::PermissionType permission,
|
2018-08-29 02:05:08 +12:00
|
|
|
content::RenderFrameHost* render_frame_host,
|
|
|
|
const GURL& requesting_origin,
|
2022-06-29 10:09:48 -07:00
|
|
|
base::Value::Dict details) const;
|
2018-08-29 02:05:08 +12:00
|
|
|
|
2022-05-17 12:48:40 -04:00
|
|
|
bool CheckDevicePermission(blink::PermissionType permission,
|
2021-09-23 07:00:11 -04:00
|
|
|
const url::Origin& origin,
|
2022-06-27 15:50:08 -05:00
|
|
|
const base::Value& object,
|
|
|
|
ElectronBrowserContext* browser_context) const;
|
2021-09-23 07:00:11 -04:00
|
|
|
|
2022-05-17 12:48:40 -04:00
|
|
|
void GrantDevicePermission(blink::PermissionType permission,
|
2021-09-23 07:00:11 -04:00
|
|
|
const url::Origin& origin,
|
2022-06-27 15:50:08 -05:00
|
|
|
const base::Value& object,
|
|
|
|
ElectronBrowserContext* browser_context) const;
|
2021-09-23 07:00:11 -04:00
|
|
|
|
2022-06-27 15:50:08 -05:00
|
|
|
void RevokeDevicePermission(blink::PermissionType permission,
|
|
|
|
const url::Origin& origin,
|
|
|
|
const base::Value& object,
|
|
|
|
ElectronBrowserContext* browser_context) const;
|
2022-05-23 15:13:18 -04:00
|
|
|
|
2023-05-30 12:35:25 -04:00
|
|
|
USBProtectedClasses CheckProtectedUSBClasses(
|
|
|
|
const USBProtectedClasses& classes) const;
|
|
|
|
|
2016-02-01 03:05:34 +05:30
|
|
|
protected:
|
|
|
|
void OnPermissionResponse(int request_id,
|
2016-12-19 15:12:16 -08:00
|
|
|
int permission_id,
|
2016-05-23 10:59:39 +09:00
|
|
|
blink::mojom::PermissionStatus status);
|
2016-02-01 03:05:34 +05:30
|
|
|
|
2018-10-02 14:53:10 -07:00
|
|
|
// content::PermissionControllerDelegate:
|
2023-09-05 21:17:56 -04:00
|
|
|
void RequestPermissions(
|
|
|
|
content::RenderFrameHost* render_frame_host,
|
|
|
|
const content::PermissionRequestDescription& request_description,
|
|
|
|
StatusesCallback callback) override;
|
2022-05-17 12:48:40 -04:00
|
|
|
void ResetPermission(blink::PermissionType permission,
|
2016-01-30 16:49:18 +05:30
|
|
|
const GURL& requesting_origin,
|
|
|
|
const GURL& embedding_origin) override;
|
2016-05-23 10:59:39 +09:00
|
|
|
blink::mojom::PermissionStatus GetPermissionStatus(
|
2025-04-24 17:18:38 +09:00
|
|
|
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
|
2016-01-30 16:49:18 +05:30
|
|
|
const GURL& requesting_origin,
|
|
|
|
const GURL& embedding_origin) override;
|
2022-06-01 08:12:47 +02:00
|
|
|
void RequestPermissionsFromCurrentDocument(
|
|
|
|
content::RenderFrameHost* render_frame_host,
|
2023-09-05 21:17:56 -04:00
|
|
|
const content::PermissionRequestDescription& request_description,
|
2022-06-01 08:12:47 +02:00
|
|
|
base::OnceCallback<
|
|
|
|
void(const std::vector<blink::mojom::PermissionStatus>&)> callback)
|
|
|
|
override;
|
2022-09-07 09:46:37 +02:00
|
|
|
content::PermissionResult GetPermissionResultForOriginWithoutContext(
|
2025-04-24 17:18:38 +09:00
|
|
|
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
|
2023-08-15 10:49:41 -05:00
|
|
|
const url::Origin& requesting_origin,
|
|
|
|
const url::Origin& embedding_origin) override;
|
2022-09-07 09:46:37 +02:00
|
|
|
blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument(
|
2025-04-24 17:18:38 +09:00
|
|
|
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
|
2024-06-07 17:18:35 -04:00
|
|
|
content::RenderFrameHost* render_frame_host,
|
|
|
|
bool should_include_device_status) override;
|
2022-04-12 13:19:14 +02:00
|
|
|
blink::mojom::PermissionStatus GetPermissionStatusForWorker(
|
2025-04-24 17:18:38 +09:00
|
|
|
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
|
2022-04-12 13:19:14 +02:00
|
|
|
content::RenderProcessHost* render_process_host,
|
|
|
|
const GURL& worker_origin) override;
|
2023-03-20 07:06:57 -04:00
|
|
|
blink::mojom::PermissionStatus GetPermissionStatusForEmbeddedRequester(
|
2025-04-24 17:18:38 +09:00
|
|
|
const blink::mojom::PermissionDescriptorPtr& permission_descriptor,
|
2023-03-20 07:06:57 -04:00
|
|
|
content::RenderFrameHost* render_frame_host,
|
|
|
|
const url::Origin& requesting_origin) override;
|
2016-01-30 16:49:18 +05:30
|
|
|
|
|
|
|
private:
|
2016-12-19 15:12:16 -08:00
|
|
|
class PendingRequest;
|
2017-11-23 14:02:43 +01:00
|
|
|
using PendingRequestsMap = base::IDMap<std::unique_ptr<PendingRequest>>;
|
2016-02-01 15:13:49 +05:30
|
|
|
|
2023-09-05 21:17:56 -04:00
|
|
|
void RequestPermissionsWithDetails(
|
|
|
|
content::RenderFrameHost* render_frame_host,
|
|
|
|
const content::PermissionRequestDescription& request_description,
|
|
|
|
base::Value::Dict details,
|
|
|
|
StatusesCallback callback);
|
|
|
|
|
2016-02-01 03:05:34 +05:30
|
|
|
RequestHandler request_handler_;
|
2018-08-29 02:05:08 +12:00
|
|
|
CheckHandler check_handler_;
|
2021-09-23 07:00:11 -04:00
|
|
|
DeviceCheckHandler device_permission_handler_;
|
2023-05-30 12:35:25 -04:00
|
|
|
ProtectedUSBHandler protected_usb_handler_;
|
2022-09-26 10:19:58 -04:00
|
|
|
BluetoothPairingHandler bluetooth_pairing_handler_;
|
2016-01-30 16:49:18 +05:30
|
|
|
|
2016-12-19 15:12:16 -08:00
|
|
|
PendingRequestsMap pending_requests_;
|
2016-01-30 16:49:18 +05:30
|
|
|
};
|
|
|
|
|
2019-06-19 14:23:04 -07:00
|
|
|
} // namespace electron
|
2016-01-30 16:49:18 +05:30
|
|
|
|
2021-11-22 08:34:31 +01:00
|
|
|
#endif // ELECTRON_SHELL_BROWSER_ELECTRON_PERMISSION_MANAGER_H_
|