blob: 742552c01c8637e6c58533e021b9c8ccd46e86d6 [file]
// Copyright 2022 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/services/network_config/test_apn_data.h"
#include <optional>
#include "ash/constants/ash_features.h"
#include "chromeos/ash/components/network/policy_util.h"
#include "components/onc/onc_constants.h"
#include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
namespace ash::network_config {
namespace {
namespace mojom = ::chromeos::network_config::mojom;
// TODO(b/162365553) Remove when shill constants are added.
constexpr char kShillApnId[] = "id";
constexpr char kShillApnAuthenticationType[] = "authentication_type";
bool IsPropertyEquals(const base::DictValue& apn,
const char* key,
const std::string& expected_value) {
const std::string* actual_value = apn.FindString(key);
if (!actual_value)
return false;
return expected_value == *actual_value;
}
} // namespace
TestApnData::TestApnData()
: mojo_state(mojom::ApnState::kEnabled),
onc_state(::onc::cellular_apn::kStateEnabled),
mojo_authentication(mojom::ApnAuthenticationType::kAutomatic),
onc_authentication(::onc::cellular_apn::kAuthenticationAutomatic),
mojo_ip_type(mojom::ApnIpType::kAutomatic),
onc_ip_type(::onc::cellular_apn::kIpTypeAutomatic),
mojo_source(mojom::ApnSource::kUi),
onc_source(::onc::cellular_apn::kSourceUi) {}
TestApnData::TestApnData(std::string access_point_name,
std::string name,
std::string username,
std::string password,
std::string attach,
std::string id,
mojom::ApnState mojo_state,
std::string onc_state,
mojom::ApnAuthenticationType mojo_authentication,
std::string onc_authentication,
mojom::ApnIpType mojo_ip_type,
std::string onc_ip_type,
mojom::ApnSource mojo_source,
std::string onc_source,
const std::vector<mojom::ApnType>& mojo_apn_types,
const std::vector<std::string>& onc_apn_types)
: access_point_name(access_point_name),
name(name),
username(username),
password(password),
attach(attach),
id(id),
mojo_state(mojo_state),
onc_state(onc_state),
mojo_authentication(mojo_authentication),
onc_authentication(onc_authentication),
mojo_ip_type(mojo_ip_type),
onc_ip_type(onc_ip_type),
mojo_source(mojo_source),
onc_source(onc_source),
mojo_apn_types(mojo_apn_types),
onc_apn_types(onc_apn_types) {}
TestApnData::~TestApnData() = default;
mojom::ApnPropertiesPtr TestApnData::AsMojoApn() const {
auto apn = mojom::ApnProperties::New();
apn->access_point_name = access_point_name;
apn->name = name;
apn->username = username;
apn->password = password;
apn->attach = attach;
apn->authentication = mojo_authentication;
if (features::IsApnRevampEnabled()) {
apn->id = id.empty() ? std::nullopt : std::optional<std::string>(id);
apn->ip_type = mojo_ip_type;
apn->apn_types = mojo_apn_types;
apn->state = mojo_state;
apn->source = mojo_source;
}
return apn;
}
base::DictValue TestApnData::AsOncApn() const {
base::DictValue apn;
apn.Set(::onc::cellular_apn::kAccessPointName, access_point_name);
apn.Set(::onc::cellular_apn::kName, name);
apn.Set(::onc::cellular_apn::kUsername, username);
apn.Set(::onc::cellular_apn::kPassword, password);
apn.Set(::onc::cellular_apn::kAttach, attach);
apn.Set(::onc::cellular_apn::kAuthentication, onc_authentication);
if (features::IsApnRevampEnabled()) {
apn.Set(::onc::cellular_apn::kId, id);
apn.Set(::onc::cellular_apn::kState, onc_state);
apn.Set(::onc::cellular_apn::kIpType, onc_ip_type);
apn.Set(::onc::cellular_apn::kSource, onc_source);
base::ListValue apn_types;
for (const std::string& apn_type : onc_apn_types)
apn_types.Append(apn_type);
apn.Set(::onc::cellular_apn::kApnTypes, std::move(apn_types));
}
return apn;
}
base::DictValue TestApnData::AsShillApn() const {
base::DictValue apn;
apn.Set(shill::kApnProperty, access_point_name);
apn.Set(shill::kApnNameProperty, name);
apn.Set(shill::kApnUsernameProperty, username);
apn.Set(shill::kApnPasswordProperty, password);
apn.Set(shill::kApnAttachProperty, attach);
apn.Set(shill::kApnSourceProperty, onc_source);
apn.Set(kShillApnAuthenticationType, onc_authentication);
if (features::IsApnRevampEnabled()) {
apn.Set(kShillApnId, id);
std::string shill_ip_type;
if (onc_ip_type == ::onc::cellular_apn::kIpTypeIpv4) {
shill_ip_type = shill::kApnIpTypeV4;
} else if (onc_ip_type == ::onc::cellular_apn::kIpTypeIpv6) {
shill_ip_type = shill::kApnIpTypeV6;
} else if (onc_ip_type == shill::kApnIpTypeV4V6) {
shill_ip_type = shill::kApnIpTypeV4V6;
} else {
NOTREACHED() << "An IP type is required";
}
apn.Set(shill::kApnIpTypeProperty, shill_ip_type);
std::string apn_types;
for (const std::string& apn_type : onc_apn_types) {
if (apn_type == ::onc::cellular_apn::kApnTypeDefault) {
apn_types += shill::kApnTypeDefault;
} else if (apn_type == ::onc::cellular_apn::kApnTypeAttach) {
apn_types += shill::kApnTypeIA;
}
apn_types += ",";
}
// Remove trailing comma.
apn_types.pop_back();
apn.Set(shill::kApnTypesProperty, base::Value(apn_types));
}
return apn;
}
std::string TestApnData::AsApnShillDict() const {
// This will serialize the dictionary into valid JSON
return AsShillApn().DebugString();
}
bool TestApnData::MojoApnEquals(const mojom::ApnProperties& apn) const {
bool ret = access_point_name == apn.access_point_name;
static auto MatchOptionalString =
[](const std::string& expected,
const std::optional<std::string>& actual) -> bool {
if (actual.has_value())
return expected == *actual;
return expected.empty();
};
ret &= MatchOptionalString(name, apn.name);
ret &= MatchOptionalString(username, apn.username);
ret &= MatchOptionalString(password, apn.password);
ret &= MatchOptionalString(attach, apn.attach);
ret &= mojo_authentication == apn.authentication;
if (features::IsApnRevampEnabled()) {
ret &= mojo_ip_type == apn.ip_type;
ret &= mojo_apn_types == apn.apn_types;
ret &= mojo_source == apn.source;
}
return ret;
}
bool TestApnData::OncApnEquals(const base::DictValue& onc_apn,
bool has_state_field,
bool is_password_masked) const {
bool ret = true;
ret &= IsPropertyEquals(onc_apn, ::onc::cellular_apn::kAccessPointName,
access_point_name);
ret &= IsPropertyEquals(onc_apn, ::onc::cellular_apn::kName, name);
ret &= IsPropertyEquals(onc_apn, ::onc::cellular_apn::kUsername, username);
const std::string* onc_password =
onc_apn.FindString(::onc::cellular_apn::kPassword);
if (is_password_masked) {
ret &= policy_util::kFakeCredential == *onc_password;
} else {
ret &= password == *onc_password;
}
ret &= IsPropertyEquals(onc_apn, ::onc::cellular_apn::kAttach, attach);
ret &= IsPropertyEquals(onc_apn, ::onc::cellular_apn::kAuthentication,
onc_authentication);
if (features::IsApnRevampEnabled()) {
const std::string* state = onc_apn.FindString(::onc::cellular_apn::kState);
if (has_state_field) {
ret &= state && onc_state == *state;
} else {
ret &= !state;
}
ret &= IsPropertyEquals(onc_apn, ::onc::cellular_apn::kIpType, onc_ip_type);
const std::string* source =
onc_apn.FindString(::onc::cellular_apn::kSource);
if (source) {
ret &=
IsPropertyEquals(onc_apn, ::onc::cellular_apn::kSource, onc_source);
}
if (const base::ListValue* apn_types =
onc_apn.FindList(::onc::cellular_apn::kApnTypes)) {
if (onc_apn_types.size() != apn_types->size())
return false;
for (size_t i = 0; i < onc_apn_types.size(); i++)
if (onc_apn_types[i] != ((*apn_types)[i]).GetString())
return false;
}
}
return ret;
}
} // namespace ash::network_config