1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file.
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifndef REMOTING_PROTOCOL_PAIRING_REGISTRY_DELEGATE_WIN_H_
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define REMOTING_PROTOCOL_PAIRING_REGISTRY_DELEGATE_WIN_H_
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <string>
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/basictypes.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/compiler_specific.h"
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "base/win/registry.h"
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "remoting/protocol/pairing_registry.h"
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace base {
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class ListValue;
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace base
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace remoting {
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Stores client pairing information in Windows registry. Two separate registry
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// keys are used:
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//  - |privileged| - contains the shared secrets of all pairings. This key must
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//                   be protected by a strong ACL denying access to unprivileged
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//                   code.
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//  - |unprivileged| - contains the rest of pairing state.
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Creator of this object is responsible for passing the registry key handles
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// with appropriate access. |privileged| may be NULL if read-only access is
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// sufficient. Shared secrets will not be returned in such a case.
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class PairingRegistryDelegateWin
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : public protocol::PairingRegistry::Delegate {
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PairingRegistryDelegateWin();
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual ~PairingRegistryDelegateWin();
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Passes the root keys to be used to access the pairing registry store.
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // |privileged| is optional and may be NULL. The caller retains ownership of
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // the passed handles.
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool SetRootKeys(HKEY privileged, HKEY unprivileged);
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // PairingRegistry::Delegate interface
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual scoped_ptr<base::ListValue> LoadAll() OVERRIDE;
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool DeleteAll() OVERRIDE;
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual protocol::PairingRegistry::Pairing Load(
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const std::string& client_id) OVERRIDE;
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool Save(const protocol::PairingRegistry::Pairing& pairing) OVERRIDE;
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool Delete(const std::string& client_id) OVERRIDE;
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  base::win::RegKey privileged_;
534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  base::win::RegKey unprivileged_;
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PairingRegistryDelegateWin);
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace remoting
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif  // REMOTING_PROTOCOL_PAIRING_REGISTRY_DELEGATE_WIN_H_
61