We are going to change the webdav path depending on the capabilities.
But the SyncEngine and csync might have been created before the capabilities
are retrieved.
The main raison why we gave the path to the sync engine was to pass it to csync.
But the thing is that csync don't need anymore this url as everything is done by the
discovery classes in libsync that use the network jobs that use the account for the urls.
So csync do not need the remote URI.
shortenFilename in folderstatusmodel.cpp was useless because the string is the
_file of a SyncFileItem which is the relative file name, that name never
starts with owncloud://.
All the csync test creates the folder because csync use to check if the folder
exists. But we don't need to do that anymore
return 0;
}
-void csync_create(CSYNC **csync, const char *local, const char *remote) {
+void csync_create(CSYNC **csync, const char *local) {
CSYNC *ctx;
size_t len = 0;
ctx->local.uri = c_strndup(local, len);
- /* remove trailing slashes */
- len = strlen(remote);
- while(len > 0 && remote[len - 1] == '/') --len;
-
- ctx->remote.uri = c_strndup(remote, len);
-
ctx->status_code = CSYNC_STATUS_OK;
ctx->current_fs = NULL;
ctx->current = REMOTE_REPLICA;
ctx->replica = ctx->remote.type;
- rc = csync_ftw(ctx, ctx->remote.uri, csync_walker, MAX_DEPTH);
+ rc = csync_ftw(ctx, "", csync_walker, MAX_DEPTH);
if (rc < 0) {
if(ctx->status_code == CSYNC_STATUS_OK) {
ctx->status_code = csync_errno_to_status(errno, CSYNC_STATUS_UPDATE_ERROR);
_csync_clean_ctx(ctx);
SAFE_FREE(ctx->local.uri);
- SAFE_FREE(ctx->remote.uri);
SAFE_FREE(ctx->error_string);
#ifdef WITH_ICONV
*
* @param csync The context variable to allocate.
*/
-void OCSYNC_EXPORT csync_create(CSYNC **csync, const char *local, const char *remote);
+void OCSYNC_EXPORT csync_create(CSYNC **csync, const char *local);
/**
* @brief Initialize the file synchronizer.
} local;
struct {
- char *uri;
c_rbtree_t *tree;
enum csync_replica_e type;
int read_from_db;
if( ctx && file ) {
path = file;
- switch (ctx->current) {
- case LOCAL_REPLICA:
+ if (ctx->current == LOCAL_REPLICA) {
if (strlen(path) <= strlen(ctx->local.uri)) {
return 0;
}
path += strlen(ctx->local.uri) + 1;
- break;
- case REMOTE_REPLICA:
- if (strlen(path) <= strlen(ctx->remote.uri)) {
- return 0;
- }
- path += strlen(ctx->remote.uri) + 1;
- break;
- default:
- path = NULL;
- return 0;
- break;
}
len = strlen(path);
-
h = c_jhash64((uint8_t *) path, len, 0);
}
return h;
}
path = file;
- switch (ctx->current) {
- case LOCAL_REPLICA:
+ if (ctx->current == LOCAL_REPLICA) {
if (strlen(path) <= strlen(ctx->local.uri)) {
ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
return -1;
}
path += strlen(ctx->local.uri) + 1;
- break;
- case REMOTE_REPLICA:
- if (strlen(path) <= strlen(ctx->remote.uri)) {
- ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
- return -1;
- }
- path += strlen(ctx->remote.uri) + 1;
- break;
- default:
- path = NULL;
- ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
- return -1;
}
len = strlen(path);
static bool fill_tree_from_db(CSYNC *ctx, const char *uri)
{
- const char *path = NULL;
-
- if( strlen(uri) < strlen(ctx->remote.uri)+1) {
- CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "name does not contain remote uri!");
- return false;
- }
-
- path = uri + strlen(ctx->remote.uri)+1;
-
- if( csync_statedb_get_below_path(ctx, path) < 0 ) {
+ if( csync_statedb_get_below_path(ctx, uri) < 0 ) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "StateDB could not be read!");
return false;
}
bool do_read_from_db = (ctx->current == REMOTE_REPLICA && ctx->remote.read_from_db);
- if (uri[0] == '\0') {
- errno = ENOENT;
- ctx->status_code = CSYNC_STATUS_PARAM_ERROR;
- goto error;
- }
-
read_from_db = ctx->remote.read_from_db;
// if the etag of this dir is still the same, its content is restored from the
goto done;
}
- const char *uri_for_vio = uri;
- if (ctx->current == REMOTE_REPLICA) {
- uri_for_vio += strlen(ctx->remote.uri);
- if (strlen(uri_for_vio) > 0 && uri_for_vio[0] == '/') {
- uri_for_vio++; // cut leading slash
- }
- CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "URI without fuzz for %s is \"%s\"", uri, uri_for_vio);
- }
-
- if ((dh = csync_vio_opendir(ctx, uri_for_vio)) == NULL) {
+ if ((dh = csync_vio_opendir(ctx, uri)) == NULL) {
if (ctx->abort) {
CSYNC_LOG(CSYNC_LOG_PRIORITY_TRACE, "Aborted!");
ctx->status_code = CSYNC_STATUS_ABORTED;
continue;
}
- flen = asprintf(&filename, "%s/%s", uri, d_name);
- if (flen < 0) {
+ if (uri[0] == '\0') {
+ filename = c_strdup(d_name);
+ flen = strlen(d_name);
+ } else {
+ flen = asprintf(&filename, "%s/%s", uri, d_name);
+ }
+ if (flen < 0 || !filename) {
csync_vio_file_stat_destroy(dirent);
dirent = NULL;
ctx->status_code = CSYNC_STATUS_MEMORY_ERROR;
goto error;
}
- /* Create relative path */
- switch (ctx->current) {
- case LOCAL_REPLICA:
+ /* Create relative path: For local replica, we need to remove the base path. */
+ path = filename;
+ if (ctx->current == LOCAL_REPLICA) {
ulen = strlen(ctx->local.uri) + 1;
- break;
- case REMOTE_REPLICA:
- ulen = strlen(ctx->remote.uri) + 1;
- break;
- default:
- break;
- }
-
- if (((size_t)flen) < ulen) {
- csync_vio_file_stat_destroy(dirent);
- dirent = NULL;
- ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
- goto error;
+ if (((size_t)flen) < ulen) {
+ csync_vio_file_stat_destroy(dirent);
+ dirent = NULL;
+ ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
+ goto error;
+ }
+ path += ulen;
}
- path = filename + ulen;
/* skip ".csync_journal.db" and ".csync_journal.db.ctmp" */
/* Isn't this done via csync_exclude already? */
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("mkdir -p /tmp/check_csync2");
- assert_int_equal(rc, 0);
-
- csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
+ csync_create(&csync, "/tmp/check_csync1");
*state = csync;
}
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("mkdir -p /tmp/check_csync2");
- assert_int_equal(rc, 0);
-
- csync_create(&csync, "/tmp/check_csync1", "dummy://foo/bar");
+ csync_create(&csync, "/tmp/check_csync1");
csync_init(csync);
*state = csync;
rc = system("rm -rf /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("rm -rf /tmp/check_csync2");
- assert_int_equal(rc, 0);
-
*state = NULL;
}
(void) state; /* unused */
- csync_create(&csync, "/tmp/csync1", "/tmp/csync2");
+ csync_create(&csync, "/tmp/csync1");
rc = csync_destroy(csync);
assert_int_equal(rc, 0);
static void setup(void **state) {
CSYNC *csync;
- csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
+ csync_create(&csync, "/tmp/check_csync1");
*state = csync;
}
CSYNC *csync;
int rc;
- csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
+ csync_create(&csync, "/tmp/check_csync1");
rc = csync_exclude_load(EXCLUDE_LIST_FILE, &(csync->excludes));
assert_int_equal(rc, 0);
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("mkdir -p /tmp/check_csync2");
- assert_int_equal(rc, 0);
-
- csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
+ csync_create(&csync, "/tmp/check_csync1");
*state = csync;
}
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("mkdir -p /tmp/check_csync2");
- assert_int_equal(rc, 0);
-
- csync_create(&csync, "/tmp/check_csync1", "dummy://foo/bar");
+ csync_create(&csync, "/tmp/check_csync1");
*state = csync;
}
rc = system("rm -rf /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("rm -rf /tmp/check_csync2");
- assert_int_equal(rc, 0);
-
*state = NULL;
}
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("mkdir -p /tmp/check_csync2");
- assert_int_equal(rc, 0);
-
- csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
+ csync_create(&csync, "/tmp/check_csync1");
*state = csync;
}
rc = system("rm -rf /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("rm -rf /tmp/check_csync2");
- assert_int_equal(rc, 0);
-
*state = NULL;
}
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
- csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
+ csync_create(&csync, "/tmp/check_csync1");
csync->statedb.file = c_strdup( TESTDB );
*state = csync;
rc = system("rm -rf /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("rm -rf /tmp/check_csync2");
- assert_int_equal(rc, 0);
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("mkdir -p /tmp/check_csync2");
- assert_int_equal(rc, 0);
rc = system("mkdir -p /tmp/check_csync");
assert_int_equal(rc, 0);
- csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
+ csync_create(&csync, "/tmp/check_csync1");
csync_init(csync);
sqlite3 *db = NULL;
assert_int_equal(rc, 0);
rc = system("rm -rf /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("rm -rf /tmp/check_csync2");
- assert_int_equal(rc, 0);
*state = NULL;
}
assert_int_equal(rc, 0);
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("mkdir -p /tmp/check_csync2");
- assert_int_equal(rc, 0);
- csync_create(&csync, "/tmp/check_csync1", "/tmp/check_csync2");
+ csync_create(&csync, "/tmp/check_csync1");
csync_init(csync);
/* Create a new db with metadata */
assert_int_equal(rc, 0);
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("mkdir -p /tmp/check_csync2");
- assert_int_equal(rc, 0);
- csync_create(&csync, "/tmp", "/tmp");
+ csync_create(&csync, "/tmp");
csync_init(csync);
sqlite3 *db = NULL;
assert_int_equal(rc, 0);
rc = system("rm -rf /tmp/check_csync1");
assert_int_equal(rc, 0);
- rc = system("rm -rf /tmp/check_csync2");
- assert_int_equal(rc, 0);
}
/* create a file stat, caller must free memory */
rc = system("rm -rf /tmp/csync_test");
assert_int_equal(rc, 0);
- csync_create(&csync, "/tmp/csync1", "/tmp/csync2");
+ csync_create(&csync, "/tmp/csync1");
csync->replica = LOCAL_REPLICA;
statevar *mystate = malloc( sizeof(statevar) );
mystate->result = NULL;
- csync_create(&(mystate->csync), "/tmp/csync1", "/tmp/csync2");
+ csync_create(&(mystate->csync), "/tmp/csync1");
mystate->csync->replica = LOCAL_REPLICA;
selectiveSyncFixup(&db, selectiveSyncList);
}
- SyncEngine engine(account, options.source_dir, QUrl(options.target_url), folder, &db);
+ SyncEngine engine(account, options.source_dir, folder, &db);
engine.setIgnoreHiddenFiles(options.ignoreHiddenFiles);
QObject::connect(&engine, SIGNAL(finished(bool)), &app, SLOT(quit()));
QObject::connect(&engine, SIGNAL(transmissionProgress(ProgressInfo)), &cmd, SLOT(transmissionProgressSlot()));
_syncResult.setFolder(_definition.alias);
- _engine.reset(new SyncEngine(_accountState->account(), path(), remoteUrl(), remotePath(), &_journal));
+ _engine.reset(new SyncEngine(_accountState->account(), path(), remotePath(), &_journal));
// pass the setting if hidden files are to be ignored, will be read in csync_update
_engine->setIgnoreHiddenFiles(_definition.ignoreHiddenFiles);
resetFolders();
}
-static QString shortenFilename( Folder *f, const QString& file )
-{
- // strip off the server prefix from the file name
- QString shortFile(file);
- if( shortFile.isEmpty() ) {
- return QString::null;
- }
-
- if(shortFile.startsWith(QLatin1String("ownclouds://")) ||
- shortFile.startsWith(QLatin1String("owncloud://")) ) {
- // rip off the whole ownCloud URL.
- if( f ) {
- QString remotePathUrl = f->remoteUrl().toString();
- shortFile.remove(Utility::toCSyncScheme(remotePathUrl));
- }
- }
- return shortFile;
-}
-
void FolderStatusModel::slotSetProgress(const ProgressInfo &progress)
{
auto par = qobject_cast<QWidget*>(QObject::parent());
curItemProgress = curItem._size;
}
- QString itemFileName = shortenFilename(f, curItem._file);
+ QString itemFileName = curItem._file;
QString kindString = Progress::asActionString(curItem);
QString fileProgressString;
QTimer::singleShot(0, this, SLOT(scheduleNextJob()));
}
+// ownCloud server < 7.0 did not had permissions so we need some other euristics
+// to detect wrong doing in a Shared directory
bool OwncloudPropagator::isInSharedDirectory(const QString& file)
{
bool re = false;
- if( _remoteDir.contains( _account->davPath() + QLatin1String("Shared") ) ) {
+ if( _remoteFolder.startsWith( QLatin1String("Shared") ) ) {
// The Shared directory is synced as its own sync connection
re = true;
} else {
public:
const QString _localDir; // absolute path to the local directory. ends with '/'
- const QString _remoteDir; // path to the root of the remote. ends with '/' (include WebDAV path)
- const QString _remoteFolder; // folder. (same as remoteDir but without the WebDAV path)
+ const QString _remoteFolder; // remote folder, ends with '/'
SyncJournalDb * const _journal;
bool _finishedEmited; // used to ensure that finished is only emitted once
public:
OwncloudPropagator(AccountPtr account, const QString &localDir,
- const QString &remoteDir, const QString &remoteFolder,
- SyncJournalDb *progressDb)
+ const QString &remoteFolder, SyncJournalDb *progressDb)
: _localDir((localDir.endsWith(QChar('/'))) ? localDir : localDir+'/' )
- , _remoteDir((remoteDir.endsWith(QChar('/'))) ? remoteDir : remoteDir+'/' )
, _remoteFolder((remoteFolder.endsWith(QChar('/'))) ? remoteFolder : remoteFolder+'/' )
, _journal(progressDb)
, _finishedEmited(false)
#include "filesystem.h"
#include <QFile>
#include <QStringList>
+#include <QDir>
namespace OCC {
}
}
+ QString destination = QDir::cleanPath(_propagator->account()->url().path() + QLatin1Char('/')
+ + _propagator->account()->davPath() + _propagator->_remoteFolder + _item->_renameTarget);
_job = new MoveJob(_propagator->account(),
_propagator->_remoteFolder + _item->_file,
- _propagator->_remoteDir + _item->_renameTarget,
- this);
+ destination, this);
connect(_job, SIGNAL(finishedSignal()), this, SLOT(slotMoveJobFinished()));
_propagator->_activeJobList.append(this);
_job->start();
QString destination = _propagator->account()->url().path()
+ QLatin1String("/remote.php/dav/files/") + _propagator->account()->user()
+ _propagator->_remoteFolder + _item->_file;
+
auto headers = PropagateUploadFileCommon::headers();
// "If-Match applies to the source, but we are interested in comparing the etag of the destination
qint64 SyncEngine::minimumFileAgeForUpload = 2000;
SyncEngine::SyncEngine(AccountPtr account, const QString& localPath,
- const QUrl& remoteURL, const QString& remotePath, OCC::SyncJournalDb* journal)
+ const QString& remotePath, OCC::SyncJournalDb* journal)
: _account(account)
, _needsUpdate(false)
, _syncRunning(false)
, _localPath(localPath)
- , _remoteUrl(remoteURL)
, _remotePath(remotePath)
, _journal(journal)
, _progressInfo(new ProgressInfo)
// Everything in the SyncEngine expects a trailing slash for the localPath.
Q_ASSERT(localPath.endsWith(QLatin1Char('/')));
- // We need to reconstruct the url because the path needs to be fully decoded, as csync will re-encode the path:
- // Remember that csync will just append the filename to the path and pass it to the vio plugin.
- // csync_owncloud will then re-encode everything.
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
- QString url_string = _remoteUrl.scheme() + QLatin1String("://") + _remoteUrl.authority(QUrl::EncodeDelimiters) + _remoteUrl.path(QUrl::FullyDecoded);
-#else
- // Qt4 was broken anyway as it did not encode the '#' as it should have done (it was actually a problem when parsing the path from QUrl::setPath
- QString url_string = _remoteUrl.toString();
-#endif
- url_string = Utility::toCSyncScheme(url_string);
-
- csync_create(&_csync_ctx, localPath.toUtf8().data(), url_string.toUtf8().data());
+ csync_create(&_csync_ctx, localPath.toUtf8().data());
csync_init(_csync_ctx);
_excludedFiles.reset(new ExcludedFiles(&_csync_ctx->excludes));
_syncFileStatusTracker.reset(new SyncFileStatusTracker(this));
// This is used for the DiscoveryJob to be able to request the main thread/
// to read in directory contents.
- qDebug() << Q_FUNC_INFO << _remotePath << _remoteUrl;
_discoveryMainThread->setupHooks( discoveryJob, _remotePath);
// Starts the update in a seperate thread
_journal->commit("post treewalk");
_propagator = QSharedPointer<OwncloudPropagator>(
- new OwncloudPropagator (_account, _localPath, _remoteUrl.path(), _remotePath, _journal));
+ new OwncloudPropagator (_account, _localPath, _remotePath, _journal));
connect(_propagator.data(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)),
this, SLOT(slotItemCompleted(const SyncFileItem &, const PropagatorJob &)));
connect(_propagator.data(), SIGNAL(progress(const SyncFileItem &,quint64)),
Q_OBJECT
public:
SyncEngine(AccountPtr account, const QString &localPath,
- const QUrl &remoteURL, const QString &remotePath, SyncJournalDb *journal);
+ const QString &remotePath, SyncJournalDb *journal);
~SyncEngine();
static QString csyncErrorToString( CSYNC_STATUS);
bool _needsUpdate;
bool _syncRunning;
QString _localPath;
- QUrl _remoteUrl;
QString _remotePath;
QString _remoteRootEtag;
SyncJournalDb *_journal;
return str;
}
-QString Utility::toCSyncScheme(const QString &urlStr)
-{
-
- QUrl url( urlStr );
- if( url.scheme() == QLatin1String("http") ) {
- url.setScheme( QLatin1String("owncloud") );
- } else {
- // connect SSL!
- url.setScheme( QLatin1String("ownclouds") );
- }
- return url.toString();
-}
-
QString Utility::escape(const QString &in)
{
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
OWNCLOUDSYNC_EXPORT bool hasLaunchOnStartup(const QString &appName);
OWNCLOUDSYNC_EXPORT void setLaunchOnStartup(const QString &appName, const QString& guiName, bool launch);
OWNCLOUDSYNC_EXPORT qint64 freeDiskSpace(const QString &path);
- OWNCLOUDSYNC_EXPORT QString toCSyncScheme(const QString &urlStr);
/**
* @brief compactFormatDouble - formats a double value human readable.
_account->setCredentials(new FakeCredentials{_fakeQnam});
_journalDb.reset(new OCC::SyncJournalDb(localPath()));
- _syncEngine.reset(new OCC::SyncEngine(_account, localPath(), sRootUrl, "", _journalDb.get()));
+ _syncEngine.reset(new OCC::SyncEngine(_account, localPath(), "", _journalDb.get()));
// A new folder will update the local file state database on first sync.
// To have a state matching what users will encounter, we have to a sync
QVERIFY(hasLaunchOnStartup(appName) == false);
}
- void testToCSyncScheme()
- {
- QVERIFY(toCSyncScheme("http://example.com/owncloud/") ==
- "owncloud://example.com/owncloud/");
- QVERIFY(toCSyncScheme("https://example.com/owncloud/") ==
- "ownclouds://example.com/owncloud/");
- }
-
void testDurationToDescriptiveString()
{
QLocale::setDefault(QLocale("C"));