blob: 1345f2d23905b54fef1d60cd2b5fa9d7cb6ddbbf [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 base {
class Value;
} // namespace base
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 and
// DeviceWebUsbAllowDevicesForUrls 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
// PrefChangeRegistrars to observe for changes to the preference values 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 PrefChangeRegistrars and adds observers to listen to the prefs
// controlled by user and device policy.
explicit UsbPolicyAllowedDevices(PrefService* profile_prefs,
PrefService* local_state_prefs);
~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 prefs
// controlled by user and device policy. The existing map is cleared to ensure
// that previous pref settings are removed.
void CreateOrUpdateMap();
void CreateOrUpdateMapFromPrefValue(const base::Value* pref_value);
// Allow for this class to observe changes to the pref value.
PrefChangeRegistrar profile_pref_change_registrar_;
#if defined(OS_CHROMEOS)
PrefChangeRegistrar local_state_pref_change_registrar_;
#endif // defined(OS_CHROMEOS)
UsbDeviceIdsToUrlsMap usb_device_ids_to_urls_;
};
#endif // CHROME_BROWSER_USB_USB_POLICY_ALLOWED_DEVICES_H_