blob: ccf1b9ea0a38b2d15d7fd5617d62df6568a47ae3 [file] [log] [blame]
// Copyright 2019 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_SHARING_SHARING_SYNC_PREFERENCE_H_
#define CHROME_BROWSER_SHARING_SHARING_SYNC_PREFERENCE_H_
#include <stdint.h>
#include <map>
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/optional.h"
#include "base/time/time.h"
#include "base/values.h"
#include "components/prefs/pref_change_registrar.h"
namespace user_prefs {
class PrefRegistrySyncable;
}
class PrefService;
// SharingSyncPreference manages all preferences related to Sharing using Sync,
// such as storing list of user devices synced via Chrome and VapidKey used
// for authentication.
class SharingSyncPreference {
public:
struct Device {
Device(std::string fcm_token,
std::string p256dh,
std::string auth_secret,
const int capabilities);
Device(Device&& other);
Device& operator=(Device&& other);
~Device();
// FCM registration token of device for sending SharingMessage.
std::string fcm_token;
// Subscription public key required for RFC 8291.
std::string p256dh;
// Auth secret key required for RFC 8291.
std::string auth_secret;
// Bitmask of capabilities, defined in SharingDeviceCapability enum, that
// are supported by the device.
int capabilities;
};
// FCM registration status of current device. Not synced across devices.
// Used as a convenient cache of FCM registration and encryption data to avoid
// frequent lookup.
struct FCMRegistration {
FCMRegistration(std::string authorized_entity,
std::string fcm_token,
std::string p256dh,
std::string auth_secret,
base::Time timestamp);
FCMRegistration(FCMRegistration&& other);
FCMRegistration& operator=(FCMRegistration&& other);
~FCMRegistration();
// Authorized entity registered with FCM.
std::string authorized_entity;
// FCM registration token of the device.
std::string fcm_token;
// Subscription public key required for RFC 8291.
std::string p256dh;
// Auth secret key required for RFC 8291.
std::string auth_secret;
// Timestamp of latest registration.
base::Time timestamp;
};
explicit SharingSyncPreference(PrefService* prefs);
~SharingSyncPreference();
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
// Returns VAPID key from preferences if present, otherwise returns
// base::nullopt.
// For more information on vapid keys, please see
// https://tools.ietf.org/html/draft-thomson-webpush-vapid-02
base::Optional<std::vector<uint8_t>> GetVapidKey() const;
// Adds VAPID key to preferences for syncing across devices.
void SetVapidKey(const std::vector<uint8_t>& vapid_key) const;
// Observes for VAPID key changes. Replaces previously set observer.
void SetVapidKeyChangeObserver(const base::RepeatingClosure& obs);
// Clears previously set observer.
void ClearVapidKeyChangeObserver();
// Returns the map of guid to device from sharing preferences. Guid is same
// as sync device guid.
std::map<std::string, Device> GetSyncedDevices() const;
// Returns the device from sharing preferences with specified guid.
base::Optional<Device> GetSyncedDevice(const std::string& guid) const;
// Stores |device| with key |guid| in sharing preferences.
// |guid| is same as sync device guid.
void SetSyncDevice(const std::string& guid, const Device& device);
// Removes device corresponding to |guid| from sharing preferences.
// |guid| is same as sync device guid.
void RemoveDevice(const std::string& guid);
base::Optional<FCMRegistration> GetFCMRegistration() const;
void SetFCMRegistration(FCMRegistration registration);
void ClearFCMRegistration();
private:
friend class SharingSyncPreferenceTest;
static base::Value DeviceToValue(const Device& device, base::Time timestamp);
static base::Optional<Device> ValueToDevice(const base::Value& value);
PrefService* prefs_;
PrefChangeRegistrar pref_change_registrar_;
DISALLOW_COPY_AND_ASSIGN(SharingSyncPreference);
};
#endif // CHROME_BROWSER_SHARING_SHARING_SYNC_PREFERENCE_H_