Bug? New IOS update fails to sync on WebDav connection

Joplin Version: 10.0.39 (IOS)
OS: IOS 13.2.2

Hello.

I upgraded the Joplin IOS app on my iPhone to the latest version yesterday (10.0.39).
Ran sync which then failed with error (log attched)

The authorisation credentials were working previously to the update. When I run ‘check synchronisation configuration’ this comes back as ok.

I dont think this is a WebDav server issue as I can still sync to the WebDav connection on my iPad (still on previous version of app)

Maybe Apache is denying access to this hidden file? Is there some config parameter you can set somewhere to fix this?

I’m planning to make all these folders non-hidden to avoid these issues but for now you might have to tweak the config.

Thanks for your quick response Laurent. I eventually copied the files over to my OneDrive account, which I believe is interfaced through the API in Joplin rather than webdav. All running okay now.

Have same issue on IOS after update. On Windows and Ubuntu all works fine.

Do you have a test user I could use to try to fix this issue?

You need pcloud acc?
Just created new pcloud account and reinstall Joplin on ios. Have the same issue it doesn’t want to sync default Joplin’s notes. It used to work before last update.

Tried dropbox. It works just fine.
Also tried webdav.yandex.com works well too.

Maybe pCloud blocks the new user agent string?

I'm having the same issue with iOS update v10.0.39, but I think I see what the problem might be in my Apache logs:

xx.xxx.xx.xxx - myuserid [14/Nov/2019:12:39:53 -0700] "MKCOL /Joplin/.sync/ HTTP/1.1" 405 239
xx.xxx.xx.xxx - myuserid [14/Nov/2019:12:39:53 -0700] "MKCOL /Joplin/.lock/ HTTP/1.1" 405 239
xx.xxx.xx.xxx - myuserid [14/Nov/2019:12:39:53 -0700] "MKCOL /Joplin/.resource/ HTTP/1.1" 405 243
xx.xxx.xx.xxx - - [14/Nov/2019:12:39:53 -0700] "PROPFIND /Joplin/.lock/ HTTP/1.1" 401 381
xx.xxx.xx.xxx - - [14/Nov/2019:12:39:53 -0700] "PROPFIND /Joplin/.lock/ HTTP/1.1" 401 381
xx.xxx.xx.xxx - - [14/Nov/2019:12:39:57 -0700] "PROPFIND /Joplin/.lock/ HTTP/1.1" 401 381
xx.xxx.xx.xxx - - [14/Nov/2019:12:39:57 -0700] "PROPFIND /Joplin/.lock/ HTTP/1.1" 401 381
xx.xxx.xx.xxx - - [14/Nov/2019:12:40:04 -0700] "PROPFIND /Joplin/.lock/ HTTP/1.1" 401 381
xx.xxx.xx.xxx - - [14/Nov/2019:12:40:04 -0700] "PROPFIND /Joplin/.lock/ HTTP/1.1" 401 381
xx.xxx.xx.xxx - - [14/Nov/2019:12:40:14 -0700] "PROPFIND /Joplin/.lock/ HTTP/1.1" 401 381
xx.xxx.xx.xxx - - [14/Nov/2019:12:40:14 -0700] "PROPFIND /Joplin/.lock/ HTTP/1.1" 401 381

Notice that the PROPFINDs do not include the user credentials, and hence Apache's mod_webdav returns a 401 error.

I hope this helps...Joplin is an excellent notetaking and todo list app, and when small bugs like this crop up, it makes me realize how much I depend on it! :slight_smile:

I’m using 10.0.39 on iPadOS 13.1.3 and my connection still works. Also, btw, here are my Apache logs, and there’s no user at all in them.

LogFormat "%h %u [%{%F %T}t.%{usec_frac}t %{%z}t] \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

(I filter out PROPFIND in my logs, because they hammer my logs like crazy…)

10.0.37

X.X.X.X - [2019-11-16 00:20:01.946036 +0100] "MKCOL /remote.php/webdav/Joplin/.sync/ HTTP/2.0" 405 247 "-" "Joplin/37 CFNetwork/1107.1 Darwin/19.0.0"
X.X.X.X - [2019-11-16 00:20:03.292134 +0100] "MKCOL /remote.php/webdav/Joplin/.resource/ HTTP/2.0" 405 247 "-" "Joplin/37 CFNetwork/1107.1 Darwin/19.0.0"

10.0.39

