| 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_private_api.h" | 5 #include "chrome/browser/chromeos/extensions/file_browser_private_api.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 } | 170 } |
| 171 | 171 |
| 172 mount_info->SetString("mountCondition", | 172 mount_info->SetString("mountCondition", |
| 173 DiskMountManager::MountConditionToString( | 173 DiskMountManager::MountConditionToString( |
| 174 mount_point_info.mount_condition)); | 174 mount_point_info.mount_condition)); |
| 175 | 175 |
| 176 return mount_info; | 176 return mount_info; |
| 177 } | 177 } |
| 178 #endif // defined(OS_CHROMEOS) | 178 #endif // defined(OS_CHROMEOS) |
| 179 | 179 |
| 180 |
| 181 // Gives the extension renderer |host| file |permissions| for the given |path|. |
| 182 void GrantFilePermissionsToHost(content::RenderViewHost* host, |
| 183 const FilePath& path, |
| 184 int permissions) { |
| 185 ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile( |
| 186 host->GetProcess()->GetID(), path, permissions); |
| 187 } |
| 188 |
| 180 // Given a file url, find the virtual FilePath associated with it. | 189 // Given a file url, find the virtual FilePath associated with it. |
| 181 FilePath GetVirtualPathFromURL(const GURL& file_url) { | 190 FilePath GetVirtualPathFromURL(const GURL& file_url) { |
| 182 FilePath virtual_path; | 191 FilePath virtual_path; |
| 183 fileapi::FileSystemType type = fileapi::kFileSystemTypeUnknown; | 192 fileapi::FileSystemType type = fileapi::kFileSystemTypeUnknown; |
| 184 GURL file_origin_url; | 193 GURL file_origin_url; |
| 185 if (!CrackFileSystemURL(file_url, &file_origin_url, &type, &virtual_path) || | 194 if (!CrackFileSystemURL(file_url, &file_origin_url, &type, &virtual_path) || |
| 186 type != fileapi::kFileSystemTypeExternal) { | 195 type != fileapi::kFileSystemTypeExternal) { |
| 187 NOTREACHED(); | 196 NOTREACHED(); |
| 188 return FilePath(); | 197 return FilePath(); |
| 189 } | 198 } |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 this, | 349 this, |
| 341 source_url_, | 350 source_url_, |
| 342 render_view_host()->GetProcess()->GetID())); | 351 render_view_host()->GetProcess()->GetID())); |
| 343 // Will finish asynchronously. | 352 // Will finish asynchronously. |
| 344 return true; | 353 return true; |
| 345 } | 354 } |
| 346 | 355 |
| 347 void RequestLocalFileSystemFunction::RespondSuccessOnUIThread( | 356 void RequestLocalFileSystemFunction::RespondSuccessOnUIThread( |
| 348 const std::string& name, const GURL& root_path) { | 357 const std::string& name, const GURL& root_path) { |
| 349 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 358 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 359 // Add gdata mount point immediately when we kick of first instance of file |
| 360 // manager. The actual mount event will be sent to UI only when we perform |
| 361 // proper authentication. |
| 362 AddGDataMountPoint(); |
| 350 result_.reset(new DictionaryValue()); | 363 result_.reset(new DictionaryValue()); |
| 351 DictionaryValue* dict = reinterpret_cast<DictionaryValue*>(result_.get()); | 364 DictionaryValue* dict = reinterpret_cast<DictionaryValue*>(result_.get()); |
| 352 dict->SetString("name", name); | 365 dict->SetString("name", name); |
| 353 dict->SetString("path", root_path.spec()); | 366 dict->SetString("path", root_path.spec()); |
| 354 dict->SetInteger("error", base::PLATFORM_FILE_OK); | 367 dict->SetInteger("error", base::PLATFORM_FILE_OK); |
| 355 SendResponse(true); | 368 SendResponse(true); |
| 356 } | 369 } |
| 357 | 370 |
| 371 void RequestLocalFileSystemFunction::AddGDataMountPoint() { |
| 372 fileapi::ExternalFileSystemMountPointProvider* provider = |
| 373 BrowserContext::GetFileSystemContext(profile_)->external_provider(); |
| 374 const FilePath mount_point = gdata::util::GetGDataMountPointPath(); |
| 375 if (!provider || provider->HasMountPoint(mount_point)) |
| 376 return; |
| 377 |
| 378 // Grant R/W permissions to gdata 'folder'. File API layer still |
| 379 // expects this to be satisfied. |
| 380 GrantFilePermissionsToHost(render_view_host(), |
| 381 mount_point, |
| 382 file_handler_util::GetReadWritePermissions()); |
| 383 |
| 384 // Grant R/W permission for tmp and pinned cache folder. |
| 385 gdata::GDataSystemService* system_service = |
| 386 gdata::GDataSystemServiceFactory::GetForProfile(profile_); |
| 387 DCHECK(system_service); |
| 388 gdata::GDataFileSystem* gdata_file_system = system_service->file_system(); |
| 389 |
| 390 // We check permissions for raw cache file paths only for read-only |
| 391 // operations (when fileEntry.file() is called), so read only permissions |
| 392 // should be sufficient for all cache paths. For the rest of supported |
| 393 // operations the file access check is done for gdata/ paths. |
| 394 GrantFilePermissionsToHost(render_view_host(), |
| 395 gdata_file_system->GetGDataCacheTmpDirectory(), |
| 396 file_handler_util::GetReadOnlyPermissions()); |
| 397 GrantFilePermissionsToHost( |
| 398 render_view_host(), |
| 399 gdata_file_system->GetGDataCachePersistentDirectory(), |
| 400 file_handler_util::GetReadOnlyPermissions()); |
| 401 |
| 402 provider->AddRemoteMountPoint( |
| 403 mount_point, |
| 404 new gdata::GDataFileSystemProxy(gdata_file_system)); |
| 405 |
| 406 FilePath mount_point_virtual; |
| 407 if (provider->GetVirtualPath(mount_point, &mount_point_virtual)) |
| 408 provider->GrantFileAccessToExtension(extension_id(), mount_point_virtual); |
| 409 } |
| 410 |
| 358 void RequestLocalFileSystemFunction::RespondFailedOnUIThread( | 411 void RequestLocalFileSystemFunction::RespondFailedOnUIThread( |
| 359 base::PlatformFileError error_code) { | 412 base::PlatformFileError error_code) { |
| 360 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 413 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 361 error_ = base::StringPrintf(kFileError, static_cast<int>(error_code)); | 414 error_ = base::StringPrintf(kFileError, static_cast<int>(error_code)); |
| 362 SendResponse(false); | 415 SendResponse(false); |
| 363 } | 416 } |
| 364 | 417 |
| 365 bool FileWatchBrowserFunctionBase::GetLocalFilePath( | 418 bool FileWatchBrowserFunctionBase::GetLocalFilePath( |
| 366 const GURL& file_url, FilePath* local_path, FilePath* virtual_path) { | 419 const GURL& file_url, FilePath* local_path, FilePath* virtual_path) { |
| 367 GURL file_origin_url; | 420 GURL file_origin_url; |
| (...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 900 this, | 953 this, |
| 901 mount_type_str)); | 954 mount_type_str)); |
| 902 break; | 955 break; |
| 903 } | 956 } |
| 904 } | 957 } |
| 905 #endif // defined(OS_CHROMEOS) | 958 #endif // defined(OS_CHROMEOS) |
| 906 | 959 |
| 907 return true; | 960 return true; |
| 908 } | 961 } |
| 909 | 962 |
| 910 void AddMountFunction::GrantFilePermissionsToHost(const FilePath& path, | |
| 911 int permissions) { | |
| 912 ChildProcessSecurityPolicy::GetInstance()->GrantPermissionsForFile( | |
| 913 render_view_host()->GetProcess()->GetID(), path, permissions); | |
| 914 } | |
| 915 | |
| 916 void AddMountFunction::AddGDataMountPoint() { | |
| 917 fileapi::ExternalFileSystemMountPointProvider* provider = | |
| 918 BrowserContext::GetFileSystemContext(profile_)->external_provider(); | |
| 919 const FilePath mount_point = gdata::util::GetGDataMountPointPath(); | |
| 920 if (!provider || provider->HasMountPoint(mount_point)) | |
| 921 return; | |
| 922 | |
| 923 // Grant R/W permissions to gdata 'folder'. File API layer still | |
| 924 // expects this to be satisfied. | |
| 925 GrantFilePermissionsToHost(mount_point, | |
| 926 file_handler_util::GetReadWritePermissions()); | |
| 927 | |
| 928 // Grant R/W permission for tmp and pinned cache folder. | |
| 929 gdata::GDataSystemService* system_service = | |
| 930 gdata::GDataSystemServiceFactory::GetForProfile(profile_); | |
| 931 DCHECK(system_service); | |
| 932 gdata::GDataFileSystem* gdata_file_system = system_service->file_system(); | |
| 933 | |
| 934 // We check permissions for raw cache file paths only for read-only | |
| 935 // operations (when fileEntry.file() is called), so read only permissions | |
| 936 // should be sufficient for all cache paths. For the rest of supported | |
| 937 // operations the file access check is done for gdata/ paths. | |
| 938 GrantFilePermissionsToHost(gdata_file_system->GetGDataCacheTmpDirectory(), | |
| 939 file_handler_util::GetReadOnlyPermissions()); | |
| 940 GrantFilePermissionsToHost( | |
| 941 gdata_file_system->GetGDataCachePersistentDirectory(), | |
| 942 file_handler_util::GetReadOnlyPermissions()); | |
| 943 | |
| 944 provider->AddRemoteMountPoint( | |
| 945 mount_point, | |
| 946 new gdata::GDataFileSystemProxy(gdata_file_system)); | |
| 947 | |
| 948 FilePath mount_point_virtual; | |
| 949 if (provider->GetVirtualPath(mount_point, &mount_point_virtual)) | |
| 950 provider->GrantFileAccessToExtension(extension_id(), mount_point_virtual); | |
| 951 } | |
| 952 | |
| 953 void AddMountFunction::RaiseGDataMountEvent(gdata::GDataErrorCode error) { | 963 void AddMountFunction::RaiseGDataMountEvent(gdata::GDataErrorCode error) { |
| 954 chromeos::MountError error_code = error == gdata::HTTP_SUCCESS ? | 964 chromeos::MountError error_code = error == gdata::HTTP_SUCCESS ? |
| 955 chromeos::MOUNT_ERROR_NONE : chromeos::MOUNT_ERROR_NOT_AUTHENTICATED; | 965 chromeos::MOUNT_ERROR_NONE : chromeos::MOUNT_ERROR_NOT_AUTHENTICATED; |
| 956 DiskMountManager::MountPointInfo mount_info( | 966 DiskMountManager::MountPointInfo mount_info( |
| 957 gdata::util::GetGDataMountPointPathAsString(), | 967 gdata::util::GetGDataMountPointPathAsString(), |
| 958 gdata::util::GetGDataMountPointPathAsString(), | 968 gdata::util::GetGDataMountPointPathAsString(), |
| 959 chromeos::MOUNT_TYPE_GDATA, | 969 chromeos::MOUNT_TYPE_GDATA, |
| 960 chromeos::disks::MOUNT_CONDITION_NONE); | 970 chromeos::disks::MOUNT_CONDITION_NONE); |
| 961 // Raise mount event | 971 // Raise mount event |
| 962 FileBrowserEventRouterFactory::GetForProfile(profile_)-> | 972 FileBrowserEventRouterFactory::GetForProfile(profile_)-> |
| 963 MountCompleted(DiskMountManager::MOUNTING, error_code, mount_info); | 973 MountCompleted(DiskMountManager::MOUNTING, error_code, mount_info); |
| 964 } | 974 } |
| 965 | 975 |
| 966 void AddMountFunction::OnGDataAuthentication(gdata::GDataErrorCode error, | 976 void AddMountFunction::OnGDataAuthentication(gdata::GDataErrorCode error, |
| 967 const std::string& token) { | 977 const std::string& token) { |
| 968 if (error == gdata::HTTP_SUCCESS) | |
| 969 AddGDataMountPoint(); | |
| 970 | |
| 971 RaiseGDataMountEvent(error); | 978 RaiseGDataMountEvent(error); |
| 972 SendResponse(true); | 979 SendResponse(true); |
| 973 } | 980 } |
| 974 | 981 |
| 975 void AddMountFunction::GetLocalPathsResponseOnUIThread( | 982 void AddMountFunction::GetLocalPathsResponseOnUIThread( |
| 976 const std::string& mount_type_str, | 983 const std::string& mount_type_str, |
| 977 const SelectedFileInfoList& files) { | 984 const SelectedFileInfoList& files) { |
| 978 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 985 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 979 | 986 |
| 980 if (!files.size()) { | 987 if (!files.size()) { |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1436 SET_STRING(IDS_FILE_BROWSER, TAR_GZIP_ARCHIVE_FILE_TYPE); | 1443 SET_STRING(IDS_FILE_BROWSER, TAR_GZIP_ARCHIVE_FILE_TYPE); |
| 1437 SET_STRING(IDS_FILE_BROWSER, PLAIN_TEXT_FILE_TYPE); | 1444 SET_STRING(IDS_FILE_BROWSER, PLAIN_TEXT_FILE_TYPE); |
| 1438 SET_STRING(IDS_FILE_BROWSER, PDF_DOCUMENT_FILE_TYPE); | 1445 SET_STRING(IDS_FILE_BROWSER, PDF_DOCUMENT_FILE_TYPE); |
| 1439 SET_STRING(IDS_FILE_BROWSER, WORD_DOCUMENT_FILE_TYPE); | 1446 SET_STRING(IDS_FILE_BROWSER, WORD_DOCUMENT_FILE_TYPE); |
| 1440 SET_STRING(IDS_FILE_BROWSER, POWERPOINT_PRESENTATION_FILE_TYPE); | 1447 SET_STRING(IDS_FILE_BROWSER, POWERPOINT_PRESENTATION_FILE_TYPE); |
| 1441 SET_STRING(IDS_FILE_BROWSER, EXCEL_FILE_TYPE); | 1448 SET_STRING(IDS_FILE_BROWSER, EXCEL_FILE_TYPE); |
| 1442 | 1449 |
| 1443 SET_STRING(IDS_FILE_BROWSER, GDOC_DOCUMENT_FILE_TYPE); | 1450 SET_STRING(IDS_FILE_BROWSER, GDOC_DOCUMENT_FILE_TYPE); |
| 1444 SET_STRING(IDS_FILE_BROWSER, GSHEET_DOCUMENT_FILE_TYPE); | 1451 SET_STRING(IDS_FILE_BROWSER, GSHEET_DOCUMENT_FILE_TYPE); |
| 1445 SET_STRING(IDS_FILE_BROWSER, GSLIDES_DOCUMENT_FILE_TYPE); | 1452 SET_STRING(IDS_FILE_BROWSER, GSLIDES_DOCUMENT_FILE_TYPE); |
| 1446 SET_STRING(IDS_FILE_BROWSER, GSLIDES_DOCUMENT_FILE_TYPE); | 1453 SET_STRING(IDS_FILE_BROWSER, GDRAW_DOCUMENT_FILE_TYPE); |
| 1447 SET_STRING(IDS_FILE_BROWSER, GTABLE_DOCUMENT_FILE_TYPE); | 1454 SET_STRING(IDS_FILE_BROWSER, GTABLE_DOCUMENT_FILE_TYPE); |
| 1448 | 1455 |
| 1456 |
| 1449 SET_STRING(IDS_FILE_BROWSER, AUDIO_PLAYER_TITLE); | 1457 SET_STRING(IDS_FILE_BROWSER, AUDIO_PLAYER_TITLE); |
| 1450 #undef SET_STRING | 1458 #undef SET_STRING |
| 1451 | 1459 |
| 1452 dict->SetString("PDF_VIEW_ENABLED", | 1460 dict->SetString("PDF_VIEW_ENABLED", |
| 1453 file_manager_util::ShouldBeOpenedWithPdfPlugin(".pdf") ? | 1461 file_manager_util::ShouldBeOpenedWithPdfPlugin(".pdf") ? |
| 1454 "true" : "false"); | 1462 "true" : "false"); |
| 1455 | 1463 |
| 1456 ChromeURLDataManager::DataSource::SetFontAndTextDirection(dict); | 1464 ChromeURLDataManager::DataSource::SetFontAndTextDirection(dict); |
| 1457 | 1465 |
| 1458 if (!profile_->GetPrefs()->GetBoolean(prefs::kDisableGData)) | 1466 if (!profile_->GetPrefs()->GetBoolean(prefs::kDisableGData)) |
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1898 local_source_file, | 1906 local_source_file, |
| 1899 remote_destination_file, | 1907 remote_destination_file, |
| 1900 base::Bind(&TransferFileFunction::OnTransferCompleted, | 1908 base::Bind(&TransferFileFunction::OnTransferCompleted, |
| 1901 this)); | 1909 this)); |
| 1902 } | 1910 } |
| 1903 | 1911 |
| 1904 void TransferFileFunction::OnTransferCompleted( | 1912 void TransferFileFunction::OnTransferCompleted( |
| 1905 base::PlatformFileError error) { | 1913 base::PlatformFileError error) { |
| 1906 SendResponse(error == base::PLATFORM_FILE_OK); | 1914 SendResponse(error == base::PLATFORM_FILE_OK); |
| 1907 } | 1915 } |
| OLD | NEW |