blob: dea9b13d59f97c6cc3f968aed3ebb73667a4c453 [file] [log] [blame]
// Copyright 2014 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 EXTENSIONS_DEVICE_PERMISSION_MANAGER_H_
#define EXTENSIONS_DEVICE_PERMISSION_MANAGER_H_
#include <map>
#include <set>
#include <vector>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string16.h"
#include "base/threading/thread_checker.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
#include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "device/usb/usb_device.h"
template <typename T>
struct DefaultSingletonTraits;
namespace base {
class Value;
}
namespace content {
class BrowserContext;
}
namespace device {
class UsbDevice;
}
namespace extensions {
// Stores information about a device saved with access granted.
struct DevicePermissionEntry {
DevicePermissionEntry(uint16_t vendor_id,
uint16_t product_id,
const base::string16& serial_number);
base::Value* ToValue() const;
// The vendor ID of this device.
uint16_t vendor_id;
// The product ID of this device.
uint16_t product_id;
// The serial number (possibly alphanumeric) of this device.
base::string16 serial_number;
};
// Stores a copy of device permissions associated with a particular extension.
class DevicePermissions {
public:
virtual ~DevicePermissions();
bool CheckUsbDevice(scoped_refptr<device::UsbDevice> device) const;
private:
friend class DevicePermissionsManager;
DevicePermissions(content::BrowserContext* context,
const std::string& extension_id);
DevicePermissions(
const std::vector<DevicePermissionEntry>& permission_entries,
const std::set<scoped_refptr<device::UsbDevice>>& ephemeral_devices);
std::vector<DevicePermissionEntry>& permission_entries();
std::set<scoped_refptr<device::UsbDevice>>& ephemeral_devices();
std::vector<DevicePermissionEntry> permission_entries_;
std::set<scoped_refptr<device::UsbDevice>> ephemeral_devices_;
DISALLOW_COPY_AND_ASSIGN(DevicePermissions);
};
// Manages saved device permissions for all extensions.
class DevicePermissionsManager : public KeyedService,
public base::NonThreadSafe,
public content::NotificationObserver,
public device::UsbDevice::Observer {
public:
static DevicePermissionsManager* Get(content::BrowserContext* context);
// Returns a copy of the DevicePermissions object for a given extension that
// can be used by any thread.
scoped_ptr<DevicePermissions> GetForExtension(
const std::string& extension_id);
std::vector<base::string16> GetPermissionMessageStrings(
const std::string& extension_id);
void AllowUsbDevice(const std::string& extension_id,
scoped_refptr<device::UsbDevice> device,
const base::string16& serial_number);
void Clear(const std::string& extension_id);
private:
friend class DevicePermissionsManagerFactory;
DevicePermissionsManager(content::BrowserContext* context);
~DevicePermissionsManager() override;
DevicePermissions* Get(const std::string& extension_id) const;
DevicePermissions* GetOrInsert(const std::string& extension_id);
// content::NotificationObserver.
void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) override;
// device::UsbDevice::Observer
void OnDisconnect(scoped_refptr<device::UsbDevice> device) override;
content::BrowserContext* context_;
std::map<std::string, DevicePermissions*> extension_id_to_device_permissions_;
content::NotificationRegistrar registrar_;
DISALLOW_COPY_AND_ASSIGN(DevicePermissionsManager);
};
class DevicePermissionsManagerFactory
: public BrowserContextKeyedServiceFactory {
public:
static DevicePermissionsManager* GetForBrowserContext(
content::BrowserContext* context);
static DevicePermissionsManagerFactory* GetInstance();
private:
friend struct DefaultSingletonTraits<DevicePermissionsManagerFactory>;
DevicePermissionsManagerFactory();
~DevicePermissionsManagerFactory() override;
// BrowserContextKeyedServiceFactory
KeyedService* BuildServiceInstanceFor(
content::BrowserContext* context) const override;
virtual content::BrowserContext* GetBrowserContextToUse(
content::BrowserContext* context) const override;
DISALLOW_COPY_AND_ASSIGN(DevicePermissionsManagerFactory);
};
} // namespace extensions
#endif // EXTENSIONS_DEVICE_PERMISSION_MANAGER_H_