X.X.X.X - [2019-11-16 00:22:11.269866 +0100] "MKCOL /remote.php/webdav/Joplin/.sync/ HTTP/2.0" 405 247 "-" "Joplin/1.0"
X.X.X.X - [2019-11-16 00:22:11.799728 +0100] "MKCOL /remote.php/webdav/Joplin/.lock/ HTTP/2.0" 405 247 "-" "Joplin/1.0"
X.X.X.X - [2019-11-16 00:22:12.300188 +0100] "MKCOL /remote.php/webdav/Joplin/.resource/ HTTP/2.0" 405 247 "-" "Joplin/1.0"
X.X.X.X - [2019-11-16 00:22:13.330114 +0100] "GET /remote.php/webdav/Joplin/.sync/version.txt HTTP/2.0" 200 1 "-" "Joplin/1.0"
X.X.X.X - [2019-11-16 00:22:13.825881 +0100] "PUT /remote.php/webdav/Joplin/.sync/version.txt HTTP/2.0" 204 - "-" "Joplin/1.0"

The only thing I noticed were 2 vs 5 requests though (propfind not counted, since I don’t see them in my logs).

@tessus: Do you have authentication configured in your httpd-dav.conf?

I’m using Nextcloud, which uses WebDAV in the backend. I do not use Apache’s WebDAV module directly. Maybe there’s a difference, although Joplin uses the the same WebDAV code for Nextcloud as for direct WebDAV access.

I see. In your Joplin configuration (synchronization section), do you have a WebDAV username or password configured? Or are they empty?

They are set. I have never even tried, whether it would work without credentials. (I think Joplin would error out.) Not sure, if there's anyone who uses a server without credentials. Well, there are people who use http, which is basically the same thing.

OK cool, perhaps it is something a little different from the basic Auth that Apache’s mod_dav uses. Otherwise, your userid should show up in the %u field in your logs.

@laurent: I’ll try turning on mod_dumpio to see if I can grab the full request/response.

I should note that the latest Windows version (.174?) works fine, and sends the userid as expected. It’s only the iOS version (.39) that doesn’t seem to be sending it, at least for me and a few others. This is specific to the PROPFIND /.lock/ request, incidentally. Apache (correctly) denies the request with a 401, so Joplin cannot get any further in the sync process.

Apologies for the delay; work has been crazy this week…

Using mod_dumpio, I was able to determine that the iOS app (v10.0.39) is not sending the authorization header when issuing the PROPFIND request for the newly-introduced .lock/ directory, and this prevents the synchronization from completing. The Windows desktop application (v1.0.174) does include the authorization header, and hence synchronizes just fine. Here are my logs, showing both the desktop and iOS versions of Joplin issuing the PROPFIND request:
Joplin (Windows) v1.0.174:

mod_dumpio: dumpio_in (data-HEAP): 37 bytes
mod_dumpio: dumpio_in (data-HEAP): PROPFIND /fs/Joplin/.lock/ HTTP/1.1\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio: dumpio_in (data-HEAP): 10 bytes
mod_dumpio: dumpio_in (data-HEAP): depth: 1\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio: dumpio_in (data-HEAP): 39 bytes
mod_dumpio: dumpio_in (data-HEAP): authorization: Basic XXXXXXXXXXXXXXXXXX\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio: dumpio_in (data-HEAP): 35 bytes
mod_dumpio: dumpio_in (data-HEAP): if-none-match: JoplinIgnore-71950\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio: dumpio_in (data-HEAP): 24 bytes
mod_dumpio: dumpio_in (data-HEAP): user-agent: Joplin/1.0\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio: dumpio_in (data-HEAP): 21 bytes
mod_dumpio: dumpio_in (data-HEAP): content-length: 190\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio: dumpio_in (data-HEAP): 31 bytes
mod_dumpio: dumpio_in (data-HEAP): accept-encoding: gzip,deflate\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio: dumpio_in (data-HEAP): 19 bytes
mod_dumpio: dumpio_in (data-HEAP): connection: close\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio: dumpio_in (data-HEAP): 13 bytes
mod_dumpio: dumpio_in (data-HEAP): accept: /\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio: dumpio_in (data-HEAP): 24 bytes
mod_dumpio: dumpio_in (data-HEAP): Host: xxxx.xxxx.xxx\r\n
mod_dumpio: dumpio_in [getline-blocking] 0 readbytes
mod_dumpio: dumpio_in (data-HEAP): 2 bytes
mod_dumpio: dumpio_in (data-HEAP): \r\n
mod_dumpio: dumpio_in [readbytes-blocking] 190 readbytes
mod_dumpio: dumpio_in (data-HEAP): 190 bytes
mod_dumpio: dumpio_in (data-HEAP): <?xml version="1.0" encoding="UTF-8"?>\n\t\t\t<d:propfind xmlns:d=“DAV:”>\n\t\t\t\t<d:prop xmlns:oc=“http://owncloud.org/ns”>\n\t\t\t\t\t<d:getlastmodified/><d:resourcetype/>\n\t\t\t\t</d:prop>\n\t\t\t</d:propfind>
mod_dumpio: dumpio_out
mod_dumpio: dumpio_out (data-HEAP): 178 bytes
mod_dumpio: dumpio_out (data-HEAP): HTTP/1.1 207 Multi-Status\r\nDate: Mon, 18 Nov 2019 15:42:14 GMT\r\nServer: Apache/2.4.23 (Win32)\r\nContent-Length: 468\r\nConnection: close\r\nContent-Type: text/xml; charset=“utf-8”\r\n\r\n
mod_dumpio: dumpio_out
mod_dumpio: dumpio_out (data-HEAP): 468 bytes
mod_dumpio: dumpio_out (data-HEAP): <?xml version="1.0" encoding="utf-8"?>\n<D:multistatus xmlns:D=“DAV:” xmlns:ns1=“http://owncloud.org/ns” xmlns:ns0=“DAV:”>\n<D:response xmlns:lp1=“DAV:” xmlns:lp2=“http://apache.org/dav/props/”>\n<D:href>/fs/Joplin/.lock/</D:href>\n<D:propstat>\n<D:prop>\nlp1:getlastmodifiedThu, 14 Nov 2019 19:20:57 GMT</lp1:getlastmodified>\nlp1:resourcetype<D:collection/></lp1:resourcetype>\n</D:prop>\n<D:status>HTTP/1.1 200 OK</D:status>\n</D:propstat>\n</D:response>\n</D:multistatus>\n
[Mon Nov 18 08:42:14.659500 2019] [dumpio:trace7] [pid 3056:tid 1272] mod_dumpio.c(58): [client 68.106.51.102:49811] mod_dumpio: dumpio_out (metadata-EOS): 0 bytes


