// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/ash/components/multidevice/stub_multidevice_util.h"
#include <map>
#include <vector>
#include "ash/constants/ash_features.h"
#include "base/base64.h"
#include "base/base64url.h"
#include "base/no_destructor.h"
#include "base/system/sys_info.h"
#include "base/time/time.h"
#include "chromeos/ash/components/multidevice/beacon_seed.h"
namespace ash::multidevice {
namespace {
// Attributes of the default stub device.
const char kStubDeviceUserId[] = "[email protected]";
const char kStubDevicePiiFreeName[] = "no-pii device";
const char kStubDevicePSK[] = "remote device psk";
const int64_t kStubDeviceLastUpdateTimeMillis = 0L;
const char kBeaconSeedData[] = "beacon seed data";
const int64_t kBeaconSeedStartTimeMillis = 100L;
const int64_t kBeaconSeedEndTimeMillis = 200L;
} // namespace
// Attributes of the default stub devices.
const char kStubHostPhoneName[] = "Fake Phone";
const char kStubClientComputerName[] = "Fake Computer";
const char kStubHostPhoneInstanceId[] = "1234";
const char kStubClientComputerInstanceId[] = "5678";
const char kStubHostPhonePublicKey[] = "public key phone";
const char kStubClientComputerPublicKey[] = "public key computer";
const char kStubDeviceBluetoothPublicAddress[] = "01:23:45:67:89:AB";
RemoteDevice CreateStubHostPhone() {
static const base::NoDestructor<RemoteDevice> host_phone([] {
// Stub host phone defaults to all host features enabled.
std::map<SoftwareFeature, SoftwareFeatureState> software_features;
software_features[SoftwareFeature::kBetterTogetherHost] =
SoftwareFeatureState::kEnabled;
software_features[SoftwareFeature::kSmartLockHost] =
SoftwareFeatureState::kEnabled;
software_features[SoftwareFeature::kInstantTetheringHost] =
SoftwareFeatureState::kEnabled;
software_features[SoftwareFeature::kMessagesForWebHost] =
SoftwareFeatureState::kEnabled;
software_features[SoftwareFeature::kPhoneHubHost] =
SoftwareFeatureState::kEnabled;
software_features[SoftwareFeature::kWifiSyncHost] =
SoftwareFeatureState::kEnabled;
software_features[SoftwareFeature::kEcheHost] =
SoftwareFeatureState::kEnabled;
software_features[SoftwareFeature::kPhoneHubCameraRollHost] =
SoftwareFeatureState::kEnabled;
std::vector<BeaconSeed> beacon_seeds = {multidevice::BeaconSeed(
kBeaconSeedData,
base::Time::FromMillisecondsSinceUnixEpoch(kBeaconSeedStartTimeMillis),
base::Time::FromMillisecondsSinceUnixEpoch(kBeaconSeedEndTimeMillis))};
return RemoteDevice(kStubDeviceUserId, kStubHostPhoneInstanceId,
kStubHostPhoneName, kStubDevicePiiFreeName,
kStubHostPhonePublicKey, kStubDevicePSK,
kStubDeviceLastUpdateTimeMillis, software_features,
beacon_seeds, kStubDeviceBluetoothPublicAddress);
}());
return *host_phone;
}
RemoteDevice CreateStubClientComputer() {
static const base::NoDestructor<RemoteDevice> client_computer([] {
// Stub client computer relies on flags.
std::map<SoftwareFeature, SoftwareFeatureState> software_features;
software_features[SoftwareFeature::kBetterTogetherClient] =
SoftwareFeatureState::kSupported;
software_features[SoftwareFeature::kSmartLockClient] =
SoftwareFeatureState::kSupported;
software_features[SoftwareFeature::kMessagesForWebClient] =
SoftwareFeatureState::kSupported;
software_features[SoftwareFeature::kInstantTetheringClient] =
base::FeatureList::IsEnabled(features::kInstantTethering)
? SoftwareFeatureState::kSupported
: SoftwareFeatureState::kNotSupported;
software_features[SoftwareFeature::kPhoneHubClient] =
features::IsPhoneHubEnabled() ? SoftwareFeatureState::kSupported
: SoftwareFeatureState::kNotSupported;
software_features[SoftwareFeature::kWifiSyncClient] =
features::IsWifiSyncAndroidEnabled()
? SoftwareFeatureState::kSupported
: SoftwareFeatureState::kNotSupported;
software_features[SoftwareFeature::kEcheClient] =
features::IsEcheSWAEnabled() ? SoftwareFeatureState::kSupported
: SoftwareFeatureState::kNotSupported;
software_features[SoftwareFeature::kPhoneHubCameraRollClient] =
features::IsPhoneHubCameraRollEnabled()
? SoftwareFeatureState::kSupported
: SoftwareFeatureState::kNotSupported;
std::vector<BeaconSeed> beacon_seeds = {multidevice::BeaconSeed(
kBeaconSeedData,
base::Time::FromMillisecondsSinceUnixEpoch(kBeaconSeedStartTimeMillis),
base::Time::FromMillisecondsSinceUnixEpoch(kBeaconSeedEndTimeMillis))};
return RemoteDevice(kStubDeviceUserId, kStubClientComputerInstanceId,
kStubClientComputerName, kStubDevicePiiFreeName,
kStubClientComputerPublicKey, kStubDevicePSK,
kStubDeviceLastUpdateTimeMillis, software_features,
beacon_seeds, kStubDeviceBluetoothPublicAddress);
}());
return *client_computer;
}
bool ShouldUseMultideviceStubs() {
// Should use multidevice stubs if running on Linux CrOS build which doesn't
// support making authenticated network requests to the back-end.
return !base::SysInfo::IsRunningOnChromeOS();
}
} // namespace ash::multidevice