blob: 3084725951d638d519999b8ee5b660c3f129a886 [file]
// 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.
#include "chrome/browser/sharing/sharing_device_registration.h"
#include <stdint.h>
#include <vector>
#include "base/base64url.h"
#include "base/bind.h"
#include "base/optional.h"
#include "chrome/browser/sharing/fcm_constants.h"
#include "chrome/browser/sharing/sharing_device_info.h"
#include "chrome/browser/sharing/sharing_sync_preference.h"
#include "chrome/browser/sharing/vapid_key_manager.h"
#include "components/gcm_driver/crypto/p256_key_util.h"
#include "components/gcm_driver/gcm_driver.h"
#include "components/gcm_driver/instance_id/instance_id_driver.h"
#include "components/sync_device_info/device_info.h"
#include "components/sync_device_info/local_device_info_provider.h"
#include "crypto/ec_private_key.h"
SharingDeviceRegistration::SharingDeviceRegistration(
SharingSyncPreference* sharing_sync_preference,
instance_id::InstanceIDDriver* instance_id_driver,
VapidKeyManager* vapid_key_manager,
gcm::GCMDriver* gcm_driver,
syncer::LocalDeviceInfoProvider* local_device_info_provider)
: sharing_sync_preference_(sharing_sync_preference),
instance_id_driver_(instance_id_driver),
vapid_key_manager_(vapid_key_manager),
gcm_driver_(gcm_driver),
local_device_info_provider_(local_device_info_provider),
weak_ptr_factory_(this) {}
SharingDeviceRegistration::~SharingDeviceRegistration() = default;
void SharingDeviceRegistration::RegisterDevice(RegistrationCallback callback) {
// TODO(himanshujaju) : Extract a static function to convert ECPrivateKey* to
// Base64PublicKey in library.
crypto::ECPrivateKey* vapid_key = vapid_key_manager_->GetOrCreateKey();
if (!vapid_key) {
std::move(callback).Run(Result::FAILURE);
return;
}
std::string public_key;
if (!gcm::GetRawPublicKey(*vapid_key, &public_key)) {
std::move(callback).Run(Result::FAILURE);
return;
}
std::string base64_public_key;
base::Base64UrlEncode(public_key, base::Base64UrlEncodePolicy::OMIT_PADDING,
&base64_public_key);
instance_id_driver_->GetInstanceID(kSharingFCMAppID)
->GetToken(
base64_public_key, kFCMScope,
/*options=*/{},
/*is_lazy=*/false,
base::BindOnce(&SharingDeviceRegistration::OnFCMTokenReceived,
weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
}
void SharingDeviceRegistration::OnFCMTokenReceived(
RegistrationCallback callback,
const std::string& fcm_registration_token,
instance_id::InstanceID::Result result) {
if (result != instance_id::InstanceID::SUCCESS) {
std::move(callback).Run(Result::FAILURE);
return;
}
gcm_driver_->GetEncryptionInfo(
kSharingFCMAppID,
base::AdaptCallbackForRepeating(
base::BindOnce(&SharingDeviceRegistration::OnEncryptionInfoReceived,
weak_ptr_factory_.GetWeakPtr(), std::move(callback),
fcm_registration_token)));
}
void SharingDeviceRegistration::OnEncryptionInfoReceived(
RegistrationCallback callback,
const std::string& fcm_registration_token,
const std::string& p256dh,
const std::string& auth_secret) const {
int device_capabilities = GetDeviceCapabilities();
std::string device_guid =
local_device_info_provider_->GetLocalDeviceInfo()->guid();
SharingSyncPreference::Device device(fcm_registration_token, p256dh,
auth_secret, device_capabilities);
sharing_sync_preference_->SetSyncDevice(device_guid, device);
std::move(callback).Run(Result::SUCCESS);
}
int SharingDeviceRegistration::GetDeviceCapabilities() const {
int device_capabilities = static_cast<int>(SharingDeviceCapability::kNone);
return device_capabilities;
}