| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 // Generating a fingerprint consists of two major steps: | 5 // Generating a fingerprint consists of two major steps: |
| 6 // (1) Gather all the necessary data. | 6 // (1) Gather all the necessary data. |
| 7 // (2) Write it into a protocol buffer. | 7 // (2) Write it into a protocol buffer. |
| 8 // | 8 // |
| 9 // Step (2) is as simple as it sounds -- it's really just a matter of copying | 9 // Step (2) is as simple as it sounds -- it's really just a matter of copying |
| 10 // data. Step (1) requires waiting on several asynchronous callbacks, which are | 10 // data. Step (1) requires waiting on several asynchronous callbacks, which are |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "base/scoped_observer.h" | 23 #include "base/scoped_observer.h" |
| 24 #include "base/strings/string_split.h" | 24 #include "base/strings/string_split.h" |
| 25 #include "base/strings/utf_string_conversions.h" | 25 #include "base/strings/utf_string_conversions.h" |
| 26 #include "base/sys_info.h" | 26 #include "base/sys_info.h" |
| 27 #include "base/time/time.h" | 27 #include "base/time/time.h" |
| 28 #include "base/timer/timer.h" | 28 #include "base/timer/timer.h" |
| 29 #include "base/values.h" | 29 #include "base/values.h" |
| 30 #include "components/autofill/content/browser/risk/proto/fingerprint.pb.h" | 30 #include "components/autofill/content/browser/risk/proto/fingerprint.pb.h" |
| 31 #include "content/public/browser/browser_thread.h" | 31 #include "content/public/browser/browser_thread.h" |
| 32 #include "content/public/browser/font_list_async.h" | 32 #include "content/public/browser/font_list_async.h" |
| 33 #include "content/public/browser/geolocation_provider.h" | |
| 34 #include "content/public/browser/gpu_data_manager.h" | 33 #include "content/public/browser/gpu_data_manager.h" |
| 35 #include "content/public/browser/gpu_data_manager_observer.h" | 34 #include "content/public/browser/gpu_data_manager_observer.h" |
| 36 #include "content/public/browser/plugin_service.h" | 35 #include "content/public/browser/plugin_service.h" |
| 37 #include "content/public/browser/render_widget_host.h" | 36 #include "content/public/browser/render_widget_host.h" |
| 38 #include "content/public/browser/render_widget_host_view.h" | 37 #include "content/public/browser/render_widget_host_view.h" |
| 39 #include "content/public/browser/web_contents.h" | 38 #include "content/public/browser/web_contents.h" |
| 40 #include "content/public/common/geoposition.h" | |
| 41 #include "content/public/common/webplugininfo.h" | 39 #include "content/public/common/webplugininfo.h" |
| 40 #include "device/geolocation/geolocation_provider.h" |
| 41 #include "device/geolocation/geoposition.h" |
| 42 #include "gpu/config/gpu_info.h" | 42 #include "gpu/config/gpu_info.h" |
| 43 #include "third_party/WebKit/public/platform/WebRect.h" | 43 #include "third_party/WebKit/public/platform/WebRect.h" |
| 44 #include "third_party/WebKit/public/platform/WebScreenInfo.h" | 44 #include "third_party/WebKit/public/platform/WebScreenInfo.h" |
| 45 #include "ui/display/display.h" | 45 #include "ui/display/display.h" |
| 46 #include "ui/display/screen.h" | 46 #include "ui/display/screen.h" |
| 47 #include "ui/gfx/geometry/rect.h" | 47 #include "ui/gfx/geometry/rect.h" |
| 48 | 48 |
| 49 using blink::WebScreenInfo; | 49 using blink::WebScreenInfo; |
| 50 | 50 |
| 51 namespace autofill { | 51 namespace autofill { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 | 193 |
| 194 private: | 194 private: |
| 195 ~FingerprintDataLoader() override {} | 195 ~FingerprintDataLoader() override {} |
| 196 | 196 |
| 197 // content::GpuDataManagerObserver: | 197 // content::GpuDataManagerObserver: |
| 198 void OnGpuInfoUpdate() override; | 198 void OnGpuInfoUpdate() override; |
| 199 | 199 |
| 200 // Callbacks for asynchronously loaded data. | 200 // Callbacks for asynchronously loaded data. |
| 201 void OnGotFonts(std::unique_ptr<base::ListValue> fonts); | 201 void OnGotFonts(std::unique_ptr<base::ListValue> fonts); |
| 202 void OnGotPlugins(const std::vector<content::WebPluginInfo>& plugins); | 202 void OnGotPlugins(const std::vector<content::WebPluginInfo>& plugins); |
| 203 void OnGotGeoposition(const content::Geoposition& geoposition); | 203 void OnGotGeoposition(const device::Geoposition& geoposition); |
| 204 | 204 |
| 205 // If all of the asynchronous data has been loaded, calls |callback_| with | 205 // If all of the asynchronous data has been loaded, calls |callback_| with |
| 206 // the fingerprint data. | 206 // the fingerprint data. |
| 207 void MaybeFillFingerprint(); | 207 void MaybeFillFingerprint(); |
| 208 | 208 |
| 209 // Calls |callback_| with the fingerprint data. | 209 // Calls |callback_| with the fingerprint data. |
| 210 void FillFingerprint(); | 210 void FillFingerprint(); |
| 211 | 211 |
| 212 // The GPU data provider. | 212 // The GPU data provider. |
| 213 // Weak reference because the GpuDataManager class is a singleton. | 213 // Weak reference because the GpuDataManager class is a singleton. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 227 const std::string charset_; | 227 const std::string charset_; |
| 228 const std::string accept_languages_; | 228 const std::string accept_languages_; |
| 229 const std::string app_locale_; | 229 const std::string app_locale_; |
| 230 const std::string user_agent_; | 230 const std::string user_agent_; |
| 231 const base::Time install_time_; | 231 const base::Time install_time_; |
| 232 | 232 |
| 233 // Data that will be loaded asynchronously. | 233 // Data that will be loaded asynchronously. |
| 234 std::unique_ptr<base::ListValue> fonts_; | 234 std::unique_ptr<base::ListValue> fonts_; |
| 235 std::vector<content::WebPluginInfo> plugins_; | 235 std::vector<content::WebPluginInfo> plugins_; |
| 236 bool waiting_on_plugins_; | 236 bool waiting_on_plugins_; |
| 237 content::Geoposition geoposition_; | 237 device::Geoposition geoposition_; |
| 238 | 238 |
| 239 // Timer to enforce a maximum timeout before the |callback_| is called, even | 239 // Timer to enforce a maximum timeout before the |callback_| is called, even |
| 240 // if not all asynchronous data has been loaded. | 240 // if not all asynchronous data has been loaded. |
| 241 base::OneShotTimer timeout_timer_; | 241 base::OneShotTimer timeout_timer_; |
| 242 | 242 |
| 243 // The callback that will be called once all the data is available. | 243 // The callback that will be called once all the data is available. |
| 244 base::Callback<void(std::unique_ptr<Fingerprint>)> callback_; | 244 base::Callback<void(std::unique_ptr<Fingerprint>)> callback_; |
| 245 | 245 |
| 246 // The callback used as an "observer" of the GeolocationProvider. | 246 // The callback used as an "observer" of the GeolocationProvider. |
| 247 std::unique_ptr<content::GeolocationProvider::Subscription> | 247 std::unique_ptr<device::GeolocationProvider::Subscription> |
| 248 geolocation_subscription_; | 248 geolocation_subscription_; |
| 249 | 249 |
| 250 // For invalidating asynchronous callbacks that might arrive after |this| | 250 // For invalidating asynchronous callbacks that might arrive after |this| |
| 251 // instance is destroyed. | 251 // instance is destroyed. |
| 252 base::WeakPtrFactory<FingerprintDataLoader> weak_ptr_factory_; | 252 base::WeakPtrFactory<FingerprintDataLoader> weak_ptr_factory_; |
| 253 | 253 |
| 254 DISALLOW_COPY_AND_ASSIGN(FingerprintDataLoader); | 254 DISALLOW_COPY_AND_ASSIGN(FingerprintDataLoader); |
| 255 }; | 255 }; |
| 256 | 256 |
| 257 FingerprintDataLoader::FingerprintDataLoader( | 257 FingerprintDataLoader::FingerprintDataLoader( |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 #else | 303 #else |
| 304 waiting_on_plugins_ = false; | 304 waiting_on_plugins_ = false; |
| 305 #endif | 305 #endif |
| 306 | 306 |
| 307 // Load font data. | 307 // Load font data. |
| 308 content::GetFontListAsync( | 308 content::GetFontListAsync( |
| 309 base::Bind(&FingerprintDataLoader::OnGotFonts, | 309 base::Bind(&FingerprintDataLoader::OnGotFonts, |
| 310 weak_ptr_factory_.GetWeakPtr())); | 310 weak_ptr_factory_.GetWeakPtr())); |
| 311 | 311 |
| 312 // Load geolocation data. | 312 // Load geolocation data. |
| 313 geolocation_subscription_ = content::GeolocationProvider::GetInstance()-> | 313 geolocation_subscription_ = device::GeolocationProvider::GetInstance()-> |
| 314 AddLocationUpdateCallback( | 314 AddLocationUpdateCallback( |
| 315 base::Bind(&FingerprintDataLoader::OnGotGeoposition, | 315 base::Bind(&FingerprintDataLoader::OnGotGeoposition, |
| 316 weak_ptr_factory_.GetWeakPtr()), | 316 weak_ptr_factory_.GetWeakPtr()), |
| 317 false); | 317 false); |
| 318 } | 318 } |
| 319 | 319 |
| 320 void FingerprintDataLoader::OnGpuInfoUpdate() { | 320 void FingerprintDataLoader::OnGpuInfoUpdate() { |
| 321 if (!gpu_data_manager_->IsEssentialGpuInfoAvailable()) | 321 if (!gpu_data_manager_->IsEssentialGpuInfoAvailable()) |
| 322 return; | 322 return; |
| 323 | 323 |
| 324 gpu_observer_.Remove(gpu_data_manager_); | 324 gpu_observer_.Remove(gpu_data_manager_); |
| 325 MaybeFillFingerprint(); | 325 MaybeFillFingerprint(); |
| 326 } | 326 } |
| 327 | 327 |
| 328 void FingerprintDataLoader::OnGotFonts(std::unique_ptr<base::ListValue> fonts) { | 328 void FingerprintDataLoader::OnGotFonts(std::unique_ptr<base::ListValue> fonts) { |
| 329 DCHECK(!fonts_); | 329 DCHECK(!fonts_); |
| 330 fonts_.reset(fonts.release()); | 330 fonts_.reset(fonts.release()); |
| 331 MaybeFillFingerprint(); | 331 MaybeFillFingerprint(); |
| 332 } | 332 } |
| 333 | 333 |
| 334 void FingerprintDataLoader::OnGotPlugins( | 334 void FingerprintDataLoader::OnGotPlugins( |
| 335 const std::vector<content::WebPluginInfo>& plugins) { | 335 const std::vector<content::WebPluginInfo>& plugins) { |
| 336 DCHECK(waiting_on_plugins_); | 336 DCHECK(waiting_on_plugins_); |
| 337 waiting_on_plugins_ = false; | 337 waiting_on_plugins_ = false; |
| 338 plugins_ = plugins; | 338 plugins_ = plugins; |
| 339 MaybeFillFingerprint(); | 339 MaybeFillFingerprint(); |
| 340 } | 340 } |
| 341 | 341 |
| 342 void FingerprintDataLoader::OnGotGeoposition( | 342 void FingerprintDataLoader::OnGotGeoposition( |
| 343 const content::Geoposition& geoposition) { | 343 const device::Geoposition& geoposition) { |
| 344 DCHECK(!geoposition_.Validate()); | 344 DCHECK(!geoposition_.Validate()); |
| 345 | 345 |
| 346 geoposition_ = geoposition; | 346 geoposition_ = geoposition; |
| 347 DCHECK(geoposition_.Validate() || | 347 DCHECK(geoposition_.Validate() || |
| 348 geoposition_.error_code != content::Geoposition::ERROR_CODE_NONE); | 348 geoposition_.error_code != device::Geoposition::ERROR_CODE_NONE); |
| 349 geolocation_subscription_.reset(); | 349 geolocation_subscription_.reset(); |
| 350 | 350 |
| 351 MaybeFillFingerprint(); | 351 MaybeFillFingerprint(); |
| 352 } | 352 } |
| 353 | 353 |
| 354 void FingerprintDataLoader::MaybeFillFingerprint() { | 354 void FingerprintDataLoader::MaybeFillFingerprint() { |
| 355 // If all of the data has been loaded, or if the |timeout_timer_| has expired, | 355 // If all of the data has been loaded, or if the |timeout_timer_| has expired, |
| 356 // fill the fingerprint and clean up. | 356 // fill the fingerprint and clean up. |
| 357 if (!timeout_timer_.IsRunning() || | 357 if (!timeout_timer_.IsRunning() || |
| 358 ((!gpu_data_manager_->GpuAccessAllowed(NULL) || | 358 ((!gpu_data_manager_->GpuAccessAllowed(NULL) || |
| 359 gpu_data_manager_->IsEssentialGpuInfoAvailable()) && | 359 gpu_data_manager_->IsEssentialGpuInfoAvailable()) && |
| 360 fonts_ && | 360 fonts_ && |
| 361 !waiting_on_plugins_ && | 361 !waiting_on_plugins_ && |
| 362 (geoposition_.Validate() || | 362 (geoposition_.Validate() || |
| 363 geoposition_.error_code != content::Geoposition::ERROR_CODE_NONE))) { | 363 geoposition_.error_code != device::Geoposition::ERROR_CODE_NONE))) { |
| 364 FillFingerprint(); | 364 FillFingerprint(); |
| 365 delete this; | 365 delete this; |
| 366 } | 366 } |
| 367 } | 367 } |
| 368 | 368 |
| 369 void FingerprintDataLoader::FillFingerprint() { | 369 void FingerprintDataLoader::FillFingerprint() { |
| 370 std::unique_ptr<Fingerprint> fingerprint(new Fingerprint); | 370 std::unique_ptr<Fingerprint> fingerprint(new Fingerprint); |
| 371 Fingerprint::MachineCharacteristics* machine = | 371 Fingerprint::MachineCharacteristics* machine = |
| 372 fingerprint->mutable_machine_characteristics(); | 372 fingerprint->mutable_machine_characteristics(); |
| 373 | 373 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 403 Fingerprint::Dimension* outer_window_size = | 403 Fingerprint::Dimension* outer_window_size = |
| 404 transient_state->mutable_outer_window_size(); | 404 transient_state->mutable_outer_window_size(); |
| 405 outer_window_size->set_width(window_bounds_.width()); | 405 outer_window_size->set_width(window_bounds_.width()); |
| 406 outer_window_size->set_height(window_bounds_.height()); | 406 outer_window_size->set_height(window_bounds_.height()); |
| 407 | 407 |
| 408 // TODO(isherman): Record network performance data, which is theoretically | 408 // TODO(isherman): Record network performance data, which is theoretically |
| 409 // available to JS. | 409 // available to JS. |
| 410 | 410 |
| 411 // TODO(isherman): Record more user behavior data. | 411 // TODO(isherman): Record more user behavior data. |
| 412 if (geoposition_.Validate() && | 412 if (geoposition_.Validate() && |
| 413 geoposition_.error_code == content::Geoposition::ERROR_CODE_NONE) { | 413 geoposition_.error_code == device::Geoposition::ERROR_CODE_NONE) { |
| 414 Fingerprint::UserCharacteristics::Location* location = | 414 Fingerprint::UserCharacteristics::Location* location = |
| 415 fingerprint->mutable_user_characteristics()->mutable_location(); | 415 fingerprint->mutable_user_characteristics()->mutable_location(); |
| 416 location->set_altitude(geoposition_.altitude); | 416 location->set_altitude(geoposition_.altitude); |
| 417 location->set_latitude(geoposition_.latitude); | 417 location->set_latitude(geoposition_.latitude); |
| 418 location->set_longitude(geoposition_.longitude); | 418 location->set_longitude(geoposition_.longitude); |
| 419 location->set_accuracy(geoposition_.accuracy); | 419 location->set_accuracy(geoposition_.accuracy); |
| 420 location->set_time_in_ms( | 420 location->set_time_in_ms( |
| 421 (geoposition_.timestamp - base::Time::UnixEpoch()).InMilliseconds()); | 421 (geoposition_.timestamp - base::Time::UnixEpoch()).InMilliseconds()); |
| 422 } | 422 } |
| 423 | 423 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 host_view->GetRenderWidgetHost()->GetWebScreenInfo(&screen_info); | 477 host_view->GetRenderWidgetHost()->GetWebScreenInfo(&screen_info); |
| 478 | 478 |
| 479 internal::GetFingerprintInternal( | 479 internal::GetFingerprintInternal( |
| 480 obfuscated_gaia_id, window_bounds, content_bounds, screen_info, version, | 480 obfuscated_gaia_id, window_bounds, content_bounds, screen_info, version, |
| 481 charset, accept_languages, install_time, app_locale, user_agent, | 481 charset, accept_languages, install_time, app_locale, user_agent, |
| 482 base::TimeDelta::FromSeconds(kTimeoutSeconds), callback); | 482 base::TimeDelta::FromSeconds(kTimeoutSeconds), callback); |
| 483 } | 483 } |
| 484 | 484 |
| 485 } // namespace risk | 485 } // namespace risk |
| 486 } // namespace autofill | 486 } // namespace autofill |
| OLD | NEW |