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.cc b/wifi_service.cc
index fdb6964..7c1748c 100644
--- a/wifi_service.cc
+++ b/wifi_service.cc
@@ -20,6 +20,7 @@
 #include "shill/error.h"
 #include "shill/event_dispatcher.h"
 #include "shill/ieee80211.h"
+#include "shill/property_accessor.h"
 #include "shill/store_interface.h"
 #include "shill/wifi.h"
 #include "shill/wifi_endpoint.h"
@@ -50,7 +51,10 @@
       ssid_(ssid) {
   PropertyStore *store = this->mutable_store();
   store->RegisterConstString(flimflam::kModeProperty, &mode_);
-  store->RegisterWriteOnlyString(flimflam::kPassphraseProperty, &passphrase_);
+  HelpRegisterDerivedString(store,
+                            flimflam::kPassphraseProperty,
+                            NULL,
+                            &WiFiService::SetPassphrase);
   store->RegisterBool(flimflam::kPassphraseRequiredProperty, &need_passphrase_);
   store->RegisterConstString(flimflam::kSecurityProperty, &security_);
   store->RegisterConstUint8(flimflam::kSignalStrengthProperty, &strength_);
@@ -208,6 +212,16 @@
 }
 
 // private methods
+void WiFiService::HelpRegisterDerivedString(
+    PropertyStore *store,
+    const std::string &name,
+    std::string(WiFiService::*get)(Error *),
+    void(WiFiService::*set)(const std::string&, Error *)) {
+  store->RegisterDerivedString(
+      name,
+      StringAccessor(new CustomAccessor<WiFiService, string>(this, get, set)));
+}
+
 void WiFiService::ConnectTask() {
   std::map<string, DBus::Variant> params;
   DBus::MessageIter writer;