| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/extensions/api/file_handlers/app_file_handler_util.h" | 5 #include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h" |
| 6 | 6 |
| 7 #include "chrome/browser/extensions/extension_prefs.h" | 7 #include "chrome/browser/extensions/extension_prefs.h" |
| 8 #include "content/public/browser/child_process_security_policy.h" | 8 #include "content/public/browser/child_process_security_policy.h" |
| 9 #include "net/base/mime_util.h" | 9 #include "net/base/mime_util.h" |
| 10 #include "webkit/fileapi/file_system_types.h" | 10 #include "webkit/fileapi/file_system_types.h" |
| 11 #include "webkit/fileapi/isolated_context.h" | 11 #include "webkit/fileapi/isolated_context.h" |
| 12 | 12 |
| 13 namespace extensions { | 13 namespace extensions { |
| 14 | 14 |
| 15 namespace app_file_handler_util { | 15 namespace app_file_handler_util { |
| 16 | 16 |
| 17 namespace { | 17 namespace { |
| 18 // Preference keys | |
| 19 | |
| 20 // The file entries that an extension has permission to access. | |
| 21 const char kFileEntries[] = "file_entries"; | |
| 22 | |
| 23 // The path to a file entry that an extension had permission to access. | |
| 24 const char kFileEntryPath[] = "path"; | |
| 25 | |
| 26 // Whether or not an extension had write access to a file entry. | |
| 27 const char kFileEntryWritable[] = "writable"; | |
| 28 | 18 |
| 29 bool FileHandlerCanHandleFileWithExtension( | 19 bool FileHandlerCanHandleFileWithExtension( |
| 30 const FileHandlerInfo& handler, | 20 const FileHandlerInfo& handler, |
| 31 const base::FilePath& path) { | 21 const base::FilePath& path) { |
| 32 for (std::set<std::string>::const_iterator extension = | 22 for (std::set<std::string>::const_iterator extension = |
| 33 handler.extensions.begin(); | 23 handler.extensions.begin(); |
| 34 extension != handler.extensions.end(); ++extension) { | 24 extension != handler.extensions.end(); ++extension) { |
| 35 if (*extension == "*") | 25 if (*extension == "*") |
| 36 return true; | 26 return true; |
| 37 | 27 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 if (writable) | 142 if (writable) |
| 153 policy->GrantWriteFileSystem(renderer_id, result.filesystem_id); | 143 policy->GrantWriteFileSystem(renderer_id, result.filesystem_id); |
| 154 | 144 |
| 155 result.id = result.filesystem_id + ":" + result.registered_name; | 145 result.id = result.filesystem_id + ":" + result.registered_name; |
| 156 | 146 |
| 157 // We only need file level access for reading FileEntries. Saving FileEntries | 147 // We only need file level access for reading FileEntries. Saving FileEntries |
| 158 // just needs the file system to have read/write access, which is granted | 148 // just needs the file system to have read/write access, which is granted |
| 159 // above if required. | 149 // above if required. |
| 160 if (!policy->CanReadFile(renderer_id, path)) | 150 if (!policy->CanReadFile(renderer_id, path)) |
| 161 policy->GrantReadFile(renderer_id, path); | 151 policy->GrantReadFile(renderer_id, path); |
| 162 | |
| 163 // Save this file entry in the prefs. | |
| 164 AddSavedFileEntry(ExtensionPrefs::Get(profile), | |
| 165 extension_id, | |
| 166 result.id, | |
| 167 path, | |
| 168 writable); | |
| 169 return result; | 152 return result; |
| 170 } | 153 } |
| 171 | 154 |
| 172 void AddSavedFileEntry(ExtensionPrefs* prefs, | |
| 173 const std::string& extension_id, | |
| 174 const std::string& file_entry_id, | |
| 175 const base::FilePath& file_path, | |
| 176 bool writable) { | |
| 177 ExtensionPrefs::ScopedDictionaryUpdate update( | |
| 178 prefs, | |
| 179 extension_id, | |
| 180 kFileEntries); | |
| 181 DictionaryValue* file_entries = update.Get(); | |
| 182 if (!file_entries) | |
| 183 file_entries = update.Create(); | |
| 184 | |
| 185 // Once a file's permissions are set, they can't be changed. | |
| 186 DictionaryValue* file_entry_dict = NULL; | |
| 187 if (file_entries->GetDictionary(file_entry_id, &file_entry_dict)) | |
| 188 return; | |
| 189 | |
| 190 file_entry_dict = new DictionaryValue(); | |
| 191 file_entry_dict->SetString(kFileEntryPath, file_path.value()); | |
| 192 file_entry_dict->SetBoolean(kFileEntryWritable, writable); | |
| 193 file_entries->SetWithoutPathExpansion(file_entry_id, file_entry_dict); | |
| 194 } | |
| 195 | |
| 196 void GetSavedFileEntries( | |
| 197 const ExtensionPrefs* prefs, | |
| 198 const std::string& extension_id, | |
| 199 std::vector<SavedFileEntry>* out) { | |
| 200 const DictionaryValue* file_entries = NULL; | |
| 201 if (!prefs || !prefs->ReadPrefAsDictionary(extension_id, | |
| 202 kFileEntries, | |
| 203 &file_entries)) { | |
| 204 return; | |
| 205 } | |
| 206 | |
| 207 for (DictionaryValue::Iterator iter(*file_entries); | |
| 208 !iter.IsAtEnd(); iter.Advance()) { | |
| 209 const DictionaryValue* file_entry = NULL; | |
| 210 if (!iter.value().GetAsDictionary(&file_entry)) | |
| 211 continue; | |
| 212 base::FilePath::StringType path_string; | |
| 213 if (!file_entry->GetString(kFileEntryPath, &path_string)) | |
| 214 continue; | |
| 215 bool writable = false; | |
| 216 if (!file_entry->GetBoolean(kFileEntryWritable, &writable)) | |
| 217 continue; | |
| 218 base::FilePath file_path(path_string); | |
| 219 out->push_back(SavedFileEntry(iter.key(), file_path, writable)); | |
| 220 } | |
| 221 } | |
| 222 | |
| 223 void ClearSavedFileEntries(ExtensionPrefs* prefs, | |
| 224 const std::string& extension_id) { | |
| 225 prefs->UpdateExtensionPref(extension_id, kFileEntries, NULL); | |
| 226 } | |
| 227 | |
| 228 } // namespace app_file_handler_util | 155 } // namespace app_file_handler_util |
| 229 | 156 |
| 230 } // namespace extensions | 157 } // namespace extensions |
| OLD | NEW |