nextcloud / nextcloud/desktop

[Bug]: macOS 4.0.1 doesnt offer renaming of folder ending with forbidden char

Open
#9,175 0 comments 0 reactions 0 assignees View on GitHub
0. Needs triage bug os: :apple: macOS
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

Image

### 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

Image

### 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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.