shill: WiFiProvider: Accept WiFi.HexSSID property

Accept WiFi.HexSSID interchangeably with WiFi.SSID for purposes
of configuring new services or finding existing services.

BUG=chromium:291075
TEST=Unit tests

Change-Id: Ic761a1b8f77b6ee136faa6325ea027857e51fda8
Reviewed-on: https://chromium-review.googlesource.com/172636
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Reviewed-by: Philipp Neubeck <pneubeck@chromium.org>
Tested-by: Philipp Neubeck <pneubeck@chromium.org>
Commit-Queue: Paul Stewart <pstew@chromium.org>
diff --git a/wifi_provider.cc b/wifi_provider.cc
index 2db5d41..f2fd08b 100644
--- a/wifi_provider.cc
+++ b/wifi_provider.cc
@@ -479,21 +479,30 @@
     return false;
   }
 
-  if (!args.ContainsString(kSSIDProperty)) {
+  vector<uint8_t> ssid;
+  if (args.ContainsString(kWifiHexSsid)) {
+    string ssid_hex_string = args.GetString(kWifiHexSsid);
+    if (!base::HexStringToBytes(ssid_hex_string, &ssid)) {
+      Error::PopulateAndLog(error, Error::kInvalidArguments,
+                            "Hex SSID parameter is not valid");
+      return false;
+    }
+  } else if (args.ContainsString(kSSIDProperty)) {
+    string ssid_string = args.GetString(kSSIDProperty);
+    ssid = vector<uint8_t>(ssid_string.begin(), ssid_string.end());
+  } else {
     Error::PopulateAndLog(error, Error::kInvalidArguments,
                           kManagerErrorSSIDRequired);
     return false;
   }
 
-  string ssid = args.GetString(kSSIDProperty);
-
-  if (ssid.length() < 1) {
+  if (ssid.size() < 1) {
     Error::PopulateAndLog(error, Error::kInvalidNetworkName,
                           kManagerErrorSSIDTooShort);
     return false;
   }
 
-  if (ssid.length() > IEEE_80211::kMaxSSIDLen) {
+  if (ssid.size() > IEEE_80211::kMaxSSIDLen) {
     Error::PopulateAndLog(error, Error::kInvalidNetworkName,
                           kManagerErrorSSIDTooLong);
     return false;
@@ -508,7 +517,7 @@
     return false;
   }
 
-  *ssid_bytes = vector<uint8_t>(ssid.begin(), ssid.end());
+  *ssid_bytes = ssid;
   *mode = mode_test;
   *security_method = security_method_test;
 
diff --git a/wifi_provider_unittest.cc b/wifi_provider_unittest.cc
index 1ea0717..b78d6ba 100644
--- a/wifi_provider_unittest.cc
+++ b/wifi_provider_unittest.cc
@@ -198,6 +198,8 @@
                             KeyValueStore *args) {
     args->SetString(kTypeProperty, kTypeWifi);
     if (ssid) {
+      // TODO(pstew): When Chrome switches to using kWifiHexSsid primarily for
+      // GetService and friends, we should switch to doing so here ourselves.
       args->SetString(kSSIDProperty, ssid);
     }
     if (mode) {
@@ -697,6 +699,35 @@
   EXPECT_EQ(2, GetServices().size());
 }
 
+TEST_F(WiFiProviderTest, GetServiceByHexSsid) {
+  EXPECT_CALL(manager_, RegisterService(_)).Times(1);
+  const string kSSID("bar");
+  const string kHexSsid(base::HexEncode(kSSID.c_str(), kSSID.length()));
+
+  KeyValueStore args;
+  args.SetString(kTypeProperty, kTypeWifi);
+  args.SetString(kWifiHexSsid, kHexSsid);
+  args.SetString(kSecurityProperty, kSecurityPsk);
+  args.SetBool(kWifiHiddenSsid, false);
+
+  Error error;
+  WiFiServiceRefPtr service = GetWiFiService(args, &error);
+  Mock::VerifyAndClearExpectations(&manager_);
+  EXPECT_TRUE(error.IsSuccess());
+  const string service_ssid(service->ssid().begin(), service->ssid().end());
+  EXPECT_EQ(kSSID, service_ssid);
+  EXPECT_EQ(kModeManaged, service->mode());
+  EXPECT_TRUE(service->IsSecurityMatch(kSecurityPsk));
+  EXPECT_FALSE(service->hidden_ssid());
+
+
+  // While here, make sure FindSimilarService also supports kWifiHexSsid.
+  Error find_error;
+  ServiceRefPtr find_service = provider_.FindSimilarService(args, &find_error);
+  EXPECT_TRUE(find_error.IsSuccess());
+  EXPECT_EQ(service.get(), find_service.get());
+}
+
 TEST_F(WiFiProviderTest, FindSimilarService) {
   // Since CreateTemporyService uses exactly the same validation as
   // GetService, don't bother with testing invalid parameters.
diff --git a/wifi_service.cc b/wifi_service.cc
index be00c61..6723e59 100644
--- a/wifi_service.cc
+++ b/wifi_service.cc
@@ -139,6 +139,7 @@
   IgnoreParameterForConfigure(kModeProperty);
   IgnoreParameterForConfigure(kSSIDProperty);
   IgnoreParameterForConfigure(kSecurityProperty);
+  IgnoreParameterForConfigure(kWifiHexSsid);
 
   InitializeCustomMetrics();
 
diff --git a/wifi_service_unittest.cc b/wifi_service_unittest.cc
index deb3b99..558215d 100644
--- a/wifi_service_unittest.cc
+++ b/wifi_service_unittest.cc
@@ -1056,6 +1056,7 @@
   args.SetString(kTypeProperty, kTypeWifi);
   args.SetString(kSSIDProperty, simple_ssid_string());
   args.SetString(kSecurityProperty, kSecurityNone);
+  args.SetString(kWifiHexSsid, "This is ignored even if it is invalid hex.");
   const string kGUID = "aguid";
   args.SetString(kGuidProperty, kGUID);