Skip to content

Conversation

@danxuliu
Copy link
Member

Fixes #11180

When the uploaded files have a relative path (that is, when a folder is uploaded) it is first ensured that all the parent folders exist, which is done by trying to create them. When a folder is created in the currently opened folder the file list is updated and a row for the new folder is added. However, this was done too when the folder already existed, which caused the previous row to be removed and a new one added to replace it.

For security reasons, some special headers need to be set in requests; this is done automatically for jQuery by handling the ajaxSend event in the document. In the case of DAV requests, if the headers are not set the server rejects the request with "CSRF check not passed".

When a file or folder is dropped on a folder row the jQuery upload events are chained from the initial drop event, which has the row as its target. In order to upload the file jQuery performs a request, which triggers the ajaxSend event in the row; this event then bubbles up to the document, which is then handled by adding the special headers to the request (hopefully you do not mind that I have spared you the links to jQuery's guts; I have been there, it behaves as I have explained :-P ).

However, when a folder was dropped on a folder row that folder row was removed when ensuring that the folder exists. The jQuery upload events were still triggered on the row, but as it had been removed it had no parent nodes, and thus the events did not bubble up. Due to this the ajaxSend event never reached the document when triggered on the removed row, the headers were not set, and the upload failed.

All this is simply fixed by not removing the folder row when trying to create it if it existed already.

I have also noticed some issues with the Uploading N files text shown in a folder row, but that is something for another pull request.

When the uploaded files have a relative path (that is, when a folder is
uploaded) it is first ensured that all the parent folders exist, which
is done by trying to create them. When a folder is created in the
currently opened folder the file list is updated and a row for the new
folder is added. However, this was done too when the folder already
existed, which caused the previous row to be removed and a new one added
to replace it.

For security reasons, some special headers need to be set in requests;
this is done automatically for jQuery by handling the "ajaxSend" event
in the document. In the case of DAV requests, if the headers are not set
the server rejects the request with "CSRF check not passed".

When a file or folder is dropped on a folder row the jQuery upload
events are chained from the initial drop event, which has the row as its
target. In order to upload the file jQuery performs a request, which
triggers the "ajaxSend" event in the row; this event then bubbles up to
the document, which is then handled by adding the special headers to the
request.

However, when a folder was dropped on a folder row that folder row was
removed when ensuring that the folder exists. The jQuery upload events
were still triggered on the row, but as it had been removed it had no
parent nodes, and thus the events did not bubble up. Due to this the
"ajaxSend" event never reached the document when triggered on the
removed row, the headers were not set, and the upload failed.

All this is simply fixed by not removing the folder row when trying to
create it if it existed already.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
@danxuliu
Copy link
Member Author

/backport to stable15

@danxuliu
Copy link
Member Author

/backport to stable14

@danxuliu
Copy link
Member Author

/backport to stable13

Copy link
Member

@ChristophWurst ChristophWurst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested and works! Thanks a lot for looking into this 🙌

Copy link
Member

@MorrisJobke MorrisJobke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code makes sense 👍

@MorrisJobke MorrisJobke added 4. to release Ready to be released and/or waiting for tests to finish and removed 3. to review Waiting for reviews labels Jan 29, 2019
@rullzer rullzer merged commit 050b913 into master Jan 29, 2019
@rullzer rullzer deleted the fix-dropping-a-folder-on-a-folder-row branch January 29, 2019 14:44
@backportbot-nextcloud
Copy link

backport to stable15 in #13887

@backportbot-nextcloud
Copy link

backport to stable14 in #13888

@backportbot-nextcloud
Copy link

backport to stable13 in #13889

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

4. to release Ready to be released and/or waiting for tests to finish bug feature: files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CSRF check not passed message when dragging folders into Nextcloud 13 Web interface

5 participants