Chromium Code Reviews| OLD | NEW | 
|---|---|
| 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/download/chrome_download_manager_delegate.h" | 5 #include "chrome/browser/download/chrome_download_manager_delegate.h" | 
| 6 | 6 | 
| 7 #include "base/callback.h" | 7 #include "base/callback.h" | 
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" | 
| 9 #include "base/path_service.h" | 9 #include "base/path_service.h" | 
| 10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" | 
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 126 void ChromeDownloadManagerDelegate::ChooseSavePath( | 126 void ChromeDownloadManagerDelegate::ChooseSavePath( | 
| 127 const base::WeakPtr<SavePackage>& save_package, | 127 const base::WeakPtr<SavePackage>& save_package, | 
| 128 const FilePath& suggested_path, | 128 const FilePath& suggested_path, | 
| 129 bool can_save_as_complete) { | 129 bool can_save_as_complete) { | 
| 130 // Deletes itself. | 130 // Deletes itself. | 
| 131 new SavePackageFilePicker( | 131 new SavePackageFilePicker( | 
| 132 save_package, suggested_path, can_save_as_complete); | 132 save_package, suggested_path, can_save_as_complete); | 
| 133 } | 133 } | 
| 134 | 134 | 
| 135 void ChromeDownloadManagerDelegate::CheckDownloadUrlDone( | 135 void ChromeDownloadManagerDelegate::CheckDownloadUrlDone( | 
| 136 int32 download_id, bool is_dangerous_url) { | 136 int32 download_id, | 
| 137 bool is_dangerous_url) { | |
| 137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 138 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| 138 | 139 | 
| 139 DownloadItem* download = | 140 DownloadItem* download = | 
| 140 download_manager_->GetActiveDownloadItem(download_id); | 141 download_manager_->GetActiveDownloadItem(download_id); | 
| 141 if (!download) | 142 if (!download) | 
| 142 return; | 143 return; | 
| 143 | 144 | 
| 144 if (is_dangerous_url) | 145 if (is_dangerous_url) | 
| 145 download->MarkUrlDangerous(); | 146 download->MarkUrlDangerous(); | 
| 146 | 147 | 
| 147 download_manager_->download_history()->CheckVisitedReferrerBefore( | 148 download_manager_->download_history()->CheckVisitedReferrerBefore(download_id, | 
| 148 download_id, | 149 download->referrer_url(), NewCallback(this, | 
| 149 download->referrer_url(), | 150 &ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone)); | 
| 
 
ahendrickson
2011/08/19 15:51:47
Nit:  I think the indentation is wrong here.
 
Peter Kasting
2011/08/19 17:27:38
I'll indent the last line 4 more.  I asked Brett w
 
 | |
| 150 NewCallback(this, | |
| 151 &ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone)); | |
| 152 } | 151 } | 
| 153 | 152 | 
| 154 void ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone( | 153 void ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone( | 
| 155 int32 download_id, | 154 int32 download_id, | 
| 156 bool visited_referrer_before) { | 155 bool visited_referrer_before) { | 
| 157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 156 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| 158 | 157 | 
| 159 DownloadItem* download = | 158 DownloadItem* download = | 
| 160 download_manager_->GetActiveDownloadItem(download_id); | 159 download_manager_->GetActiveDownloadItem(download_id); | 
| 161 if (!download) | 160 if (!download) | 
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 331 download_manager_->RestartDownload(download_id); | 330 download_manager_->RestartDownload(download_id); | 
| 332 } | 331 } | 
| 333 | 332 | 
| 334 // TODO(phajdan.jr): This is apparently not being exercised in tests. | 333 // TODO(phajdan.jr): This is apparently not being exercised in tests. | 
| 335 bool ChromeDownloadManagerDelegate::IsDangerousFile( | 334 bool ChromeDownloadManagerDelegate::IsDangerousFile( | 
| 336 const DownloadItem& download, | 335 const DownloadItem& download, | 
| 337 const DownloadStateInfo& state, | 336 const DownloadStateInfo& state, | 
| 338 bool visited_referrer_before) { | 337 bool visited_referrer_before) { | 
| 339 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 338 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| 340 | 339 | 
| 341 bool auto_open = ShouldOpenFileBasedOnExtension(state.suggested_path); | 340 // Anything loaded directly from the address bar is OK. | 
| 342 download_util::DownloadDangerLevel danger_level = | 341 if (state.transition_type & PageTransition::FROM_ADDRESS_BAR) | 
| 343 download_util::GetFileDangerLevel(state.suggested_path.BaseName()); | 342 return false; | 
| 344 | 343 | 
| 345 if (danger_level == download_util::Dangerous) | 344 // Extensions that are not from the gallery are considered dangerous. | 
| 346 return !(auto_open && state.has_user_gesture); | |
| 347 | |
| 348 if (danger_level == download_util::AllowOnUserGesture && | |
| 349 (!state.has_user_gesture || !visited_referrer_before)) | |
| 350 return true; | |
| 351 | |
| 352 if (state.is_extension_install) { | 345 if (state.is_extension_install) { | 
| 353 // Extensions that are not from the gallery are considered dangerous. | |
| 354 ExtensionService* service = | 346 ExtensionService* service = | 
| 355 download_manager_->profile()->GetExtensionService(); | 347 download_manager_->profile()->GetExtensionService(); | 
| 356 if (!service || !service->IsDownloadFromGallery(download.GetURL(), | 348 if (!service || !service->IsDownloadFromGallery(download.GetURL(), | 
| 357 download.referrer_url())) | 349 download.referrer_url())) | 
| 358 return true; | 350 return true; | 
| 359 } | 351 } | 
| 360 return false; | 352 | 
| 353 // Anything the user has marked auto-open is OK if it's user-initiated. | |
| 354 if (ShouldOpenFileBasedOnExtension(state.suggested_path) && | |
| 355 state.has_user_gesture) | |
| 356 return false; | |
| 357 | |
| 358 // "Allow on user gesture" is OK when we have a user gesture and the hosting | |
| 359 // page has been visited before today. | |
| 360 download_util::DownloadDangerLevel danger_level = | |
| 361 download_util::GetFileDangerLevel(state.suggested_path.BaseName()); | |
| 362 if (danger_level == download_util::AllowOnUserGesture) | |
| 363 return !state.has_user_gesture || !visited_referrer_before; | |
| 364 | |
| 365 return danger_level == download_util::Dangerous; | |
| 361 } | 366 } | 
| OLD | NEW |