Skip to content
  • Martijn Schmidt's avatar
    KIOGDrive::copy - resolve the destGDriveUrl's new parent into a destDirId... · f89c3f7f
    Martijn Schmidt authored and Elvis Angelaccio's avatar Elvis Angelaccio committed
    KIOGDrive::copy - resolve the destGDriveUrl's new parent into a destDirId before passing it to FileCopyJob in src/kio_gdrive.cpp
    
    Summary:
    KIOGDrive::copy doesn't resolve the destGDriveUrl's new parent into a destDirId before passing it to FileCopyJob, which means it'll be sending an illegal request body to the Google Drive API - for example:
    
    ```{
       \"editable\":false,
       \"kind\":\"drive#file\",
       \"lastViewedByMeDate\":   \"2018-01-10T19:38:11   Z\",
       \"modifiedDate\":   \"2018-01-10T19:38:11   Z\",
       \"parents\":[
          {
             \"id\":\"testfoldertwo\"
          }
       ],
       \"title\":\"yetanothertestfile.txt\"
    }```
    
    The "id" field should contain a valid parent ID rather than an originalFilename, and this patch resolves the right parent ID in one of two ways:
    
    - If the target folder of the copy command is the root of the GDrive, resolve the rootFolderId from the destAccountId.
    - If the target folder of the copy command is any other directory on the GDrive, resolve the fileId of the destGDriveUrl's parentPath.
    
    The resulting parent ID is passed to FileCopyJob as the parent of the new cloned file, which then successfully processes the API call.
    
    BUG: 376735
    FIXED-IN: 1.2.2
    
    Test Plan:
    This bug is triggered whenever `KIOGDrive::copy` is called:
    
    1. Try to copy a file from a random folder on the GDrive to the root folder of the GDrive.
    
    2. Try to copy a file from a random folder on the GDrive to another random non-root folder on the GDrive.
    
    3. Try to copy a file from a random folder on the GDrive to the same random folder on the GDrive, which creates another fileId with an identical originalFilename within that same folder.
    
    In all three cases, the FileCopyJob should succeed rather than throwing an error because the destination doesn't exist.
    
    Copying a file from a non-GDrive source into a destination on the GDrive uses `KIOGDrive::put` + `KIOGDrive::putCreate`, and copying a file from a GDrive source into a non-GDrive destination uses `KIOGDrive::get`, which is why the bug isn't triggered in these scenarios.
    
    Reviewers: #kio_gdrive, elvisangelaccio, dvratil
    
    Reviewed By: #kio_gdrive, elvisangelaccio
    
    Subscribers: elvisangelaccio, #kio_gdrive, martijnschmidt
    
    Tags: #kio_gdrive
    
    Differential Revision: https://phabricator.kde.org/D9806
    f89c3f7f