void PropagateRemoteMkdir::slotMkdir()
{
- const auto parentPath = [=]() {
+ const auto rootPath = [=]() {
const auto result = propagator()->_remoteFolder;
if (result.startsWith('/')) {
return result.mid(1);
return result;
}
}();
- const auto path = parentPath + _item->_file;
+ const auto path = QString(rootPath + _item->_file);
+ const auto parentPath = path.left(path.lastIndexOf('/'));
+
+ SyncJournalFileRecord parentRec;
+ bool ok = propagator()->_journal->getFileRecord(parentPath, &parentRec);
+ if (!ok) {
+ done(SyncFileItem::NormalError);
+ return;
+ }
+
+ const auto remoteParentPath = parentRec._e2eMangledName.isEmpty() ? parentPath : parentRec._e2eMangledName;
const auto account = propagator()->account();
if (!account->capabilities().clientSideEncryptionAvailable() ||
- !account->e2e()->isAnyParentFolderEncrypted(path)) {
+ (!account->e2e()->isFolderEncrypted(remoteParentPath + '/') &&
+ !account->e2e()->isAnyParentFolderEncrypted(remoteParentPath + '/'))) {
slotStartMkcolJob();
return;
}
// We should be encrypted as well since our parent is
- _uploadEncryptedHelper = new PropagateUploadEncrypted(propagator(), _item);
+ _uploadEncryptedHelper = new PropagateUploadEncrypted(propagator(), remoteParentPath, _item);
connect(_uploadEncryptedHelper, &PropagateUploadEncrypted::folderNotEncrypted,
this, &PropagateRemoteMkdir::slotStartMkcolJob);
connect(_uploadEncryptedHelper, &PropagateUploadEncrypted::finalized,
void PropagateUploadFileCommon::start()
{
- if (propagator()->account()->capabilities().clientSideEncryptionAvailable()) {
- _uploadEncryptedHelper = new PropagateUploadEncrypted(propagator(), _item);
- connect(_uploadEncryptedHelper, &PropagateUploadEncrypted::folderNotEncrypted,
- this, &PropagateUploadFileCommon::setupUnencryptedFile);
- connect(_uploadEncryptedHelper, &PropagateUploadEncrypted::finalized,
- this, &PropagateUploadFileCommon::setupEncryptedFile);
- connect(_uploadEncryptedHelper, &PropagateUploadEncrypted::error,
- []{ qCDebug(lcPropagateUpload) << "Error setting up encryption."; });
- _uploadEncryptedHelper->start();
- } else {
- setupUnencryptedFile();
+ const auto rootPath = [=]() {
+ const auto result = propagator()->_remoteFolder;
+ if (result.startsWith('/')) {
+ return result.mid(1);
+ } else {
+ return result;
+ }
+ }();
+ const auto path = QString(rootPath + _item->_file);
+ const auto parentPath = path.left(path.lastIndexOf('/'));
+
+ SyncJournalFileRecord parentRec;
+ bool ok = propagator()->_journal->getFileRecord(parentPath, &parentRec);
+ if (!ok) {
+ done(SyncFileItem::NormalError);
+ return;
+ }
+
+ const auto remoteParentPath = parentRec._e2eMangledName.isEmpty() ? parentPath : parentRec._e2eMangledName;
+ const auto account = propagator()->account();
+
+ if (!account->capabilities().clientSideEncryptionAvailable() ||
+ !account->e2e()->isFolderEncrypted(remoteParentPath + '/')) {
+ setupUnencryptedFile();
+ return;
}
+
+ _uploadEncryptedHelper = new PropagateUploadEncrypted(propagator(), remoteParentPath, _item);
+ connect(_uploadEncryptedHelper, &PropagateUploadEncrypted::folderNotEncrypted,
+ this, &PropagateUploadFileCommon::setupUnencryptedFile);
+ connect(_uploadEncryptedHelper, &PropagateUploadEncrypted::finalized,
+ this, &PropagateUploadFileCommon::setupEncryptedFile);
+ connect(_uploadEncryptedHelper, &PropagateUploadEncrypted::error,
+ []{ qCDebug(lcPropagateUpload) << "Error setting up encryption."; });
+ _uploadEncryptedHelper->start();
}
void PropagateUploadFileCommon::setupEncryptedFile(const QString& path, const QString& filename, quint64 size)
Q_LOGGING_CATEGORY(lcPropagateUploadEncrypted, "nextcloud.sync.propagator.upload.encrypted", QtInfoMsg)
-PropagateUploadEncrypted::PropagateUploadEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item)
-: _propagator(propagator),
- _item(item),
- _metadata(nullptr)
+PropagateUploadEncrypted::PropagateUploadEncrypted(OwncloudPropagator *propagator, const QString &remoteParentPath, SyncFileItemPtr item)
+ : _propagator(propagator)
+ , _remoteParentPath(remoteParentPath)
+ , _item(item)
+ , _metadata(nullptr)
{
}
* If the folder is unencrypted we just follow the old way.
*/
qCDebug(lcPropagateUploadEncrypted) << "Starting to send an encrypted file!";
- QFileInfo info(_item->_file);
- auto getEncryptedStatus = new GetFolderEncryptStatusJob(_propagator->account(),
- info.path());
+ auto getEncryptedStatus = new GetFolderEncryptStatusJob(_propagator->account(), _remoteParentPath);
connect(getEncryptedStatus, &GetFolderEncryptStatusJob::encryptStatusFolderReceived,
this, &PropagateUploadEncrypted::slotFolderEncryptedStatusFetched);
encryptedFile.mimetype = mdb.mimeTypeForFile(info).name().toLocal8Bit();
}
- _item->_encryptedFileName = _item->_file.section(QLatin1Char('/'), 0, -2)
- + QLatin1Char('/') + encryptedFile.encryptedFilename;
+ _item->_encryptedFileName = _remoteParentPath + QLatin1Char('/') + encryptedFile.encryptedFilename;
qCDebug(lcPropagateUploadEncrypted) << "Creating the encrypted file.";
qCDebug(lcPropagateUploadEncrypted) << "Encrypted Info:" << outputInfo.path() << outputInfo.fileName() << outputInfo.size();
qCDebug(lcPropagateUploadEncrypted) << "Finalizing the upload part, now the actuall uploader will take over";
emit finalized(outputInfo.path() + QLatin1Char('/') + outputInfo.fileName(),
- _item->_file.section(QLatin1Char('/'), 0, -2) + QLatin1Char('/') + outputInfo.fileName(),
+ _remoteParentPath + QLatin1Char('/') + outputInfo.fileName(),
outputInfo.size());
}
{
Q_OBJECT
public:
- PropagateUploadEncrypted(OwncloudPropagator *propagator, SyncFileItemPtr item);
+ PropagateUploadEncrypted(OwncloudPropagator *propagator, const QString &remoteParentPath, SyncFileItemPtr item);
void start();
/* unlocks the current folder that holds this file */
private:
OwncloudPropagator *_propagator;
+ QString _remoteParentPath;
SyncFileItemPtr _item;
QElapsedTimer _folderLockFirstTry;