• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_SYNC_SERVICE_H_
6 #define CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_SYNC_SERVICE_H_
7 
8 #include <vector>
9 
10 #include "base/callback_forward.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/observer_list.h"
13 #include "base/prefs/pref_change_registrar.h"
14 #include "chrome/browser/supervised_user/supervised_user_sync_service_observer.h"
15 #include "chrome/browser/supervised_user/supervised_users.h"
16 #include "components/keyed_service/core/keyed_service.h"
17 #include "sync/api/syncable_service.h"
18 
19 namespace base {
20 class DictionaryValue;
21 }
22 
23 namespace user_prefs {
24 class PrefRegistrySyncable;
25 }
26 
27 class PrefService;
28 
29 class SupervisedUserSyncService : public KeyedService,
30                                   public syncer::SyncableService {
31  public:
32   // For use with GetSupervisedUsersAsync() below.
33   typedef base::Callback<void(const base::DictionaryValue*)>
34       SupervisedUsersCallback;
35 
36   // Dictionary keys for entry values of |prefs::kSupervisedUsers|.
37   static const char kAcknowledged[];
38   static const char kChromeAvatar[];
39   static const char kChromeOsAvatar[];
40   static const char kMasterKey[];
41   static const char kPasswordSignatureKey[];
42   static const char kPasswordEncryptionKey[];
43   static const char kName[];
44 
45   // Represents a non-existing avatar on Chrome and Chrome OS.
46   static const int kNoAvatar;
47 
48   virtual ~SupervisedUserSyncService();
49 
50   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
51 
52   // Extracts the avatar index from the input |avatar_str| and set
53   // |avatar_index| to hold the extracted value. Returns true if the
54   // index was extracted successfully and false otherwise.
55   // |avatar_str| should have the format: "chrome-avatar-index:INDEX"
56   // where INDEX is the integer to be extracted. |avatar_str| can be empty
57   // in case there is no avatar synced for a supervised user in which case
58   // |avatar_index| is set to -1.
59   static bool GetAvatarIndex(const std::string& avatar_str,
60                              int* avatar_index);
61 
62   // Given an |avatar_index|, it returns a string of the form:
63   // "chrome-avatar-index:INDEX" where INDEX = |avatar_index|.
64   // It is exposed for testing purposes only.
65   static std::string BuildAvatarString(int avatar_index);
66 
67   void AddObserver(SupervisedUserSyncServiceObserver* observer);
68   void RemoveObserver(SupervisedUserSyncServiceObserver* observer);
69 
70   void AddSupervisedUser(const std::string& id,
71                          const std::string& name,
72                          const std::string& master_key,
73                          const std::string& signature_key,
74                          const std::string& encryption_key,
75                          int avatar_index);
76   void UpdateSupervisedUser(const std::string& id,
77                             const std::string& name,
78                             const std::string& master_key,
79                             const std::string& signature_key,
80                             const std::string& encryption_key,
81                             int avatar_index);
82 
83   void DeleteSupervisedUser(const std::string& id);
84 
85   // Updates the supervised user avatar only if the supervised user has
86   // no avatar and |avatar_index| is set to some value other than
87   // |kNoAvatar|. If |avatar_index| equals |kNoAvatar| and the
88   // supervised user has an avatar, it will be cleared. However,
89   // to clear an avatar call the convenience method
90   // |ClearSupervisedUserAvatar()|.
91   // Returns true if the avatar value is changed (either updated or cleared)
92   // and false otherwise.
93   bool UpdateSupervisedUserAvatarIfNeeded(const std::string& id,
94                                           int avatar_index);
95   void ClearSupervisedUserAvatar(const std::string& id);
96 
97   // Returns a dictionary containing all supervised users supervised by this
98   // custodian. This method should only be called once this service has started
99   // syncing supervised users (i.e. has finished its initial merge of local and
100   // server-side data, via MergeDataAndStartSyncing), as the stored data might
101   // be outdated before that.
102   const base::DictionaryValue* GetSupervisedUsers();
103 
104   // Calls the passed |callback| with a dictionary containing all supervised
105   // users managed by this custodian.
106   void GetSupervisedUsersAsync(const SupervisedUsersCallback& callback);
107 
108   // KeyedService implementation:
109   virtual void Shutdown() OVERRIDE;
110 
111   // SyncableService implementation:
112   virtual syncer::SyncMergeResult MergeDataAndStartSyncing(
113       syncer::ModelType type,
114       const syncer::SyncDataList& initial_sync_data,
115       scoped_ptr<syncer::SyncChangeProcessor> sync_processor,
116       scoped_ptr<syncer::SyncErrorFactory> error_handler) OVERRIDE;
117   virtual void StopSyncing(syncer::ModelType type) OVERRIDE;
118   virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
119       OVERRIDE;
120   virtual syncer::SyncError ProcessSyncChanges(
121       const tracked_objects::Location& from_here,
122       const syncer::SyncChangeList& change_list) OVERRIDE;
123 
124  private:
125   friend class SupervisedUserSyncServiceFactory;
126 
127   // Use |SupervisedUserSyncServiceFactory::GetForProfile(...)| to get an
128   // instance of this service.
129   explicit SupervisedUserSyncService(PrefService* prefs);
130 
131   void OnLastSignedInUsernameChange();
132 
133   scoped_ptr<base::DictionaryValue> CreateDictionary(
134       const std::string& name,
135       const std::string& master_key,
136       const std::string& signature_key,
137       const std::string& encryption_key,
138       int avatar_index);
139 
140   void UpdateSupervisedUserImpl(const std::string& id,
141                                 const std::string& name,
142                                 const std::string& master_key,
143                                 const std::string& signature_key,
144                                 const std::string& encryption_key,
145                                 int avatar_index,
146                                 bool add_user);
147 
148   void NotifySupervisedUserAcknowledged(const std::string& supervised_user_id);
149   void NotifySupervisedUsersSyncingStopped();
150   void NotifySupervisedUsersChanged();
151 
152   void DispatchCallbacks();
153 
154   PrefService* prefs_;
155   PrefChangeRegistrar pref_change_registrar_;
156 
157   scoped_ptr<syncer::SyncChangeProcessor> sync_processor_;
158   scoped_ptr<syncer::SyncErrorFactory> error_handler_;
159 
160   ObserverList<SupervisedUserSyncServiceObserver> observers_;
161 
162   std::vector<SupervisedUsersCallback> callbacks_;
163 
164   DISALLOW_COPY_AND_ASSIGN(SupervisedUserSyncService);
165 };
166 
167 #endif  // CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_SYNC_SERVICE_H_
168