Loosen permission on extension temp dir when a flag is used.

Issue 35198 can not be reproduced locally.  To enable users to do experiments, three command line flags are added to chrome:

--issue35198-crxdir-browser: Have the browser process create the directory in which the extension will be unzipped.

--issue35198-logging: Enable log messages from directory creation in the utility process to be moved to the browser process.

--issue35198-permission: Use the most permissive file permissions possible on the extension unpack directory.

BUG=35198
TEST=manual

Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=51231

Review URL: http://codereview.chromium.org/2802018

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@51416 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: 4cd2d520d95db38a157fd2f86161ea457eab7af2
diff --git a/base/file_util.h b/base/file_util.h
index 48f431f..6277748 100644
--- a/base/file_util.h
+++ b/base/file_util.h
@@ -265,8 +265,13 @@
 // Create a directory within another directory.
 // Extra characters will be appended to |name_tmpl| to ensure that the
 // new directory does not have the same name as an existing directory.
+// If |loosen_permissions| is true, the new directory will be readable
+// and writable to all users on windows.  It is ignored on other platforms.
+// |loosen_permissions| exists to allow debugging of crbug/35198, and will
+// be removed when the issue is understood.
 bool CreateTemporaryDirInDir(const FilePath& base_dir,
                              const FilePath::StringType& prefix,
+                             bool loosen_permissions,
                              FilePath* new_dir);
 
 // Create a new directory under TempPath. If prefix is provided, the new
diff --git a/base/file_util_posix.cc b/base/file_util_posix.cc
index 9d738da..434c859 100644
--- a/base/file_util_posix.cc
+++ b/base/file_util_posix.cc
@@ -428,7 +428,15 @@
 
 bool CreateTemporaryDirInDir(const FilePath& base_dir,
                              const FilePath::StringType& prefix,
+                             bool loosen_permissions,
                              FilePath* new_dir) {
+  // To understand crbug/35198, the ability to call this
+  // this function on windows while giving loose permissions
+  // to the resulting directory has been temporarily added.
+  // It should not be possible to call this function with
+  // loosen_permissions == true on non-windows platforms.
+  DCHECK(!loosen_permissions);
+
   FilePath::StringType mkdtemp_template = prefix;
   mkdtemp_template.append(FILE_PATH_LITERAL("XXXXXX"));
   return CreateTemporaryDirInDirImpl(base_dir, mkdtemp_template, new_dir);
diff --git a/base/file_util_unittest.cc b/base/file_util_unittest.cc
index 39e5398..4827f59 100644
--- a/base/file_util_unittest.cc
+++ b/base/file_util_unittest.cc
@@ -1569,6 +1569,7 @@
   ASSERT_TRUE(file_util::CreateTemporaryDirInDir(
                   test_dir_,
                   FILE_PATH_LITERAL("CreateNewTemporaryDirInDirTest"),
+                  false,
                   &new_dir));
   EXPECT_TRUE(file_util::PathExists(new_dir));
   EXPECT_TRUE(test_dir_.IsParent(new_dir));
diff --git a/base/scoped_temp_dir.cc b/base/scoped_temp_dir.cc
index c8ed9c6..28f59bf 100644
--- a/base/scoped_temp_dir.cc
+++ b/base/scoped_temp_dir.cc
@@ -4,6 +4,7 @@
 
 #include "base/scoped_temp_dir.h"
 
+#include "base/command_line.h"
 #include "base/file_util.h"
 #include "base/logging.h"
 #include "base/string_util.h"
@@ -26,15 +27,19 @@
   return true;
 }
 
-bool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) {
+bool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path,
+                                                 bool loose_permissions) {
   // If |path| does not exist, create it.
-  if (!file_util::CreateDirectory(base_path))
+  if (!file_util::CreateDirectory(base_path)) {
+    LOG(ERROR) << "Failed to create base directory " << base_path.value();
     return false;
+  }
 
-  // Create a new, uniquly named directory under |base_path|.
+  // Create a new, uniquely named directory under |base_path|.
   if (!file_util::CreateTemporaryDirInDir(
           base_path,
           FILE_PATH_LITERAL("scoped_dir_"),
+          loose_permissions,
           &path_)) {
     return false;
   }
diff --git a/base/scoped_temp_dir.h b/base/scoped_temp_dir.h
index a5dca1e..a0708dc 100644
--- a/base/scoped_temp_dir.h
+++ b/base/scoped_temp_dir.h
@@ -26,7 +26,8 @@
   bool CreateUniqueTempDir();
 
   // Creates a unique directory under a given path, and takes ownership of it.
-  bool CreateUniqueTempDirUnderPath(const FilePath& path);
+  bool CreateUniqueTempDirUnderPath(const FilePath& path,
+                                    bool loose_permissions);
 
   // Takes ownership of directory at |path|, creating it if necessary.
   // Don't call multiple times unless Take() has been called first.
diff --git a/base/scoped_temp_dir_unittest.cc b/base/scoped_temp_dir_unittest.cc
index 4be0d07..e180119 100644
--- a/base/scoped_temp_dir_unittest.cc
+++ b/base/scoped_temp_dir_unittest.cc
@@ -65,7 +65,7 @@
   FilePath test_path;
   {
     ScopedTempDir dir;
-    EXPECT_TRUE(dir.CreateUniqueTempDirUnderPath(base_path));
+    EXPECT_TRUE(dir.CreateUniqueTempDirUnderPath(base_path, false));
     test_path = dir.path();
     EXPECT_TRUE(file_util::DirectoryExists(test_path));
     EXPECT_TRUE(base_path.IsParent(test_path));