Joplin (iOS) v10.0.39:

dumpio_in (data-HEAP): 37 bytes
dumpio_in (data-HEAP): PROPFIND /fs/Joplin/.lock/ HTTP/1.1\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 24 bytes
dumpio_in (data-HEAP): Host: xxxx.xxxx.xxx\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 40 bytes
dumpio_in (data-HEAP): Content-Type: text/plain;charset=UTF-8\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 13 bytes
dumpio_in (data-HEAP): Accept: /\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 32 bytes
dumpio_in (data-HEAP): Accept-Encoding: gzip, deflate\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 24 bytes
dumpio_in (data-HEAP): Connection: keep-alive\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 35 bytes
dumpio_in (data-HEAP): If-None-Match: JoplinIgnore-41905\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 10 bytes
dumpio_in (data-HEAP): depth: 1\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 24 bytes
dumpio_in (data-HEAP): User-Agent: Joplin/1.0\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 21 bytes
dumpio_in (data-HEAP): Content-Length: 190\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 24 bytes
dumpio_in (data-HEAP): Accept-Language: en-us\r\n
dumpio_in [getline-blocking] 0 readbytes
dumpio_in (data-HEAP): 2 bytes
dumpio_in (data-HEAP): \r\n
dumpio_in [readbytes-blocking] 190 readbytes
dumpio_in (data-HEAP): 190 bytes
dumpio_in (data-HEAP): <?xml version="1.0" encoding="UTF-8"?>\n\t\t\t<d:propfind xmlns:d=“DAV:”>\n\t\t\t\t<d:prop xmlns:oc=“http://owncloud.org/ns”>\n\t\t\t\t\t<d:getlastmodified/><d:resourcetype/>\n\t\t\t\t</d:prop>\n\t\t\t</d:propfind>
dumpio_out
dumpio_out (data-HEAP): 256 bytes
dumpio_out (data-HEAP): HTTP/1.1 401 Unauthorized\r\nDate: Mon, 18 Nov 2019 14:59:05 GMT\r\nServer: Apache/2.4.23 (Win32)\r\nWWW-Authenticate: Basic realm=“dav”\r\nContent-Length: 381\r\nKeep-Alive: timeout=5, max=100\r\nConnection: Keep-Alive\r\nContent-Type: text/html; charset=iso-8859-1\r\n\r\n
dumpio_out
dumpio_out (data-HEAP): 381 bytes
dumpio_out (data-HEAP): \n\n401 Unauthorized\n\n

Unauthorized

\n

This server could not verify that you\nare authorized to access the document\nrequested. Either you supplied the wrong\ncredentials (e.g., bad password), or your\nbrowser doesn’t understand how to supply\nthe credentials required.

\n\n
dumpio_out (metadata-EOS): 0 bytes
dumpio_out
dumpio_out (metadata-EOR): 0 bytes

Note the missing authorization header above. This applies to users who are using basic authentication, obviously. I hope this makes the iOS bug easier to locate!

This is already fixed and the fix will be on the next release.

1 Like

Awesome! Looking forward to this fix…

The fix in 10.0.40 works great, and iOS WebDAV synchronization is working once more!

Thanks again, @laurent!

1 Like

I’m still experiencing issues with 10.0.40. I can’t seem to export a debug report.


I have tried a new setup with an empty database and syncing to a new free Nextcloud provider and that is working for now. So my first guess is that it is something in combination with STACK storage.