| 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_system/file_system_api.h" | 5 #include "chrome/browser/extensions/api/file_system/file_system_api.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 1312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1323 | 1323 |
| 1324 void FileSystemRequestFileSystemFunction::OnConsentReceived( | 1324 void FileSystemRequestFileSystemFunction::OnConsentReceived( |
| 1325 const base::WeakPtr<file_manager::Volume>& volume, | 1325 const base::WeakPtr<file_manager::Volume>& volume, |
| 1326 bool writable, | 1326 bool writable, |
| 1327 ConsentProvider::Consent result) { | 1327 ConsentProvider::Consent result) { |
| 1328 using file_manager::VolumeManager; | 1328 using file_manager::VolumeManager; |
| 1329 using file_manager::Volume; | 1329 using file_manager::Volume; |
| 1330 | 1330 |
| 1331 switch (result) { | 1331 switch (result) { |
| 1332 case ConsentProvider::CONSENT_REJECTED: | 1332 case ConsentProvider::CONSENT_REJECTED: |
| 1333 SetError(kSecurityError); | 1333 Respond(Error(kSecurityError)); |
| 1334 SendResponse(false); | |
| 1335 return; | 1334 return; |
| 1336 | 1335 |
| 1337 case ConsentProvider::CONSENT_IMPOSSIBLE: | 1336 case ConsentProvider::CONSENT_IMPOSSIBLE: |
| 1338 SetError(kConsentImpossible); | 1337 Respond(Error(kConsentImpossible)); |
| 1339 SendResponse(false); | |
| 1340 return; | 1338 return; |
| 1341 | 1339 |
| 1342 case ConsentProvider::CONSENT_GRANTED: | 1340 case ConsentProvider::CONSENT_GRANTED: |
| 1343 break; | 1341 break; |
| 1344 } | 1342 } |
| 1345 | 1343 |
| 1346 if (!volume.get()) { | 1344 if (!volume.get()) { |
| 1347 SetError(kVolumeNotFoundError); | 1345 Respond(Error(kVolumeNotFoundError)); |
| 1348 SendResponse(false); | |
| 1349 return; | 1346 return; |
| 1350 } | 1347 } |
| 1351 | 1348 |
| 1352 const GURL site = | 1349 const GURL site = |
| 1353 util::GetSiteForExtensionId(extension_id(), chrome_details_.GetProfile()); | 1350 util::GetSiteForExtensionId(extension_id(), chrome_details_.GetProfile()); |
| 1354 scoped_refptr<storage::FileSystemContext> file_system_context = | 1351 scoped_refptr<storage::FileSystemContext> file_system_context = |
| 1355 content::BrowserContext::GetStoragePartitionForSite( | 1352 content::BrowserContext::GetStoragePartitionForSite( |
| 1356 chrome_details_.GetProfile(), site)->GetFileSystemContext(); | 1353 chrome_details_.GetProfile(), site)->GetFileSystemContext(); |
| 1357 storage::ExternalFileSystemBackend* const backend = | 1354 storage::ExternalFileSystemBackend* const backend = |
| 1358 file_system_context->external_backend(); | 1355 file_system_context->external_backend(); |
| 1359 DCHECK(backend); | 1356 DCHECK(backend); |
| 1360 | 1357 |
| 1361 base::FilePath virtual_path; | 1358 base::FilePath virtual_path; |
| 1362 if (!backend->GetVirtualPath(volume->mount_path(), &virtual_path)) { | 1359 if (!backend->GetVirtualPath(volume->mount_path(), &virtual_path)) { |
| 1363 SetError(kSecurityError); | 1360 Respond(Error(kSecurityError)); |
| 1364 SendResponse(false); | |
| 1365 return; | 1361 return; |
| 1366 } | 1362 } |
| 1367 | 1363 |
| 1368 storage::IsolatedContext* const isolated_context = | 1364 storage::IsolatedContext* const isolated_context = |
| 1369 storage::IsolatedContext::GetInstance(); | 1365 storage::IsolatedContext::GetInstance(); |
| 1370 DCHECK(isolated_context); | 1366 DCHECK(isolated_context); |
| 1371 | 1367 |
| 1372 const storage::FileSystemURL original_url = | 1368 const storage::FileSystemURL original_url = |
| 1373 file_system_context->CreateCrackedFileSystemURL( | 1369 file_system_context->CreateCrackedFileSystemURL( |
| 1374 GURL(std::string(kExtensionScheme) + url::kStandardSchemeSeparator + | 1370 GURL(std::string(kExtensionScheme) + url::kStandardSchemeSeparator + |
| 1375 extension_id()), | 1371 extension_id()), |
| 1376 storage::kFileSystemTypeExternal, virtual_path); | 1372 storage::kFileSystemTypeExternal, virtual_path); |
| 1377 | 1373 |
| 1378 // Set a fixed register name, as the automatic one would leak the mount point | 1374 // Set a fixed register name, as the automatic one would leak the mount point |
| 1379 // directory. | 1375 // directory. |
| 1380 std::string register_name = "fs"; | 1376 std::string register_name = "fs"; |
| 1381 const std::string file_system_id = | 1377 const std::string file_system_id = |
| 1382 isolated_context->RegisterFileSystemForPath( | 1378 isolated_context->RegisterFileSystemForPath( |
| 1383 storage::kFileSystemTypeNativeForPlatformApp, | 1379 storage::kFileSystemTypeNativeForPlatformApp, |
| 1384 std::string() /* file_system_id */, original_url.path(), | 1380 std::string() /* file_system_id */, original_url.path(), |
| 1385 ®ister_name); | 1381 ®ister_name); |
| 1386 if (file_system_id.empty()) { | 1382 if (file_system_id.empty()) { |
| 1387 SetError(kSecurityError); | 1383 Respond(Error(kSecurityError)); |
| 1388 SendResponse(false); | |
| 1389 return; | 1384 return; |
| 1390 } | 1385 } |
| 1391 | 1386 |
| 1392 backend->GrantFileAccessToExtension(extension_->id(), virtual_path); | 1387 backend->GrantFileAccessToExtension(extension_->id(), virtual_path); |
| 1393 | 1388 |
| 1394 // Grant file permissions to the renderer hosting component. | 1389 // Grant file permissions to the renderer hosting component. |
| 1395 content::ChildProcessSecurityPolicy* policy = | 1390 content::ChildProcessSecurityPolicy* policy = |
| 1396 content::ChildProcessSecurityPolicy::GetInstance(); | 1391 content::ChildProcessSecurityPolicy::GetInstance(); |
| 1397 DCHECK(policy); | 1392 DCHECK(policy); |
| 1398 | 1393 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1413 policy->GrantDeleteFromFileSystem( | 1408 policy->GrantDeleteFromFileSystem( |
| 1414 render_frame_host()->GetProcess()->GetID(), file_system_id); | 1409 render_frame_host()->GetProcess()->GetID(), file_system_id); |
| 1415 policy->GrantCreateFileForFileSystem( | 1410 policy->GrantCreateFileForFileSystem( |
| 1416 render_frame_host()->GetProcess()->GetID(), file_system_id); | 1411 render_frame_host()->GetProcess()->GetID(), file_system_id); |
| 1417 } | 1412 } |
| 1418 | 1413 |
| 1419 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 1414 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 1420 dict->SetString("file_system_id", file_system_id); | 1415 dict->SetString("file_system_id", file_system_id); |
| 1421 dict->SetString("file_system_path", register_name); | 1416 dict->SetString("file_system_path", register_name); |
| 1422 | 1417 |
| 1423 SetResult(std::move(dict)); | 1418 Respond(OneArgument(std::move(dict))); |
| 1424 SendResponse(true); | |
| 1425 } | 1419 } |
| 1426 | 1420 |
| 1427 FileSystemGetVolumeListFunction::FileSystemGetVolumeListFunction() | 1421 FileSystemGetVolumeListFunction::FileSystemGetVolumeListFunction() |
| 1428 : chrome_details_(this) { | 1422 : chrome_details_(this) { |
| 1429 } | 1423 } |
| 1430 | 1424 |
| 1431 FileSystemGetVolumeListFunction::~FileSystemGetVolumeListFunction() { | 1425 FileSystemGetVolumeListFunction::~FileSystemGetVolumeListFunction() { |
| 1432 } | 1426 } |
| 1433 | 1427 |
| 1434 ExtensionFunction::ResponseAction FileSystemGetVolumeListFunction::Run() { | 1428 ExtensionFunction::ResponseAction FileSystemGetVolumeListFunction::Run() { |
| 1435 // Only kiosk apps in kiosk sessions can use this API. | 1429 // Only kiosk apps in kiosk sessions can use this API. |
| 1436 // Additionally it is enabled for whitelisted component extensions and apps. | 1430 // Additionally it is enabled for whitelisted component extensions and apps. |
| 1437 file_system_api::ConsentProviderDelegate consent_provider_delegate( | 1431 file_system_api::ConsentProviderDelegate consent_provider_delegate( |
| 1438 chrome_details_.GetProfile(), render_frame_host()); | 1432 chrome_details_.GetProfile(), render_frame_host()); |
| 1439 file_system_api::ConsentProvider consent_provider(&consent_provider_delegate); | 1433 file_system_api::ConsentProvider consent_provider(&consent_provider_delegate); |
| 1440 | 1434 |
| 1441 if (!consent_provider.IsGrantable(*extension())) | 1435 if (!consent_provider.IsGrantable(*extension())) |
| 1442 return RespondNow(Error(kNotSupportedOnNonKioskSessionError)); | 1436 return RespondNow(Error(kNotSupportedOnNonKioskSessionError)); |
| 1443 std::vector<api::file_system::Volume> result_volume_list; | 1437 std::vector<api::file_system::Volume> result_volume_list; |
| 1444 FillVolumeList(chrome_details_.GetProfile(), &result_volume_list); | 1438 FillVolumeList(chrome_details_.GetProfile(), &result_volume_list); |
| 1445 | 1439 |
| 1446 return RespondNow(ArgumentList( | 1440 return RespondNow(ArgumentList( |
| 1447 api::file_system::GetVolumeList::Results::Create(result_volume_list))); | 1441 api::file_system::GetVolumeList::Results::Create(result_volume_list))); |
| 1448 } | 1442 } |
| 1449 #endif | 1443 #endif |
| 1450 | 1444 |
| 1451 } // namespace extensions | 1445 } // namespace extensions |
| OLD | NEW |