mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-23 05:25:50 +03:00
Merge branch 'master' into reference_coding_style_wiki_page
This commit is contained in:
commit
60a3c27d84
93 changed files with 3687 additions and 525 deletions
23
.github/issue_template.md
vendored
23
.github/issue_template.md
vendored
|
@ -1,11 +1,7 @@
|
|||
<!--
|
||||
Thanks for reporting issues back to Nextcloud!
|
||||
|
||||
Note: This is the **issue tracker of Nextcloud**, please do NOT use this to get answers to your questions or get help for fixing your installation. This is a place to report bugs to developers, after your server has been debugged. You can find help debugging your system on our home user forums: https://help.nextcloud.com or, if you use Nextcloud in a large organization, ask our engineers on https://portal.nextcloud.com. See also https://nextcloud.com/support for support options.
|
||||
|
||||
Nextcloud is an open source project backed by Nextcloud GmbH. Most of our volunteers are home users and thus primarily care about issues that affect home users. Our paid engineers prioritize issues of our customers. If you are neither a home user nor a customer, consider paying somebody to fix your issue, do it yourself or become a customer.
|
||||
|
||||
Please understand that at the moment, we are very busy with customer issues and some high priority development work. A lot of issues are getting reported. We can't always keep up and timely respond to all of them, but we try!
|
||||
This is the **issue tracker of Nextcloud**, please do NOT use this to get answers to your questions or get help for fixing your installation. You can find help debugging your system on our home user forums: https://help.nextcloud.com or, if you use Nextcloud in a large organization, ask our engineers on https://portal.nextcloud.com. See also https://nextcloud.com/support for support options.
|
||||
|
||||
Guidelines for submitting issues:
|
||||
|
||||
|
@ -14,9 +10,9 @@ Guidelines for submitting issues:
|
|||
- You can also filter by appending e. g. "state:open" to the search string.
|
||||
- More info on search syntax within github: https://help.github.com/articles/searching-issues
|
||||
|
||||
* Please fill in as much of the template below as possible. We know it is a pain sometimes, but especially without logs there is often not much we can do: really, if we would have seen the issue you encoutered before, we would already have fixed it. So we did NOT see it, and we will need YOUR help to find out what is wrong and fix it. The logs are absoutely crucial for that. Expect us to quickly close issues without logs or other information we need. If you don't have time to gather the required information, we don't either.
|
||||
* Please fill in as much of the template below as possible. The logs are absolutely crucial for the developers to be able to help you. Expect us to quickly close issues without logs or other information we need.
|
||||
|
||||
Please also note that we have a https://nextcloud.com/contribute/code-of-conduct/ that applies on Github. To summarize it: please, be kind. We try our best to be nice, too. If you can't be bothered to be polite, please just don't bother to report issues as we won't feel motivated to help you. Remember, we don't get paid to help you!
|
||||
* Also note that we have a https://nextcloud.com/contribute/code-of-conduct/ that applies on Github. To summarize it: be kind. We try our best to be nice, too. If you can't be bothered to be polite, please just don't bother to report issues as we won't feel motivated to help you.
|
||||
-->
|
||||
|
||||
<!--- Please keep the note below for others who read your bug report -->
|
||||
|
@ -33,9 +29,7 @@ Tell us what should happen
|
|||
|
||||
### Actual behaviour
|
||||
Tell us what happens instead
|
||||
<!--
|
||||
Did you try end-to-end encryption before version 3.0? Following the instructions from this post might solve your problem since you might need to clean up the keys as that can break the functioning of >3.0 if you had a malformed key: https://help.nextcloud.com/t/help-test-the-latest-version-of-e2ee/87590
|
||||
-->
|
||||
|
||||
|
||||
### Steps to reproduce
|
||||
1.
|
||||
|
@ -47,7 +41,6 @@ Client version:
|
|||
<!---
|
||||
Please try to only report a bug if it happens with the latest version
|
||||
The latest version can be seen by checking https://nextcloud.com/install/#install-clients
|
||||
In the case of end-to-end encryption bug reports the client must be at least 3.0 and the server at least 19 with the end to end encryption app version at least 1.5.2.
|
||||
--->
|
||||
|
||||
Operating system:
|
||||
|
@ -70,15 +63,15 @@ Nextcloud version:
|
|||
Storage backend (external storage):
|
||||
|
||||
### Logs
|
||||
<!-- desktop client logs are a hard requirement for bug reports because we don't know how to do magic here :) -->
|
||||
|
||||
Please use Gist (https://gist.github.com/) or a similar code paster for longer
|
||||
logs.
|
||||
|
||||
1. Client logfile:
|
||||
<!-- desktop client logs are a hard requirement for bug reports because we don't know how to do magic here :) -->
|
||||
Output of `nextcloud --logdebug --logwindow` or `nextcloud --logdebug --logfile log.txt`
|
||||
(On Windows using `cmd.exe`, you might need to first `cd` into the Nextcloud directory)
|
||||
(See also https://docs.nextcloud.com/desktop/2.3/troubleshooting.html#log-files)
|
||||
Since 3.1: Under the "General" settings, you can click on "Create Debug Archive ..." to pick the location of where the desktop client will export the logs and the database to a zip file.
|
||||
On previous releases: Via the command line: `nextcloud --logdebug --logwindow` or `nextcloud --logdebug --logfile log.txt`
|
||||
(See also https://docs.nextcloud.com/desktop/3.0/troubleshooting.html#log-files)
|
||||
|
||||
2. Web server error log:
|
||||
|
||||
|
|
|
@ -24,4 +24,4 @@ Icon=@APPLICATION_EXECUTABLE@
|
|||
Icon[de]=@APPLICATION_ICON_NAME@
|
||||
Name[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisierung
|
||||
Comment[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisierung
|
||||
GenericName[de]=Synchronisierungsordner
|
||||
GenericName[de]=Ordner-Synchronisation
|
||||
|
|
27
.tx/nextcloud.client-desktop/sc_translation
Normal file
27
.tx/nextcloud.client-desktop/sc_translation
Normal file
|
@ -0,0 +1,27 @@
|
|||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ desktop sync client
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
MimeType=application/vnd.@APPLICATION_EXECUTABLE@;
|
||||
Actions=Quit;
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
[Desktop Action Quit]
|
||||
Exec=@APPLICATION_EXECUTABLE@ --quit
|
||||
Name=Quit @APPLICATION_NAME@
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Icon[sc]=@APPLICATION_ICON_NAME@
|
||||
Name[sc]=@APPLICATION_NAME@ cliente sicronizadore de desktop
|
||||
Comment[sc]=@APPLICATION_NAME@ cliente de sincronizatzione desktop
|
||||
GenericName[sc]=Sincronizadore de cartellas
|
|
@ -10,7 +10,7 @@
|
|||
```
|
||||
$ git clone https://github.com/nextcloud/desktop.git
|
||||
$ cd desktop
|
||||
$ cd docs
|
||||
$ cd doc
|
||||
$ sphinx-build -b html -D html_theme='nextcloud_com' -d _build/doctrees . _build/html/com
|
||||
```
|
||||
|
||||
|
|
BIN
doc/images/create_debug_archive.png
Normal file
BIN
doc/images/create_debug_archive.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
|
@ -114,7 +114,17 @@ quickly.
|
|||
Obtaining the Client Log File
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To obtain the client log file:
|
||||
Create Debug Archive
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Since the 3.1.0 release we made it easier for users to provide debug information: debug logging is enabled by default with expiration time set to 24 hours and under the "General" settings, you can click on "Create Debug Archive ..." to pick the location of where the desktop client will export the logs and the database to a zip file.
|
||||
|
||||
.. image:: images/create_debug_archive.png
|
||||
|
||||
Keyboard shortcut
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Another way to obtain the client log file:
|
||||
|
||||
1. Open the Nextcloud Desktop Client.
|
||||
|
||||
|
@ -136,6 +146,9 @@ To obtain the client log file:
|
|||
|
||||
The log file is saved in the location specified.
|
||||
|
||||
Command line
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Alternatively, you can launch the Nextcloud Log Output window using the
|
||||
``--logwindow`` command. After issuing this command, the Log Output window
|
||||
opens to show the current log. You can then follow the same procedures
|
||||
|
@ -148,8 +161,8 @@ mentioned above to save the log to a file.
|
|||
* macOS: ``/Applications/nextcloud.app/Contents/MacOS/nextcloud --logwindow``
|
||||
* Linux: ``nextcloud --logwindow``
|
||||
|
||||
Saving Files Directly
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
Config file
|
||||
~~~~~~~~~~~
|
||||
|
||||
The Nextcloud client enables you to save log files directly to a predefined file
|
||||
or directory. This is a useful option for troubleshooting sporadic issues as
|
||||
|
|
|
@ -53,6 +53,8 @@ QString Vfs::modeToString(Mode mode)
|
|||
return QStringLiteral("suffix");
|
||||
case WindowsCfApi:
|
||||
return QStringLiteral("wincfapi");
|
||||
case XAttr:
|
||||
return QStringLiteral("xattr");
|
||||
}
|
||||
return QStringLiteral("off");
|
||||
}
|
||||
|
@ -145,6 +147,8 @@ static QString modeToPluginName(Vfs::Mode mode)
|
|||
return QStringLiteral("suffix");
|
||||
if (mode == Vfs::WindowsCfApi)
|
||||
return QStringLiteral("win");
|
||||
if (mode == Vfs::XAttr)
|
||||
return QStringLiteral("xattr");
|
||||
return QString();
|
||||
}
|
||||
|
||||
|
@ -171,9 +175,32 @@ Vfs::Mode OCC::bestAvailableVfsMode()
|
|||
{
|
||||
if (isVfsPluginAvailable(Vfs::WindowsCfApi)) {
|
||||
return Vfs::WindowsCfApi;
|
||||
} else if (isVfsPluginAvailable(Vfs::WithSuffix)) {
|
||||
}
|
||||
|
||||
if (isVfsPluginAvailable(Vfs::WithSuffix)) {
|
||||
return Vfs::WithSuffix;
|
||||
}
|
||||
|
||||
// For now the "suffix" backend has still precedence over the "xattr" backend.
|
||||
// Ultimately the order of those ifs will change when xattr will be more mature.
|
||||
// But what does "more mature" means here?
|
||||
//
|
||||
// * On Mac when it properly reads and writes com.apple.LaunchServices.OpenWith
|
||||
// This will require reverse engineering to see what they stuff in there. Maybe a good
|
||||
// starting point:
|
||||
// https://eclecticlight.co/2017/12/20/xattr-com-apple-launchservices-openwith-sets-a-custom-app-to-open-a-file/
|
||||
//
|
||||
// * On Linux when our user.nextcloud.hydrate_exec is adopted by at least KDE and Gnome
|
||||
// the "user.nextcloud" prefix might turn into "user.xdg" in the process since it would
|
||||
// be best to have a freedesktop.org spec for it.
|
||||
// When that time comes, it might still require detecting at runtime if that's indeed
|
||||
// supported in the user session or even per sync folder (in case user would pick a folder
|
||||
// which wouldn't support xattr for some reason)
|
||||
|
||||
if (isVfsPluginAvailable(Vfs::XAttr)) {
|
||||
return Vfs::XAttr;
|
||||
}
|
||||
|
||||
return Vfs::Off;
|
||||
}
|
||||
|
||||
|
|
|
@ -95,6 +95,7 @@ public:
|
|||
Off,
|
||||
WithSuffix,
|
||||
WindowsCfApi,
|
||||
XAttr,
|
||||
};
|
||||
Q_ENUM(Mode)
|
||||
static QString modeToString(Mode mode);
|
||||
|
|
|
@ -124,7 +124,7 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
|
|||
if (vfs) {
|
||||
// Directly modifies file_stat->type.
|
||||
// We can ignore the return value since we're done here anyway.
|
||||
vfs->statTypeVirtualFile(file_stat.get(), nullptr);
|
||||
vfs->statTypeVirtualFile(file_stat.get(), &handle->path);
|
||||
}
|
||||
|
||||
return file_stat;
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
project(libsync)
|
||||
include(DefinePlatformDefaults)
|
||||
|
||||
set(CMAKE_AUTOMOC TRUE)
|
||||
|
||||
if ( APPLE )
|
||||
|
@ -34,6 +36,8 @@ set(libsync_SRCS
|
|||
networkjobs.cpp
|
||||
owncloudpropagator.cpp
|
||||
nextcloudtheme.cpp
|
||||
abstractpropagateremotedeleteencrypted.cpp
|
||||
deletejob.cpp
|
||||
progressdispatcher.cpp
|
||||
propagatorjobs.cpp
|
||||
propagatedownload.cpp
|
||||
|
@ -42,6 +46,7 @@ set(libsync_SRCS
|
|||
propagateuploadng.cpp
|
||||
propagateremotedelete.cpp
|
||||
propagateremotedeleteencrypted.cpp
|
||||
propagateremotedeleteencryptedrootfolder.cpp
|
||||
propagateremotemove.cpp
|
||||
propagateremotemkdir.cpp
|
||||
propagateuploadencrypted.cpp
|
||||
|
@ -69,6 +74,13 @@ if (WIN32)
|
|||
)
|
||||
add_definitions(-D_WIN32_WINNT=_WIN32_WINNT_WIN10)
|
||||
list(APPEND OS_SPECIFIC_LINK_LIBRARIES cldapi)
|
||||
elseif(LINUX) # elseif(LINUX OR APPLE)
|
||||
set(libsync_SRCS ${libsync_SRCS} vfs/xattr/vfs_xattr.cpp)
|
||||
if (APPLE)
|
||||
set(libsync_SRCS ${libsync_SRCS} vfs/xattr/xattrwrapper_mac.cpp)
|
||||
else()
|
||||
set(libsync_SRCS ${libsync_SRCS} vfs/xattr/xattrwrapper_linux.cpp)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(TOKEN_AUTH_ONLY)
|
||||
|
|
201
src/libsync/abstractpropagateremotedeleteencrypted.cpp
Normal file
201
src/libsync/abstractpropagateremotedeleteencrypted.cpp
Normal file
|
@ -0,0 +1,201 @@
|
|||
/*
|
||||
* Copyright (C) by Oleksandr Zolotov <alex@nextcloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <QFileInfo>
|
||||
#include <QLoggingCategory>
|
||||
|
||||
#include "abstractpropagateremotedeleteencrypted.h"
|
||||
#include "account.h"
|
||||
#include "clientsideencryptionjobs.h"
|
||||
#include "deletejob.h"
|
||||
#include "owncloudpropagator.h"
|
||||
|
||||
Q_LOGGING_CATEGORY(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED, "nextcloud.sync.propagator.remove.encrypted")
|
||||
|
||||
namespace OCC {
|
||||
|
||||
AbstractPropagateRemoteDeleteEncrypted::AbstractPropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent)
|
||||
: QObject(parent)
|
||||
, _propagator(propagator)
|
||||
, _item(item)
|
||||
{}
|
||||
|
||||
QNetworkReply::NetworkError AbstractPropagateRemoteDeleteEncrypted::networkError() const
|
||||
{
|
||||
return _networkError;
|
||||
}
|
||||
|
||||
QString AbstractPropagateRemoteDeleteEncrypted::errorString() const
|
||||
{
|
||||
return _errorString;
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::storeFirstError(QNetworkReply::NetworkError err)
|
||||
{
|
||||
if (_networkError == QNetworkReply::NetworkError::NoError) {
|
||||
_networkError = err;
|
||||
}
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::storeFirstErrorString(const QString &errString)
|
||||
{
|
||||
if (_errorString.isEmpty()) {
|
||||
_errorString = errString;
|
||||
}
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::startLsColJob(const QString &path)
|
||||
{
|
||||
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Folder is encrypted, let's get the Id from it.";
|
||||
auto job = new LsColJob(_propagator->account(), path, this);
|
||||
job->setProperties({"resourcetype", "http://owncloud.org/ns:fileid"});
|
||||
connect(job, &LsColJob::directoryListingSubfolders, this, &AbstractPropagateRemoteDeleteEncrypted::slotFolderEncryptedIdReceived);
|
||||
connect(job, &LsColJob::finishedWithError, this, &AbstractPropagateRemoteDeleteEncrypted::taskFailed);
|
||||
job->start();
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::slotFolderEncryptedIdReceived(const QStringList &list)
|
||||
{
|
||||
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Received id of folder, trying to lock it so we can prepare the metadata";
|
||||
auto job = qobject_cast<LsColJob *>(sender());
|
||||
const ExtraFolderInfo folderInfo = job->_folderInfos.value(list.first());
|
||||
slotTryLock(folderInfo.fileId);
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::slotTryLock(const QByteArray &folderId)
|
||||
{
|
||||
auto lockJob = new LockEncryptFolderApiJob(_propagator->account(), folderId, this);
|
||||
connect(lockJob, &LockEncryptFolderApiJob::success, this, &AbstractPropagateRemoteDeleteEncrypted::slotFolderLockedSuccessfully);
|
||||
connect(lockJob, &LockEncryptFolderApiJob::error, this, &AbstractPropagateRemoteDeleteEncrypted::taskFailed);
|
||||
lockJob->start();
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::slotFolderLockedSuccessfully(const QByteArray &folderId, const QByteArray &token)
|
||||
{
|
||||
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Folder id" << folderId << "Locked Successfully for Upload, Fetching Metadata";
|
||||
_folderLocked = true;
|
||||
_folderToken = token;
|
||||
_folderId = folderId;
|
||||
|
||||
auto job = new GetMetadataApiJob(_propagator->account(), _folderId);
|
||||
connect(job, &GetMetadataApiJob::jsonReceived, this, &AbstractPropagateRemoteDeleteEncrypted::slotFolderEncryptedMetadataReceived);
|
||||
connect(job, &GetMetadataApiJob::error, this, &AbstractPropagateRemoteDeleteEncrypted::taskFailed);
|
||||
job->start();
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::slotFolderUnLockedSuccessfully(const QByteArray &folderId)
|
||||
{
|
||||
Q_UNUSED(folderId);
|
||||
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Folder id" << folderId << "successfully unlocked";
|
||||
_folderLocked = false;
|
||||
_folderToken = "";
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::slotDeleteRemoteItemFinished()
|
||||
{
|
||||
auto *deleteJob = qobject_cast<DeleteJob *>(QObject::sender());
|
||||
|
||||
Q_ASSERT(deleteJob);
|
||||
|
||||
if (!deleteJob) {
|
||||
qCCritical(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Sender is not a DeleteJob instance.";
|
||||
taskFailed();
|
||||
return;
|
||||
}
|
||||
|
||||
const auto err = deleteJob->reply()->error();
|
||||
|
||||
_item->_httpErrorCode = deleteJob->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
_item->_responseTimeStamp = deleteJob->responseTimestamp();
|
||||
_item->_requestId = deleteJob->requestId();
|
||||
|
||||
if (err != QNetworkReply::NoError && err != QNetworkReply::ContentNotFoundError) {
|
||||
storeFirstErrorString(deleteJob->errorString());
|
||||
storeFirstError(err);
|
||||
|
||||
taskFailed();
|
||||
return;
|
||||
}
|
||||
|
||||
// A 404 reply is also considered a success here: We want to make sure
|
||||
// a file is gone from the server. It not being there in the first place
|
||||
// is ok. This will happen for files that are in the DB but not on
|
||||
// the server or the local file system.
|
||||
if (_item->_httpErrorCode != 204 && _item->_httpErrorCode != 404) {
|
||||
// Normally we expect "204 No Content"
|
||||
// If it is not the case, it might be because of a proxy or gateway intercepting the request, so we must
|
||||
// throw an error.
|
||||
storeFirstErrorString(tr("Wrong HTTP code returned by server. Expected 204, but received \"%1 %2\".")
|
||||
.arg(_item->_httpErrorCode)
|
||||
.arg(deleteJob->reply()->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()));
|
||||
|
||||
taskFailed();
|
||||
return;
|
||||
}
|
||||
|
||||
_propagator->_journal->deleteFileRecord(_item->_originalFile, _item->isDirectory());
|
||||
_propagator->_journal->commit("Remote Remove");
|
||||
|
||||
unlockFolder();
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::deleteRemoteItem(const QString &filename)
|
||||
{
|
||||
qCInfo(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Deleting nested encrypted item" << filename;
|
||||
|
||||
auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), this);
|
||||
deleteJob->setFolderToken(_folderToken);
|
||||
|
||||
connect(deleteJob, &DeleteJob::finishedSignal, this, &AbstractPropagateRemoteDeleteEncrypted::slotDeleteRemoteItemFinished);
|
||||
|
||||
deleteJob->start();
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::unlockFolder()
|
||||
{
|
||||
if (!_folderLocked) {
|
||||
emit finished(true);
|
||||
return;
|
||||
}
|
||||
|
||||
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Unlocking folder" << _folderId;
|
||||
auto unlockJob = new UnlockEncryptFolderApiJob(_propagator->account(), _folderId, _folderToken, this);
|
||||
|
||||
connect(unlockJob, &UnlockEncryptFolderApiJob::success, this, &AbstractPropagateRemoteDeleteEncrypted::slotFolderUnLockedSuccessfully);
|
||||
connect(unlockJob, &UnlockEncryptFolderApiJob::error, this, [this] (const QByteArray& fileId, int httpReturnCode) {
|
||||
Q_UNUSED(fileId);
|
||||
_folderLocked = false;
|
||||
_folderToken = "";
|
||||
_item->_httpErrorCode = httpReturnCode;
|
||||
_errorString = tr("\"%1 Failed to unlock encrypted folder %2\".")
|
||||
.arg(httpReturnCode)
|
||||
.arg(QString::fromUtf8(fileId));
|
||||
_item->_errorString =_errorString;
|
||||
taskFailed();
|
||||
});
|
||||
unlockJob->start();
|
||||
}
|
||||
|
||||
void AbstractPropagateRemoteDeleteEncrypted::taskFailed()
|
||||
{
|
||||
qCDebug(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Task failed for job" << sender();
|
||||
_isTaskFailed = true;
|
||||
if (_folderLocked) {
|
||||
unlockFolder();
|
||||
} else {
|
||||
emit finished(false);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace OCC
|
72
src/libsync/abstractpropagateremotedeleteencrypted.h
Normal file
72
src/libsync/abstractpropagateremotedeleteencrypted.h
Normal file
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* Copyright (C) by Oleksandr Zolotov <alex@nextcloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QNetworkReply>
|
||||
|
||||
#include "syncfileitem.h"
|
||||
|
||||
namespace OCC {
|
||||
|
||||
class OwncloudPropagator;
|
||||
/**
|
||||
* @brief The AbstractPropagateRemoteDeleteEncrypted class is the base class for Propagate Remote Delete Encrypted jobs
|
||||
* @ingroup libsync
|
||||
*/
|
||||
class AbstractPropagateRemoteDeleteEncrypted : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
AbstractPropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent);
|
||||
virtual ~AbstractPropagateRemoteDeleteEncrypted() = default;
|
||||
|
||||
QNetworkReply::NetworkError networkError() const;
|
||||
QString errorString() const;
|
||||
|
||||
virtual void start() = 0;
|
||||
|
||||
signals:
|
||||
void finished(bool success);
|
||||
|
||||
protected:
|
||||
void storeFirstError(QNetworkReply::NetworkError err);
|
||||
void storeFirstErrorString(const QString &errString);
|
||||
|
||||
void startLsColJob(const QString &path);
|
||||
void slotFolderEncryptedIdReceived(const QStringList &list);
|
||||
void slotTryLock(const QByteArray &folderId);
|
||||
void slotFolderLockedSuccessfully(const QByteArray &folderId, const QByteArray &token);
|
||||
virtual void slotFolderUnLockedSuccessfully(const QByteArray &folderId);
|
||||
virtual void slotFolderEncryptedMetadataReceived(const QJsonDocument &json, int statusCode) = 0;
|
||||
void slotDeleteRemoteItemFinished();
|
||||
|
||||
void deleteRemoteItem(const QString &filename);
|
||||
void unlockFolder();
|
||||
void taskFailed();
|
||||
|
||||
protected:
|
||||
OwncloudPropagator *_propagator = nullptr;
|
||||
SyncFileItemPtr _item;
|
||||
QByteArray _folderToken;
|
||||
QByteArray _folderId;
|
||||
bool _folderLocked = false;
|
||||
bool _isTaskFailed = false;
|
||||
QNetworkReply::NetworkError _networkError = QNetworkReply::NoError;
|
||||
QString _errorString;
|
||||
};
|
||||
|
||||
}
|
|
@ -1468,6 +1468,11 @@ void FolderMetadata::removeEncryptedFile(const EncryptedFile &f)
|
|||
}
|
||||
}
|
||||
|
||||
void FolderMetadata::removeAllEncryptedFiles()
|
||||
{
|
||||
_files.clear();
|
||||
}
|
||||
|
||||
QVector<EncryptedFile> FolderMetadata::files() const {
|
||||
return _files;
|
||||
}
|
||||
|
|
|
@ -137,6 +137,7 @@ public:
|
|||
QByteArray encryptedMetadata();
|
||||
void addEncryptedFile(const EncryptedFile& f);
|
||||
void removeEncryptedFile(const EncryptedFile& f);
|
||||
void removeAllEncryptedFiles();
|
||||
QVector<EncryptedFile> files() const;
|
||||
|
||||
|
||||
|
|
|
@ -257,8 +257,8 @@ bool LockEncryptFolderApiJob::finished()
|
|||
return true;
|
||||
}
|
||||
|
||||
SetEncryptionFlagApiJob::SetEncryptionFlagApiJob(const AccountPtr& account, const QByteArray& fileId, QObject* parent)
|
||||
: AbstractNetworkJob(account, baseUrl() + QStringLiteral("encrypted/") + fileId, parent), _fileId(fileId)
|
||||
SetEncryptionFlagApiJob::SetEncryptionFlagApiJob(const AccountPtr& account, const QByteArray& fileId, FlagAction flagAction, QObject* parent)
|
||||
: AbstractNetworkJob(account, baseUrl() + QStringLiteral("encrypted/") + fileId, parent), _fileId(fileId), _flagAction(flagAction)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -268,8 +268,10 @@ void SetEncryptionFlagApiJob::start()
|
|||
req.setRawHeader("OCS-APIREQUEST", "true");
|
||||
QUrl url = Utility::concatUrlPath(account()->url(), path());
|
||||
|
||||
qCInfo(lcCseJob()) << "marking the file with id" << _fileId << "as encrypted";
|
||||
sendRequest("PUT", url, req);
|
||||
qCInfo(lcCseJob()) << "marking the file with id" << _fileId << "as" << (_flagAction == Set ? "encrypted" : "non-encrypted") << ".";
|
||||
|
||||
sendRequest(_flagAction == Set ? "PUT" : "DELETE", url, req);
|
||||
|
||||
AbstractNetworkJob::start();
|
||||
}
|
||||
|
||||
|
|
|
@ -114,7 +114,12 @@ class OWNCLOUDSYNC_EXPORT SetEncryptionFlagApiJob : public AbstractNetworkJob
|
|||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SetEncryptionFlagApiJob(const AccountPtr &account, const QByteArray& fileId, QObject *parent = nullptr);
|
||||
enum FlagAction {
|
||||
Clear = 0,
|
||||
Set = 1
|
||||
};
|
||||
|
||||
explicit SetEncryptionFlagApiJob(const AccountPtr &account, const QByteArray &fileId, FlagAction flagAction = Set, QObject *parent = nullptr);
|
||||
|
||||
public slots:
|
||||
void start() override;
|
||||
|
@ -123,11 +128,12 @@ protected:
|
|||
bool finished() override;
|
||||
|
||||
signals:
|
||||
void success(const QByteArray fileId);
|
||||
void error(const QByteArray fileId, int httpReturnCode);
|
||||
void success(const QByteArray &fileId);
|
||||
void error(const QByteArray &fileId, int httpReturnCode);
|
||||
|
||||
private:
|
||||
QByteArray _fileId;
|
||||
FlagAction _flagAction = Set;
|
||||
};
|
||||
|
||||
class OWNCLOUDSYNC_EXPORT LockEncryptFolderApiJob : public AbstractNetworkJob
|
||||
|
|
72
src/libsync/deletejob.cpp
Normal file
72
src/libsync/deletejob.cpp
Normal file
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* Copyright (C) by Olivier Goffart <ogoffart@owncloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include "deletejob.h"
|
||||
#include "account.h"
|
||||
#include <QLoggingCategory>
|
||||
|
||||
namespace OCC {
|
||||
|
||||
Q_LOGGING_CATEGORY(lcDeleteJob, "nextcloud.sync.networkjob.delete", QtInfoMsg)
|
||||
|
||||
DeleteJob::DeleteJob(AccountPtr account, const QString &path, QObject *parent)
|
||||
: AbstractNetworkJob(account, path, parent)
|
||||
{
|
||||
}
|
||||
|
||||
DeleteJob::DeleteJob(AccountPtr account, const QUrl &url, QObject *parent)
|
||||
: AbstractNetworkJob(account, QString(), parent)
|
||||
, _url(url)
|
||||
{
|
||||
}
|
||||
|
||||
void DeleteJob::start()
|
||||
{
|
||||
QNetworkRequest req;
|
||||
if (!_folderToken.isEmpty()) {
|
||||
req.setRawHeader("e2e-token", _folderToken);
|
||||
}
|
||||
|
||||
if (_url.isValid()) {
|
||||
sendRequest("DELETE", _url, req);
|
||||
} else {
|
||||
sendRequest("DELETE", makeDavUrl(path()), req);
|
||||
}
|
||||
|
||||
if (reply()->error() != QNetworkReply::NoError) {
|
||||
qCWarning(lcDeleteJob) << " Network error: " << reply()->errorString();
|
||||
}
|
||||
AbstractNetworkJob::start();
|
||||
}
|
||||
|
||||
bool DeleteJob::finished()
|
||||
{
|
||||
qCInfo(lcDeleteJob) << "DELETE of" << reply()->request().url() << "FINISHED WITH STATUS"
|
||||
<< replyStatusString();
|
||||
|
||||
emit finishedSignal();
|
||||
return true;
|
||||
}
|
||||
|
||||
QByteArray DeleteJob::folderToken() const
|
||||
{
|
||||
return _folderToken;
|
||||
}
|
||||
|
||||
void DeleteJob::setFolderToken(const QByteArray &folderToken)
|
||||
{
|
||||
_folderToken = folderToken;
|
||||
}
|
||||
|
||||
} // namespace OCC
|
46
src/libsync/deletejob.h
Normal file
46
src/libsync/deletejob.h
Normal file
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (C) by Olivier Goffart <ogoffart@owncloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "accountfwd.h"
|
||||
#include "networkjobs.h"
|
||||
|
||||
namespace OCC {
|
||||
|
||||
/**
|
||||
* @brief The DeleteJob class
|
||||
* @ingroup libsync
|
||||
*/
|
||||
class DeleteJob : public AbstractNetworkJob
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DeleteJob(AccountPtr account, const QString &path, QObject *parent = nullptr);
|
||||
explicit DeleteJob(AccountPtr account, const QUrl &url, QObject *parent = nullptr);
|
||||
|
||||
void start() override;
|
||||
bool finished() override;
|
||||
|
||||
QByteArray folderToken() const;
|
||||
void setFolderToken(const QByteArray &folderToken);
|
||||
|
||||
signals:
|
||||
void finishedSignal();
|
||||
|
||||
private:
|
||||
QUrl _url; // Only used if the constructor taking a url is taken.
|
||||
QByteArray _folderToken;
|
||||
};
|
||||
}
|
|
@ -887,6 +887,11 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
|
|||
qCInfo(lcDisco) << "Not a move, no item in db with inode" << localEntry.inode;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (base._isE2eEncrypted || isInsideEncryptedTree()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (base.isDirectory() != item->isDirectory()) {
|
||||
qCInfo(lcDisco) << "Not a move, types don't match" << base._type << item->_type << localEntry.type;
|
||||
return false;
|
||||
|
@ -1149,6 +1154,7 @@ void ProcessDirectoryJob::processFileFinalize(
|
|||
}
|
||||
if (recurse) {
|
||||
auto job = new ProcessDirectoryJob(path, item, recurseQueryLocal, recurseQueryServer, this);
|
||||
job->setInsideEncryptedTree(isInsideEncryptedTree() || item->_isEncrypted);
|
||||
if (removed) {
|
||||
job->setParent(_discoveryData);
|
||||
_discoveryData->_queuedDeletedDirectories[path._original] = job;
|
||||
|
|
|
@ -88,6 +88,16 @@ public:
|
|||
/** Start up to nbJobs, return the number of job started; emit finished() when done */
|
||||
int processSubJobs(int nbJobs);
|
||||
|
||||
void setInsideEncryptedTree(bool isInsideEncryptedTree)
|
||||
{
|
||||
_isInsideEncryptedTree = isInsideEncryptedTree;
|
||||
}
|
||||
|
||||
bool isInsideEncryptedTree() const
|
||||
{
|
||||
return _isInsideEncryptedTree;
|
||||
}
|
||||
|
||||
SyncFileItemPtr _dirItem;
|
||||
|
||||
private:
|
||||
|
@ -273,6 +283,7 @@ private:
|
|||
bool _childModified = false; // the directory contains modified item what would prevent deletion
|
||||
bool _childIgnored = false; // The directory contains ignored item that would prevent deletion
|
||||
PinState _pinState = PinState::Unspecified; // The directory's pin-state, see computePinState()
|
||||
bool _isInsideEncryptedTree = false; // this directory is encrypted or is within the tree of directories with root directory encrypted
|
||||
|
||||
signals:
|
||||
void finished();
|
||||
|
|
|
@ -34,7 +34,7 @@ EncryptFolderJob::EncryptFolderJob(const AccountPtr &account, SyncJournalDb *jou
|
|||
|
||||
void EncryptFolderJob::start()
|
||||
{
|
||||
auto job = new OCC::SetEncryptionFlagApiJob(_account, _fileId, this);
|
||||
auto job = new OCC::SetEncryptionFlagApiJob(_account, _fileId, OCC::SetEncryptionFlagApiJob::Set, this);
|
||||
connect(job, &OCC::SetEncryptionFlagApiJob::success, this, &EncryptFolderJob::slotEncryptionFlagSuccess);
|
||||
connect(job, &OCC::SetEncryptionFlagApiJob::error, this, &EncryptFolderJob::slotEncryptionFlagError);
|
||||
job->start();
|
||||
|
|
|
@ -301,6 +301,29 @@ void PropagateItemJob::slotRestoreJobFinished(SyncFileItem::Status status)
|
|||
}
|
||||
}
|
||||
|
||||
bool PropagateItemJob::hasEncryptedAncestor() const
|
||||
{
|
||||
if (!propagator()->account()->capabilities().clientSideEncryptionAvailable()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto path = _item->_file;
|
||||
const auto slashPosition = path.lastIndexOf('/');
|
||||
const auto parentPath = slashPosition >= 0 ? path.left(slashPosition) : QString();
|
||||
|
||||
auto pathComponents = parentPath.split('/');
|
||||
while (!pathComponents.isEmpty()) {
|
||||
SyncJournalFileRecord rec;
|
||||
propagator()->_journal->getFileRecord(pathComponents.join('/'), &rec);
|
||||
if (rec.isValid() && rec._isE2eEncrypted) {
|
||||
return true;
|
||||
}
|
||||
pathComponents.removeLast();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// ================================================================================
|
||||
|
||||
PropagateItemJob *OwncloudPropagator::createJob(const SyncFileItemPtr &item)
|
||||
|
|
|
@ -171,6 +171,8 @@ protected:
|
|||
_item->_errorString = msg;
|
||||
}
|
||||
|
||||
bool hasEncryptedAncestor() const;
|
||||
|
||||
protected slots:
|
||||
void slotRestoreJobFinished(SyncFileItem::Status status);
|
||||
|
||||
|
|
|
@ -985,7 +985,13 @@ void PropagateDownloadFile::downloadFinished()
|
|||
previousFileExists = false;
|
||||
}
|
||||
|
||||
if (previousFileExists) {
|
||||
const auto vfs = propagator()->syncOptions()._vfs;
|
||||
|
||||
// In the case of an hydration, this size is likely to change for placeholders
|
||||
// (except with the cfapi backend)
|
||||
const auto isVirtualDownload = _item->_type == ItemTypeVirtualFileDownload;
|
||||
const auto isCfApiVfs = vfs && vfs->mode() == Vfs::WindowsCfApi;
|
||||
if (previousFileExists && (isCfApiVfs || !isVirtualDownload)) {
|
||||
// Check whether the existing file has changed since the discovery
|
||||
// phase by comparing size and mtime to the previous values. This
|
||||
// is necessary to avoid overwriting user changes that happened between
|
||||
|
@ -1027,7 +1033,6 @@ void PropagateDownloadFile::downloadFinished()
|
|||
if (_conflictRecord.isValid())
|
||||
propagator()->_journal->setConflictRecord(_conflictRecord);
|
||||
|
||||
auto vfs = propagator()->syncOptions()._vfs;
|
||||
if (vfs && vfs->mode() == Vfs::WithSuffix) {
|
||||
// If the virtual file used to have a different name and db
|
||||
// entry, remove it transfer its old pin state.
|
||||
|
|
|
@ -14,66 +14,18 @@
|
|||
|
||||
#include "propagateremotedelete.h"
|
||||
#include "propagateremotedeleteencrypted.h"
|
||||
#include "propagateremotedeleteencryptedrootfolder.h"
|
||||
#include "owncloudpropagator_p.h"
|
||||
#include "account.h"
|
||||
#include "deletejob.h"
|
||||
#include "common/asserts.h"
|
||||
|
||||
#include <QLoggingCategory>
|
||||
|
||||
namespace OCC {
|
||||
|
||||
Q_LOGGING_CATEGORY(lcDeleteJob, "nextcloud.sync.networkjob.delete", QtInfoMsg)
|
||||
Q_LOGGING_CATEGORY(lcPropagateRemoteDelete, "nextcloud.sync.propagator.remotedelete", QtInfoMsg)
|
||||
|
||||
DeleteJob::DeleteJob(AccountPtr account, const QString &path, QObject *parent)
|
||||
: AbstractNetworkJob(account, path, parent)
|
||||
{
|
||||
}
|
||||
|
||||
DeleteJob::DeleteJob(AccountPtr account, const QUrl &url, QObject *parent)
|
||||
: AbstractNetworkJob(account, QString(), parent)
|
||||
, _url(url)
|
||||
{
|
||||
}
|
||||
|
||||
void DeleteJob::start()
|
||||
{
|
||||
QNetworkRequest req;
|
||||
if (!_folderToken.isEmpty()) {
|
||||
req.setRawHeader("e2e-token", _folderToken);
|
||||
}
|
||||
|
||||
if (_url.isValid()) {
|
||||
sendRequest("DELETE", _url, req);
|
||||
} else {
|
||||
sendRequest("DELETE", makeDavUrl(path()), req);
|
||||
}
|
||||
|
||||
if (reply()->error() != QNetworkReply::NoError) {
|
||||
qCWarning(lcDeleteJob) << " Network error: " << reply()->errorString();
|
||||
}
|
||||
AbstractNetworkJob::start();
|
||||
}
|
||||
|
||||
bool DeleteJob::finished()
|
||||
{
|
||||
qCInfo(lcDeleteJob) << "DELETE of" << reply()->request().url() << "FINISHED WITH STATUS"
|
||||
<< replyStatusString();
|
||||
|
||||
emit finishedSignal();
|
||||
return true;
|
||||
}
|
||||
|
||||
QByteArray DeleteJob::folderToken() const
|
||||
{
|
||||
return _folderToken;
|
||||
}
|
||||
|
||||
void DeleteJob::setFolderToken(const QByteArray &folderToken)
|
||||
{
|
||||
_folderToken = folderToken;
|
||||
}
|
||||
|
||||
PropagatorJob::JobParallelism PropagateRemoteDelete::parallelism()
|
||||
{
|
||||
return _item->_encryptedFileName.isEmpty() ? FullParallelism : WaitForFinished;
|
||||
|
@ -84,11 +36,22 @@ void PropagateRemoteDelete::start()
|
|||
if (propagator()->_abortRequested)
|
||||
return;
|
||||
|
||||
if (!_item->_encryptedFileName.isEmpty()) {
|
||||
_deleteEncryptedHelper = new PropagateRemoteDeleteEncrypted(propagator(), _item, this);
|
||||
connect(_deleteEncryptedHelper, &PropagateRemoteDeleteEncrypted::finished, this, [this] (bool success) {
|
||||
Q_UNUSED(success) // Should we skip file deletion in case of failure?
|
||||
createDeleteJob(_item->_encryptedFileName);
|
||||
if (!_item->_encryptedFileName.isEmpty() || _item->_isEncrypted) {
|
||||
if (!_item->_encryptedFileName.isEmpty()) {
|
||||
_deleteEncryptedHelper = new PropagateRemoteDeleteEncrypted(propagator(), _item, this);
|
||||
} else {
|
||||
_deleteEncryptedHelper = new PropagateRemoteDeleteEncryptedRootFolder(propagator(), _item, this);
|
||||
}
|
||||
connect(_deleteEncryptedHelper, &AbstractPropagateRemoteDeleteEncrypted::finished, this, [this] (bool success) {
|
||||
if (!success) {
|
||||
SyncFileItem::Status status = SyncFileItem::NormalError;
|
||||
if (_deleteEncryptedHelper->networkError() != QNetworkReply::NoError && _deleteEncryptedHelper->networkError() != QNetworkReply::ContentNotFoundError) {
|
||||
status = classifyError(_deleteEncryptedHelper->networkError(), _item->_httpErrorCode, &propagator()->_anotherSyncNeeded);
|
||||
}
|
||||
done(status, _deleteEncryptedHelper->errorString());
|
||||
} else {
|
||||
done(SyncFileItem::Success);
|
||||
}
|
||||
});
|
||||
_deleteEncryptedHelper->start();
|
||||
} else {
|
||||
|
@ -103,9 +66,7 @@ void PropagateRemoteDelete::createDeleteJob(const QString &filename)
|
|||
_job = new DeleteJob(propagator()->account(),
|
||||
propagator()->fullRemotePath(filename),
|
||||
this);
|
||||
if (_deleteEncryptedHelper && !_deleteEncryptedHelper->folderToken().isEmpty()) {
|
||||
_job->setFolderToken(_deleteEncryptedHelper->folderToken());
|
||||
}
|
||||
|
||||
connect(_job.data(), &DeleteJob::finishedSignal, this, &PropagateRemoteDelete::slotDeleteJobFinished);
|
||||
propagator()->_activeJobList.append(this);
|
||||
_job->start();
|
||||
|
@ -158,16 +119,6 @@ void PropagateRemoteDelete::slotDeleteJobFinished()
|
|||
propagator()->_journal->deleteFileRecord(_item->_originalFile, _item->isDirectory());
|
||||
propagator()->_journal->commit("Remote Remove");
|
||||
|
||||
if (_deleteEncryptedHelper && !_job->folderToken().isEmpty()) {
|
||||
propagator()->_activeJobList.append(this);
|
||||
connect(_deleteEncryptedHelper, &PropagateRemoteDeleteEncrypted::folderUnlocked,
|
||||
this, [this] {
|
||||
propagator()->_activeJobList.removeOne(this);
|
||||
done(SyncFileItem::Success);
|
||||
});
|
||||
_deleteEncryptedHelper->unlockFolder();
|
||||
} else {
|
||||
done(SyncFileItem::Success);
|
||||
}
|
||||
done(SyncFileItem::Success);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,32 +18,9 @@
|
|||
|
||||
namespace OCC {
|
||||
|
||||
class PropagateRemoteDeleteEncrypted;
|
||||
class DeleteJob;
|
||||
|
||||
/**
|
||||
* @brief The DeleteJob class
|
||||
* @ingroup libsync
|
||||
*/
|
||||
class DeleteJob : public AbstractNetworkJob
|
||||
{
|
||||
Q_OBJECT
|
||||
QUrl _url; // Only used if the constructor taking a url is taken.
|
||||
public:
|
||||
explicit DeleteJob(AccountPtr account, const QString &path, QObject *parent = nullptr);
|
||||
explicit DeleteJob(AccountPtr account, const QUrl &url, QObject *parent = nullptr);
|
||||
|
||||
void start() override;
|
||||
bool finished() override;
|
||||
|
||||
QByteArray folderToken() const;
|
||||
void setFolderToken(const QByteArray &folderToken);
|
||||
|
||||
signals:
|
||||
void finishedSignal();
|
||||
|
||||
private:
|
||||
QByteArray _folderToken;
|
||||
};
|
||||
class AbstractPropagateRemoteDeleteEncrypted;
|
||||
|
||||
/**
|
||||
* @brief The PropagateRemoteDelete class
|
||||
|
@ -53,7 +30,7 @@ class PropagateRemoteDelete : public PropagateItemJob
|
|||
{
|
||||
Q_OBJECT
|
||||
QPointer<DeleteJob> _job;
|
||||
PropagateRemoteDeleteEncrypted *_deleteEncryptedHelper = nullptr;
|
||||
AbstractPropagateRemoteDeleteEncrypted *_deleteEncryptedHelper = nullptr;
|
||||
|
||||
public:
|
||||
PropagateRemoteDelete(OwncloudPropagator *propagator, const SyncFileItemPtr &item)
|
||||
|
|
|
@ -1,85 +1,61 @@
|
|||
/*
|
||||
* Copyright (C) by Oleksandr Zolotov <alex@nextcloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include "propagateremotedeleteencrypted.h"
|
||||
#include "clientsideencryptionjobs.h"
|
||||
#include "clientsideencryption.h"
|
||||
#include "owncloudpropagator.h"
|
||||
|
||||
#include "encryptfolderjob.h"
|
||||
#include <QLoggingCategory>
|
||||
#include <QMimeDatabase>
|
||||
#include <QFileInfo>
|
||||
#include <QDir>
|
||||
|
||||
using namespace OCC;
|
||||
|
||||
Q_LOGGING_CATEGORY(PROPAGATE_REMOVE_ENCRYPTED, "nextcloud.sync.propagator.remove.encrypted")
|
||||
|
||||
PropagateRemoteDeleteEncrypted::PropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent)
|
||||
: QObject(parent)
|
||||
, _propagator(propagator)
|
||||
, _item(item)
|
||||
: AbstractPropagateRemoteDeleteEncrypted(propagator, item, parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QByteArray PropagateRemoteDeleteEncrypted::folderToken()
|
||||
{
|
||||
return _folderToken;
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncrypted::start()
|
||||
{
|
||||
Q_ASSERT(!_item->_encryptedFileName.isEmpty());
|
||||
QFileInfo info(_item->_encryptedFileName);
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Folder is encrypted, let's get the Id from it.";
|
||||
auto job = new LsColJob(_propagator->account(), info.path(), this);
|
||||
job->setProperties({"resourcetype", "http://owncloud.org/ns:fileid"});
|
||||
connect(job, &LsColJob::directoryListingSubfolders, this, &PropagateRemoteDeleteEncrypted::slotFolderEncryptedIdReceived);
|
||||
connect(job, &LsColJob::finishedWithError, this, &PropagateRemoteDeleteEncrypted::taskFailed);
|
||||
job->start();
|
||||
|
||||
const QFileInfo info(_item->_encryptedFileName);
|
||||
startLsColJob(info.path());
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncrypted::slotFolderEncryptedIdReceived(const QStringList &list)
|
||||
void PropagateRemoteDeleteEncrypted::slotFolderUnLockedSuccessfully(const QByteArray &folderId)
|
||||
{
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Received id of folder, trying to lock it so we can prepare the metadata";
|
||||
auto job = qobject_cast<LsColJob *>(sender());
|
||||
const ExtraFolderInfo folderInfo = job->_folderInfos.value(list.first());
|
||||
slotTryLock(folderInfo.fileId);
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncrypted::slotTryLock(const QByteArray &folderId)
|
||||
{
|
||||
auto lockJob = new LockEncryptFolderApiJob(_propagator->account(), folderId, this);
|
||||
connect(lockJob, &LockEncryptFolderApiJob::success, this, &PropagateRemoteDeleteEncrypted::slotFolderLockedSuccessfully);
|
||||
connect(lockJob, &LockEncryptFolderApiJob::error, this, &PropagateRemoteDeleteEncrypted::taskFailed);
|
||||
lockJob->start();
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncrypted::slotFolderLockedSuccessfully(const QByteArray &folderId, const QByteArray &token)
|
||||
{
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Folder id" << folderId << "Locked Successfully for Upload, Fetching Metadata";
|
||||
_folderLocked = true;
|
||||
_folderToken = token;
|
||||
_folderId = folderId;
|
||||
|
||||
auto job = new GetMetadataApiJob(_propagator->account(), _folderId);
|
||||
connect(job, &GetMetadataApiJob::jsonReceived, this, &PropagateRemoteDeleteEncrypted::slotFolderEncryptedMetadataReceived);
|
||||
connect(job, &GetMetadataApiJob::error, this, &PropagateRemoteDeleteEncrypted::taskFailed);
|
||||
job->start();
|
||||
AbstractPropagateRemoteDeleteEncrypted::slotFolderUnLockedSuccessfully(folderId);
|
||||
emit finished(!_isTaskFailed);
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncrypted::slotFolderEncryptedMetadataReceived(const QJsonDocument &json, int statusCode)
|
||||
{
|
||||
if (statusCode == 404) {
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Metadata not found, ignoring.";
|
||||
emit finished(true);
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Metadata not found, but let's proceed with removing the file anyway.";
|
||||
deleteRemoteItem(_item->_encryptedFileName);
|
||||
return;
|
||||
}
|
||||
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Metadata Received, Preparing it for the new file.";
|
||||
|
||||
// Encrypt File!
|
||||
FolderMetadata metadata(_propagator->account(), json.toJson(QJsonDocument::Compact), statusCode);
|
||||
|
||||
QFileInfo info(_propagator->fullLocalPath(_item->_file));
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Metadata Received, preparing it for removal of the file";
|
||||
|
||||
const QFileInfo info(_propagator->fullLocalPath(_item->_file));
|
||||
const QString fileName = info.fileName();
|
||||
|
||||
// Find existing metadata for this file
|
||||
|
@ -94,50 +70,18 @@ void PropagateRemoteDeleteEncrypted::slotFolderEncryptedMetadataReceived(const Q
|
|||
}
|
||||
|
||||
if (!found) {
|
||||
// The removed file was not in the JSON so nothing else to do
|
||||
emit finished(true);
|
||||
// file is not found in the metadata, but we still need to remove it
|
||||
deleteRemoteItem(_item->_encryptedFileName);
|
||||
return;
|
||||
}
|
||||
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Metadata updated, sending to the server.";
|
||||
|
||||
auto job = new UpdateMetadataApiJob(_propagator->account(),
|
||||
_folderId,
|
||||
metadata.encryptedMetadata(),
|
||||
_folderToken);
|
||||
|
||||
connect(job, &UpdateMetadataApiJob::success, this, [this] { emit finished(true); });
|
||||
auto job = new UpdateMetadataApiJob(_propagator->account(), _folderId, metadata.encryptedMetadata(), _folderToken);
|
||||
connect(job, &UpdateMetadataApiJob::success, this, [this](const QByteArray& fileId) {
|
||||
Q_UNUSED(fileId);
|
||||
deleteRemoteItem(_item->_encryptedFileName);
|
||||
});
|
||||
connect(job, &UpdateMetadataApiJob::error, this, &PropagateRemoteDeleteEncrypted::taskFailed);
|
||||
job->start();
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncrypted::unlockFolder()
|
||||
{
|
||||
if (!_folderLocked) {
|
||||
emit folderUnlocked();
|
||||
return;
|
||||
}
|
||||
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Unlocking folder" << _folderId;
|
||||
auto unlockJob = new UnlockEncryptFolderApiJob(_propagator->account(),
|
||||
_folderId, _folderToken, this);
|
||||
|
||||
connect(unlockJob, &UnlockEncryptFolderApiJob::success, [this] {
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Folder successfully unlocked" << _folderId;
|
||||
_folderLocked = false;
|
||||
emit folderUnlocked();
|
||||
});
|
||||
connect(unlockJob, &UnlockEncryptFolderApiJob::error, this, &PropagateRemoteDeleteEncrypted::taskFailed);
|
||||
unlockJob->start();
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncrypted::taskFailed()
|
||||
{
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED) << "Task failed of job" << sender();
|
||||
if (_folderLocked) {
|
||||
connect(this, &PropagateRemoteDeleteEncrypted::folderUnlocked, this, [this] { emit finished(false); });
|
||||
unlockFolder();
|
||||
} else {
|
||||
emit finished(false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,43 +1,34 @@
|
|||
#ifndef PROPAGATEREMOTEDELETEENCRYPTED_H
|
||||
#define PROPAGATEREMOTEDELETEENCRYPTED_H
|
||||
/*
|
||||
* Copyright (C) by Oleksandr Zolotov <alex@nextcloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include <QObject>
|
||||
#include <QElapsedTimer>
|
||||
#pragma once
|
||||
|
||||
#include "syncfileitem.h"
|
||||
#include "abstractpropagateremotedeleteencrypted.h"
|
||||
|
||||
namespace OCC {
|
||||
|
||||
class OwncloudPropagator;
|
||||
class PropagateRemoteDeleteEncrypted : public QObject
|
||||
class PropagateRemoteDeleteEncrypted : public AbstractPropagateRemoteDeleteEncrypted
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
PropagateRemoteDeleteEncrypted(OwncloudPropagator *_propagator, SyncFileItemPtr item, QObject *parent);
|
||||
PropagateRemoteDeleteEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent);
|
||||
|
||||
QByteArray folderToken();
|
||||
void unlockFolder();
|
||||
|
||||
void start();
|
||||
|
||||
signals:
|
||||
void finished(bool success);
|
||||
void folderUnlocked();
|
||||
virtual void start() Q_DECL_OVERRIDE;
|
||||
|
||||
private:
|
||||
void slotFolderEncryptedIdReceived(const QStringList &list);
|
||||
void slotTryLock(const QByteArray &folderId);
|
||||
void slotFolderLockedSuccessfully(const QByteArray &fileId, const QByteArray &token);
|
||||
void slotFolderEncryptedMetadataReceived(const QJsonDocument &json, int statusCode);
|
||||
void taskFailed();
|
||||
|
||||
OwncloudPropagator *_propagator;
|
||||
SyncFileItemPtr _item;
|
||||
QByteArray _folderToken;
|
||||
QByteArray _folderId;
|
||||
bool _folderLocked = false;
|
||||
void slotFolderUnLockedSuccessfully(const QByteArray &folderId) override;
|
||||
void slotFolderEncryptedMetadataReceived(const QJsonDocument &json, int statusCode) override;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // PROPAGATEREMOTEDELETEENCRYPTED_H
|
||||
|
|
191
src/libsync/propagateremotedeleteencryptedrootfolder.cpp
Normal file
191
src/libsync/propagateremotedeleteencryptedrootfolder.cpp
Normal file
|
@ -0,0 +1,191 @@
|
|||
/*
|
||||
* Copyright (C) by Oleksandr Zolotov <alex@nextcloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Removing the root encrypted folder is consisted of multiple steps:
|
||||
* - 1st step is to obtain the folderID via LsColJob so it then can be used for the next step
|
||||
* - 2nd step is to lock the root folder useing the folderID from the previous step. !!! NOTE: If there are no nested items in the folder, this, and subsequent steps are skipped until step 7.
|
||||
* - 3rd step is to obtain the root folder's metadata (it contains list of nested files and folders)
|
||||
* - 4th step is to remove the nested files and folders from the metadata and send it to the server via UpdateMetadataApiJob
|
||||
* - 5th step is to trigger DeleteJob for every nested file and folder of the root folder
|
||||
* - 6th step is to unlock the root folder using the previously obtained token from locking
|
||||
* - 7th step is to decrypt and delete the root folder, because it is now possible as it has become empty
|
||||
*/
|
||||
|
||||
#include <QFileInfo>
|
||||
#include <QLoggingCategory>
|
||||
|
||||
#include "deletejob.h"
|
||||
#include "clientsideencryptionjobs.h"
|
||||
#include "clientsideencryption.h"
|
||||
#include "encryptfolderjob.h"
|
||||
#include "owncloudpropagator.h"
|
||||
#include "propagateremotedeleteencryptedrootfolder.h"
|
||||
|
||||
namespace {
|
||||
const char* encryptedFileNamePropertyKey = "encryptedFileName";
|
||||
}
|
||||
|
||||
using namespace OCC;
|
||||
|
||||
Q_LOGGING_CATEGORY(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER, "nextcloud.sync.propagator.remove.encrypted.rootfolder")
|
||||
|
||||
PropagateRemoteDeleteEncryptedRootFolder::PropagateRemoteDeleteEncryptedRootFolder(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent)
|
||||
: AbstractPropagateRemoteDeleteEncrypted(propagator, item, parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncryptedRootFolder::start()
|
||||
{
|
||||
Q_ASSERT(_item->_isEncrypted);
|
||||
|
||||
const bool listFilesResult = _propagator->_journal->listFilesInPath(_item->_file.toUtf8(), [this](const OCC::SyncJournalFileRecord &record) {
|
||||
_nestedItems[record._e2eMangledName] = record;
|
||||
});
|
||||
|
||||
if (!listFilesResult || _nestedItems.isEmpty()) {
|
||||
// if the folder is empty, just decrypt and delete it
|
||||
decryptAndRemoteDelete();
|
||||
return;
|
||||
}
|
||||
|
||||
startLsColJob(_item->_file);
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncryptedRootFolder::slotFolderUnLockedSuccessfully(const QByteArray &folderId)
|
||||
{
|
||||
AbstractPropagateRemoteDeleteEncrypted::slotFolderUnLockedSuccessfully(folderId);
|
||||
decryptAndRemoteDelete();
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncryptedRootFolder::slotFolderEncryptedMetadataReceived(const QJsonDocument &json, int statusCode)
|
||||
{
|
||||
if (statusCode == 404) {
|
||||
// we've eneded up having no metadata, but, _nestedItems is not empty since we went this far, let's proceed with removing the nested items without modifying the metadata
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "There is no metadata for this folder. Just remove it's nested items.";
|
||||
for (auto it = _nestedItems.constBegin(); it != _nestedItems.constEnd(); ++it) {
|
||||
deleteNestedRemoteItem(it.key());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
FolderMetadata metadata(_propagator->account(), json.toJson(QJsonDocument::Compact), statusCode);
|
||||
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "It's a root encrypted folder. Let's remove nested items first.";
|
||||
|
||||
metadata.removeAllEncryptedFiles();
|
||||
|
||||
qCDebug(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "Metadata updated, sending to the server.";
|
||||
|
||||
auto job = new UpdateMetadataApiJob(_propagator->account(), _folderId, metadata.encryptedMetadata(), _folderToken);
|
||||
connect(job, &UpdateMetadataApiJob::success, this, [this](const QByteArray& fileId) {
|
||||
Q_UNUSED(fileId);
|
||||
for (auto it = _nestedItems.constBegin(); it != _nestedItems.constEnd(); ++it) {
|
||||
deleteNestedRemoteItem(it.key());
|
||||
}
|
||||
});
|
||||
connect(job, &UpdateMetadataApiJob::error, this, &PropagateRemoteDeleteEncryptedRootFolder::taskFailed);
|
||||
job->start();
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncryptedRootFolder::slotDeleteNestedRemoteItemFinished()
|
||||
{
|
||||
auto *deleteJob = qobject_cast<DeleteJob *>(QObject::sender());
|
||||
|
||||
Q_ASSERT(deleteJob);
|
||||
|
||||
if (!deleteJob) {
|
||||
return;
|
||||
}
|
||||
|
||||
const QString encryptedFileName = deleteJob->property(encryptedFileNamePropertyKey).toString();
|
||||
|
||||
if (!encryptedFileName.isEmpty()) {
|
||||
const auto nestedItem = _nestedItems.take(encryptedFileName);
|
||||
|
||||
if (nestedItem.isValid()) {
|
||||
_propagator->_journal->deleteFileRecord(nestedItem._path, nestedItem._type == ItemTypeDirectory);
|
||||
_propagator->_journal->commit("Remote Remove");
|
||||
}
|
||||
}
|
||||
|
||||
QNetworkReply::NetworkError err = deleteJob->reply()->error();
|
||||
|
||||
const auto httpErrorCode = deleteJob->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
_item->_responseTimeStamp = deleteJob->responseTimestamp();
|
||||
_item->_requestId = deleteJob->requestId();
|
||||
|
||||
if (err != QNetworkReply::NoError && err != QNetworkReply::ContentNotFoundError) {
|
||||
storeFirstError(err);
|
||||
storeFirstErrorString(deleteJob->errorString());
|
||||
qCWarning(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "Delete nested item finished with error" << err << ".";
|
||||
} else if (httpErrorCode != 204 && httpErrorCode != 404) {
|
||||
// A 404 reply is also considered a success here: We want to make sure
|
||||
// a file is gone from the server. It not being there in the first place
|
||||
// is ok. This will happen for files that are in the DB but not on
|
||||
// the server or the local file system.
|
||||
|
||||
// Normally we expect "204 No Content"
|
||||
// If it is not the case, it might be because of a proxy or gateway intercepting the request, so we must
|
||||
// throw an error.
|
||||
storeFirstErrorString(tr("Wrong HTTP code returned by server. Expected 204, but received \"%1 %2\".")
|
||||
.arg(httpErrorCode)
|
||||
.arg(deleteJob->reply()->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()));
|
||||
if (_item->_httpErrorCode == 0) {
|
||||
_item->_httpErrorCode = httpErrorCode;
|
||||
}
|
||||
|
||||
qCWarning(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "Delete nested item finished with error" << httpErrorCode << ".";
|
||||
}
|
||||
|
||||
if (_nestedItems.size() == 0) {
|
||||
// we wait for all _nestedItems' DeleteJobs to finish, and then - fail if any of those jobs has failed
|
||||
if (networkError() != QNetworkReply::NetworkError::NoError || _item->_httpErrorCode != 0) {
|
||||
const int errorCode = networkError() != QNetworkReply::NetworkError::NoError ? networkError() : _item->_httpErrorCode;
|
||||
qCCritical(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "Delete of nested items finished with error" << errorCode << ". Failing the entire sequence.";
|
||||
taskFailed();
|
||||
return;
|
||||
}
|
||||
unlockFolder();
|
||||
}
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncryptedRootFolder::deleteNestedRemoteItem(const QString &filename)
|
||||
{
|
||||
qCInfo(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "Deleting nested encrypted remote item" << filename;
|
||||
|
||||
auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), this);
|
||||
deleteJob->setFolderToken(_folderToken);
|
||||
deleteJob->setProperty(encryptedFileNamePropertyKey, filename);
|
||||
|
||||
connect(deleteJob, &DeleteJob::finishedSignal, this, &PropagateRemoteDeleteEncryptedRootFolder::slotDeleteNestedRemoteItemFinished);
|
||||
|
||||
deleteJob->start();
|
||||
}
|
||||
|
||||
void PropagateRemoteDeleteEncryptedRootFolder::decryptAndRemoteDelete()
|
||||
{
|
||||
auto job = new OCC::SetEncryptionFlagApiJob(_propagator->account(), _item->_fileId, OCC::SetEncryptionFlagApiJob::Clear, this);
|
||||
connect(job, &OCC::SetEncryptionFlagApiJob::success, this, [this] (const QByteArray &fileId) {
|
||||
Q_UNUSED(fileId);
|
||||
deleteRemoteItem(_item->_file);
|
||||
});
|
||||
connect(job, &OCC::SetEncryptionFlagApiJob::error, this, [this] (const QByteArray &fileId, int httpReturnCode) {
|
||||
Q_UNUSED(fileId);
|
||||
_item->_httpErrorCode = httpReturnCode;
|
||||
taskFailed();
|
||||
});
|
||||
job->start();
|
||||
}
|
43
src/libsync/propagateremotedeleteencryptedrootfolder.h
Normal file
43
src/libsync/propagateremotedeleteencryptedrootfolder.h
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Copyright (C) by Oleksandr Zolotov <alex@nextcloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QMap>
|
||||
|
||||
#include "abstractpropagateremotedeleteencrypted.h"
|
||||
#include "syncfileitem.h"
|
||||
|
||||
namespace OCC {
|
||||
|
||||
class PropagateRemoteDeleteEncryptedRootFolder : public AbstractPropagateRemoteDeleteEncrypted
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
PropagateRemoteDeleteEncryptedRootFolder(OwncloudPropagator *propagator, SyncFileItemPtr item, QObject *parent);
|
||||
|
||||
virtual void start() Q_DECL_OVERRIDE;
|
||||
|
||||
private:
|
||||
void slotFolderUnLockedSuccessfully(const QByteArray &folderId) override;
|
||||
void slotFolderEncryptedMetadataReceived(const QJsonDocument &json, int statusCode) override;
|
||||
void slotDeleteNestedRemoteItemFinished();
|
||||
|
||||
void deleteNestedRemoteItem(const QString &filename);
|
||||
void decryptAndRemoteDelete();
|
||||
|
||||
QMap<QString, OCC::SyncJournalFileRecord> _nestedItems; // Nested files and folders
|
||||
};
|
||||
|
||||
}
|
|
@ -17,7 +17,7 @@
|
|||
#include "account.h"
|
||||
#include "common/syncjournalfilerecord.h"
|
||||
#include "propagateuploadencrypted.h"
|
||||
#include "propagateremotedelete.h"
|
||||
#include "deletejob.h"
|
||||
#include "common/asserts.h"
|
||||
#include "encryptfolderjob.h"
|
||||
|
||||
|
@ -34,14 +34,6 @@ PropagateRemoteMkdir::PropagateRemoteMkdir(OwncloudPropagator *propagator, const
|
|||
, _uploadEncryptedHelper(nullptr)
|
||||
, _parallelism(FullParallelism)
|
||||
{
|
||||
const auto rootPath = [=]() {
|
||||
const auto result = propagator->remotePath();
|
||||
if (result.startsWith('/')) {
|
||||
return result.mid(1);
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}();
|
||||
const auto path = _item->_file;
|
||||
const auto slashPosition = path.lastIndexOf('/');
|
||||
const auto parentPath = slashPosition >= 0 ? path.left(slashPosition) : QString();
|
||||
|
@ -52,11 +44,7 @@ PropagateRemoteMkdir::PropagateRemoteMkdir(OwncloudPropagator *propagator, const
|
|||
return;
|
||||
}
|
||||
|
||||
const auto account = propagator->account();
|
||||
|
||||
if (account->capabilities().clientSideEncryptionAvailable() &&
|
||||
parentRec.isValid() &&
|
||||
parentRec._isE2eEncrypted) {
|
||||
if (hasEncryptedAncestor()) {
|
||||
_parallelism = WaitForFinished;
|
||||
}
|
||||
}
|
||||
|
@ -142,14 +130,6 @@ void PropagateRemoteMkdir::setDeleteExisting(bool enabled)
|
|||
|
||||
void PropagateRemoteMkdir::slotMkdir()
|
||||
{
|
||||
const auto rootPath = [=]() {
|
||||
const auto result = propagator()->remotePath();
|
||||
if (result.startsWith('/')) {
|
||||
return result.mid(1);
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}();
|
||||
const auto path = _item->_file;
|
||||
const auto slashPosition = path.lastIndexOf('/');
|
||||
const auto parentPath = slashPosition >= 0 ? path.left(slashPosition) : QString();
|
||||
|
@ -161,21 +141,7 @@ void PropagateRemoteMkdir::slotMkdir()
|
|||
return;
|
||||
}
|
||||
|
||||
const auto hasEncryptedAncestor = [=] {
|
||||
auto pathComponents = parentPath.split('/');
|
||||
while (!pathComponents.isEmpty()) {
|
||||
SyncJournalFileRecord rec;
|
||||
propagator()->_journal->getFileRecord(pathComponents.join('/'), &rec);
|
||||
if (rec.isValid() && rec._isE2eEncrypted) {
|
||||
return true;
|
||||
}
|
||||
pathComponents.removeLast();
|
||||
}
|
||||
return false;
|
||||
}();
|
||||
|
||||
const auto account = propagator()->account();
|
||||
if (!account->capabilities().clientSideEncryptionAvailable() || !hasEncryptedAncestor) {
|
||||
if (!hasEncryptedAncestor()) {
|
||||
slotStartMkcolJob();
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include "propagatorjobs.h"
|
||||
#include "common/checksums.h"
|
||||
#include "syncengine.h"
|
||||
#include "propagateremotedelete.h"
|
||||
#include "deletejob.h"
|
||||
#include "common/asserts.h"
|
||||
#include "networkjobs.h"
|
||||
#include "clientsideencryption.h"
|
||||
|
@ -206,11 +206,7 @@ PropagateUploadFileCommon::PropagateUploadFileCommon(OwncloudPropagator *propaga
|
|||
return;
|
||||
}
|
||||
|
||||
const auto account = propagator->account();
|
||||
|
||||
if (account->capabilities().clientSideEncryptionAvailable() &&
|
||||
parentRec.isValid() &&
|
||||
parentRec._isE2eEncrypted) {
|
||||
if (hasEncryptedAncestor()) {
|
||||
_parallelism = WaitForFinished;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include "propagatorjobs.h"
|
||||
#include "syncengine.h"
|
||||
#include "propagateremotemove.h"
|
||||
#include "propagateremotedelete.h"
|
||||
#include "deletejob.h"
|
||||
#include "common/asserts.h"
|
||||
|
||||
#include <QNetworkAccessManager>
|
||||
|
@ -318,7 +318,7 @@ void PropagateUploadFileNG::startNextChunk()
|
|||
|
||||
const QString fileName = _fileToUpload._path;
|
||||
auto device = std::make_unique<UploadDevice>(
|
||||
fileName, _currentChunk, _currentChunkSize, &propagator()->_bandwidthManager);
|
||||
fileName, _sent, _currentChunkSize, &propagator()->_bandwidthManager);
|
||||
if (!device->open(QIODevice::ReadOnly)) {
|
||||
qCWarning(lcPropagateUploadNG) << "Could not prepare upload device: " << device->errorString();
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include "common/syncfilestatus.h"
|
||||
#include "csync_exclude.h"
|
||||
#include "filesystem.h"
|
||||
#include "propagateremotedelete.h"
|
||||
#include "deletejob.h"
|
||||
#include "propagatedownload.h"
|
||||
#include "common/asserts.h"
|
||||
#include "configfile.h"
|
||||
|
|
186
src/libsync/vfs/xattr/vfs_xattr.cpp
Normal file
186
src/libsync/vfs/xattr/vfs_xattr.cpp
Normal file
|
@ -0,0 +1,186 @@
|
|||
/*
|
||||
* Copyright (C) by Kevin Ottens <kevin.ottens@nextcloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include "vfs_xattr.h"
|
||||
|
||||
#include <QFile>
|
||||
|
||||
#include "syncfileitem.h"
|
||||
#include "filesystem.h"
|
||||
#include "common/syncjournaldb.h"
|
||||
|
||||
#include "xattrwrapper.h"
|
||||
|
||||
namespace xattr {
|
||||
using namespace OCC::XAttrWrapper;
|
||||
}
|
||||
|
||||
namespace OCC {
|
||||
|
||||
VfsXAttr::VfsXAttr(QObject *parent)
|
||||
: Vfs(parent)
|
||||
{
|
||||
}
|
||||
|
||||
VfsXAttr::~VfsXAttr() = default;
|
||||
|
||||
Vfs::Mode VfsXAttr::mode() const
|
||||
{
|
||||
return XAttr;
|
||||
}
|
||||
|
||||
QString VfsXAttr::fileSuffix() const
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
void VfsXAttr::startImpl(const VfsSetupParams &)
|
||||
{
|
||||
}
|
||||
|
||||
void VfsXAttr::stop()
|
||||
{
|
||||
}
|
||||
|
||||
void VfsXAttr::unregisterFolder()
|
||||
{
|
||||
}
|
||||
|
||||
bool VfsXAttr::socketApiPinStateActionsShown() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool VfsXAttr::isHydrating() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Result<void, QString> VfsXAttr::updateMetadata(const QString &filePath, time_t modtime, qint64, const QByteArray &)
|
||||
{
|
||||
FileSystem::setModTime(filePath, modtime);
|
||||
return {};
|
||||
}
|
||||
|
||||
Result<void, QString> VfsXAttr::createPlaceholder(const SyncFileItem &item)
|
||||
{
|
||||
const auto path = QString(_setupParams.filesystemPath + item._file);
|
||||
QFile file(path);
|
||||
if (file.exists() && file.size() > 1
|
||||
&& !FileSystem::verifyFileUnchanged(path, item._size, item._modtime)) {
|
||||
return QStringLiteral("Cannot create a placeholder because a file with the placeholder name already exist");
|
||||
}
|
||||
|
||||
if (!file.open(QFile::ReadWrite | QFile::Truncate)) {
|
||||
return file.errorString();
|
||||
}
|
||||
|
||||
file.write(" ");
|
||||
file.close();
|
||||
FileSystem::setModTime(path, item._modtime);
|
||||
return xattr::addNextcloudPlaceholderAttributes(path);
|
||||
}
|
||||
|
||||
Result<void, QString> VfsXAttr::dehydratePlaceholder(const SyncFileItem &item)
|
||||
{
|
||||
const auto path = QString(_setupParams.filesystemPath + item._file);
|
||||
QFile file(path);
|
||||
if (!file.remove()) {
|
||||
return QStringLiteral("Couldn't remove the original file to dehydrate");
|
||||
}
|
||||
auto r = createPlaceholder(item);
|
||||
if (!r) {
|
||||
return r;
|
||||
}
|
||||
|
||||
// Ensure the pin state isn't contradictory
|
||||
const auto pin = pinState(item._file);
|
||||
if (pin && *pin == PinState::AlwaysLocal) {
|
||||
setPinState(item._renameTarget, PinState::Unspecified);
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
Result<void, QString> VfsXAttr::convertToPlaceholder(const QString &, const SyncFileItem &, const QString &)
|
||||
{
|
||||
// Nothing necessary
|
||||
return {};
|
||||
}
|
||||
|
||||
bool VfsXAttr::needsMetadataUpdate(const SyncFileItem &)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool VfsXAttr::isDehydratedPlaceholder(const QString &filePath)
|
||||
{
|
||||
const auto fi = QFileInfo(filePath);
|
||||
return fi.exists() &&
|
||||
xattr::hasNextcloudPlaceholderAttributes(filePath);
|
||||
}
|
||||
|
||||
bool VfsXAttr::statTypeVirtualFile(csync_file_stat_t *stat, void *statData)
|
||||
{
|
||||
if (stat->type == ItemTypeDirectory) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto parentPath = static_cast<QByteArray *>(statData);
|
||||
Q_ASSERT(!parentPath->endsWith('/'));
|
||||
Q_ASSERT(!stat->path.startsWith('/'));
|
||||
|
||||
const auto path = QByteArray(*parentPath + '/' + stat->path);
|
||||
const auto pin = [=] {
|
||||
const auto absolutePath = QString::fromUtf8(path);
|
||||
Q_ASSERT(absolutePath.startsWith(params().filesystemPath.toUtf8()));
|
||||
const auto folderPath = absolutePath.mid(params().filesystemPath.length());
|
||||
return pinState(folderPath);
|
||||
}();
|
||||
|
||||
if (xattr::hasNextcloudPlaceholderAttributes(path)) {
|
||||
const auto shouldDownload = pin && (*pin == PinState::AlwaysLocal);
|
||||
stat->type = shouldDownload ? ItemTypeVirtualFileDownload : ItemTypeVirtualFile;
|
||||
return true;
|
||||
} else {
|
||||
const auto shouldDehydrate = pin && (*pin == PinState::OnlineOnly);
|
||||
if (shouldDehydrate) {
|
||||
stat->type = ItemTypeVirtualFileDehydration;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool VfsXAttr::setPinState(const QString &folderPath, PinState state)
|
||||
{
|
||||
return setPinStateInDb(folderPath, state);
|
||||
}
|
||||
|
||||
Optional<PinState> VfsXAttr::pinState(const QString &folderPath)
|
||||
{
|
||||
return pinStateInDb(folderPath);
|
||||
}
|
||||
|
||||
Vfs::AvailabilityResult VfsXAttr::availability(const QString &folderPath)
|
||||
{
|
||||
return availabilityInDb(folderPath);
|
||||
}
|
||||
|
||||
void VfsXAttr::fileStatusChanged(const QString &, SyncFileStatus)
|
||||
{
|
||||
}
|
||||
|
||||
} // namespace OCC
|
||||
|
||||
OCC_DEFINE_VFS_FACTORY("xattr", OCC::VfsXAttr)
|
61
src/libsync/vfs/xattr/vfs_xattr.h
Normal file
61
src/libsync/vfs/xattr/vfs_xattr.h
Normal file
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* Copyright (C) by Kevin Ottens <kevin.ottens@nextcloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QScopedPointer>
|
||||
|
||||
#include "common/vfs.h"
|
||||
|
||||
namespace OCC {
|
||||
|
||||
class VfsXAttr : public Vfs
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit VfsXAttr(QObject *parent = nullptr);
|
||||
~VfsXAttr();
|
||||
|
||||
Mode mode() const override;
|
||||
QString fileSuffix() const override;
|
||||
|
||||
void stop() override;
|
||||
void unregisterFolder() override;
|
||||
|
||||
bool socketApiPinStateActionsShown() const override;
|
||||
bool isHydrating() const override;
|
||||
|
||||
Result<void, QString> updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) override;
|
||||
|
||||
Result<void, QString> createPlaceholder(const SyncFileItem &item) override;
|
||||
Result<void, QString> dehydratePlaceholder(const SyncFileItem &item) override;
|
||||
Result<void, QString> convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile) override;
|
||||
|
||||
bool needsMetadataUpdate(const SyncFileItem &item) override;
|
||||
bool isDehydratedPlaceholder(const QString &filePath) override;
|
||||
bool statTypeVirtualFile(csync_file_stat_t *stat, void *statData) override;
|
||||
|
||||
bool setPinState(const QString &folderPath, PinState state) override;
|
||||
Optional<PinState> pinState(const QString &folderPath) override;
|
||||
AvailabilityResult availability(const QString &folderPath) override;
|
||||
|
||||
public slots:
|
||||
void fileStatusChanged(const QString &systemFileName, SyncFileStatus fileStatus) override;
|
||||
|
||||
protected:
|
||||
void startImpl(const VfsSetupParams ¶ms) override;
|
||||
};
|
||||
|
||||
} // namespace OCC
|
31
src/libsync/vfs/xattr/xattrwrapper.h
Normal file
31
src/libsync/vfs/xattr/xattrwrapper.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* Copyright (C) by Kevin Ottens <kevin.ottens@nextcloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <QString>
|
||||
|
||||
#include "owncloudlib.h"
|
||||
#include "common/result.h"
|
||||
|
||||
namespace OCC {
|
||||
|
||||
namespace XAttrWrapper
|
||||
{
|
||||
|
||||
OWNCLOUDSYNC_EXPORT bool hasNextcloudPlaceholderAttributes(const QString &path);
|
||||
OWNCLOUDSYNC_EXPORT Result<void, QString> addNextcloudPlaceholderAttributes(const QString &path);
|
||||
|
||||
}
|
||||
|
||||
} // namespace OCC
|
69
src/libsync/vfs/xattr/xattrwrapper_linux.cpp
Normal file
69
src/libsync/vfs/xattr/xattrwrapper_linux.cpp
Normal file
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Copyright (C) by Kevin Ottens <kevin.ottens@nextcloud.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#include "xattrwrapper.h"
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <QLoggingCategory>
|
||||
|
||||
#include <sys/xattr.h>
|
||||
|
||||
Q_LOGGING_CATEGORY(lcXAttrWrapper, "nextcloud.sync.vfs.xattr.wrapper", QtInfoMsg)
|
||||
|
||||
namespace {
|
||||
constexpr auto hydrateExecAttributeName = "user.nextcloud.hydrate_exec";
|
||||
|
||||
OCC::Optional<QByteArray> xattrGet(const QByteArray &path, const QByteArray &name)
|
||||
{
|
||||
constexpr auto bufferSize = 256;
|
||||
QByteArray result;
|
||||
result.resize(bufferSize);
|
||||
const auto count = getxattr(path.constData(), name.constData(), result.data(), bufferSize);
|
||||
if (count >= 0) {
|
||||
result.resize(static_cast<int>(count) - 1);
|
||||
return result;
|
||||
} else {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
bool xattrSet(const QByteArray &path, const QByteArray &name, const QByteArray &value)
|
||||
{
|
||||
const auto returnCode = setxattr(path.constData(), name.constData(), value.constData(), value.size() + 1, 0);
|
||||
return returnCode == 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool OCC::XAttrWrapper::hasNextcloudPlaceholderAttributes(const QString &path)
|
||||
{
|
||||
const auto value = xattrGet(path.toUtf8(), hydrateExecAttributeName);
|
||||
if (value) {
|
||||
return *value == QByteArrayLiteral(APPLICATION_EXECUTABLE);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
OCC::Result<void, QString> OCC::XAttrWrapper::addNextcloudPlaceholderAttributes(const QString &path)
|
||||
{
|
||||
const auto success = xattrSet(path.toUtf8(), hydrateExecAttributeName, APPLICATION_EXECUTABLE);
|
||||
if (!success) {
|
||||
return QStringLiteral("Failed to set the extended attribute");
|
||||
} else {
|
||||
return {};
|
||||
}
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
include(DefinePlatformDefaults)
|
||||
find_package(SQLite3 3.8.0 REQUIRED)
|
||||
include_directories(${CMAKE_SOURCE_DIR}/src
|
||||
${CMAKE_SOURCE_DIR}/src/3rdparty/qtokenizer
|
||||
|
@ -76,6 +77,8 @@ endif(UNIX AND NOT APPLE)
|
|||
if (WIN32)
|
||||
nextcloud_add_test(LongWinPath "")
|
||||
nextcloud_add_test(SyncCfApi "")
|
||||
elseif(LINUX) # elseif(LINUX OR APPLE)
|
||||
nextcloud_add_test(SyncXAttr "")
|
||||
endif()
|
||||
|
||||
nextcloud_add_benchmark(LargeSync "")
|
||||
|
|
1095
test/testsyncxattr.cpp
Normal file
1095
test/testsyncxattr.cpp
Normal file
File diff suppressed because it is too large
Load diff
|
@ -202,6 +202,19 @@
|
|||
<translation>Сървъра отговори "%1 %2" на "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3095,6 +3108,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Respontet en deus "%1 %2" da "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3115,6 +3128,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Kod HTTP fall roet gant ar servijour. O gortoz e oa 204, met resevet a zo ber "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor ha contestat «%1 %2» a «%3 %4»</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -2594,7 +2607,7 @@ for additional privileges during the process.</source>
|
|||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="96"/>
|
||||
<source>This is the link to your %1 web interface when you open it in the browser.<br/>It looks like https://cloud.example.com or https://example.com/cloud</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Aquest és l'enllaç a la interfície web del %1 quan l'obriu en el navegador.<br/>És similar a https://cloud.example.com o https://example.com/cloud</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudsetuppage.cpp" line="184"/>
|
||||
|
@ -3108,6 +3121,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>El servidor ha retornat un codi HTTP incorrecte. S'esperava el codi 204, però s'ha rebut «%1 %2».</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
@ -4014,7 +4035,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="352"/>
|
||||
<source>Could not update file : %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>No s'ha pogut actualitzar el fitxer: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="362"/>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Odpověď ze serveru „%1 %2“ na „%3 %4“</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3117,6 +3130,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Server vrátil neplatný HTTP kód. Očekáván 204, ale obdržen „%1 %2“.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Serveren svarede "%1 %2" to "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3115,6 +3128,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Forkert HTTP kode returneret fra server. Forventet 204, men modtog "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Server hat "%1 %2" auf "%3 %4" geantwortet</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>Falscher HTTP-Code vom Server zurückgegeben. 204 erwartet, aber "%1 %2" erhalten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation>"%1 Der verschlüsselte Ordner %2 konnte nicht entsperrt werden".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3137,6 +3150,14 @@ Dies ist ein neuer, experimenteller Modus. Wenn Sie sich entscheiden, ihn zu ver
|
|||
<translation>Es wurde ein falscher HTTP-Status-Code vom Server gesendet. Erwartet wurde 204, aber gesendet wurde "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>Falscher HTTP-Code vom Server zurückgegeben. 204 erwartet, aber "%1 %2" erhalten.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -202,6 +202,19 @@
|
|||
<translation>Server replied "%1 %2" to "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3106,6 +3119,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Servilo respondis „%1 %2“ al „%3 %4“</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3112,6 +3125,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Neĝusta HTTP-kodo ricevita de servilo. Atendita: 204, ricevita: „%1 %2“.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor respondió "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>El código HTTP devuelto por el servidor es erróneo. Se esperaba 204, pero recibido "%1 %2".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation>"%1 Falló al desbloquear la carpeta cifrada %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3138,6 +3151,14 @@ Esta es un modo nuevo y experimental. Si decides usarlo, por favor, informa de c
|
|||
<translation>El código HTTP devuelto por el servidor es erróneo. Esperado 204, pero recibido "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>El código HTTP devuelto por el servidor es erróneo. Se esperaba 204, pero recibido "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3093,6 +3106,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor respondió "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3099,6 +3112,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código de HTTP equivocado regresado por el servidor. Se esperaba 204, pero se recibió "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor respondió "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3099,6 +3112,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código de HTTP equivocado regresado por el servidor. Se esperaba 204, pero se recibió "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor respondió "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3099,6 +3112,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código de HTTP equivocado regresado por el servidor. Se esperaba 204, pero se recibió "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor respondió "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3099,6 +3112,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código de HTTP equivocado regresado por el servidor. Se esperaba 204, pero se recibió "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor respondió "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3099,6 +3112,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código de HTTP equivocado regresado por el servidor. Se esperaba 204, pero se recibió "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor respondió "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3099,6 +3112,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código de HTTP equivocado regresado por el servidor. Se esperaba 204, pero se recibió "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor respondió "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3099,6 +3112,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código de HTTP equivocado regresado por el servidor. Se esperaba 204, pero se recibió "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor respondió "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3099,6 +3112,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código de HTTP equivocado regresado por el servidor. Se esperaba 204, pero se recibió "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>El servidor respondió "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3099,6 +3112,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código de HTTP equivocado regresado por el servidor. Se esperaba 204, pero se recibió "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3093,6 +3106,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Server saatis vale HTTP koodi. Ootuspärane kood oli 204, aga saadeti kood "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Zerbitzariak erantzun du "%1 %2" "%3 %4"-ra</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -384,7 +397,7 @@ Itxaron berriro sinkronizatu arte, ondoren enkriptatu.</translation>
|
|||
<message>
|
||||
<location filename="../src/gui/accountsettings.cpp" line="525"/>
|
||||
<source> (experimental)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>(esperimentala)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/accountsettings.cpp" line="501"/>
|
||||
|
@ -685,12 +698,12 @@ This action will abort any currently running synchronization.</source>
|
|||
<message>
|
||||
<location filename="../src/gui/application.cpp" line="146"/>
|
||||
<source>Quit</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Irten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/application.cpp" line="147"/>
|
||||
<source>Continue</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Jarraitu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/application.cpp" line="207"/>
|
||||
|
@ -939,7 +952,7 @@ This action will abort any currently running synchronization.</source>
|
|||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="299"/>
|
||||
<source>Filename encoding is not valid</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategiaren kodeketa baliogabea da</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="318"/>
|
||||
|
@ -1676,12 +1689,12 @@ If this was an accident and you decide to keep your files, they will be re-synce
|
|||
<message>
|
||||
<location filename="../src/gui/folderwizard.cpp" line="512"/>
|
||||
<source> (experimental)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>(esperimentala)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderwizard.cpp" line="548"/>
|
||||
<source>Virtual files are not available for the selected folder</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategi birtualak ez daude hautatutako karpetarentzako eskuragarri</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -1869,7 +1882,7 @@ Note that this selects only what pool upgrades are taken from, and that there ar
|
|||
<message>
|
||||
<location filename="../src/gui/generalsettings.cpp" line="318"/>
|
||||
<source>Cancel</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ezeztatu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/generalsettings.cpp" line="411"/>
|
||||
|
@ -2084,7 +2097,7 @@ Note that using any logging command line options will override this setting.</so
|
|||
<message>
|
||||
<location filename="../src/gui/logbrowser.cpp" line="77"/>
|
||||
<source>Open folder</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ireki karpeta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/logbrowser.cpp" line="78"/>
|
||||
|
@ -2453,7 +2466,7 @@ pribilegio gehigarriak eskatzen ahal dizu prozesuan.</translation>
|
|||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="85"/>
|
||||
<source> (experimental)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>(esperimentala)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="154"/>
|
||||
|
@ -2478,7 +2491,7 @@ pribilegio gehigarriak eskatzen ahal dizu prozesuan.</translation>
|
|||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="274"/>
|
||||
<source>Virtual files are not available for the selected folder</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategi birtualak ez daude hautatutako karpetarentzako eskuragarri</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="294"/>
|
||||
|
@ -2846,62 +2859,62 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="237"/>
|
||||
<source>Symbolic links are not supported in syncing.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Esteka sinbolikoak ezin dira sinkronizatu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="245"/>
|
||||
<source>File is listed on the ignore list.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategia baztertutakoen zerrendan dago.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="249"/>
|
||||
<source>File names ending with a period are not supported on this file system.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Puntu batekin amaitzen diren fitxategi-izenak ez dira onartzen fitxategi-sistema honetan.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="259"/>
|
||||
<source>File names containing the character '%1' are not supported on this file system.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>'%1' karakterea daukaten fitxategi-izenak ez dira onartzen fitxategi-sistema honetan.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="263"/>
|
||||
<source>File name contains at least one invalid character</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategi izenak behintzat baliogabeko karaktere bat du</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="265"/>
|
||||
<source>The file name is a reserved name on this file system.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategi-izena izen erreserbatua da fitxategi-sistema honetan.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="270"/>
|
||||
<source>Filename contains trailing spaces.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategi-izenak amaierako zuriunea dauka.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="273"/>
|
||||
<source>Filename is too long.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategiaren izena luzeegia da.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="276"/>
|
||||
<source>File/Folder is ignored because it's hidden.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategia/Karpeta ez da ikusi ezkutuan dagoelako.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="279"/>
|
||||
<source>Stat failed.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Hasierak huts egin du.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="282"/>
|
||||
<source>Conflict: Server version downloaded, local copy renamed and not uploaded.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gatazka: zerbitzari bertsioa deskargatu da, kopia lokala berrizendatua eta ez igoa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="286"/>
|
||||
<source>The filename cannot be encoded on your file system.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxategi-izen hori ezin da kodetu fitxategi-sistema honetan.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="289"/>
|
||||
|
@ -2936,22 +2949,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1186"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ez ikusi egin zaio, "aukeratu zer sinkronizatu" zerrenda beltzagatik.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1219"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ez da onartu, ez daukazulako baimenik karpeta horretan azpikarpetak gehitzeko</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1224"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ez da onartu, ez daukazulako baimenik karpeta horretan fitxategiak gehitzeko</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1237"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ez dago baimenik fitxategi hau kargatzek zerbitzarian irakurtzeko soilik delako, leheneratzen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1259"/>
|
||||
|
@ -2961,7 +2974,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1272"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ezabatzeko baimenik gabe, berrezartzen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1381"/>
|
||||
|
@ -3105,7 +3118,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/propagatorjobs.cpp" line="267"/>
|
||||
<source>Error setting pin state</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Errorea pin egoera ezartzean</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -3116,6 +3129,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>HTTP kode okerra erantzun du zerbitzariak. 204 espero zen, baina "%1 %2" jaso da. </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
@ -3150,7 +3171,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/propagateremotemove.cpp" line="233"/>
|
||||
<source>Error setting pin state</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Errorea pin egoera ezartzean</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -3202,7 +3223,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
|
||||
<source>Poll URL missing</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Inkesta URLa falta da</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateuploadng.cpp" line="457"/>
|
||||
|
@ -3551,7 +3572,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/gui/shareusergroupwidget.cpp" line="89"/>
|
||||
<source>Search globally</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Bilatu globalki</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/shareusergroupwidget.cpp" line="285"/>
|
||||
|
@ -3613,7 +3634,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<location filename="../src/gui/sharee.cpp" line="133"/>
|
||||
<source>%1 (%2)</source>
|
||||
<comment>sharee (shareWithAdditionalInfo)</comment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1 (%2)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -4229,13 +4250,13 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<location filename="../src/gui/systray.cpp" line="97"/>
|
||||
<location filename="../src/gui/systray.cpp" line="107"/>
|
||||
<source>Pause sync</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gelditu sinkronizazioa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/systray.cpp" line="98"/>
|
||||
<location filename="../src/gui/systray.cpp" line="113"/>
|
||||
<source>Resume sync</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Berrekin sinkronizazioa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/systray.cpp" line="99"/>
|
||||
|
@ -4250,12 +4271,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/gui/systray.cpp" line="107"/>
|
||||
<source>Pause sync for all</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Pausatu sinkronizazioa guztientzat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/systray.cpp" line="113"/>
|
||||
<source>Resume sync for all</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Berrekin sinkronizazioa guztientzat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/systray.cpp" line="234"/>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>سرور "1% 2%" به "3% 4%" پاسخ داد</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3097,6 +3110,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>کد HTTP اشتباه توسط سرور برگردانده شد. 204 انتظار می رفت، اما "1% 2%" دریافت شد.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3101,6 +3114,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>HTTP-palvelin palautti väärän koodin. Odotettiin koodia 204, vastaanotettiin "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Le serveur a répondu "%1 %2" à "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3119,6 +3132,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Le code HTTP retourné par le serveur n'est pas valide. La valeur attendue est 204 mais la valeur reçue est "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>O servidor repondeu «%1 %2» a «%3 %4»</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>O servidor devolveu código HTTP incorrecto. Agardábase 204, mais recibiuse «%1 %2».</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation>«%1 Produciuse un fallo ao crear o cartafol %2».</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -423,7 +436,11 @@ Agarde a nova sincronización e logo cífreo.</translation>
|
|||
The only advantage of disabling virtual file support is that the selective sync feature will become available again.
|
||||
|
||||
This action will abort any currently running synchronization.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Esta acción desactivará a compatibilidade cos ficheiros virtuais. Como consecuencia, descargaranse os contidos dos cartafoles que están marcados actualmente como «só dispoñíbeis en liña».
|
||||
|
||||
A única vantaxe de desactivar a compatibilidade con ficheiros virtuais é que volverá dispoñíbel a función de sincronización selectiva.
|
||||
|
||||
Esta acción interromperá calquera sincronización que estea a executarse actualmente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/accountsettings.cpp" line="788"/>
|
||||
|
@ -468,12 +485,12 @@ This action will abort any currently running synchronization.</source>
|
|||
<message>
|
||||
<location filename="../src/gui/accountsettings.cpp" line="770"/>
|
||||
<source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
|
||||
<translation>Este servidor da versión %1 é vello e non ten soporte! Vostede verá o que fai.</translation>
|
||||
<translation>Este servidor da versión %1 é vello e non ten soporte! Proceda baixo a súa propia responsabilidade.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/accountsettings.cpp" line="1034"/>
|
||||
<source>The server version %1 is unsupported! Proceed at your own risk.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Este servidor da versión %1 non ten asistencia técnica! Proceda baixo a súa propia responsabilidade.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/accountsettings.cpp" line="772"/>
|
||||
|
@ -637,7 +654,7 @@ This action will abort any currently running synchronization.</source>
|
|||
<message>
|
||||
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
|
||||
<source>Certificate & Key (pkcs12) :</source>
|
||||
<translation>Certificado e chave (pkcs12) :</translation>
|
||||
<translation>Certificado e clave (pkcs12) :</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>
|
||||
|
@ -652,7 +669,7 @@ This action will abort any currently running synchronization.</source>
|
|||
<message>
|
||||
<location filename="../src/gui/addcertificatedialog.ui" line="79"/>
|
||||
<source>An encrypted pkcs12 bundle is strongly recommended as a copy will be stored in the configuration file.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Recoméndase encarecidamente un paquete pkcs12 cifrado xa que se gardará unha copia no ficheiro de configuración.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/addcertificatedialog.cpp" line="38"/>
|
||||
|
@ -680,7 +697,7 @@ This action will abort any currently running synchronization.</source>
|
|||
<message>
|
||||
<location filename="../src/gui/application.cpp" line="139"/>
|
||||
<source>Some settings were configured in newer versions of this client and use features that are not available in this version.<br><br>%1<br><br>The current configuration file was already backed up to <i>%2</i>.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Algúns axustes foron configuradas nas versións máis recentes deste cliente e usan funcións que non están dispoñíbeis nesta versión. <br><br>%1<br><br> Fíxose unha copia de seguridade do ficheiro de configuración actual <i>%2</i>.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/application.cpp" line="146"/>
|
||||
|
@ -918,7 +935,7 @@ This action will abort any currently running synchronization.</source>
|
|||
<location filename="../src/libsync/discoveryphase.cpp" line="497"/>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="522"/>
|
||||
<source>Server error: PROPFIND reply is not XML formatted!</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Erro do servidor: a resposta PROPFIND non está formatada en XML.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -931,7 +948,7 @@ This action will abort any currently running synchronization.</source>
|
|||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="264"/>
|
||||
<source>Directory not accessible on client, permission denied</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Directorio non accesíbel no cliente, permiso denegado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discoveryphase.cpp" line="268"/>
|
||||
|
@ -1069,7 +1086,7 @@ Isto pode ser un problema coas súas bibliotecas OpenSSL.</translation>
|
|||
<message numerus="yes">
|
||||
<location filename="../src/gui/folder.cpp" line="425"/>
|
||||
<source>%1 and %n other file(s) have been added.</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>%1 e outro ficheiro foi actualizado.</numerusform><numerusform>%1 e outros %n ficheiros foron engadidos.</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folder.cpp" line="427"/>
|
||||
|
@ -1256,14 +1273,19 @@ Continuando a sincronización como normal fará que todos os seus ficheiros sexa
|
|||
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
|
||||
If you decide to restore the files, they will be re-synced with the server if you have rights to do so.
|
||||
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Todos os ficheiros no cartafol de sincronización «%1» foron eliminados no servidor.
|
||||
Estas eliminacións sincronizarse co seu cartafol de sincronización local, facendo que estes ficheiros non estean dispoñíbeis a menos que teña dereitos para restauralos.
|
||||
Se decide restaurar os ficheiros, resincronizaranse co servidor se ten dereitos para facelo.
|
||||
Se decide eliminar os ficheiros, non poderá dispor deles a non ser que sexa o propietario.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folder.cpp" line="1240"/>
|
||||
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
|
||||
Are you sure you want to sync those actions with the server?
|
||||
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Todos os ficheiros do cartafol de sincronización local «%1» foron eliminados. Estas eliminacións sincronizaranse co servidor, facendo que estes ficheiros non estean dispoñíbeis a non ser que se restauren.
|
||||
Confirma que quere sincronizar estas accións co servidor?
|
||||
Se fose un accidente e decide manter os seus ficheiros, volverán ser sincronizados dende o servidor.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folder.cpp" line="1244"/>
|
||||
|
@ -1672,7 +1694,7 @@ If this was an accident and you decide to keep your files, they will be re-synce
|
|||
<message>
|
||||
<location filename="../src/gui/folderwizard.cpp" line="512"/>
|
||||
<source>Use virtual files instead of downloading content immediately%1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Use ficheiros virtuais no canto de descargar contido inmediatamente%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderwizard.cpp" line="512"/>
|
||||
|
@ -1713,7 +1735,7 @@ If this was an accident and you decide to keep your files, they will be re-synce
|
|||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="213"/>
|
||||
<source>We received an unexpected download Content-Length.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Recibimos unha descarga inesperada de lonxitude do contido.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagatedownload.cpp" line="215"/>
|
||||
|
@ -1848,7 +1870,7 @@ If this was an accident and you decide to keep your files, they will be re-synce
|
|||
<message>
|
||||
<location filename="../src/gui/generalsettings.cpp" line="162"/>
|
||||
<source>You cannot disable autostart because system-wide autostart is enabled.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Non pode desactivar o inicio automático porque o inicio automático de todo o sistema está activado.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/generalsettings.cpp" line="303"/>
|
||||
|
@ -2066,18 +2088,21 @@ Os elementos onde se permite a eliminación eliminaranse se impiden que se elimi
|
|||
<source>The client can write debug logs to a temporary folder. These logs are very helpful for diagnosing problems.
|
||||
Since log files can get large, the client will start a new one for each sync run and compress older ones. It will also delete log files after a couple of hours to avoid consuming too much disk space.
|
||||
If enabled, logs will be written to %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>O cliente pode escribir rexistros de depuración nun cartafol temporal. Estes rexistros son moi útiles para diagnosticar problemas.
|
||||
Dado que os ficheiros de rexistro poden ser grandes, o cliente iniciará un novo para cada execución de sincronización e comprimirá os máis antigos. Tamén eliminará os ficheiros de rexistro após un par de horas para evitar consumir demasiado espazo no disco.
|
||||
Se está activado, os rexistros escribiranse en %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/logbrowser.cpp" line="64"/>
|
||||
<source>Enable logging to temporary folder</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Activar o acceso no cartafol temporal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/logbrowser.cpp" line="70"/>
|
||||
<source>This setting persists across client restarts.
|
||||
Note that using any logging command line options will override this setting.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Este axuste persiste nos reinicios do cliente.
|
||||
Teña en conta que o uso de calquera opción da liña de ordes anulara este axuste.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/logbrowser.cpp" line="70"/>
|
||||
|
@ -2251,7 +2276,7 @@ Os rexistros escribiranse en %1</translation>
|
|||
<message>
|
||||
<location filename="../src/gui/networksettings.ui" line="176"/>
|
||||
<source>Note: proxy settings have no effects for accounts on localhost</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Nota: os axustes do proxy non teñen efectos para as contas en localhost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/networksettings.ui" line="190"/>
|
||||
|
@ -2334,7 +2359,7 @@ Os rexistros escribiranse en %1</translation>
|
|||
<message>
|
||||
<location filename="../src/gui/creds/oauth.cpp" line="120"/>
|
||||
<source>Empty JSON from OAuth2 redirect</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>JSON baleiro da redirección de OAuth2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/creds/oauth.cpp" line="116"/>
|
||||
|
@ -2452,7 +2477,7 @@ actualización pode pedir privilexios adicionais durante o procedemento.</transl
|
|||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="85"/>
|
||||
<source>Use &virtual files instead of downloading content immediately%1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Use ficheiros &virtuais no canto de descargar contido inmediatamente%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="85"/>
|
||||
|
@ -2482,7 +2507,7 @@ actualización pode pedir privilexios adicionais durante o procedemento.</transl
|
|||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="274"/>
|
||||
<source>Virtual files are not available for the selected folder</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Os ficheiros virtuais non están dispoñíbeis para o cartafol seleccionado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="294"/>
|
||||
|
@ -2806,7 +2831,13 @@ The virtual files mode is mutually exclusive with selective sync. Currently unse
|
|||
Switching to this mode will abort any currently running synchronization.
|
||||
|
||||
This is a new, experimental mode. If you decide to use it, please report any issues that come up.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Cando está activado o modo «ficheiros virtuais» inicialmente non se descargarán ficheiros. Pola contra, crearase un pequeno ficheiro «%1» para cada ficheiro que existe no servidor. O contido pódese descargar executando estes ficheiros ou usando o seu menú contextual.
|
||||
|
||||
O modo de ficheiros virtuais exclúese mutuamente coa sincronización selectiva. Os cartafoles non seleccionados actualmente converteranse en cartafoles só en liña e restabeleceranse os axustes de sincronización selectiva.
|
||||
|
||||
Cambiar a este modo interromperá calquera sincronización que estea a executarse actualmente.
|
||||
|
||||
Este é un novo modo experimental. Se decide usalo, agradecémoslle que informe dos problemas que se presenten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudwizard.cpp" line="340"/>
|
||||
|
@ -2935,47 +2966,47 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="418"/>
|
||||
<source>server reported no %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>o servidor non informou de %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1186"/>
|
||||
<source>Ignored because of the "choose what to sync" blacklist</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ignorado por mor da lista de bloqueo de «escolla que sincronizar»</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1219"/>
|
||||
<source>Not allowed because you don't have permission to add subfolders to that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Non se lle permite porque vostede non ten permiso para engadir subcartafoles neste cartafol</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1224"/>
|
||||
<source>Not allowed because you don't have permission to add files in that folder</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Non se lle permite porque vostede non ten permiso para engadir ficheiros neste cartafol</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1237"/>
|
||||
<source>Not allowed to upload this file because it is read-only on the server, restoring</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Non está permitido o envío xa que o ficheiro é só de lectura no servidor, restaurando</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1259"/>
|
||||
<source>Moved to invalid target, restoring</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Moveuse a un destino non válido, restaurándo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1272"/>
|
||||
<source>Not allowed to remove, restoring</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Non está permitido retiralo, restaurando</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1381"/>
|
||||
<source>Error while reading the database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Produciuse un erro ao ler a base de datos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="1442"/>
|
||||
<source>Server replied with an error while reading directory '%1' : %2</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>O servidor respondeu cun erro ao ler o directorio «%1» : %2</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -3109,7 +3140,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/propagatorjobs.cpp" line="267"/>
|
||||
<source>Error setting pin state</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Produciuse un erro ao definir o estado do pin</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -3120,6 +3151,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>O servidor devolveu código HTTP incorrecto. Agardábase 204, mais recibiuse «%1 %2».</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>O servidor devolveu código HTTP incorrecto. Agardábase 204, mais recibiuse «%1 %2».</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
@ -3138,7 +3177,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/propagateremotemove.cpp" line="142"/>
|
||||
<source>Could not rename %1 to %2, error: %3</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Non foi posíbel renomear %1 a %2, erro: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotemove.cpp" line="134"/>
|
||||
|
@ -3154,7 +3193,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/propagateremotemove.cpp" line="233"/>
|
||||
<source>Error setting pin state</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Produciuse un erro ao definir o estado do pin</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -3672,7 +3711,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/gui/socketapi.cpp" line="946"/>
|
||||
<source>Resharing this folder is not allowed</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Non está permitido volver compartir este cartafol</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/socketapi.cpp" line="824"/>
|
||||
|
@ -4026,12 +4065,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="352"/>
|
||||
<source>Could not update file : %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Non foi posíbel actualizar o ficheiro: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="362"/>
|
||||
<source>Could not update virtual file metadata: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Non foi posíbel actualizar os metadatos do ficheiro virtual: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="536"/>
|
||||
|
@ -4144,7 +4183,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="514"/>
|
||||
<source>Using virtual files with suffix, but suffix is not set</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Usando ficheiros virtuais con sufixo, mais o sufixo non está definido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="521"/>
|
||||
|
@ -4348,7 +4387,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/common/vfs.cpp" line="80"/>
|
||||
<source>The Virtual filesystem feature requires a NTFS file system, %1 is using %2</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>A funcionalidade do sistema de ficheiros virtual require un sistema de ficheiros NTFS, %1 está a usar %2</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -4400,7 +4439,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="228"/>
|
||||
<source>The server on account %1 runs an unsupported version %2. Using this client with unsupported server versions is untested and potentially dangerous. Proceed at your own risk.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>O servidor na conta %1 executa unha versión non admitida (%2). O uso deste cliente con versións de servidor non admitidas non está probado e é potencialmente perigoso. Proceda baixo a súa propia responsabilidade.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="272"/>
|
||||
|
@ -4630,12 +4669,12 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="90"/>
|
||||
<source>S&ynchronize everything from server (recommended)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Sincronizar &todo dende o servidor (recomendado)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="90"/>
|
||||
<source>S&ync everything from server</source>
|
||||
<translation>Sincronizar &todo o contido do servidor</translation>
|
||||
<translation>Sincronizar &todo dende o servidor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="148"/>
|
||||
|
@ -4948,7 +4987,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/common/checksums.cpp" line="362"/>
|
||||
<source>The downloaded file does not match the checksum, it will be resumed. '%1' != '%2'</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>O ficheiro descargado non coincide coa suma de comprobación. Retomase. «%1' != '%2»</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>תגובת השרת הייתה „%1 %2” אל „%3 %4”</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3100,6 +3113,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>הוחזר קוד HTTP שגוי על ידי השרת. אמור היה להיות 204 אבל התקבל „%1 %2”.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Poslužitelj je odgovorio „%1 %2” na „%3 %4”</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3118,6 +3131,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Poslužitelj je vratio pogrešnu HTTP šifru. Očekivana je 204, ali je primljena „%1 %2”.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Kiszolgáló válasza: „%1 %2” erre: „%3 %4”</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3113,6 +3126,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>A kiszolgáló hibás HTTP kódot adott vissza. 204-es kód várt, de ez érkezett: „%1 %2”.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Server membalas "%1 %2" ke "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3105,6 +3118,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Þjónn svaraði "%1 %2" til "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3109,6 +3122,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Fékk rangan HTTP-kóða frá þjóni. Átti von á 204, en fékk "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Il server ha risposto "%1 %2" a "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>Codice HTTP errato restituito dal server. Atteso 204, ma ricevuto "%1 %2".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation>"%1 Impossibile sbloccare la cartella cifrata %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3128,6 +3141,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Codice HTTP errato restituito dal server. Atteso 204, ma ricevuto "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>Codice HTTP errato restituito dal server. Atteso 204, ma ricevuto "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>サーバーは "%1 %2"を "%3 %4"に応答しました</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3110,6 +3123,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>誤ったHTTPコードがサーバーから返されました。204のはずが、"%1 %2"が返りました。</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>서버에서 "%3 %4"에 "%1 %2"(으)로 응답함</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3114,6 +3127,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>서버에서 잘못된 HTTP 코드를 반환했습니다. 204가 받아지는 대신 "1 %2"을 받았습니다.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Serveris atsakė "%1 %2" į "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3114,6 +3127,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Serveris grąžino neteisingą HTTP kodą. Tikimasi 204, gauta "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Serveris atbildēja "%1 %2" uz "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3095,6 +3108,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Серверот одговори "%1 %2" до "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3104,6 +3117,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Погрешен HTTP код е испратен од серверот. Се очекува 204, но примено е "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Server svarte "%1 %2" til "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3099,6 +3112,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Feil HTTP-kode returnert fra server. Ventet 204, men mottok "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Server antwoordde "%1 %2" naar "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3141,6 +3154,14 @@ Dit is een nieuwe, experimentele modus. Als je besluit het te gebruiken, vragen
|
|||
<translation>Foutieve HTTP code ontvangen van de server. Verwacht was 204, maar ontvangen "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Lo servidor a respondut « %1 %2 » a « %3 %4 »</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3093,6 +3106,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Serwer odpowiedział "%1 %2" na "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>Serwer zwrócił nieprawidłowy kod HTTP. Oczekiwano 204, ale otrzymano "%1 %2".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation>"%1 Nie udało się odblokować zaszyfrowanego katalogu %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3138,6 +3151,14 @@ To nowy, eksperymentalny tryb. Jeśli zdecydujesz się z niego skorzystać, zgł
|
|||
<translation>Serwer zwrócił nieprawidłowy kod HTTP. Oczekiwano 204, a otrzymano "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>Serwer zwrócił nieprawidłowy kod HTTP. Oczekiwano 204, ale otrzymano "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>O Servidor respondeu "%1 %2" até "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3100,6 +3113,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código HTTP errado devolvido pelo servidor. Esperado 204, mas foi recebido "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>O servidor respondeu "%1 %2" para "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3118,6 +3131,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Código HTTP errado retornado pelo servidor. 204 esperado, mas retornou "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>На запрос «%3 %4» от сервера получен ответ «%1 %2» </translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3115,6 +3128,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Сервер ответил неправильным кодом HTTP. Ожидался 204, но получен «%1 %2».</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Server odpovedal "%1 %2" na "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3115,6 +3128,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Server vrátil neplatný HTTP kód. Očakávaný bol 204, ale vrátený bol "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Odziv strežnika: »%1 %2« za »%3 %4«</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3131,6 +3144,14 @@ To je nov preizkusni način. Če ga boste uporabili, pošljite tudi poročila o
|
|||
<translation>S strežnika je vrnjen neveljaven odziv HTTP. Pričakovan je 204, prejet pa je bil »%1 %2«.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Сервер је одговорио „%1 %2“ на „%3 %4“</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3116,6 +3129,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Сервер је вратио лош ХТТП код. Очекивано је 204 али је примљено „%1 %2“.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Servern svarade "%1 %2" på "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3118,6 +3131,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Felaktig HTTP-kod i svaret från servern. '204' förväntades, men "%1 %2" mottogs.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>เซิร์ฟเวอร์ตอบกลับ "%1 %2" ถึง "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3097,6 +3110,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>รหัส HTTP ผิดพลาด โดยเซิร์ฟเวอร์คาดว่าจะได้รับรหัส 204 แต่กลับได้รับ "%1 %2"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>"%3 %4" için sunucu yanıtı "%1 %2"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3122,6 +3135,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Sunucudan alınan HTTP kodu yanlış. 204 bekleniyordu, ancak "%1 %2" alındı.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>Відповідь сервера: "%1 %2" до "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3098,6 +3111,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>Сервер відповів неправильним HTTP кодом. Очікувався 204, але отримано "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>服务器向 "%3 %4" 返回了 "%1 %2"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>服务器返回了错误的 HTTP 代码。预期的是 204,但接收到的是 "%1 %2"。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation>"%1 未能解锁加密的文件夹 %2"。</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -3120,6 +3133,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>服务器返回的 HTTP 状态错误,应返回 204,但返回的是“%1 %2”。</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation>服务器返回了错误的 HTTP 代码。预期的是 204,但接收到的是 "%1 %2"。</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
|
|
@ -202,6 +202,19 @@
|
|||
<translation>伺服器回覆 "%1 %2" 到 "%3 %4"</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AbstractPropagateRemoteDeleteEncrypted</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="139"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/abstractpropagateremotedeleteencrypted.cpp" line="181"/>
|
||||
<source>"%1 Failed to unlock encrypted folder %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::AccountManager</name>
|
||||
<message>
|
||||
|
@ -2915,17 +2928,17 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="408"/>
|
||||
<source>size</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>大小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="410"/>
|
||||
<source>permissions</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>權限</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="414"/>
|
||||
<source>file id</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>檔案 ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/discovery.cpp" line="418"/>
|
||||
|
@ -3115,6 +3128,14 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<translation>從伺服器端回傳錯誤的 HTTP 代碼, 預期是 204, 但是接收到的是 "%1 %2".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteDeleteEncryptedRootFolder</name>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateremotedeleteencryptedrootfolder.cpp" line="143"/>
|
||||
<source>Wrong HTTP code returned by server. Expected 204, but received "%1 %2".</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OCC::PropagateRemoteMkdir</name>
|
||||
<message>
|
||||
|
@ -3201,7 +3222,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/propagateuploadng.cpp" line="466"/>
|
||||
<source>Poll URL missing</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>遺失投票網址</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateuploadng.cpp" line="457"/>
|
||||
|
@ -3631,7 +3652,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/gui/socketapi.cpp" line="754"/>
|
||||
<source>Select new location …</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>選擇新位址...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/socketapi.cpp" line="768"/>
|
||||
|
@ -3698,22 +3719,22 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/gui/socketapi.cpp" line="920"/>
|
||||
<source>Move and rename …</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>移動並重新命名...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/socketapi.cpp" line="923"/>
|
||||
<source>Move, rename and upload …</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>移動、重新命名並上傳...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/socketapi.cpp" line="925"/>
|
||||
<source>Delete local changes</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>刪除本地變更</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/socketapi.cpp" line="931"/>
|
||||
<source>Move and upload …</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>移動並上傳...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/socketapi.cpp" line="932"/>
|
||||
|
@ -4194,7 +4215,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1024"/>
|
||||
<source>Aborted</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>已放棄</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/syncengine.cpp" line="1809"/>
|
||||
|
@ -4222,19 +4243,19 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/gui/systray.cpp" line="94"/>
|
||||
<source>Open main dialog</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>開啟主對話方塊</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/systray.cpp" line="97"/>
|
||||
<location filename="../src/gui/systray.cpp" line="107"/>
|
||||
<source>Pause sync</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>暫停同步</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/systray.cpp" line="98"/>
|
||||
<location filename="../src/gui/systray.cpp" line="113"/>
|
||||
<source>Resume sync</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>繼續同步</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/systray.cpp" line="99"/>
|
||||
|
@ -4292,7 +4313,7 @@ This is a new, experimental mode. If you decide to use it, please report any iss
|
|||
<message>
|
||||
<location filename="../src/gui/tray/UserModel.cpp" line="379"/>
|
||||
<source>Synced %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>已同步 %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/tray/UserModel.cpp" line="381"/>
|
||||
|
|
Loading…
Reference in a new issue