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

Side by Side Diff: chrome/browser/download/chrome_download_manager_delegate.cc

Issue 8571023: Implemented ExternalData interface on DownloadItem and used it for SafeBrowsing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Cleaned up a bit. Created 9 years, 1 month 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
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/download/chrome_download_manager_delegate.h" 5 #include "chrome/browser/download/chrome_download_manager_delegate.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 25 matching lines...) Expand all
36 #include "content/browser/download/download_manager.h" 36 #include "content/browser/download/download_manager.h"
37 #include "content/browser/download/download_status_updater.h" 37 #include "content/browser/download/download_status_updater.h"
38 #include "content/browser/tab_contents/tab_contents.h" 38 #include "content/browser/tab_contents/tab_contents.h"
39 #include "content/public/browser/notification_source.h" 39 #include "content/public/browser/notification_source.h"
40 #include "grit/generated_resources.h" 40 #include "grit/generated_resources.h"
41 #include "ui/base/l10n/l10n_util.h" 41 #include "ui/base/l10n/l10n_util.h"
42 42
43 using content::BrowserThread; 43 using content::BrowserThread;
44 using safe_browsing::DownloadProtectionService; 44 using safe_browsing::DownloadProtectionService;
45 45
46 namespace {
47
48 // String pointer used for identifying safebrowing data associated with
49 // a download item.
50 static char safe_browsing_id[] = "Safe Browsing ID";
noelutz 2011/11/16 02:59:38 nit: make that const?
Randy Smith (Not in Mondays) 2011/11/18 02:02:57 Done.
51
52 // The state of a safebrowsing check. If there is no data associated with the
53 struct SafeBrowsingState : public DownloadItem::ExternalData {
54 // If true the SafeBrowsing check is not done yet.
55 bool pending;
56 // The verdict that we got from calling CheckClientDownload.
57 safe_browsing::DownloadProtectionService::DownloadCheckResult verdict;
58 };
59
60 }
61
46 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile) 62 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile)
47 : profile_(profile), 63 : profile_(profile),
48 download_prefs_(new DownloadPrefs(profile->GetPrefs())) { 64 download_prefs_(new DownloadPrefs(profile->GetPrefs())) {
49 } 65 }
50 66
51 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { 67 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() {
52 } 68 }
53 69
54 bool ChromeDownloadManagerDelegate::IsExtensionDownload( 70 bool ChromeDownloadManagerDelegate::IsExtensionDownload(
55 const DownloadItem* item) { 71 const DownloadItem* item) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 if (Extension::IsExtension(path)) 164 if (Extension::IsExtension(path))
149 return false; 165 return false;
150 DCHECK(extension[0] == FilePath::kExtensionSeparator); 166 DCHECK(extension[0] == FilePath::kExtensionSeparator);
151 extension.erase(0, 1); 167 extension.erase(0, 1);
152 return download_prefs_->IsAutoOpenEnabledForExtension(extension); 168 return download_prefs_->IsAutoOpenEnabledForExtension(extension);
153 } 169 }
154 170
155 bool ChromeDownloadManagerDelegate::ShouldCompleteDownload(DownloadItem* item) { 171 bool ChromeDownloadManagerDelegate::ShouldCompleteDownload(DownloadItem* item) {
156 #if defined(ENABLE_SAFE_BROWSING) 172 #if defined(ENABLE_SAFE_BROWSING)
157 // See if there is already a pending SafeBrowsing check for that download. 173 // See if there is already a pending SafeBrowsing check for that download.
158 SafeBrowsingStateMap::iterator it = safe_browsing_state_.find(item->id()); 174 SafeBrowsingState* state = static_cast<SafeBrowsingState*>(
159 if (it != safe_browsing_state_.end()) { 175 item->GetExternalData(&safe_browsing_id));
160 SafeBrowsingState state = it->second; 176 if (state)
161 if (!state.pending) { 177 // Don't complete the download until we have an answer.
162 safe_browsing_state_.erase(it); 178 return !state->pending;
163 } 179
164 return !state.pending;
165 }
166 // Begin the safe browsing download protection check. 180 // Begin the safe browsing download protection check.
167 SafeBrowsingService* sb_service = 181 SafeBrowsingService* sb_service =
168 g_browser_process->safe_browsing_service(); 182 g_browser_process->safe_browsing_service();
169 if (sb_service && sb_service->download_protection_service() && 183 if (sb_service && sb_service->download_protection_service() &&
170 profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled)) { 184 profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled)) {
171 VLOG(2) << __FUNCTION__ << "() Start SB download check for download = " 185 VLOG(2) << __FUNCTION__ << "() Start SB download check for download = "
172 << item->DebugString(false); 186 << item->DebugString(false);
173 sb_service->download_protection_service()->CheckClientDownload( 187 sb_service->download_protection_service()->CheckClientDownload(
174 DownloadProtectionService::DownloadInfo::FromDownloadItem(*item), 188 DownloadProtectionService::DownloadInfo::FromDownloadItem(*item),
175 base::Bind( 189 base::Bind(
176 &ChromeDownloadManagerDelegate::CheckClientDownloadDone, 190 &ChromeDownloadManagerDelegate::CheckClientDownloadDone,
177 this, 191 this,
178 item->id())); 192 item->id()));
179 SafeBrowsingState state; 193 SafeBrowsingState* state(new SafeBrowsingState());
180 state.pending = true; 194 state->pending = true;
181 state.verdict = DownloadProtectionService::SAFE; 195 state->verdict = DownloadProtectionService::SAFE;
182 safe_browsing_state_[item->id()] = state; 196 item->SetExternalData(&safe_browsing_id, state);
183 return false; 197 return false;
184 } 198 }
185 #endif 199 #endif
186 return true; 200 return true;
187 } 201 }
188 202
189 bool ChromeDownloadManagerDelegate::ShouldOpenDownload(DownloadItem* item) { 203 bool ChromeDownloadManagerDelegate::ShouldOpenDownload(DownloadItem* item) {
190 if (!IsExtensionDownload(item)) { 204 if (!IsExtensionDownload(item)) {
191 return true; 205 return true;
192 } 206 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 download_history_->CheckVisitedReferrerBefore( 330 download_history_->CheckVisitedReferrerBefore(
317 download_id, download->referrer_url(), 331 download_id, download->referrer_url(),
318 base::Bind(&ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone, 332 base::Bind(&ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone,
319 base::Unretained(this))); 333 base::Unretained(this)));
320 } 334 }
321 335
322 void ChromeDownloadManagerDelegate::CheckClientDownloadDone( 336 void ChromeDownloadManagerDelegate::CheckClientDownloadDone(
323 int32 download_id, 337 int32 download_id,
324 DownloadProtectionService::DownloadCheckResult result) { 338 DownloadProtectionService::DownloadCheckResult result) {
325 DownloadItem* item = download_manager_->GetActiveDownloadItem(download_id); 339 DownloadItem* item = download_manager_->GetActiveDownloadItem(download_id);
326 if (!item) { 340 if (!item)
327 safe_browsing_state_.erase(download_id); // Just in case.
328 return; 341 return;
329 }
330 342
331 VLOG(2) << __FUNCTION__ << "() download = " << item->DebugString(false) 343 VLOG(2) << __FUNCTION__ << "() download = " << item->DebugString(false)
332 << " verdict = " << result; 344 << " verdict = " << result;
333 // TODO(noelutz): 345 // TODO(noelutz):
334 // 1) display a warning if the result is DANGEROUS. 346 // 1) display a warning if the result is DANGEROUS.
335 // 2) make sure we haven't already displayed a warning for the URL. 347 // 2) make sure we haven't already displayed a warning for the URL.
336 // 3) disable the existing dangerous file warning for executables. 348 // 3) disable the existing dangerous file warning for executables.
337 349
338 SafeBrowsingStateMap::iterator it = safe_browsing_state_.find(item->id()); 350 SafeBrowsingState* state = static_cast<SafeBrowsingState*>(
339 DCHECK(it != safe_browsing_state_.end() && it->second.pending); 351 item->GetExternalData(&safe_browsing_id));
340 if (it != safe_browsing_state_.end()) { 352 DCHECK(state);
341 it->second.pending = false; 353 state->pending = false;
noelutz 2011/11/16 02:59:38 nit: add an if here? Otherwise, this will crash i
Randy Smith (Not in Mondays) 2011/11/18 02:02:57 I wince, just because when I plot that case forwar
342 it->second.verdict = result; 354 state->verdict = result;
343 }
344 download_manager_->MaybeCompleteDownload(item); 355 download_manager_->MaybeCompleteDownload(item);
345 } 356 }
346 357
347 // content::NotificationObserver implementation. 358 // content::NotificationObserver implementation.
348 void ChromeDownloadManagerDelegate::Observe( 359 void ChromeDownloadManagerDelegate::Observe(
349 int type, 360 int type,
350 const content::NotificationSource& source, 361 const content::NotificationSource& source,
351 const content::NotificationDetails& details) { 362 const content::NotificationDetails& details) {
352 DCHECK(type == chrome::NOTIFICATION_CRX_INSTALLER_DONE); 363 DCHECK(type == chrome::NOTIFICATION_CRX_INSTALLER_DONE);
353 364
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 int32 download_id, int64 db_handle) { 583 int32 download_id, int64 db_handle) {
573 // It's not immediately obvious, but HistoryBackend::CreateDownload() can 584 // It's not immediately obvious, but HistoryBackend::CreateDownload() can
574 // call this function with an invalid |db_handle|. For instance, this can 585 // call this function with an invalid |db_handle|. For instance, this can
575 // happen when the history database is offline. We cannot have multiple 586 // happen when the history database is offline. We cannot have multiple
576 // DownloadItems with the same invalid db_handle, so we need to assign a 587 // DownloadItems with the same invalid db_handle, so we need to assign a
577 // unique |db_handle| here. 588 // unique |db_handle| here.
578 if (db_handle == DownloadItem::kUninitializedHandle) 589 if (db_handle == DownloadItem::kUninitializedHandle)
579 db_handle = download_history_->GetNextFakeDbHandle(); 590 db_handle = download_history_->GetNextFakeDbHandle();
580 download_manager_->OnItemAddedToPersistentStore(download_id, db_handle); 591 download_manager_->OnItemAddedToPersistentStore(download_id, db_handle);
581 } 592 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698