shill: Manager: Add ProhibitedTechnologies property

Add a Manager property for the list of technologies that should
be prohibited from enablement through D-Bus APIs.  New devices
that appear will similarly start in the disabled state and cannot
be enabled.  Removing a technology from the prohibited list does
not re-enable any devices that were previously disabled.

CQ-DEPEND=CL:231738
BUG=chromium:436336
TEST=Unit tests
Also manual:
  dbus-send --system --print-reply --fixed \
       --dest=org.chromium.flimflam / \
       org.chromium.flimflam.Manager.SetProperty \
       string:ProhibitedTechnologies \
       variant:string:wifi

At this point, WiFi is disconnected and disabled, and cannot
be re-enabled via the UI.  Changing "wifi" to "wimax" above
causes it to be possible to enable WiFi in the UI again.

Change-Id: I2e95cb5e95913739ccd54457bec778951af4dae6
Reviewed-on: https://chromium-review.googlesource.com/231739
Reviewed-by: Ben Chan <benchan@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
Commit-Queue: Paul Stewart <pstew@chromium.org>
diff --git a/default_profile.cc b/default_profile.cc
index caf9f2f..299fa32 100644
--- a/default_profile.cc
+++ b/default_profile.cc
@@ -36,6 +36,8 @@
 // static
 const char DefaultProfile::kStorageCheckPortalList[] = "CheckPortalList";
 // static
+const char DefaultProfile::kStorageConnectionIdSalt[] = "ConnectionIdSalt";
+// static
 const char DefaultProfile::kStorageHostName[] = "HostName";
 // static
 const char DefaultProfile::kStorageIgnoredDNSSearchPaths[] =
@@ -56,7 +58,8 @@
 const char DefaultProfile::kStoragePortalCheckInterval[] =
     "PortalCheckInterval";
 // static
-const char DefaultProfile::kStorageConnectionIdSalt[] = "ConnectionIdSalt";
+const char DefaultProfile::kStorageProhibitedTechnologies[] =
+    "ProhibitedTechnologies";
 
 DefaultProfile::DefaultProfile(ControlInterface *control,
                                Metrics *metrics,
@@ -84,6 +87,8 @@
   store->RegisterConstString(kPortalURLProperty, &manager_props.portal_url);
   store->RegisterConstInt32(kPortalCheckIntervalProperty,
                             &manager_props.portal_check_interval_seconds);
+  store->RegisterConstString(kProhibitedTechnologiesProperty,
+                             &manager_props.prohibited_technologies);
 }
 
 DefaultProfile::~DefaultProfile() {}
@@ -99,6 +104,11 @@
                             &manager_props->check_portal_list)) {
     manager_props->check_portal_list = PortalDetector::kDefaultCheckPortalList;
   }
+  if (!storage()->GetInt(kStorageId, kStorageConnectionIdSalt,
+                         &manager_props->connection_id_salt)) {
+    manager_props->connection_id_salt =
+        std::uniform_int_distribution<int>()(random_engine_);
+  }
   if (!storage()->GetString(kStorageId,
                             kStorageIgnoredDNSSearchPaths,
                             &manager_props->ignored_dns_search_paths)) {
@@ -128,10 +138,10 @@
     manager_props->portal_check_interval_seconds =
         PortalDetector::kDefaultCheckIntervalSeconds;
   }
-  if (!storage()->GetInt(kStorageId, kStorageConnectionIdSalt,
-                         &manager_props->connection_id_salt)) {
-    manager_props->connection_id_salt =
-        std::uniform_int_distribution<int>()(random_engine_);
+  if (!storage()->GetString(kStorageId,
+                            kStorageProhibitedTechnologies,
+                            &manager_props->prohibited_technologies)) {
+    manager_props->prohibited_technologies = "";
   }
 }
 
@@ -158,6 +168,8 @@
   storage()->SetString(kStorageId,
                        kStorageCheckPortalList,
                        props_.check_portal_list);
+  storage()->SetInt(kStorageId, kStorageConnectionIdSalt,
+                    props_.connection_id_salt);
   storage()->SetString(kStorageId,
                        kStorageIgnoredDNSSearchPaths,
                        props_.ignored_dns_search_paths);
@@ -173,8 +185,9 @@
   storage()->SetString(kStorageId,
                        kStoragePortalCheckInterval,
                        base::IntToString(props_.portal_check_interval_seconds));
-  storage()->SetInt(kStorageId, kStorageConnectionIdSalt,
-                    props_.connection_id_salt);
+  storage()->SetString(kStorageId,
+                       kStorageProhibitedTechnologies,
+                       props_.prohibited_technologies);
   return Profile::Save();
 }