[Bug]: macOS 4.0.1 doesnt offer renaming of folder ending with forbidden char
- Dominant language
- C++
- Stars
- 3.9k
- Forks
- 1k
- Avg merge
- 1d 17h
- Merged PRs (30d)
- 123
Description
### ⚠️ Before submitting, please verify the following: ⚠️
- [x] This is a **bug**, not a question or a configuration issue.
- [x] This issue is **not** already reported on Github (I've searched it).
- [x] Nextcloud Server and Desktop Client are **up to date**. See [Server Maintenance and Release Schedule](https://github.com/nextcloud/server/wiki/Maintenance-and-Release-Schedule) and [Desktop Releases](https://nextcloud.com/install/#install-clients) for supported versions.
- [x] I agree to follow Nextcloud's [Code of Conduct](https://nextcloud.com/contribute/code-of-conduct/)
### Bug description
If a macOS desktop client tries to sync a folder ending with a "." (dot) character, the server refuses it with an error but doesn’t offer to rename it (such as a file with a forbidden character in its name).
...
Error transferring https://nextcloud.domain.tld/remote.php/dav/files/username/__groupfoldername/path/to/folderending with a . - server replied: Not Found
### Steps to reproduce
1. set up macOS client 4.0.2 with account
2. Copy a folder ending with a dot character.
3. sync doesn’t happen, renaming is not offered, message isn’t clear for user.
...
example with forbidden filename on linux desktop client
### Expected behavior
When folder name ends with a "." client should offer to rename just like with a forbidden filename.
...
### Which files are affected by this bug
Marché Sub.
### Operating system
macOS
### Which version of the operating system you are running.
23.6.0
### Package
Official macOS Virtual files 12+ universal pkg
### Nextcloud Server version
31.0.9
### Nextcloud Desktop Client version
4.0.1
### Is this bug present after an update or on a fresh install?
Updated to a major version (ex. 3.16.3 to 3.17.0)
### Are you using the Nextcloud Server Encryption module?
Encryption is Disabled
### Are you using an external user-backend?
- [x] Default internal user-backend
- [ ] LDAP/ Active Directory
- [ ] SSO - SAML
- [ ] Other
### Nextcloud Server logs
```shell
./nextcloud.log.1:{"reqId":"lI6rXp8dWFlkyrP5YChT","level":3,"time":"2025-11-24T08:04:43+01:00","remoteAddr":"WW.XX.YY.ZZ","user":"user.name@domain.tld","app":"webdav","method":"MKCOL","url":"/remote.php/dav/files/user.name@domain.tld/__groupfolder/path/to/folder/March%C3%A9%20Sub.","message":"\".\" is a forbidden file type.","userAgent":"Mozilla/5.0 (Macintosh) mirall/4.0.1 (Nextcloud, macos-23.6.0 ClientArchitecture: arm64 OsArchitecture: arm64)","version":"31.0.9.1","clientReqId":"client-req-id-chain","exception":{"Exception":"OCA\\DAV\\Connector\\Sabre\\Exception\\InvalidPath","Message":"\".\" is a forbidden file type.","Code":0,"Trace":[{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/3rdparty/sabre/dav/lib/DAV/Server.php","line":1210,"function":"createDirectory","class":"OCA\\DAV\\Connector\\Sabre\\Directory","type":"->","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/3rdparty/sabre/dav/lib/DAV/CorePlugin.php","line":560,"function":"createCollection","class":"Sabre\\DAV\\Server","type":"->","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/3rdparty/sabre/event/lib/WildcardEmitterTrait.php","line":89,"function":"httpMkcol","class":"Sabre\\DAV\\CorePlugin","type":"->","args":[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/3rdparty/sabre/dav/lib/DAV/Server.php","line":472,"function":"emit","class":"Sabre\\DAV\\Server","type":"->","args":["method:MKCOL",[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/apps/dav/lib/Connector/Sabre/Server.php","line":49,"function":"invokeMethod","class":"Sabre\\DAV\\Server","type":"->","args":[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/apps/dav/lib/Server.php","line":401,"function":"start","class":"OCA\\DAV\\Connector\\Sabre\\Server","type":"->","args":[]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/apps/dav/appinfo/v2/remote.php","line":21,"function":"exec","class":"OCA\\DAV\\Server","type":"->","args":[]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/remote.php","line":145,"args":["/var/www/html/nextcloud/nextcloud.domain.tld/apps/dav/appinfo/v2/remote.php"],"function":"require_once"}],"File":"/var/www/html/nextcloud/nextcloud.domain.tld/apps/dav/lib/Connector/Sabre/Directory.php","Line":155,"Previous":{"Exception":"OCP\\Files\\InvalidPathException","Message":"\".\" is a forbidden file type.","Code":100,"Trace":[{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/FilenameValidator.php","line":202,"function":"checkForbiddenExtension","class":"OC\\Files\\FilenameValidator","type":"->","args":["march\u00e9 sub."]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/Storage/Common.php","line":458,"function":"validateFilename","class":"OC\\Files\\FilenameValidator","type":"->","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/Storage/Wrapper/Wrapper.php","line":273,"function":"verifyPath","class":"OC\\Files\\Storage\\Common","type":"->","args":["path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/Storage/Wrapper/Wrapper.php","line":273,"function":"verifyPath","class":"OC\\Files\\Storage\\Wrapper\\Wrapper","type":"->","args":["path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/Storage/Wrapper/Wrapper.php","line":273,"function":"verifyPath","class":"OC\\Files\\Storage\\Wrapper\\Wrapper","type":"->","args":["path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/Storage/Wrapper/Wrapper.php","line":273,"function":"verifyPath","class":"OC\\Files\\Storage\\Wrapper\\Wrapper","type":"->","args":["path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/Storage/Wrapper/Wrapper.php","line":273,"function":"verifyPath","class":"OC\\Files\\Storage\\Wrapper\\Wrapper","type":"->","args":["path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/Storage/Wrapper/Wrapper.php","line":273,"function":"verifyPath","class":"OC\\Files\\Storage\\Wrapper\\Wrapper","type":"->","args":["path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/Storage/Wrapper/Wrapper.php","line":273,"function":"verifyPath","class":"OC\\Files\\Storage\\Wrapper\\Wrapper","type":"->","args":["path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/Storage/Wrapper/Wrapper.php","line":273,"function":"verifyPath","class":"OC\\Files\\Storage\\Wrapper\\Wrapper","type":"->","args":["path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/Storage/Wrapper/Wrapper.php","line":273,"function":"verifyPath","class":"OC\\Files\\Storage\\Wrapper\\Wrapper","type":"->","args":["path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/View.php","line":1977,"function":"verifyPath","class":"OC\\Files\\Storage\\Wrapper\\Wrapper","type":"->","args":["path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/apps/dav/lib/Connector/Sabre/Directory.php","line":147,"function":"verifyPath","class":"OC\\Files\\View","type":"->","args":["/_Service classes/path/to/folder","*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/3rdparty/sabre/dav/lib/DAV/Server.php","line":1210,"function":"createDirectory","class":"OCA\\DAV\\Connector\\Sabre\\Directory","type":"->","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/3rdparty/sabre/dav/lib/DAV/CorePlugin.php","line":560,"function":"createCollection","class":"Sabre\\DAV\\Server","type":"->","args":["*** sensitive parameters replaced ***"]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/3rdparty/sabre/event/lib/WildcardEmitterTrait.php","line":89,"function":"httpMkcol","class":"Sabre\\DAV\\CorePlugin","type":"->","args":[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/3rdparty/sabre/dav/lib/DAV/Server.php","line":472,"function":"emit","class":"Sabre\\DAV\\Server","type":"->","args":["method:MKCOL",[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/apps/dav/lib/Connector/Sabre/Server.php","line":49,"function":"invokeMethod","class":"Sabre\\DAV\\Server","type":"->","args":[{"__class__":"Sabre\\HTTP\\Request"},{"__class__":"Sabre\\HTTP\\Response"}]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/apps/dav/lib/Server.php","line":401,"function":"start","class":"OCA\\DAV\\Connector\\Sabre\\Server","type":"->","args":[]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/apps/dav/appinfo/v2/remote.php","line":21,"function":"exec","class":"OCA\\DAV\\Server","type":"->","args":[]},{"file":"/var/www/html/nextcloud/nextcloud.domain.tld/remote.php","line":145,"args":["/var/www/html/nextcloud/nextcloud.domain.tld/apps/dav/appinfo/v2/remote.php"],"function":"require_once"}],"File":"/var/www/html/nextcloud/nextcloud.domain.tld/lib/private/Files/FilenameValidator.php","Line":277},"message":"\".\" is a forbidden file type.","exception":{},"CustomMessage":"\".\" is a forbidden file type."}}
```
### Additional info
_No response_
Contributor guide
Assessment
This issue has not been assessed yet.