| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/component_updater/configurator_impl.h" | 5 #include "components/component_updater/configurator_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 const char kSwitchDisableBackgroundDownloads[] = "disable-background-downloads"; | 52 const char kSwitchDisableBackgroundDownloads[] = "disable-background-downloads"; |
| 53 #endif // defined(OS_WIN) | 53 #endif // defined(OS_WIN) |
| 54 | 54 |
| 55 // Returns true if and only if |test| is contained in |vec|. | 55 // Returns true if and only if |test| is contained in |vec|. |
| 56 bool HasSwitchValue(const std::vector<std::string>& vec, const char* test) { | 56 bool HasSwitchValue(const std::vector<std::string>& vec, const char* test) { |
| 57 if (vec.empty()) | 57 if (vec.empty()) |
| 58 return 0; | 58 return 0; |
| 59 return (std::find(vec.begin(), vec.end(), test) != vec.end()); | 59 return (std::find(vec.begin(), vec.end(), test) != vec.end()); |
| 60 } | 60 } |
| 61 | 61 |
| 62 // Returns true if falling back on an alternate, unsafe, service URL is | |
| 63 // allowed. In the fallback case, the security of the component update relies | |
| 64 // only on the integrity of the CRX payloads, which is self-validating. | |
| 65 // This is allowed only for some of the pre-Windows Vista versions not including | |
| 66 // Windows XP SP3. As a side note, pings could be sent to the alternate URL too. | |
| 67 bool CanUseAltUrlSource() { | |
| 68 #if defined(OS_WIN) | |
| 69 return !base::win::MaybeHasSHA256Support(); | |
| 70 #else | |
| 71 return false; | |
| 72 #endif // OS_WIN | |
| 73 } | |
| 74 | |
| 75 // If there is an element of |vec| of the form |test|=.*, returns the right- | 62 // If there is an element of |vec| of the form |test|=.*, returns the right- |
| 76 // hand side of that assignment. Otherwise, returns an empty string. | 63 // hand side of that assignment. Otherwise, returns an empty string. |
| 77 // The right-hand side may contain additional '=' characters, allowing for | 64 // The right-hand side may contain additional '=' characters, allowing for |
| 78 // further nesting of switch arguments. | 65 // further nesting of switch arguments. |
| 79 std::string GetSwitchArgument(const std::vector<std::string>& vec, | 66 std::string GetSwitchArgument(const std::vector<std::string>& vec, |
| 80 const char* test) { | 67 const char* test) { |
| 81 if (vec.empty()) | 68 if (vec.empty()) |
| 82 return std::string(); | 69 return std::string(); |
| 83 for (std::vector<std::string>::const_iterator it = vec.begin(); | 70 for (std::vector<std::string>::const_iterator it = vec.begin(); |
| 84 it != vec.end(); ++it) { | 71 it != vec.end(); ++it) { |
| 85 const std::size_t found = it->find("="); | 72 const std::size_t found = it->find("="); |
| 86 if (found != std::string::npos) { | 73 if (found != std::string::npos) { |
| 87 if (it->substr(0, found) == test) { | 74 if (it->substr(0, found) == test) { |
| 88 return it->substr(found + 1); | 75 return it->substr(found + 1); |
| 89 } | 76 } |
| 90 } | 77 } |
| 91 } | 78 } |
| 92 return std::string(); | 79 return std::string(); |
| 93 } | 80 } |
| 94 | 81 |
| 95 } // namespace | 82 } // namespace |
| 96 | 83 |
| 97 ConfiguratorImpl::ConfiguratorImpl( | 84 ConfiguratorImpl::ConfiguratorImpl( |
| 98 const base::CommandLine* cmdline, | 85 const base::CommandLine* cmdline, |
| 99 net::URLRequestContextGetter* url_request_getter) | 86 net::URLRequestContextGetter* url_request_getter) |
| 100 : url_request_getter_(url_request_getter), | 87 : url_request_getter_(url_request_getter), |
| 101 fast_update_(false), | 88 fast_update_(false), |
| 102 pings_enabled_(false), | 89 pings_enabled_(false), |
| 103 deltas_enabled_(false), | 90 deltas_enabled_(false), |
| 104 background_downloads_enabled_(false), | 91 background_downloads_enabled_(false) { |
| 105 fallback_to_alt_source_url_enabled_(false) { | |
| 106 // Parse comma-delimited debug flags. | 92 // Parse comma-delimited debug flags. |
| 107 std::vector<std::string> switch_values = base::SplitString( | 93 std::vector<std::string> switch_values = base::SplitString( |
| 108 cmdline->GetSwitchValueASCII(switches::kComponentUpdater), ",", | 94 cmdline->GetSwitchValueASCII(switches::kComponentUpdater), ",", |
| 109 base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY); | 95 base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY); |
| 110 fast_update_ = HasSwitchValue(switch_values, kSwitchFastUpdate); | 96 fast_update_ = HasSwitchValue(switch_values, kSwitchFastUpdate); |
| 111 pings_enabled_ = !HasSwitchValue(switch_values, kSwitchDisablePings); | 97 pings_enabled_ = !HasSwitchValue(switch_values, kSwitchDisablePings); |
| 112 deltas_enabled_ = !HasSwitchValue(switch_values, kSwitchDisableDeltaUpdates); | 98 deltas_enabled_ = !HasSwitchValue(switch_values, kSwitchDisableDeltaUpdates); |
| 113 | 99 |
| 114 #if defined(OS_WIN) | 100 #if defined(OS_WIN) |
| 115 background_downloads_enabled_ = | 101 background_downloads_enabled_ = |
| 116 !HasSwitchValue(switch_values, kSwitchDisableBackgroundDownloads); | 102 !HasSwitchValue(switch_values, kSwitchDisableBackgroundDownloads); |
| 117 #else | 103 #else |
| 118 background_downloads_enabled_ = false; | 104 background_downloads_enabled_ = false; |
| 119 #endif | 105 #endif |
| 120 | 106 |
| 121 const std::string switch_url_source = | 107 const std::string switch_url_source = |
| 122 GetSwitchArgument(switch_values, kSwitchUrlSource); | 108 GetSwitchArgument(switch_values, kSwitchUrlSource); |
| 123 if (!switch_url_source.empty()) { | 109 if (!switch_url_source.empty()) { |
| 124 url_source_override_ = GURL(switch_url_source); | 110 url_source_override_ = GURL(switch_url_source); |
| 125 DCHECK(url_source_override_.is_valid()); | 111 DCHECK(url_source_override_.is_valid()); |
| 126 } | 112 } |
| 127 | 113 |
| 128 if (HasSwitchValue(switch_values, kSwitchRequestParam)) | 114 if (HasSwitchValue(switch_values, kSwitchRequestParam)) |
| 129 extra_info_ += "testrequest=\"1\""; | 115 extra_info_ += "testrequest=\"1\""; |
| 130 | |
| 131 fallback_to_alt_source_url_enabled_ = CanUseAltUrlSource(); | |
| 132 } | 116 } |
| 133 | 117 |
| 134 ConfiguratorImpl::~ConfiguratorImpl() {} | 118 ConfiguratorImpl::~ConfiguratorImpl() {} |
| 135 | 119 |
| 136 int ConfiguratorImpl::InitialDelay() const { | 120 int ConfiguratorImpl::InitialDelay() const { |
| 137 return fast_update_ ? 10 : (6 * kDelayOneMinute); | 121 return fast_update_ ? 10 : (6 * kDelayOneMinute); |
| 138 } | 122 } |
| 139 | 123 |
| 140 int ConfiguratorImpl::NextCheckDelay() const { | 124 int ConfiguratorImpl::NextCheckDelay() const { |
| 141 return fast_update_ ? 60 : (6 * kDelayOneHour); | 125 return fast_update_ ? 60 : (6 * kDelayOneHour); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 152 int ConfiguratorImpl::UpdateDelay() const { | 136 int ConfiguratorImpl::UpdateDelay() const { |
| 153 return fast_update_ ? 10 : (15 * kDelayOneMinute); | 137 return fast_update_ ? 10 : (15 * kDelayOneMinute); |
| 154 } | 138 } |
| 155 | 139 |
| 156 std::vector<GURL> ConfiguratorImpl::UpdateUrl() const { | 140 std::vector<GURL> ConfiguratorImpl::UpdateUrl() const { |
| 157 std::vector<GURL> urls; | 141 std::vector<GURL> urls; |
| 158 if (url_source_override_.is_valid()) { | 142 if (url_source_override_.is_valid()) { |
| 159 urls.push_back(GURL(url_source_override_)); | 143 urls.push_back(GURL(url_source_override_)); |
| 160 } else { | 144 } else { |
| 161 urls.push_back(GURL(kUpdaterDefaultUrl)); | 145 urls.push_back(GURL(kUpdaterDefaultUrl)); |
| 162 if (fallback_to_alt_source_url_enabled_) { | |
| 163 urls.push_back(GURL(kUpdaterAltUrl)); | |
| 164 } | |
| 165 } | 146 } |
| 166 return urls; | 147 return urls; |
| 167 } | 148 } |
| 168 | 149 |
| 169 std::vector<GURL> ConfiguratorImpl::PingUrl() const { | 150 std::vector<GURL> ConfiguratorImpl::PingUrl() const { |
| 170 return pings_enabled_ ? UpdateUrl() : std::vector<GURL>(); | 151 return pings_enabled_ ? UpdateUrl() : std::vector<GURL>(); |
| 171 } | 152 } |
| 172 | 153 |
| 173 base::Version ConfiguratorImpl::GetBrowserVersion() const { | 154 base::Version ConfiguratorImpl::GetBrowserVersion() const { |
| 174 return base::Version(version_info::GetVersionNumber()); | 155 return base::Version(version_info::GetVersionNumber()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 187 } | 168 } |
| 188 | 169 |
| 189 bool ConfiguratorImpl::DeltasEnabled() const { | 170 bool ConfiguratorImpl::DeltasEnabled() const { |
| 190 return deltas_enabled_; | 171 return deltas_enabled_; |
| 191 } | 172 } |
| 192 | 173 |
| 193 bool ConfiguratorImpl::UseBackgroundDownloader() const { | 174 bool ConfiguratorImpl::UseBackgroundDownloader() const { |
| 194 return background_downloads_enabled_; | 175 return background_downloads_enabled_; |
| 195 } | 176 } |
| 196 | 177 |
| 197 void ConfiguratorImpl::set_enable_alt_source_url(bool enable_alt_source_url) { | |
| 198 fallback_to_alt_source_url_enabled_ = enable_alt_source_url; | |
| 199 } | |
| 200 | |
| 201 } // namespace component_updater | 178 } // namespace component_updater |
| OLD | NEW |