| Index: chromeos/network/client_cert_resolver_unittest.cc
|
| diff --git a/chromeos/network/client_cert_resolver_unittest.cc b/chromeos/network/client_cert_resolver_unittest.cc
|
| index 98123a3671fd562d6bd0e705f31eea0f9ae402b1..2f8002dcbdb1259deb8e78b153953024f6a52c2b 100644
|
| --- a/chromeos/network/client_cert_resolver_unittest.cc
|
| +++ b/chromeos/network/client_cert_resolver_unittest.cc
|
| @@ -108,10 +108,10 @@ class ClientCertResolverTest : public testing::Test,
|
| // Imports a client certificate. Its PKCS#11 ID is stored in |test_cert_id_|.
|
| // If |import_issuer| is true, also imports the CA cert (stored as PEM in
|
| // test_ca_cert_pem_) that issued the client certificate.
|
| - void SetupTestCerts(bool import_issuer) {
|
| + void SetupTestCerts(const std::string& prefix, bool import_issuer) {
|
| // Load a CA cert.
|
| net::CertificateList ca_cert_list = net::CreateCertificateListFromFile(
|
| - net::GetTestCertsDirectory(), "client_1_ca.pem",
|
| + net::GetTestCertsDirectory(), prefix + "_ca.pem",
|
| net::X509Certificate::FORMAT_AUTO);
|
| ASSERT_TRUE(!ca_cert_list.empty());
|
| net::X509Certificate::GetPEMEncoded(ca_cert_list[0]->os_cert_handle(),
|
| @@ -127,11 +127,9 @@ class ClientCertResolverTest : public testing::Test,
|
| }
|
|
|
| // Import a client cert signed by that CA.
|
| - test_client_cert_ =
|
| - net::ImportClientCertAndKeyFromFile(net::GetTestCertsDirectory(),
|
| - "client_1.pem",
|
| - "client_1.pk8",
|
| - test_nssdb_.slot());
|
| + test_client_cert_ = net::ImportClientCertAndKeyFromFile(
|
| + net::GetTestCertsDirectory(), prefix + ".pem", prefix + ".pk8",
|
| + test_nssdb_.slot());
|
| ASSERT_TRUE(test_client_cert_.get());
|
| }
|
|
|
| @@ -220,7 +218,7 @@ class ClientCertResolverTest : public testing::Test,
|
| // Sets up a policy with a certificate pattern that matches any client cert
|
| // that is signed by the test CA cert (stored in |test_ca_cert_pem_|). In
|
| // particular it will match the test client cert.
|
| - void SetupPolicyMatchingIssuerPEM() {
|
| + void SetupPolicyMatchingIssuerPEM(const std::string& identity) {
|
| const char* kTestPolicyTemplate =
|
| "[ { \"GUID\": \"wifi_stub\","
|
| " \"Name\": \"wifi_stub\","
|
| @@ -229,6 +227,7 @@ class ClientCertResolverTest : public testing::Test,
|
| " \"Security\": \"WPA-EAP\","
|
| " \"SSID\": \"wifi_ssid\","
|
| " \"EAP\": {"
|
| + " \"Identity\": \"%s\","
|
| " \"Outer\": \"EAP-TLS\","
|
| " \"ClientCertType\": \"Pattern\","
|
| " \"ClientCertPattern\": {"
|
| @@ -237,8 +236,8 @@ class ClientCertResolverTest : public testing::Test,
|
| " }"
|
| " }"
|
| "} ]";
|
| - std::string policy_json =
|
| - base::StringPrintf(kTestPolicyTemplate, test_ca_cert_pem_.c_str());
|
| + std::string policy_json = base::StringPrintf(
|
| + kTestPolicyTemplate, identity.c_str(), test_ca_cert_pem_.c_str());
|
|
|
| std::string error;
|
| scoped_ptr<base::Value> policy_value = base::JSONReader::ReadAndReturnError(
|
| @@ -260,14 +259,14 @@ class ClientCertResolverTest : public testing::Test,
|
| kWifiStub, shill::kStateProperty, base::StringValue(state)));
|
| }
|
|
|
| - void GetClientCertProperties(std::string* pkcs11_id) {
|
| - pkcs11_id->clear();
|
| + void GetServiceProperty(const std::string& prop_name,
|
| + std::string* prop_value) {
|
| + prop_value->clear();
|
| const base::DictionaryValue* properties =
|
| service_test_->GetServiceProperties(kWifiStub);
|
| if (!properties)
|
| return;
|
| - properties->GetStringWithoutPathExpansion(shill::kEapCertIdProperty,
|
| - pkcs11_id);
|
| + properties->GetStringWithoutPathExpansion(prop_name, prop_value);
|
| }
|
|
|
| int network_properties_changed_count_;
|
| @@ -299,25 +298,25 @@ class ClientCertResolverTest : public testing::Test,
|
| };
|
|
|
| TEST_F(ClientCertResolverTest, NoMatchingCertificates) {
|
| - SetupTestCerts(false /* do not import the issuer */);
|
| + SetupTestCerts("client_1", false /* do not import the issuer */);
|
| StartCertLoader();
|
| SetupWifi();
|
| base::RunLoop().RunUntilIdle();
|
| network_properties_changed_count_ = 0;
|
| SetupNetworkHandlers();
|
| - SetupPolicyMatchingIssuerPEM();
|
| + SetupPolicyMatchingIssuerPEM("");
|
| base::RunLoop().RunUntilIdle();
|
|
|
| // Verify that no client certificate was configured.
|
| std::string pkcs11_id;
|
| - GetClientCertProperties(&pkcs11_id);
|
| + GetServiceProperty(shill::kEapCertIdProperty, &pkcs11_id);
|
| EXPECT_EQ(std::string(), pkcs11_id);
|
| EXPECT_EQ(1, network_properties_changed_count_);
|
| EXPECT_FALSE(client_cert_resolver_->IsAnyResolveTaskRunning());
|
| }
|
|
|
| TEST_F(ClientCertResolverTest, MatchIssuerCNWithoutIssuerInstalled) {
|
| - SetupTestCerts(false /* do not import the issuer */);
|
| + SetupTestCerts("client_1", false /* do not import the issuer */);
|
| SetupWifi();
|
| base::RunLoop().RunUntilIdle();
|
|
|
| @@ -332,18 +331,18 @@ TEST_F(ClientCertResolverTest, MatchIssuerCNWithoutIssuerInstalled) {
|
| // Verify that the resolver positively matched the pattern in the policy with
|
| // the test client cert and configured the network.
|
| std::string pkcs11_id;
|
| - GetClientCertProperties(&pkcs11_id);
|
| + GetServiceProperty(shill::kEapCertIdProperty, &pkcs11_id);
|
| EXPECT_EQ(test_cert_id_, pkcs11_id);
|
| EXPECT_EQ(1, network_properties_changed_count_);
|
| }
|
|
|
| TEST_F(ClientCertResolverTest, ResolveOnCertificatesLoaded) {
|
| - SetupTestCerts(true /* import issuer */);
|
| + SetupTestCerts("client_1", true /* import issuer */);
|
| SetupWifi();
|
| base::RunLoop().RunUntilIdle();
|
|
|
| SetupNetworkHandlers();
|
| - SetupPolicyMatchingIssuerPEM();
|
| + SetupPolicyMatchingIssuerPEM("");
|
| base::RunLoop().RunUntilIdle();
|
|
|
| network_properties_changed_count_ = 0;
|
| @@ -353,13 +352,13 @@ TEST_F(ClientCertResolverTest, ResolveOnCertificatesLoaded) {
|
| // Verify that the resolver positively matched the pattern in the policy with
|
| // the test client cert and configured the network.
|
| std::string pkcs11_id;
|
| - GetClientCertProperties(&pkcs11_id);
|
| + GetServiceProperty(shill::kEapCertIdProperty, &pkcs11_id);
|
| EXPECT_EQ(test_cert_id_, pkcs11_id);
|
| EXPECT_EQ(1, network_properties_changed_count_);
|
| }
|
|
|
| TEST_F(ClientCertResolverTest, ResolveAfterPolicyApplication) {
|
| - SetupTestCerts(true /* import issuer */);
|
| + SetupTestCerts("client_1", true /* import issuer */);
|
| SetupWifi();
|
| base::RunLoop().RunUntilIdle();
|
| StartCertLoader();
|
| @@ -368,24 +367,24 @@ TEST_F(ClientCertResolverTest, ResolveAfterPolicyApplication) {
|
|
|
| // Policy application will trigger the ClientCertResolver.
|
| network_properties_changed_count_ = 0;
|
| - SetupPolicyMatchingIssuerPEM();
|
| + SetupPolicyMatchingIssuerPEM("");
|
| base::RunLoop().RunUntilIdle();
|
|
|
| // Verify that the resolver positively matched the pattern in the policy with
|
| // the test client cert and configured the network.
|
| std::string pkcs11_id;
|
| - GetClientCertProperties(&pkcs11_id);
|
| + GetServiceProperty(shill::kEapCertIdProperty, &pkcs11_id);
|
| EXPECT_EQ(test_cert_id_, pkcs11_id);
|
| EXPECT_EQ(1, network_properties_changed_count_);
|
| }
|
|
|
| TEST_F(ClientCertResolverTest, ExpiringCertificate) {
|
| - SetupTestCerts(true /* import issuer */);
|
| + SetupTestCerts("client_1", true /* import issuer */);
|
| SetupWifi();
|
| base::RunLoop().RunUntilIdle();
|
|
|
| SetupNetworkHandlers();
|
| - SetupPolicyMatchingIssuerPEM();
|
| + SetupPolicyMatchingIssuerPEM("");
|
| base::RunLoop().RunUntilIdle();
|
|
|
| StartCertLoader();
|
| @@ -397,7 +396,7 @@ TEST_F(ClientCertResolverTest, ExpiringCertificate) {
|
| // Verify that the resolver positively matched the pattern in the policy with
|
| // the test client cert and configured the network.
|
| std::string pkcs11_id;
|
| - GetClientCertProperties(&pkcs11_id);
|
| + GetServiceProperty(shill::kEapCertIdProperty, &pkcs11_id);
|
| EXPECT_EQ(test_cert_id_, pkcs11_id);
|
|
|
| // Verify that, after the certificate expired and the network disconnection
|
| @@ -405,8 +404,39 @@ TEST_F(ClientCertResolverTest, ExpiringCertificate) {
|
| test_clock_->SetNow(base::Time::Max());
|
| SetWifiState(shill::kStateOffline);
|
| base::RunLoop().RunUntilIdle();
|
| - GetClientCertProperties(&pkcs11_id);
|
| + GetServiceProperty(shill::kEapCertIdProperty, &pkcs11_id);
|
| EXPECT_EQ(std::string(), pkcs11_id);
|
| }
|
|
|
| +TEST_F(ClientCertResolverTest, PopulateIdentityFromCert) {
|
| + SetupTestCerts("client_3", true /* import issuer */);
|
| + SetupWifi();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + SetupNetworkHandlers();
|
| + SetupPolicyMatchingIssuerPEM("${CERT_SAN_EMAIL}");
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + network_properties_changed_count_ = 0;
|
| + StartCertLoader();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Verify that the resolver read the subjectAltName email field from the
|
| + // cert, and wrote it into the shill service entry.
|
| + std::string identity;
|
| + GetServiceProperty(shill::kEapIdentityProperty, &identity);
|
| + EXPECT_EQ("santest@example.com", identity);
|
| + EXPECT_EQ(1, network_properties_changed_count_);
|
| +
|
| + // Verify that after changing the ONC policy to request a variant of the
|
| + // Microsoft Universal Principal Name field instead, the correct value is
|
| + // substituted into the shill service entry.
|
| + SetupPolicyMatchingIssuerPEM("upn-${CERT_SAN_UPN}-suffix");
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + GetServiceProperty(shill::kEapIdentityProperty, &identity);
|
| + EXPECT_EQ("upn-santest@ad.corp.example.com-suffix", identity);
|
| + EXPECT_EQ(2, network_properties_changed_count_);
|
| +}
|
| +
|
| } // namespace chromeos
|
|
|