| 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/chromeos/extensions/file_browser_handler.h" | 5 #include "chrome/browser/chromeos/extensions/file_browser_handler.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 unsigned int GetAccessPermissionFlagFromString(const std::string& access_str) { | 36 unsigned int GetAccessPermissionFlagFromString(const std::string& access_str) { |
| 37 if (access_str == kReadAccessString) | 37 if (access_str == kReadAccessString) |
| 38 return kReadPermission; | 38 return kReadPermission; |
| 39 if (access_str == kReadWriteAccessString) | 39 if (access_str == kReadWriteAccessString) |
| 40 return kReadPermission | kWritePermission; | 40 return kReadPermission | kWritePermission; |
| 41 if (access_str == kCreateAccessString) | 41 if (access_str == kCreateAccessString) |
| 42 return kCreatePermission; | 42 return kCreatePermission; |
| 43 return kInvalidPermission; | 43 return kInvalidPermission; |
| 44 } | 44 } |
| 45 | 45 |
| 46 const char* const kMIMETypeHandlersWhitelist[] = { | |
| 47 extension_misc::kQuickOfficeExtensionId, | |
| 48 extension_misc::kQuickOfficeDevExtensionId | |
| 49 }; | |
| 50 | |
| 51 // Stored on the Extension. | 46 // Stored on the Extension. |
| 52 struct FileBrowserHandlerInfo : public extensions::Extension::ManifestData { | 47 struct FileBrowserHandlerInfo : public extensions::Extension::ManifestData { |
| 53 FileBrowserHandler::List file_browser_handlers; | 48 FileBrowserHandler::List file_browser_handlers; |
| 54 | 49 |
| 55 FileBrowserHandlerInfo(); | 50 FileBrowserHandlerInfo(); |
| 56 virtual ~FileBrowserHandlerInfo(); | 51 virtual ~FileBrowserHandlerInfo(); |
| 57 }; | 52 }; |
| 58 | 53 |
| 59 FileBrowserHandlerInfo::FileBrowserHandlerInfo() { | 54 FileBrowserHandlerInfo::FileBrowserHandlerInfo() { |
| 60 } | 55 } |
| 61 | 56 |
| 62 FileBrowserHandlerInfo::~FileBrowserHandlerInfo() { | 57 FileBrowserHandlerInfo::~FileBrowserHandlerInfo() { |
| 63 } | 58 } |
| 64 | 59 |
| 65 } // namespace | 60 } // namespace |
| 66 | 61 |
| 67 // static | |
| 68 bool FileBrowserHandler::ExtensionWhitelistedForMIMETypes( | |
| 69 const std::string& extension_id) { | |
| 70 if (g_test_extension_id_ && extension_id == *g_test_extension_id_) | |
| 71 return true; | |
| 72 for (size_t i = 0; i < arraysize(kMIMETypeHandlersWhitelist); ++i) { | |
| 73 if (extension_id == kMIMETypeHandlersWhitelist[i]) | |
| 74 return true; | |
| 75 } | |
| 76 return false; | |
| 77 } | |
| 78 | |
| 79 // static | |
| 80 std::vector<std::string> FileBrowserHandler::GetMIMETypeWhitelist() { | |
| 81 std::vector<std::string> whitelist; | |
| 82 if (g_test_extension_id_) | |
| 83 whitelist.push_back(*g_test_extension_id_); | |
| 84 for (size_t i = 0; i < arraysize(kMIMETypeHandlersWhitelist); ++i) | |
| 85 whitelist.push_back(kMIMETypeHandlersWhitelist[i]); | |
| 86 return whitelist; | |
| 87 } | |
| 88 | |
| 89 FileBrowserHandler::FileBrowserHandler() | 62 FileBrowserHandler::FileBrowserHandler() |
| 90 : file_access_permission_flags_(kPermissionsNotDefined) { | 63 : file_access_permission_flags_(kPermissionsNotDefined) { |
| 91 } | 64 } |
| 92 | 65 |
| 93 FileBrowserHandler::~FileBrowserHandler() { | 66 FileBrowserHandler::~FileBrowserHandler() { |
| 94 } | 67 } |
| 95 | 68 |
| 96 void FileBrowserHandler::AddPattern(const URLPattern& pattern) { | 69 void FileBrowserHandler::AddPattern(const URLPattern& pattern) { |
| 97 url_set_.AddPattern(pattern); | 70 url_set_.AddPattern(pattern); |
| 98 } | 71 } |
| 99 | 72 |
| 100 void FileBrowserHandler::ClearPatterns() { | 73 void FileBrowserHandler::ClearPatterns() { |
| 101 url_set_.ClearPatterns(); | 74 url_set_.ClearPatterns(); |
| 102 } | 75 } |
| 103 | 76 |
| 104 bool FileBrowserHandler::MatchesURL(const GURL& url) const { | 77 bool FileBrowserHandler::MatchesURL(const GURL& url) const { |
| 105 return url_set_.MatchesURL(url); | 78 return url_set_.MatchesURL(url); |
| 106 } | 79 } |
| 107 | 80 |
| 108 void FileBrowserHandler::AddMIMEType(const std::string& mime_type) { | |
| 109 DCHECK(ExtensionWhitelistedForMIMETypes(extension_id())); | |
| 110 mime_type_set_.insert(mime_type); | |
| 111 } | |
| 112 | |
| 113 bool FileBrowserHandler::CanHandleMIMEType(const std::string& mime_type) const { | |
| 114 return mime_type_set_.find(mime_type) != mime_type_set_.end(); | |
| 115 } | |
| 116 | |
| 117 bool FileBrowserHandler::AddFileAccessPermission( | 81 bool FileBrowserHandler::AddFileAccessPermission( |
| 118 const std::string& access) { | 82 const std::string& access) { |
| 119 file_access_permission_flags_ |= GetAccessPermissionFlagFromString(access); | 83 file_access_permission_flags_ |= GetAccessPermissionFlagFromString(access); |
| 120 return (file_access_permission_flags_ & kInvalidPermission) != 0U; | 84 return (file_access_permission_flags_ & kInvalidPermission) != 0U; |
| 121 } | 85 } |
| 122 | 86 |
| 123 bool FileBrowserHandler::ValidateFileAccessPermissions() { | 87 bool FileBrowserHandler::ValidateFileAccessPermissions() { |
| 124 bool is_invalid = (file_access_permission_flags_ & kInvalidPermission) != 0U; | 88 bool is_invalid = (file_access_permission_flags_ & kInvalidPermission) != 0U; |
| 125 bool can_create = (file_access_permission_flags_ & kCreatePermission) != 0U; | 89 bool can_create = (file_access_permission_flags_ & kCreatePermission) != 0U; |
| 126 bool can_read_or_write = (file_access_permission_flags_ & | 90 bool can_read_or_write = (file_access_permission_flags_ & |
| (...skipping 26 matching lines...) Expand all Loading... |
| 153 // static | 117 // static |
| 154 FileBrowserHandler::List* | 118 FileBrowserHandler::List* |
| 155 FileBrowserHandler::GetHandlers(const extensions::Extension* extension) { | 119 FileBrowserHandler::GetHandlers(const extensions::Extension* extension) { |
| 156 FileBrowserHandlerInfo* info = static_cast<FileBrowserHandlerInfo*>( | 120 FileBrowserHandlerInfo* info = static_cast<FileBrowserHandlerInfo*>( |
| 157 extension->GetManifestData(keys::kFileBrowserHandlers)); | 121 extension->GetManifestData(keys::kFileBrowserHandlers)); |
| 158 if (info) | 122 if (info) |
| 159 return &info->file_browser_handlers; | 123 return &info->file_browser_handlers; |
| 160 return NULL; | 124 return NULL; |
| 161 } | 125 } |
| 162 | 126 |
| 163 std::string* FileBrowserHandler::g_test_extension_id_ = NULL; | |
| 164 | |
| 165 FileBrowserHandlerParser::FileBrowserHandlerParser() { | 127 FileBrowserHandlerParser::FileBrowserHandlerParser() { |
| 166 } | 128 } |
| 167 | 129 |
| 168 FileBrowserHandlerParser::~FileBrowserHandlerParser() { | 130 FileBrowserHandlerParser::~FileBrowserHandlerParser() { |
| 169 } | 131 } |
| 170 | 132 |
| 171 namespace { | 133 namespace { |
| 172 | 134 |
| 173 FileBrowserHandler* LoadFileBrowserHandler( | 135 FileBrowserHandler* LoadFileBrowserHandler( |
| 174 const std::string& extension_id, | 136 const std::string& extension_id, |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 bool allowed = path == "/*" || path == "/*.*" || | 219 bool allowed = path == "/*" || path == "/*.*" || |
| 258 (path.compare(0, 3, "/*.") == 0 && | 220 (path.compare(0, 3, "/*.") == 0 && |
| 259 path.find_first_of('*', 3) == std::string::npos); | 221 path.find_first_of('*', 3) == std::string::npos); |
| 260 if (!allowed) { | 222 if (!allowed) { |
| 261 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( | 223 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( |
| 262 errors::kInvalidURLPatternError, filter); | 224 errors::kInvalidURLPatternError, filter); |
| 263 return NULL; | 225 return NULL; |
| 264 } | 226 } |
| 265 result->AddPattern(pattern); | 227 result->AddPattern(pattern); |
| 266 } | 228 } |
| 267 | |
| 268 // Initialize MIME type filters (optional). | |
| 269 // NOTE: This is only used by QuickOffice extension to register MIME types | |
| 270 // it can handle by directly downloading them. It will *not* be used in File | |
| 271 // Manager UI. This is why file filters are mandatory even when MIME type | |
| 272 // filters are specified. | |
| 273 const ListValue* mime_type_filters = NULL; | |
| 274 if (file_browser_handler->HasKey(keys::kMIMETypes)) { | |
| 275 if (!FileBrowserHandler::ExtensionWhitelistedForMIMETypes(extension_id)) { | |
| 276 *error = ASCIIToUTF16( | |
| 277 errors::kNoPermissionForFileBrowserHandlerMIMETypes); | |
| 278 return NULL; | |
| 279 } | |
| 280 | |
| 281 if (!file_browser_handler->GetList(keys::kMIMETypes, | |
| 282 &mime_type_filters)) { | |
| 283 *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandlerMIMETypes); | |
| 284 return NULL; | |
| 285 } | |
| 286 | |
| 287 for (size_t i = 0; i < mime_type_filters->GetSize(); ++i) { | |
| 288 std::string filter; | |
| 289 if (!mime_type_filters->GetString(i, &filter)) { | |
| 290 *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandlerMIMETypes); | |
| 291 return NULL; | |
| 292 } | |
| 293 result->AddMIMEType(filter); | |
| 294 } | |
| 295 } | |
| 296 } | 229 } |
| 297 | 230 |
| 298 std::string default_icon; | 231 std::string default_icon; |
| 299 // Read the file browser action |default_icon| (optional). | 232 // Read the file browser action |default_icon| (optional). |
| 300 if (file_browser_handler->HasKey(keys::kPageActionDefaultIcon)) { | 233 if (file_browser_handler->HasKey(keys::kPageActionDefaultIcon)) { |
| 301 if (!file_browser_handler->GetString( | 234 if (!file_browser_handler->GetString( |
| 302 keys::kPageActionDefaultIcon, &default_icon) || | 235 keys::kPageActionDefaultIcon, &default_icon) || |
| 303 default_icon.empty()) { | 236 default_icon.empty()) { |
| 304 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); | 237 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); |
| 305 return NULL; | 238 return NULL; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 return false; // Failed to parse file browser actions definition. | 284 return false; // Failed to parse file browser actions definition. |
| 352 } | 285 } |
| 353 | 286 |
| 354 extension->SetManifestData(keys::kFileBrowserHandlers, info.release()); | 287 extension->SetManifestData(keys::kFileBrowserHandlers, info.release()); |
| 355 return true; | 288 return true; |
| 356 } | 289 } |
| 357 | 290 |
| 358 const std::vector<std::string> FileBrowserHandlerParser::Keys() const { | 291 const std::vector<std::string> FileBrowserHandlerParser::Keys() const { |
| 359 return SingleKey(keys::kFileBrowserHandlers); | 292 return SingleKey(keys::kFileBrowserHandlers); |
| 360 } | 293 } |
| OLD | NEW |