diff options
author | mnissler@chromium.org <mnissler@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-14 22:19:53 +0000 |
---|---|---|
committer | mnissler@chromium.org <mnissler@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-14 22:19:53 +0000 |
commit | 4ed69832c6178bfd8f07a77035ea0a9223276695 (patch) | |
tree | c0e34bba1e3d6daa610fa8c6f86d91748249a9dc | |
parent | 6946935636644de2829152214cb2fb513e7cddb1 (diff) | |
download | chromium_src-4ed69832c6178bfd8f07a77035ea0a9223276695.zip chromium_src-4ed69832c6178bfd8f07a77035ea0a9223276695.tar.gz chromium_src-4ed69832c6178bfd8f07a77035ea0a9223276695.tar.bz2 |
Fix ONC value substitution.
BUG=chromium-os:23751
TEST=unit test
Review URL: http://codereview.chromium.org/9234032
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121954 0039d316-1c4b-4281-b951-d872f2087c98
12 files changed, 125 insertions, 66 deletions
diff --git a/chrome/browser/automation/testing_automation_provider_chromeos.cc b/chrome/browser/automation/testing_automation_provider_chromeos.cc index 6dd58a1..2fc05ae 100644 --- a/chrome/browser/automation/testing_automation_provider_chromeos.cc +++ b/chrome/browser/automation/testing_automation_provider_chromeos.cc @@ -867,7 +867,7 @@ void TestingAutomationProvider::GetPrivateNetworkInfo( item->SetString("key", virt->psk_passphrase()); item->SetString("cert_nss", virt->ca_cert_nss()); item->SetString("cert_id", virt->client_cert_id()); - item->SetString("username", virt->GetUserName()); + item->SetString("username", virt->username()); item->SetString("password", virt->user_passphrase()); return_value->Set(virt->service_path(), item); } diff --git a/chrome/browser/chromeos/cros/network_library.cc b/chrome/browser/chromeos/cros/network_library.cc index eafbed7..03aca4c 100644 --- a/chrome/browser/chromeos/cros/network_library.cc +++ b/chrome/browser/chromeos/cros/network_library.cc @@ -37,7 +37,6 @@ #include "chrome/browser/chromeos/cros/onc_constants.h" #include "chrome/browser/chromeos/cros/onc_network_parser.h" #include "chrome/browser/chromeos/cros_settings.h" -#include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/network_login_observer.h" #include "chrome/browser/net/browser_url_util.h" #include "chrome/common/time_format.h" @@ -433,26 +432,6 @@ Network::~Network() { } } -// static. -std::string Network::GetUserExpandedValue(const std::string& value) { - // If running unit test, just return the original value. - if (!BrowserThread::IsMessageLoopValid(BrowserThread::UI)) - return value; - - if (!UserManager::Get()->user_is_logged_in()) - return value; - - std::string temp_value; - std::string final_value; - ReplaceChars(value, onc::substitutes::kLoginIDField, - UserManager::Get()->logged_in_user().GetAccountName(), - &temp_value); - ReplaceChars(temp_value, onc::substitutes::kEmailField, - UserManager::Get()->logged_in_user().email(), - &final_value); - return final_value; -} - void Network::SetNetworkParser(NetworkParser* parser) { network_parser_.reset(parser); } @@ -748,10 +727,6 @@ VirtualNetwork::VirtualNetwork(const std::string& service_path) VirtualNetwork::~VirtualNetwork() {} -std::string VirtualNetwork::GetUserName() const { - return GetUserExpandedValue(username_); -} - void VirtualNetwork::EraseCredentials() { WipeString(&ca_cert_nss_); WipeString(&psk_passphrase_); @@ -772,7 +747,7 @@ void VirtualNetwork::CopyCredentialsFromRemembered(Network* remembered) { DCHECK_EQ(remembered->type(), TYPE_VPN); VirtualNetwork* remembered_vpn = static_cast<VirtualNetwork*>(remembered); VLOG(1) << "Copy VPN credentials: " << name() - << " username: " << remembered_vpn->GetUserName(); + << " username: " << remembered_vpn->username(); if (ca_cert_nss_.empty()) ca_cert_nss_ = remembered_vpn->ca_cert_nss(); if (psk_passphrase_.empty()) @@ -780,7 +755,7 @@ void VirtualNetwork::CopyCredentialsFromRemembered(Network* remembered) { if (client_cert_id_.empty()) client_cert_id_ = remembered_vpn->client_cert_id(); if (username_.empty()) - username_ = remembered_vpn->GetUserName(); + username_ = remembered_vpn->username(); if (user_passphrase_.empty()) user_passphrase_ = remembered_vpn->user_passphrase(); } @@ -1323,15 +1298,6 @@ WifiNetwork::WifiNetwork(const std::string& service_path) WifiNetwork::~WifiNetwork() {} -std::string WifiNetwork::GetEapIdentity() const { - return GetUserExpandedValue(eap_identity_); -} - -std::string WifiNetwork::GetEapAnonymousIdentity() const { - return GetUserExpandedValue(eap_anonymous_identity_); -} - - void WifiNetwork::CalculateUniqueId() { ConnectionSecurity encryption = encryption_; // Flimflam treats wpa and rsn as psk internally, so convert those types diff --git a/chrome/browser/chromeos/cros/network_library.h b/chrome/browser/chromeos/cros/network_library.h index 1132100..54d3192 100644 --- a/chrome/browser/chromeos/cros/network_library.h +++ b/chrome/browser/chromeos/cros/network_library.h @@ -761,9 +761,6 @@ class Network { Network(const std::string& service_path, ConnectionType type); - // Expands |value| with user account specific paramaters. - static std::string GetUserExpandedValue(const std::string& value); - NetworkParser* network_parser() { return network_parser_.get(); } void SetNetworkParser(NetworkParser* parser); @@ -815,6 +812,8 @@ class Network { // This allows the implementation classes access to privates. NETWORK_LIBRARY_IMPL_FRIENDS; + FRIEND_TEST_ALL_PREFIXES(NetworkLibraryTest, GetUserExpandedValue); + // Use these functions at your peril. They are used by the various // parsers to set state, and really shouldn't be used by anything else // because they don't do the error checking and sending to the @@ -925,9 +924,9 @@ class VirtualNetwork : public Network { const std::string& ca_cert_nss() const { return ca_cert_nss_; } const std::string& psk_passphrase() const { return psk_passphrase_; } const std::string& client_cert_id() const { return client_cert_id_; } + const std::string& username() const { return username_; } const std::string& user_passphrase() const { return user_passphrase_; } const std::string& group_name() const { return group_name_; } - std::string GetUserName() const; // Sets the well-known PKCS#11 slot and PIN for accessing certificates. void SetCertificateSlotAndPin( @@ -1241,8 +1240,10 @@ class WifiNetwork : public WirelessNetwork { const std::string& eap_client_cert_pkcs11_id() const { return eap_client_cert_pkcs11_id_; } const bool eap_use_system_cas() const { return eap_use_system_cas_; } - std::string GetEapIdentity() const; - std::string GetEapAnonymousIdentity() const; + const std::string& eap_identity() const { return eap_identity_; } + const std::string& eap_anonymous_identity() const { + return eap_anonymous_identity_; + } const std::string& eap_passphrase() const { return eap_passphrase_; } const std::string& GetPassphrase() const; diff --git a/chrome/browser/chromeos/cros/network_library_unittest.cc b/chrome/browser/chromeos/cros/network_library_unittest.cc index d0aa9c8..55cf83f 100644 --- a/chrome/browser/chromeos/cros/network_library_unittest.cc +++ b/chrome/browser/chromeos/cros/network_library_unittest.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. +#include "base/at_exit.h" #include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/browser/chromeos/cros/network_library.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/chrome/browser/chromeos/cros/onc_network_parser.cc b/chrome/browser/chromeos/cros/onc_network_parser.cc index 0f1226d..140b592 100644 --- a/chrome/browser/chromeos/cros/onc_network_parser.cc +++ b/chrome/browser/chromeos/cros/onc_network_parser.cc @@ -9,6 +9,7 @@ #include "base/base64.h" #include "base/json/json_value_serializer.h" +#include "chrome/browser/chromeos/login/user_manager.h" #include "base/json/json_writer.h" // for debug output only. #include "base/stringprintf.h" #include "base/values.h" @@ -19,6 +20,7 @@ #include "chrome/browser/chromeos/proxy_config_service_impl.h" #include "chrome/browser/prefs/proxy_config_dictionary.h" #include "chrome/common/net/x509_certificate_model.h" +#include "content/public/browser/browser_thread.h" #include "crypto/encryptor.h" #include "crypto/hmac.h" #include "crypto/scoped_nss_types.h" @@ -601,6 +603,36 @@ bool OncNetworkParser::ParseNestedObject(Network* network, return !any_errors; } +// static +std::string OncNetworkParser::GetUserExpandedValue( + const base::Value& value, + NetworkUIData::ONCSource source) { + std::string string_value; + if (!value.GetAsString(&string_value)) + return string_value; + + // If running unit test, just return the original value. + if (!content::BrowserThread::IsMessageLoopValid(content::BrowserThread::UI)) + return string_value; + + if (source != NetworkUIData::ONC_SOURCE_USER_POLICY && + source != NetworkUIData::ONC_SOURCE_USER_IMPORT) { + return string_value; + } + + if (!UserManager::Get()->user_is_logged_in()) + return string_value; + + const User& logged_in_user(UserManager::Get()->logged_in_user()); + ReplaceSubstringsAfterOffset(&string_value, 0, + onc::substitutes::kLoginIDField, + logged_in_user.GetAccountName()); + ReplaceSubstringsAfterOffset(&string_value, 0, + onc::substitutes::kEmailField, + logged_in_user.email()); + return string_value; +} + Network* OncNetworkParser::CreateNewNetwork( ConnectionType type, const std::string& service_path) { Network* network = NetworkParser::CreateNewNetwork(type, service_path); @@ -1278,7 +1310,7 @@ bool OncWifiNetworkParser::ParseWifiValue(OncNetworkParser* parser, } // static -bool OncWifiNetworkParser::ParseEAPValue(OncNetworkParser*, +bool OncWifiNetworkParser::ParseEAPValue(OncNetworkParser* parser, PropertyIndex index, const base::Value& value, Network* network) { @@ -1286,10 +1318,14 @@ bool OncWifiNetworkParser::ParseEAPValue(OncNetworkParser*, return false; WifiNetwork* wifi_network = static_cast<WifiNetwork*>(network); switch (index) { - case PROPERTY_INDEX_EAP_IDENTITY: - // TODO(crosbug.com/23751): Support string expansion. - wifi_network->set_eap_identity(GetStringValue(value)); + case PROPERTY_INDEX_EAP_IDENTITY: { + const std::string expanded_identity( + GetUserExpandedValue(value, parser->onc_source())); + wifi_network->set_eap_identity(expanded_identity); + const StringValue expanded_identity_value(expanded_identity); + wifi_network->UpdatePropertyMap(index, expanded_identity_value); return true; + } case PROPERTY_INDEX_EAP_METHOD: { EAPMethod eap_method = ParseEAPMethod(GetStringValue(value)); wifi_network->set_eap_method(eap_method); @@ -1311,9 +1347,14 @@ bool OncWifiNetworkParser::ParseEAPValue(OncNetworkParser*, wifi_network->UpdatePropertyMap(index, *val.get()); return true; } - case PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY: - wifi_network->set_eap_anonymous_identity(GetStringValue(value)); + case PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY: { + const std::string expanded_identity( + GetUserExpandedValue(value, parser->onc_source())); + wifi_network->set_eap_anonymous_identity(expanded_identity); + const StringValue expanded_identity_value(expanded_identity); + wifi_network->UpdatePropertyMap(index, expanded_identity_value); return true; + } case PROPERTY_INDEX_EAP_CERT_ID: wifi_network->set_eap_client_cert_pkcs11_id(GetStringValue(value)); return true; @@ -1573,7 +1614,7 @@ ProviderType OncVirtualNetworkParser::GetCanonicalProviderType( } // static -bool OncVirtualNetworkParser::ParseL2TPValue(OncNetworkParser*, +bool OncVirtualNetworkParser::ParseL2TPValue(OncNetworkParser* parser, PropertyIndex index, const base::Value& value, Network* network) { @@ -1584,10 +1625,14 @@ bool OncVirtualNetworkParser::ParseL2TPValue(OncNetworkParser*, case PROPERTY_INDEX_L2TPIPSEC_PASSWORD: virtual_network->set_user_passphrase(GetStringValue(value)); return true; - case PROPERTY_INDEX_L2TPIPSEC_USER: - // TODO(crosbug.com/23751): Support string expansion. - virtual_network->set_username(GetStringValue(value)); + case PROPERTY_INDEX_L2TPIPSEC_USER: { + const std::string expanded_user( + GetUserExpandedValue(value, parser->onc_source())); + virtual_network->set_username(expanded_user); + const StringValue expanded_user_value(expanded_user); + virtual_network->UpdatePropertyMap(index, expanded_user_value); return true; + } case PROPERTY_INDEX_SAVE_CREDENTIALS: // Note that the specification allows different settings for // IPsec credentials (PSK) and L2TP credentials (username and @@ -1602,7 +1647,7 @@ bool OncVirtualNetworkParser::ParseL2TPValue(OncNetworkParser*, } // static -bool OncVirtualNetworkParser::ParseOpenVPNValue(OncNetworkParser*, +bool OncVirtualNetworkParser::ParseOpenVPNValue(OncNetworkParser* parser, PropertyIndex index, const base::Value& value, Network* network) { @@ -1613,10 +1658,14 @@ bool OncVirtualNetworkParser::ParseOpenVPNValue(OncNetworkParser*, case PROPERTY_INDEX_OPEN_VPN_PASSWORD: virtual_network->set_user_passphrase(GetStringValue(value)); return true; - case PROPERTY_INDEX_OPEN_VPN_USER: - // TODO(crosbug.com/23751): Support string expansion. - virtual_network->set_username(GetStringValue(value)); + case PROPERTY_INDEX_OPEN_VPN_USER: { + const std::string expanded_user( + GetUserExpandedValue(value, parser->onc_source())); + virtual_network->set_username(expanded_user); + const StringValue expanded_user_value(expanded_user); + virtual_network->UpdatePropertyMap(index, expanded_user_value); return true; + } case PROPERTY_INDEX_SAVE_CREDENTIALS: virtual_network->set_save_credentials(GetBooleanValue(value)); return true; diff --git a/chrome/browser/chromeos/cros/onc_network_parser.h b/chrome/browser/chromeos/cros/onc_network_parser.h index 754fc0f..faead8e 100644 --- a/chrome/browser/chromeos/cros/onc_network_parser.h +++ b/chrome/browser/chromeos/cros/onc_network_parser.h @@ -90,8 +90,14 @@ class OncNetworkParser : public NetworkParser { OncValueSignature* signature, ParserPointer parser); + // Expands |value| with user account specific paramaters. + static std::string GetUserExpandedValue(const base::Value& value, + NetworkUIData::ONCSource source); + const std::string& parse_error() const { return parse_error_; } + NetworkUIData::ONCSource onc_source() const { return onc_source_; } + protected: OncNetworkParser(); diff --git a/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc b/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc index d24d64a..974e2d1 100644 --- a/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc +++ b/chrome/browser/chromeos/cros/onc_network_parser_unittest.cc @@ -11,6 +11,7 @@ #include "base/file_util.h" #include "base/json/json_value_serializer.h" #include "base/lazy_instance.h" +#include "base/message_loop.h" #include "base/path_service.h" #include "base/threading/thread_restrictions.h" #include "base/stringprintf.h" @@ -18,9 +19,13 @@ #include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/browser/chromeos/cros/network_library.h" #include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" +#include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/system/runtime_environment.h" #include "chrome/browser/net/pref_proxy_config_tracker_impl.h" #include "chrome/common/chrome_paths.h" +#include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_pref_service.h" +#include "content/test/test_browser_thread.h" #include "crypto/nss_util.h" #include "net/base/cert_database.h" #include "net/base/cert_type.h" @@ -299,11 +304,11 @@ TEST_F(OncNetworkParserTest, TestCreateNetworkWifiEAP2) { EXPECT_EQ(wifi->auto_connect(), false); EXPECT_EQ(wifi->eap_method(), EAP_METHOD_LEAP); EXPECT_EQ(wifi->eap_use_system_cas(), true); - EXPECT_EQ(wifi->GetEapIdentity(), "user"); + EXPECT_EQ(wifi->eap_identity(), "user"); CheckStringProperty(wifi, PROPERTY_INDEX_EAP_IDENTITY, "user"); EXPECT_EQ(wifi->eap_passphrase(), "pass"); CheckStringProperty(wifi, PROPERTY_INDEX_EAP_PASSWORD, "pass"); - EXPECT_EQ(wifi->GetEapAnonymousIdentity(), "anon"); + EXPECT_EQ(wifi->eap_anonymous_identity(), "anon"); CheckStringProperty(wifi, PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY, "anon"); } @@ -752,4 +757,35 @@ TEST_F(OncNetworkParserTest, TestProxySettingsManual) { EXPECT_TRUE(expected_bypass_rules.Equals(rules.bypass_rules)); } +TEST(OncNetworkParserUserExpansionTest, GetUserExpandedValue) { + NetworkUIData::ONCSource source = NetworkUIData::ONC_SOURCE_USER_IMPORT; + + // Setup environment needed by UserManager. + MessageLoop loop; + content::TestBrowserThread ui_thread(content::BrowserThread::UI, &loop); + base::ShadowingAtExitManager at_exit_manager; + ScopedTestingLocalState local_state( + static_cast<TestingBrowserProcess*>(g_browser_process)); + + base::StringValue login_id_pattern("a ${LOGIN_ID} b"); + base::StringValue login_email_pattern("a ${LOGIN_EMAIL} b"); + + // No expansion if there is no user logged in. + EXPECT_EQ("a ${LOGIN_ID} b", + chromeos::OncNetworkParser::GetUserExpandedValue( + login_id_pattern, source)); + EXPECT_EQ("a ${LOGIN_EMAIL} b", + chromeos::OncNetworkParser::GetUserExpandedValue( + login_email_pattern, source)); + + // Log in a user and check that the expansions work as expected. + UserManager::Get()->UserLoggedIn("onc@example.com"); + EXPECT_EQ("a onc b", + chromeos::OncNetworkParser::GetUserExpandedValue( + login_id_pattern, source)); + EXPECT_EQ("a onc@example.com b", + chromeos::OncNetworkParser::GetUserExpandedValue( + login_email_pattern, source)); +} + } // namespace chromeos diff --git a/chrome/browser/chromeos/options/vpn_config_view.cc b/chrome/browser/chromeos/options/vpn_config_view.cc index 9ade022..efa457b 100644 --- a/chrome/browser/chromeos/options/vpn_config_view.cc +++ b/chrome/browser/chromeos/options/vpn_config_view.cc @@ -539,8 +539,8 @@ void VPNConfigView::Init(VirtualNetwork* vpn) { username_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT); username_textfield_->SetController(this); username_textfield_->SetEnabled(username_ui_data_.editable()); - if (vpn && !vpn->GetUserName().empty()) - username_textfield_->SetText(UTF8ToUTF16(vpn->GetUserName())); + if (vpn && !vpn->username().empty()) + username_textfield_->SetText(UTF8ToUTF16(vpn->username())); layout->AddView(username_textfield_); layout->AddView(new ControlledSettingIndicatorView(username_ui_data_)); layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); diff --git a/chrome/browser/chromeos/options/wifi_config_view.cc b/chrome/browser/chromeos/options/wifi_config_view.cc index fe1c08d..f6b42f6 100644 --- a/chrome/browser/chromeos/options/wifi_config_view.cc +++ b/chrome/browser/chromeos/options/wifi_config_view.cc @@ -1075,7 +1075,7 @@ void WifiConfigView::Init(WifiNetwork* wifi, bool show_8021x) { } const std::string& eap_anonymous_identity = - (wifi ? wifi->GetEapAnonymousIdentity() : std::string()); + (wifi ? wifi->eap_anonymous_identity() : std::string()); identity_anonymous_textfield_->SetText( UTF8ToUTF16(eap_anonymous_identity)); } @@ -1119,7 +1119,7 @@ void WifiConfigView::Init(WifiNetwork* wifi, bool show_8021x) { // Identity is always active. const std::string& eap_identity = - (wifi ? wifi->GetEapIdentity() : std::string()); + (wifi ? wifi->eap_identity() : std::string()); identity_textfield_->SetText(UTF8ToUTF16(eap_identity)); // Passphrase diff --git a/chrome/browser/ui/webui/about_ui.cc b/chrome/browser/ui/webui/about_ui.cc index d61768e..5d3d530 100644 --- a/chrome/browser/ui/webui/about_ui.cc +++ b/chrome/browser/ui/webui/about_ui.cc @@ -412,7 +412,7 @@ std::string ToHtmlTableRow(const chromeos::Network* network) { str += WrapWithTH(vpn->server_hostname()); str += WrapWithTH(vpn->GetProviderTypeString()); str += WrapWithTD(std::string(vpn->psk_passphrase().length(), '*')); - str += WrapWithTH(vpn->GetUserName()); + str += WrapWithTH(vpn->username()); str += WrapWithTD(std::string(vpn->user_passphrase().length(), '*')); } str += WrapWithTD(network->failed() ? network->GetErrorString() : ""); diff --git a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc index 266bb30a..b566694 100644 --- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc +++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc @@ -1110,7 +1110,7 @@ void InternetOptionsHandler::PopulateVPNDetails( dictionary->SetBoolean("remembered", remembered); dictionary->SetString("server_hostname", vpn->server_hostname()); dictionary->SetString("provider_type", vpn->GetProviderTypeString()); - dictionary->SetString("username", vpn->GetUserName()); + dictionary->SetString("username", vpn->username()); } void InternetOptionsHandler::SetActivationButtonVisibility( diff --git a/chrome/browser/ui/webui/options2/chromeos/internet_options_handler2.cc b/chrome/browser/ui/webui/options2/chromeos/internet_options_handler2.cc index c3fa6a8..d1d21cf 100644 --- a/chrome/browser/ui/webui/options2/chromeos/internet_options_handler2.cc +++ b/chrome/browser/ui/webui/options2/chromeos/internet_options_handler2.cc @@ -1112,7 +1112,7 @@ void InternetOptionsHandler::PopulateVPNDetails( dictionary->SetBoolean("remembered", remembered); dictionary->SetString("server_hostname", vpn->server_hostname()); dictionary->SetString("provider_type", vpn->GetProviderTypeString()); - dictionary->SetString("username", vpn->GetUserName()); + dictionary->SetString("username", vpn->username()); } void InternetOptionsHandler::SetActivationButtonVisibility( |