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 |