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

Unified Diff: content/browser/download/save_package.cc

Issue 2075273002: Resource requests from Save-Page-As should go through CanRequestURL checks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/download/save_package.cc
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc
index a64f3f29176816bc4d4899e683065af34f539aa6..1caa372fc9a63f1cffce6a9c67072b967afa5601 100644
--- a/content/browser/download/save_package.cc
+++ b/content/browser/download/save_package.cc
@@ -10,6 +10,7 @@
#include "base/bind.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
+#include "base/guid.h"
#include "base/i18n/file_util_icu.h"
#include "base/logging.h"
#include "base/macros.h"
@@ -349,13 +350,10 @@ void SavePackage::InitWithDownloadItem(
} else {
DCHECK_EQ(SAVE_PAGE_TYPE_AS_ONLY_HTML, save_type_);
wait_state_ = NET_FILES;
- SaveFileCreateInfo::SaveFileSource save_source = page_url_.SchemeIsFile() ?
- SaveFileCreateInfo::SAVE_FILE_FROM_FILE :
- SaveFileCreateInfo::SAVE_FILE_FROM_NET;
// Add this item to waiting list.
- waiting_item_queue_.push_back(
- new SaveItem(page_url_, Referrer(), this, save_source,
- FrameTreeNode::kFrameTreeNodeInvalidId));
+ waiting_item_queue_.push_back(new SaveItem(
+ page_url_, Referrer(), this, SaveFileCreateInfo::SAVE_FILE_FROM_NET,
+ FrameTreeNode::kFrameTreeNodeInvalidId));
all_save_items_count_ = 1;
download_->SetTotalBytes(1);
@@ -590,16 +588,6 @@ void SavePackage::StartSave(const SaveFileCreateInfo* info) {
save_item->SetTargetPath(saved_main_file_path_);
}
- // If the save source is from file system, inform SaveFileManager to copy
- // corresponding file to the file path which this SaveItem specifies.
- if (info->save_source == SaveFileCreateInfo::SAVE_FILE_FROM_FILE) {
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- base::Bind(&SaveFileManager::SaveLocalFile, file_manager_,
- save_item->url(), save_item->id(), id()));
- return;
- }
-
// Check whether we begin to require serialized HTML data.
if (save_type_ == SAVE_PAGE_TYPE_AS_COMPLETE_HTML &&
wait_state_ == HTML_DATA) {
@@ -842,6 +830,11 @@ void SavePackage::SaveNextFile(bool process_all_remaining_items) {
DCHECK(!ContainsKey(in_progress_items_, save_item->id()));
in_progress_items_[save_item->id()] = save_item;
save_item->Start();
+
+ // TODO(lukasza): https://crbug.com/616429: Pass the correct child process
+ // id instead of always passing main frame's process id. Correctness of
+ // security checks in ResourceDispatcherHostImpl::BeginSave depends on it
+ // (OTOH, this only matters if OOPIFs are present).
Łukasz Anforowicz 2016/06/18 00:37:20 I need to double-check how process_id/child_id and
asanka 2016/06/20 20:24:18 Thanks for calling this out. In addition to the tw
Łukasz Anforowicz 2016/06/21 16:39:34 Ack.
file_manager_->SaveURL(
save_item->id(), save_item->url(), save_item->referrer(),
web_contents()->GetRenderProcessHost()->GetID(), routing_id(),
@@ -993,19 +986,20 @@ void SavePackage::GetSerializedHtmlWithLocalLinksForFrame(
target_frame_tree_node_id);
if (it != frame_tree_node_id_to_contained_save_items_.end()) {
for (const SaveItem* save_item : it->second) {
- // Skip items that failed to save.
- if (!save_item->has_final_name()) {
- DCHECK_EQ(SaveItem::SaveState::COMPLETE, save_item->state());
- DCHECK(!save_item->success());
- continue;
- }
Łukasz Anforowicz 2016/06/18 00:37:20 I've added these checks in https://codereview.chro
asanka 2016/06/20 20:24:18 Acknowledged.
-
// Calculate the relative path for referring to the |save_item|.
base::FilePath local_path(base::FilePath::kCurrentDirectory);
if (target_tree_node->IsMainFrame()) {
local_path = local_path.Append(saved_main_directory_path_.BaseName());
}
- local_path = local_path.Append(save_item->full_path().BaseName());
+ if (save_item->has_final_name()) {
+ local_path = local_path.Append(save_item->full_path().BaseName());
+ } else {
+ // Skip items that failed to save.
+ DCHECK_EQ(SaveItem::SaveState::COMPLETE, save_item->state());
+ DCHECK(!save_item->success());
+ local_path = local_path.Append(base::FilePath::FromUTF8Unsafe(
+ "resource-failed-to-save-" + base::GenerateGUID() + ".txt"));
Łukasz Anforowicz 2016/06/18 00:37:20 This is tricky. We could analyze this with an exa
asanka 2016/06/20 20:24:18 As long as we are talking about subresources, I'm
Łukasz Anforowicz 2016/06/21 16:39:34 Yes - propagating origin-specific restrictions int
+ }
// Insert the link into |url_to_local_path| or |routing_id_to_local_path|.
if (save_item->save_source() != SaveFileCreateInfo::SAVE_FILE_FROM_DOM) {
@@ -1214,12 +1208,9 @@ void SavePackage::EnqueueSavableResource(int container_frame_tree_node_id,
if (!url.is_valid())
return;
- SaveFileCreateInfo::SaveFileSource save_source =
- url.SchemeIsFile() ? SaveFileCreateInfo::SAVE_FILE_FROM_FILE
- : SaveFileCreateInfo::SAVE_FILE_FROM_NET;
CreatePendingSaveItemDeduplicatingByUrl(
container_frame_tree_node_id, FrameTreeNode::kFrameTreeNodeInvalidId, url,
- referrer, save_source);
+ referrer, SaveFileCreateInfo::SAVE_FILE_FROM_NET);
}
void SavePackage::EnqueueFrame(int container_frame_tree_node_id,

Powered by Google App Engine
This is Rietveld 408576698