404/Exception bei Propfind bei Ordnern mit Sonderzeichen

android
client-development
10

#1

Hallo,
Ich bin neu hier, benutze Owncloud allerdings schon eine ganze Weile.
Aktuell bin ich gerade dran die Android Java Bibliothek im einen Projekt zu verwenden. Dabei habe ich mir die Klasse RemotefileOperation genommen und an meine Bedürfnisse angepasst. Am wesentlichen Teil der Run Methode bei der ich das Problem habe habe ich nichts verändert.

Für das Development habe ich mich Test User-Accounts angelegt und alles hat super geklappt. Danach wollte ich auf meinen normalen Account wechseln und ich bekomme ein 404.
Username und Password sind richtig. Das habe ich vorher überprüft.

Eine Analyse des Logbuchs zeigte mir folgenden Eintrag.

{
“reqId”: “zBKp0UkuE53GXMMELF15”,
“level”: 0,
“time”: “2018-07-06T18:25:39+00:00”,
“remoteAddr”: “192.168.178.32”,
“user”: “TheAkki”,
“app”: “webdav”,
“method”: “PROPFIND”,
“url”: “\/owncloud\/remote.php\/webdav\/”,
“message”: “Exception: {“Message”:“HTTP\\/1.1 404 Not Found”,“Exception”:“Sabre\\DAV\\Exception\\NotFound”,“Code”:0,“Trace”:”#0 [internal function]: OCA\\DAV\\Connector\\Sabre\\FilesPlugin->handleGetProperties(Object(Sabre\\DAV\\PropFind), Object(OCA\\DAV\\Connector\\Sabre\\File))\n#1 \\/volume1\\/web\\/owncloud\\/lib\\/composer\\/sabre\\/event\\/lib\\/EventEmitterTrait.php(105): call_user_func_array(Array, Array)\n#2 \\/volume1\\/web\\/owncloud\\/lib\\/composer\\/sabre\\/dav\\/lib\\/DAV\\/Server.php(1058): Sabre\\Event\\EventEmitter->emit(‘propFind’, Array)\n#3 \\/volume1\\/web\\/owncloud\\/lib\\/composer\\/sabre\\/dav\\/lib\\/DAV\\/Server.php(980): Sabre\\DAV\\Server->getPropertiesByNode(Object(Sabre\\DAV\\PropFind), Object(OCA\\DAV\\Connector\\Sabre\\File))\n#4 \\/volume1\\/web\\/owncloud\\/lib\\/composer\\/sabre\\/dav\\/lib\\/DAV\\/Server.php(1665): Sabre\\DAV\\Server->getPropertiesIteratorForPath(’’, Array, -1)\n#5 \\/volume1\\/web\\/owncloud\\/lib\\/composer\\/sabre\\/dav\\/lib\\/DAV\\/CorePlugin.php(355): Sabre\\DAV\\Server->generateMultiStatus(Object(Generator), false)\n#6 [internal function]: Sabre\\DAV\\CorePlugin->httpPropFind(Object(Sabre\\HTTP\\Request), Object(Sabre\\HTTP\\Response))\n#7 \\/volume1\\/web\\/owncloud\\/lib\\/composer\\/sabre\\/event\\/lib\\/EventEmitterTrait.php(105): call_user_func_array(Array, Array)\n#8 \\/volume1\\/web\\/owncloud\\/lib\\/composer\\/sabre\\/dav\\/lib\\/DAV\\/Server.php(479): Sabre\\Event\\EventEmitter->emit(‘method:PROPFIND’, Array)\n#9 \\/volume1\\/web\\/owncloud\\/lib\\/composer\\/sabre\\/dav\\/lib\\/DAV\\/Server.php(254): Sabre\\DAV\\Server->invokeMethod(Object(Sabre\\HTTP\\Request), Object(Sabre\\HTTP\\Response))\n#10 \\/volume1\\/web\\/owncloud\\/apps\\/dav\\/appinfo\\/v1\\/webdav.php(63): Sabre\\DAV\\Server->exec()\n#11 \\/volume1\\/web\\/owncloud\\/remote.php(165): require_once(’\\/volume1\\/web\\/ow…’)\n#12 {main}",“File”:"\\/volume1\\/web\\/owncloud\\/apps\\/dav\\/lib\\/Connector\\/Sabre\\/FilesPlugin.php",“Line”:274,“User”:“TheAkki”}"
}

Erstaulicherweise syncronosiere ich aber bereits mit den Owncloud client (V2.4.1 build 9083) sehr erfolgreich mit diesen Account.
Die Server-Version ist 10.0.8.5 auf meinen NAS (Synology DS218+)

Die verwendete Android-Lib ist 0.9.19 bzw. 0.9.20. (Beide probiert).

Sind an dieser Stelle Fehler oder Unzulänglichkeiten bekannt? Wie kann ich dem Problem weiter auf die Spur gehen? - Gibts einen erweiterten Log?

Gruß
Akki


#2

Hallo,

An der Stelle ist nich zu sagen, dass mein Produktiv-Account seit etlichen Jahren besteht. Ich deshalb nicht sagen kann, ob es noch irgendeine Konfiguration gibt die angepasst werden muss. Vielleicht gab es mal ein Script bei einen Versionswechsel, welches irgendwelche Settings konfiguriert hat?

Wenn ich mir den Call-Stack ansehe und die damit verbundene Methode komme ich an dem Punkt.

public function handleGetProperties(PropFind $propFind, \Sabre\DAV\INode $node) {

  $httpRequest = $this->server->httpRequest;

  if ($node instanceof \OCA\DAV\Connector\Sabre\Node) {
  	if (!$node->getFileInfo()->isReadable()) {
  		// avoid detecting files through this means
  		throw new NotFound();
  	}

Das sieht doch danach aus, als hätte ich ein Object in meinen Daten, dessen Informationen nicht lesbar sind. Wie kann das sein?
Kann ich mir irgendwelche Informationen ausgeben lassen woher das kommt? - Welcher Node das ist? -
Für den Logger habe ich ja leider keine Referenz. Oder ist der Logger irgendwie als Singleton implementiert, das es eine getInstance Methode gibt?

Gruß Akki


#3

Hallo,

Ich habe mir eine Klasse geschrieben, die für alle Objekte den Zugriff ausprobiert.

package theakki.synctool.OwnCloud;

import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.network.WebdavEntry;
import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC;

import org.apache.commons.httpclient.HttpStatus;
import org.apache.jackrabbit.webdav.DavConstants;
import org.apache.jackrabbit.webdav.MultiStatus;
import org.apache.jackrabbit.webdav.MultiStatusResponse;
import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;

/**

  • Remote operation to read files from owncloud server. Inspired by Owncloud - Android library.
  • @author theakki
    */

public class FindBrokenDavObject extends RemoteOperation
{
private static final String TAG = FindBrokenDavObject.class.getSimpleName();
private static final int SYNC_READ_TIMEOUT = 40000;
private static final int SYNC_CONNECTION_TIMEOUT = 5000;

private String  _strRemotePath;

/**
 * Constructor
 *
 * @param remotePath Remote path of the file.
 */
public FindBrokenDavObject(String remotePath)
{
    _strRemotePath = remotePath;
}


protected void getRemoteObjects(OwnCloudClient client, String localPath)
{
    PropFindMethod propfind = null;
    RemoteOperationResult result;

    /// take the duty of check the server for the current state of the file there
    try
    {
        // remote request
        propfind = new PropFindMethod(client.getWebdavUri() + WebdavUtils.encodePath(localPath),
            WebdavUtils.getFilePropSet(),    // PropFind Properties
            DavConstants.DEPTH_1);
        final int status = client.executeMethod(propfind, SYNC_READ_TIMEOUT, SYNC_CONNECTION_TIMEOUT);
        final boolean isSuccess = (status == HttpStatus.SC_MULTI_STATUS || status == HttpStatus.SC_OK);


        if (isSuccess)
        {
            // Parse response
            MultiStatus resp = propfind.getResponseBodyAsMultiStatus();
            MultiStatusResponse[] arMultiStatusResponse = resp.getResponses();
            for(MultiStatusResponse oMultiStatusResponse : arMultiStatusResponse)
            {
                WebdavEntry we = new WebdavEntry(oMultiStatusResponse, client.getWebdavUri().getPath());
                if(we.path().equals(localPath))
                    continue;

                if (we.path().endsWith("/"))
                {
                    // Dir
                    getRemoteObjects(client, we.path());
                    Log_OC.d(TAG, "Get Information for" + localPath + "'");
                }
            }

        }
        else
        {
            Log_OC.e(TAG, "Can't get information for '" + localPath + "'");
        }

    } catch (Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        if (propfind != null)
            propfind.releaseConnection();
    }
}

/**
 * Performs the read operation.
 *
 * @param client Client object to communicate with the remote ownCloud server.
 */
@Override
protected RemoteOperationResult run(OwnCloudClient client)
{
        getRemoteObjects(client, _strRemotePath);
        return new RemoteOperationResult(RemoteOperationResult.ResultCode.OK);
}

}

Nicht schön, aber funktional.
Dabei habe ich herausgefunden, dass ich die Probleme bekomme, wenn ich Ordner mit Sonderzeichen (%20, %2B) habe.
Ist da irgendwas bekannt?

Gruß
Akki


#4

Vielen danke für die Warnung!! Wir werden das Problem checken. Allerdings wird ownCloud team eine neue Durchführung des Libraries entwicklen, in denen das Fix gelosst wird.