| Index: chrome/browser/drive/fake_drive_service.cc
|
| diff --git a/chrome/browser/drive/fake_drive_service.cc b/chrome/browser/drive/fake_drive_service.cc
|
| index e8e02add61666ddfa6f806b8d6a4619cd65582bd..a38fa47b7ad80d7b975053d87342c44ee5c55046 100644
|
| --- a/chrome/browser/drive/fake_drive_service.cc
|
| +++ b/chrome/browser/drive/fake_drive_service.cc
|
| @@ -50,6 +50,7 @@ using google_apis::GetContentCallback;
|
| using google_apis::GetShareUrlCallback;
|
| using google_apis::HTTP_BAD_REQUEST;
|
| using google_apis::HTTP_CREATED;
|
| +using google_apis::HTTP_FORBIDDEN;
|
| using google_apis::HTTP_NOT_FOUND;
|
| using google_apis::HTTP_NO_CONTENT;
|
| using google_apis::HTTP_PRECONDITION;
|
| @@ -131,12 +132,30 @@ void FileListCallbackAdapter(const FileListCallback& callback,
|
| callback.Run(error, file_list.Pass());
|
| }
|
|
|
| +bool UserHasWriteAccess(google_apis::drive::PermissionRole user_permission) {
|
| + switch (user_permission) {
|
| + case google_apis::drive::PERMISSION_ROLE_OWNER:
|
| + case google_apis::drive::PERMISSION_ROLE_WRITER:
|
| + return true;
|
| + case google_apis::drive::PERMISSION_ROLE_READER:
|
| + case google_apis::drive::PERMISSION_ROLE_COMMENTER:
|
| + break;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| } // namespace
|
|
|
| struct FakeDriveService::EntryInfo {
|
| + EntryInfo() : user_permission(google_apis::drive::PERMISSION_ROLE_OWNER) {}
|
| +
|
| google_apis::ChangeResource change_resource;
|
| GURL share_url;
|
| std::string content_data;
|
| +
|
| + // Behaves in the same way as "userPermission" described in
|
| + // https://developers.google.com/drive/v2/reference/files
|
| + google_apis::drive::PermissionRole user_permission;
|
| };
|
|
|
| struct FakeDriveService::UploadSession {
|
| @@ -609,6 +628,12 @@ CancelCallback FakeDriveService::DeleteResource(
|
| return CancelCallback();
|
| }
|
|
|
| + if (entry->user_permission != google_apis::drive::PERMISSION_ROLE_OWNER) {
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE, base::Bind(callback, HTTP_FORBIDDEN));
|
| + return CancelCallback();
|
| + }
|
| +
|
| change->set_deleted(true);
|
| AddNewChangestamp(change);
|
| change->set_file(scoped_ptr<FileResource>());
|
| @@ -641,6 +666,9 @@ CancelCallback FakeDriveService::TrashResource(
|
| GDataErrorCode error = google_apis::GDATA_OTHER_ERROR;
|
| if (change->is_deleted() || file->labels().is_trashed()) {
|
| error = HTTP_NOT_FOUND;
|
| + } else if (entry->user_permission !=
|
| + google_apis::drive::PERMISSION_ROLE_OWNER) {
|
| + error = HTTP_FORBIDDEN;
|
| } else {
|
| file->mutable_labels()->set_trashed(true);
|
| AddNewChangestamp(change);
|
| @@ -814,6 +842,14 @@ CancelCallback FakeDriveService::UpdateResource(
|
|
|
| EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| if (entry) {
|
| + if (!UserHasWriteAccess(entry->user_permission)) {
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(callback, HTTP_FORBIDDEN,
|
| + base::Passed(scoped_ptr<FileResource>())));
|
| + return CancelCallback();
|
| + }
|
| +
|
| ChangeResource* change = &entry->change_resource;
|
| FileResource* file = change->mutable_file();
|
|
|
| @@ -1000,6 +1036,13 @@ CancelCallback FakeDriveService::InitiateUploadExistingFile(
|
| return CancelCallback();
|
| }
|
|
|
| + if (!UserHasWriteAccess(entry->user_permission)) {
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(callback, HTTP_FORBIDDEN, GURL()));
|
| + return CancelCallback();
|
| + }
|
| +
|
| FileResource* file = entry->change_resource.mutable_file();
|
| if (!options.etag.empty() && options.etag != file->etag()) {
|
| base::MessageLoop::current()->PostTask(
|
| @@ -1316,6 +1359,19 @@ void FakeDriveService::SetLastModifiedTime(
|
| base::Passed(make_scoped_ptr(new FileResource(*file)))));
|
| }
|
|
|
| +google_apis::GDataErrorCode FakeDriveService::SetUserPermission(
|
| + const std::string& resource_id,
|
| + google_apis::drive::PermissionRole user_permission) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + EntryInfo* entry = FindEntryByResourceId(resource_id);
|
| + if (!entry)
|
| + return HTTP_NOT_FOUND;
|
| +
|
| + entry->user_permission = user_permission;
|
| + return HTTP_SUCCESS;
|
| +}
|
| +
|
| FakeDriveService::EntryInfo* FakeDriveService::FindEntryByResourceId(
|
| const std::string& resource_id) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|