shill: Add passphrase validation

Validate passphrase when set via Service.SetProperty D-Bus API.

BUG=chromium-os:21195
TEST=Unit tests, WiFiManager/021CheckWPA_BadPassphraseLength,
WiFiManager/035CheckWEPKeySyntax

Change-Id: I5f8b92314e2fc341bc6b0f6c5f03ce2523d6e63c
Reviewed-on: https://gerrit.chromium.org/gerrit/11677
Commit-Ready: Thieu Le <thieule@chromium.org>
Reviewed-by: Thieu Le <thieule@chromium.org>
Tested-by: Thieu Le <thieule@chromium.org>
diff --git a/wifi_service_unittest.cc b/wifi_service_unittest.cc
index 4d618bd..25803a0 100644
--- a/wifi_service_unittest.cc
+++ b/wifi_service_unittest.cc
@@ -167,6 +167,45 @@
     EXPECT_NE(it.Key(), flimflam::kPassphraseProperty);
 }
 
+// Make sure setting the passphrase via D-Bus Service.SetProperty validates
+// the passphrase.
+TEST_F(WiFiServiceTest, PassphraseSetPropertyValidation) {
+  // We only spot check two password cases here to make sure the
+  // SetProperty code path does validation.  We're not going to exhaustively
+  // test for all types of passwords.
+  vector<uint8_t> ssid(5);
+  WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
+                                                   dispatcher(),
+                                                   manager(),
+                                                   wifi(),
+                                                   ssid,
+                                                   flimflam::kModeManaged,
+                                                   flimflam::kSecurityWep,
+                                                   false);
+  Error error;
+  EXPECT_TRUE(wifi_service->mutable_store()->SetStringProperty(
+                  flimflam::kPassphraseProperty, "0:abcde", &error));
+  EXPECT_FALSE(wifi_service->mutable_store()->SetStringProperty(
+                   flimflam::kPassphraseProperty, "invalid", &error));
+  EXPECT_EQ(Error::kInvalidPassphrase, error.type());
+}
+
+TEST_F(WiFiServiceTest, PassphraseSetPropertyOpenNetwork) {
+  vector<uint8_t> ssid(5);
+  WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
+                                                   dispatcher(),
+                                                   manager(),
+                                                   wifi(),
+                                                   ssid,
+                                                   flimflam::kModeManaged,
+                                                   flimflam::kSecurityNone,
+                                                   false);
+  Error error;
+  EXPECT_FALSE(wifi_service->mutable_store()->SetStringProperty(
+                   flimflam::kPassphraseProperty, "invalid", &error));
+  EXPECT_EQ(Error::kNotSupported, error.type());
+}
+
 TEST_F(WiFiServiceTest, NonUTF8SSID) {
   vector<uint8_t> ssid;