Impossible to create a folder or a file with a special character in its name

Nextcloud version : 13.0.5
Operating system and version : debian stretch
Installed using Snap

I’ve freshly installed nextcloud on a clean debian stretch server using snap and it seems impossible to create a folder or a file with special characters. I’m using an OpenStack storage with External Storage plugin.

Steps to replicate it:

  1. Install nextcloud on debian stretch using snap and configure a folder on Openstack Storage (eg. OVH Object Storage)
  2. go to “Files”
  3. Create a new folder named “tété”
  4. An error appear : Could not create folder “tété”

The output of your Nextcloud log in Admin > Logging:

Guzzle\Http\Exception\ClientErrorResponseException: Client error response [status code] 400 [reason phrase] Bad request [url] https://storage.sbg5.cloud.ovh.net/v1/AUTH_e3b22c2a9dbe4039ba7b565559fb407b/backup/tété/

    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Message/Request.php - line 145: Guzzle\Http\Exception\BadResponseException factory(Object(Guzzle\Http\Message\EntityEnclosingRequest), Object(Guzzle\Http\Message\Response))
    [internal function] Guzzle\Http\Message\Request onRequestError(Object(Guzzle\Common\Event), 'request.error', Object(Symfony\Component\EventDispatcher\EventDispatcher))
    /snap/nextcloud/8267/htdocs/3rdparty/symfony/event-dispatcher/EventDispatcher.php - line 212: call_user_func(Array, Object(Guzzle\Common\Event), 'request.error', Object(Symfony\Component\EventDispatcher\EventDispatcher))
    /snap/nextcloud/8267/htdocs/3rdparty/symfony/event-dispatcher/EventDispatcher.php - line 44: Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(Array, 'request.error', Object(Guzzle\Common\Event))
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Message/Request.php - line 589: Symfony\Component\EventDispatcher\EventDispatcher->dispatch('request.error', Object(Guzzle\Common\Event))
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Message/Request.php - line 378: Guzzle\Http\Message\Request->processResponse(Array)
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php - line 49: Guzzle\Http\Message\Request->setState('complete', Array)
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php - line 286: Guzzle\Http\Message\EntityEnclosingRequest->setState('complete', Array)
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php - line 244: Guzzle\Http\Curl\CurlMulti->processResponse(Object(Guzzle\Http\Message\EntityEnclosingRequest), Object(Guzzle\Http\Curl\CurlHandle), Array)
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php - line 227: Guzzle\Http\Curl\CurlMulti->processMessages()
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php - line 211: Guzzle\Http\Curl\CurlMulti->executeHandles()
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php - line 105: Guzzle\Http\Curl\CurlMulti->perform()
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiProxy.php - line 91: Guzzle\Http\Curl\CurlMulti->send()
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Client.php - line 282: Guzzle\Http\Curl\CurlMultiProxy->send()
    /snap/nextcloud/8267/htdocs/3rdparty/guzzle/guzzle/src/Guzzle/Http/Message/Request.php - line 198: Guzzle\Http\Client->send(Object(Guzzle\Http\Message\EntityEnclosingRequest))
    /snap/nextcloud/8267/htdocs/3rdparty/rackspace/php-opencloud/lib/OpenCloud/ObjectStore/Resource/Container.php - line 453: Guzzle\Http\Message\Request->send()
    /snap/nextcloud/8267/htdocs/apps/files_external/lib/Lib/Storage/Swift.php - line 204: OpenCloud\ObjectStore\Resource\Container->uploadObject('t\xC3\xA9t\xC3\xA9/', '', Array)
    /snap/nextcloud/8267/htdocs/lib/private/Files/Storage/Wrapper/Wrapper.php - line 81: OCA\Files_External\Lib\Storage\Swift->mkdir('t\xC3\xA9t\xC3\xA9/')
    /snap/nextcloud/8267/htdocs/lib/private/Files/Storage/Wrapper/PermissionsMask.php - line 104: OC\Files\Storage\Wrapper\Wrapper->mkdir('t\xC3\xA9t\xC3\xA9')
    /snap/nextcloud/8267/htdocs/lib/private/Files/Storage/Wrapper/Wrapper.php - line 81: OC\Files\Storage\Wrapper\PermissionsMask->mkdir('t\xC3\xA9t\xC3\xA9')
    /snap/nextcloud/8267/htdocs/lib/private/Files/Storage/Wrapper/Availability.php - line 87: OC\Files\Storage\Wrapper\Wrapper->mkdir('t\xC3\xA9t\xC3\xA9')
    /snap/nextcloud/8267/htdocs/lib/private/Files/Storage/Wrapper/Wrapper.php - line 81: OC\Files\Storage\Wrapper\Availability->mkdir('t\xC3\xA9t\xC3\xA9')
    /snap/nextcloud/8267/htdocs/lib/private/Files/View.php - line 1148: OC\Files\Storage\Wrapper\Wrapper->mkdir('t\xC3\xA9t\xC3\xA9')
    /snap/nextcloud/8267/htdocs/lib/private/Files/View.php - line 267: OC\Files\View->basicOperation('mkdir', '/t\xC3\xA9t\xC3\xA9', Array)
    /snap/nextcloud/8267/htdocs/apps/dav/lib/Connector/Sabre/Directory.php - line 189: OC\Files\View->mkdir('//t\xC3\xA9t\xC3\xA9')
    /snap/nextcloud/8267/htdocs/3rdparty/sabre/dav/lib/DAV/Server.php - line 1210: OCA\DAV\Connector\Sabre\Directory->createDirectory('t\xC3\xA9t\xC3\xA9')
    /snap/nextcloud/8267/htdocs/3rdparty/sabre/dav/lib/DAV/CorePlugin.php - line 594: Sabre\DAV\Server->createCollection('t\xC3\xA9t\xC3\xA9', Object(Sabre\DAV\MkCol))
    [internal function] Sabre\DAV\CorePlugin->httpMkcol(Object(Sabre\HTTP\Request), Object(Sabre\HTTP\Response))
    /snap/nextcloud/8267/htdocs/3rdparty/sabre/event/lib/EventEmitterTrait.php - line 105: call_user_func_array(Array, Array)
    /snap/nextcloud/8267/htdocs/3rdparty/sabre/dav/lib/DAV/Server.php - line 479: Sabre\Event\EventEmitter->emit('method MKCOL', Array)
    /snap/nextcloud/8267/htdocs/3rdparty/sabre/dav/lib/DAV/Server.php - line 254: Sabre\DAV\Server->invokeMethod(Object(Sabre\HTTP\Request), Object(Sabre\HTTP\Response))
    /snap/nextcloud/8267/htdocs/apps/dav/appinfo/v1/webdav.php - line 80: Sabre\DAV\Server->exec()
    /snap/nextcloud/8267/htdocs/remote.php - line 164: require_once('/snap/nextcloud...')
    {main}
  1. Can you create files/folders on local storage with special characters (to verify your configuration)?
  2. Can you directly access the object storage (without Nextcloud) and try to create such a folder (to check the external storage compatibility for special characters)?
1 Like
  1. I can create folder with special characters on local storage
  2. If I create folders on Object Storage without nextcloud then appear on the storage but they are invisible on Nextcloud

Seems that there is a communication problem (Guzzle) between Nextcloud and Open Storage.

Seems that the normalizePath method in the /apps/files_external/lib/Lib/Storage/Swift.php file has a bug. maybe we should add a urldecode here ? (I can’t test it now…)

In this case it would be the best to share this information with the developers in a bug report on github.com/nextcloud/server/issues

Ok, Thanks :slight_smile:

For reference there are two issues for this problem, one closed with no action taken (https://github.com/nextcloud/server/issues/4036) and one still open (https://github.com/nextcloud/server/issues/15849).