blob: 1497744c82a182ba78b8d16e3b930f2c228022ee [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_USB_USB_POLICY_ALLOWED_DEVICES_H_
#define CHROME_BROWSER_USB_USB_POLICY_ALLOWED_DEVICES_H_
#include <map>
#include <memory>
#include <set>
#include <utility>
#include "base/optional.h"
#include "components/prefs/pref_change_registrar.h"
#include "url/origin.h"
namespace device {
namespace mojom {
class UsbDeviceInfo;
} // namespace mojom
} // namespace device
class PrefService;
// This class is used to initialize a UsbDeviceIdsToUrlsMap from the
// preference value for the WebUsbAllowDevicesForUrls or
// DeviceLoginScreenWebUsbAllowDevicesForUrls policy. The map provides an
// efficient method of checking if a particular device is allowed to be used by
// the given requesting and embedding origins. Additionally, this class also
// uses |pref_change_registrar_| to observe for changes to the preference value
// so that the map can be updated accordingly.
class UsbPolicyAllowedDevices {
public:
// A map of device IDs to a set of origins stored in a std::pair. The device
// IDs correspond to a pair of |vendor_id| and |product_id| integers. The
// origins correspond to a pair of |requesting_origin| and |embedding_origin|
// that are allowed to access the device mapped to them. If |embedding_origin|
// is base::nullopt then |requesting_origin| is allowed to access the device
// when embedded in any top-level frame.
using UsbDeviceIdsToUrlsMap =
std::map<std::pair<int, int>,
std::set<std::pair<url::Origin, base::Optional<url::Origin>>>>;
// Initializes |pref_change_registrar_| with |pref_service| and adds an
// an observer for the |pref_name|.
UsbPolicyAllowedDevices(PrefService* pref_service, const char* pref_name);
~UsbPolicyAllowedDevices();
// Checks if |requesting_origin| (when embedded within |embedding_origin|) is
// allowed to use the device with |device_info|.
bool IsDeviceAllowed(const url::Origin& requesting_origin,
const url::Origin& embedding_origin,
const device::mojom::UsbDeviceInfo& device_info);
bool IsDeviceAllowed(const url::Origin& requesting_origin,
const url::Origin& embedding_origin,
const std::pair<int, int>& device_ids);
const UsbDeviceIdsToUrlsMap& map() const { return usb_device_ids_to_urls_; }
private:
// Creates or updates the |usb_device_ids_to_urls_| map using the
// pref at |pref_name_|. The existing map is cleared to ensure that previous
// pref settings are removed.
void CreateOrUpdateMap();
// Allow for this class to observe changes to the pref value.
const char* pref_name_;
PrefChangeRegistrar pref_change_registrar_;
UsbDeviceIdsToUrlsMap usb_device_ids_to_urls_;
};
#endif // CHROME_BROWSER_USB_USB_POLICY_ALLOWED_DEVICES_H_