15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef COMPONENTS_METRICS_CLONED_INSTALL_DETECTOR_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPONENTS_METRICS_CLONED_INSTALL_DETECTOR_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/ref_counted.h"
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/memory/weak_ptr.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class PrefRegistrySimple;
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class PrefService;
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class SingleThreadTaskRunner;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace metrics {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class MachineIdProvider;
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class for detecting if an install is cloned. It does this by detecting
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when the hardware running Chrome changes.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClonedInstallDetector {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ClonedInstallDetector(MachineIdProvider* raw_id_provider);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ClonedInstallDetector();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Posts a task to |task_runner| to generate a machine ID and store it to a
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // local state pref. If the newly generated ID is different than the
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // previously stored one, then the install is considered cloned. The ID is a
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 24-bit value based off of machine characteristics. This value should never
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be sent over the network.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jwd): Implement change detection.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckForClonedInstall(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrefService* local_state,
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static void RegisterPrefs(PrefRegistrySimple* registry);
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) private:
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ClonedInstallDetectorTest, SaveId);
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ClonedInstallDetectorTest, DetectClone);
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Converts raw_id into a 24-bit hash and stores the hash in |local_state|.
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // |raw_id| is not a const ref because it's passed from a cross-thread post
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // task.
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void SaveMachineId(PrefService* local_state, std::string raw_id);
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  scoped_refptr<MachineIdProvider> raw_id_provider_;
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  base::WeakPtrFactory<ClonedInstallDetector> weak_ptr_factory_;
533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClonedInstallDetector);
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace metrics
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // COMPONENTS_METRICS_CLONED_INSTALL_DETECTOR_H_
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)