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
|
// 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 CONTENT_BROWSER_SMART_CARD_SMART_CARD_SERVICE_H_
#define CONTENT_BROWSER_SMART_CARD_SMART_CARD_SERVICE_H_
#include <map>
#include <string>
#include "base/containers/flat_set.h"
#include "base/memory/raw_ref.h"
#include "content/common/content_export.h"
#include "content/public/browser/document_service.h"
#include "content/public/browser/smart_card_delegate.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/device/public/mojom/smart_card.mojom.h"
#include "third_party/blink/public/mojom/smart_card/smart_card.mojom.h"
namespace content {
class RenderFrameHost;
// SmarCardService provides an implementation of the SmartCardService mojom
// interface. This interface is used by Blink to implement the Web Smart Card
// API.
class CONTENT_EXPORT SmartCardService
: public DocumentService<blink::mojom::SmartCardService>,
public device::mojom::SmartCardContext,
public device::mojom::SmartCardConnectionWatcher,
public SmartCardDelegate::PermissionObserver {
public:
explicit SmartCardService(
RenderFrameHost& render_frame_host,
mojo::PendingReceiver<blink::mojom::SmartCardService> receiver,
mojo::PendingRemote<device::mojom::SmartCardContextFactory>
context_factory);
~SmartCardService() override;
// Use this when creating from a document.
static void Create(RenderFrameHost*,
mojo::PendingReceiver<blink::mojom::SmartCardService>);
// blink::mojom::SmartCardService overrides:
void CreateContext(CreateContextCallback callback) override;
// device::mojom::SmartCardContext overrides:
void ListReaders(ListReadersCallback callback) override;
void GetStatusChange(
base::TimeDelta timeout,
std::vector<device::mojom::SmartCardReaderStateInPtr> reader_states,
GetStatusChangeCallback callback) override;
void Cancel(CancelCallback callback) override;
void Connect(const std::string& reader,
device::mojom::SmartCardShareMode share_mode,
device::mojom::SmartCardProtocolsPtr preferred_protocols,
mojo::PendingRemote<device::mojom::SmartCardConnectionWatcher>
connection_watcher,
ConnectCallback callback) override;
void NotifyConnectionUsed() override;
// SmartCardDelegate::PermissionObserver overrides:
void OnPermissionRevoked(const url::Origin& origin) override;
private:
void OnContextCreated(CreateContextCallback callback,
::device::mojom::SmartCardCreateContextResultPtr);
void OnReaderPermissionResult(
mojo::ReceiverId context_wrapper_id,
const std::string& reader,
device::mojom::SmartCardShareMode share_mode,
device::mojom::SmartCardProtocolsPtr preferred_protocols,
ConnectCallback callback,
bool granted);
void OnMojoWrapperContextDisconnected();
void OnListReadersResult(ListReadersCallback callback,
device::mojom::SmartCardListReadersResultPtr result);
mojo::PendingRemote<device::mojom::SmartCardConnectionWatcher>
GetNewConnectionWatcher(const std::string& reader);
void OnMojoWatcherPipeClosed();
// Sends SmartCardContext calls to the platform's PC/SC stack.
// Maps a wrapper context to its corresponding real context.
std::map<mojo::ReceiverId, mojo::Remote<SmartCardContext>> context_remotes_;
// Receives SmartCardContext calls from blink
mojo::ReceiverSet<device::mojom::SmartCardContext> context_wrapper_receivers_;
// Receives notifications about smart card reader usage from the
// platform-specific implementation.
mojo::ReceiverSet<device::mojom::SmartCardConnectionWatcher>
connection_watcher_receivers_;
// On grant expiry, this allows us to kill the unwanted connections using the
// watcher's pipe.
std::map<std::string, std::set<mojo::ReceiverId>>
connection_watchers_per_reader_;
std::map<mojo::ReceiverId, std::string> reader_names_per_watcher_;
// Used to filter a reader name coming from an application, before
// it can be shown to the user in a permission prompt.
base::flat_set<std::string> valid_reader_names_;
mojo::Remote<device::mojom::SmartCardContextFactory> context_factory_;
base::WeakPtrFactory<SmartCardService> weak_ptr_factory_{this};
};
} // namespace content
#endif // CONTENT_BROWSER_SMART_CARD_SMART_CARD_SERVICE_H_
|