Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(268)

Side by Side Diff: chrome/browser/chromeos/cros/network_library.cc

Issue 8804021: Proper management for policy-configured networks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/policy/network_configuration_updater.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/cros/network_library.h" 5 #include "chrome/browser/chromeos/cros/network_library.h"
6 6
7 #include <dbus/dbus-glib.h> 7 #include <dbus/dbus-glib.h>
8 #include <dbus/dbus-gtype-specialized.h> 8 #include <dbus/dbus-gtype-specialized.h>
9 #include <glib-object.h> 9 #include <glib-object.h>
10 10
11 #include <algorithm> 11 #include <algorithm>
12 #include <list> 12 #include <list>
13 #include <map> 13 #include <map>
14 #include <set> 14 #include <set>
15 #include <utility> 15 #include <utility>
16 16
17 #include "base/bind.h" 17 #include "base/bind.h"
18 #include "base/i18n/icu_encoding_detection.h" 18 #include "base/i18n/icu_encoding_detection.h"
19 #include "base/i18n/icu_string_conversions.h" 19 #include "base/i18n/icu_string_conversions.h"
20 #include "base/i18n/time_formatting.h" 20 #include "base/i18n/time_formatting.h"
21 #include "base/memory/scoped_vector.h"
21 #include "base/json/json_writer.h" // for debug output only. 22 #include "base/json/json_writer.h" // for debug output only.
22 #include "base/metrics/histogram.h" 23 #include "base/metrics/histogram.h"
23 #include "base/stl_util.h" 24 #include "base/stl_util.h"
24 #include "base/string_number_conversions.h" 25 #include "base/string_number_conversions.h"
25 #include "base/string_tokenizer.h" 26 #include "base/string_tokenizer.h"
26 #include "base/string_util.h" 27 #include "base/string_util.h"
27 #include "base/stringprintf.h" 28 #include "base/stringprintf.h"
28 #include "base/utf_string_conversion_utils.h" 29 #include "base/utf_string_conversion_utils.h"
29 #include "base/utf_string_conversions.h" 30 #include "base/utf_string_conversions.h"
30 #include "base/values.h" 31 #include "base/values.h"
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 bool is_unicode_char = base::ReadUnicodeCharacter(str.c_str(), str.size(), 157 bool is_unicode_char = base::ReadUnicodeCharacter(str.c_str(), str.size(),
157 &index, &code_point_out); 158 &index, &code_point_out);
158 if (is_unicode_char && (code_point_out >= 0x20)) 159 if (is_unicode_char && (code_point_out >= 0x20))
159 base::WriteUnicodeCharacter(code_point_out, output); 160 base::WriteUnicodeCharacter(code_point_out, output);
160 else 161 else
161 // Puts REPLACEMENT CHARACTER (U+FFFD) if character is not readable UTF-8 162 // Puts REPLACEMENT CHARACTER (U+FFFD) if character is not readable UTF-8
162 base::WriteUnicodeCharacter(0xFFFD, output); 163 base::WriteUnicodeCharacter(0xFFFD, output);
163 } 164 }
164 } 165 }
165 166
167 NetworkProfileType GetProfileTypeForSource(NetworkUIData::ONCSource source) {
168 switch (source) {
169 case NetworkUIData::ONC_SOURCE_DEVICE_POLICY:
170 return PROFILE_SHARED;
171 case NetworkUIData::ONC_SOURCE_USER_POLICY:
172 return PROFILE_USER;
173 case NetworkUIData::ONC_SOURCE_NONE:
174 case NetworkUIData::ONC_SOURCE_USER_IMPORT:
175 return PROFILE_NONE;
176 }
177 NOTREACHED() << "Unknown ONC source " << source;
178 return PROFILE_NONE;
179 }
180
166 //////////////////////////////////////////////////////////////////////////////// 181 ////////////////////////////////////////////////////////////////////////////////
167 // glib 182 // glib
168 183
169 Value* ConvertGlibValue(const GValue* gvalue); 184 Value* ConvertGlibValue(const GValue* gvalue);
170 185
171 void AppendListElement(const GValue* gvalue, gpointer user_data) { 186 void AppendListElement(const GValue* gvalue, gpointer user_data) {
172 ListValue* list = static_cast<ListValue*>(user_data); 187 ListValue* list = static_cast<ListValue*>(user_data);
173 Value* value = ConvertGlibValue(gvalue); 188 Value* value = ConvertGlibValue(gvalue);
174 list->Append(value); 189 list->Append(value);
175 } 190 }
(...skipping 2674 matching lines...) Expand 10 before | Expand all | Expand 10 after
2850 for (int i = 0; i < parser.GetCertificatesSize(); i++) { 2865 for (int i = 0; i < parser.GetCertificatesSize(); i++) {
2851 // Insert each of the available certs into the certificate DB. 2866 // Insert each of the available certs into the certificate DB.
2852 if (parser.ParseCertificate(i).get() == NULL) { 2867 if (parser.ParseCertificate(i).get() == NULL) {
2853 DLOG(WARNING) << "Cannot parse certificate in ONC file"; 2868 DLOG(WARNING) << "Cannot parse certificate in ONC file";
2854 if (error) 2869 if (error)
2855 *error = parser.parse_error(); 2870 *error = parser.parse_error();
2856 return false; 2871 return false;
2857 } 2872 }
2858 } 2873 }
2859 2874
2875 // Parse all networks. Bail out if that fails.
2876 ScopedVector<Network> networks;
2860 for (int i = 0; i < parser.GetNetworkConfigsSize(); i++) { 2877 for (int i = 0; i < parser.GetNetworkConfigsSize(); i++) {
2861 // Parse Open Network Configuration blob into a temporary Network object. 2878 // Parse Open Network Configuration blob into a temporary Network object.
2862 scoped_ptr<Network> network(parser.ParseNetwork(i)); 2879 Network* network = parser.ParseNetwork(i);
2863 if (!network.get()) { 2880 if (!network) {
2864 DLOG(WARNING) << "Cannot parse network in ONC file"; 2881 DLOG(WARNING) << "Cannot parse network in ONC file";
2865 if (error) 2882 if (error)
2866 *error = parser.parse_error(); 2883 *error = parser.parse_error();
2867 return false; 2884 return false;
2868 } 2885 }
2886 networks.push_back(network);
2887 }
2869 2888
2889 // Configure the networks. While doing so, collect unique identifiers of the
2890 // networks that are defined in the ONC blob in |network_ids|. They're later
2891 // used to clean out any previously-existing networks that had been configured
2892 // through policy but are no longer specified in the updated ONC blob.
2893 std::set<std::string> network_ids;
2894 std::string profile_path(GetProfilePath(GetProfileTypeForSource(source)));
2895 for (std::vector<Network*>::iterator iter(networks.begin());
2896 iter != networks.end(); ++iter) {
2897 Network* network = *iter;
2870 DictionaryValue dict; 2898 DictionaryValue dict;
2871 for (Network::PropertyMap::const_iterator props = 2899 for (Network::PropertyMap::const_iterator props =
2872 network->property_map_.begin(); 2900 network->property_map_.begin();
2873 props != network->property_map_.end(); ++props) { 2901 props != network->property_map_.end(); ++props) {
2874 std::string key = 2902 std::string key =
2875 NativeNetworkParser::property_mapper()->GetKey(props->first); 2903 NativeNetworkParser::property_mapper()->GetKey(props->first);
2876 if (!key.empty()) 2904 if (!key.empty())
2877 dict.SetWithoutPathExpansion(key, props->second->DeepCopy()); 2905 dict.SetWithoutPathExpansion(key, props->second->DeepCopy());
2878 else 2906 else
2879 VLOG(2) << "Property " << props->first << " will not be sent"; 2907 VLOG(2) << "Property " << props->first << " will not be sent";
2880 } 2908 }
2881 2909
2910 // Set the appropriate profile for |source|.
2911 if (!profile_path.empty())
2912 dict.SetString(flimflam::kProfileProperty, profile_path);
2913
2882 CallConfigureService(network->unique_id(), &dict); 2914 CallConfigureService(network->unique_id(), &dict);
2915 network_ids.insert(network->unique_id());
2916 }
2917
2918 // Go through the list of existing remembered networks and clean out the ones
2919 // that no longer have a definition in the ONC blob. We first collect the
2920 // networks and do the actual deletion later because ForgetNetwork() changes
2921 // the remembered network vectors.
2922 if (source != NetworkUIData::ONC_SOURCE_USER_IMPORT) {
2923 std::vector<std::string> to_be_deleted;
2924 for (WifiNetworkVector::iterator i(remembered_wifi_networks_.begin());
2925 i != remembered_wifi_networks_.end(); ++i) {
2926 WifiNetwork* network = *i;
2927 if (NetworkUIData::GetONCSource(network) == source &&
2928 network_ids.find(network->unique_id()) == network_ids.end())
2929 to_be_deleted.push_back(network->service_path());
2930 }
2931
2932 for (VirtualNetworkVector::iterator i(remembered_virtual_networks_.begin());
2933 i != remembered_virtual_networks_.end(); ++i) {
2934 VirtualNetwork* network = *i;
2935 if (NetworkUIData::GetONCSource(network) == source &&
2936 network_ids.find(network->unique_id()) == network_ids.end())
2937 to_be_deleted.push_back(network->service_path());
2938 }
2939
2940 for (std::vector<std::string>::const_iterator i(to_be_deleted.begin());
2941 i != to_be_deleted.end(); ++i) {
2942 ForgetNetwork(*i);
2943 }
2883 } 2944 }
2884 2945
2885 if (parser.GetNetworkConfigsSize() != 0 || 2946 if (parser.GetNetworkConfigsSize() != 0 ||
2886 parser.GetCertificatesSize() != 0) { 2947 parser.GetCertificatesSize() != 0) {
2887 if (error) 2948 if (error)
2888 *error = l10n_util::GetStringUTF8( 2949 *error = l10n_util::GetStringUTF8(
2889 IDS_NETWORK_CONFIG_ERROR_NETWORK_IMPORT); 2950 IDS_NETWORK_CONFIG_ERROR_NETWORK_IMPORT);
2890 return false; 2951 return false;
2891 } 2952 }
2892 return true; 2953 return true;
(...skipping 2470 matching lines...) Expand 10 before | Expand all | Expand 10 after
5363 return impl; 5424 return impl;
5364 } 5425 }
5365 5426
5366 ///////////////////////////////////////////////////////////////////////////// 5427 /////////////////////////////////////////////////////////////////////////////
5367 5428
5368 } // namespace chromeos 5429 } // namespace chromeos
5369 5430
5370 // Allows InvokeLater without adding refcounting. This class is a Singleton and 5431 // Allows InvokeLater without adding refcounting. This class is a Singleton and
5371 // won't be deleted until its last InvokeLater is run. 5432 // won't be deleted until its last InvokeLater is run.
5372 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::NetworkLibraryImplBase); 5433 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::NetworkLibraryImplBase);
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/policy/network_configuration_updater.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698