mirror of
https://github.com/nextcloud/desktop.git
synced 2025-10-26 11:17:43 +00:00
If the server has the 'uploadConflictFiles' capability conflict files will be uploaded instead of ignored. Uploaded conflict files have the following headers set during upload OC-Conflict: 1 OC-ConflictBaseFileId: 172489174instanceid OC-ConflictBaseMtime: 1235789213 OC-ConflictBaseEtag: myetag when the data is available. Downloads accept the same headers in return when downloading a conflict file. In the absence of server support clients will identify conflict files through the file name pattern and attempt to deduce the base fileid. Base etag and mtime can't be deduced though. The upload job for a new conflict file will be triggered directly from the job that created the conflict file now. No second sync run is necessary anymore. This commit does not yet introduce a 'username' like identifier that automatically gets added to conflict file filenames (to name the files foo_conflict-Fred-1345.txt instead of just foo_conflict-1345.txt).
163 lines
4.8 KiB
C++
163 lines
4.8 KiB
C++
/*
|
|
* Copyright (C) by Roeland Jago Douma <roeland@famdouma.nl>
|
|
*
|
|
* 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 "capabilities.h"
|
|
|
|
#include <QVariantMap>
|
|
#include <QDebug>
|
|
|
|
namespace OCC {
|
|
|
|
|
|
Capabilities::Capabilities(const QVariantMap &capabilities)
|
|
: _capabilities(capabilities)
|
|
{
|
|
}
|
|
|
|
bool Capabilities::shareAPI() const
|
|
{
|
|
if (_capabilities["files_sharing"].toMap().contains("api_enabled")) {
|
|
return _capabilities["files_sharing"].toMap()["api_enabled"].toBool();
|
|
} else {
|
|
// This was later added so if it is not present just assume the API is enabled.
|
|
return true;
|
|
}
|
|
}
|
|
|
|
bool Capabilities::sharePublicLink() const
|
|
{
|
|
if (_capabilities["files_sharing"].toMap().contains("public")) {
|
|
return shareAPI() && _capabilities["files_sharing"].toMap()["public"].toMap()["enabled"].toBool();
|
|
} else {
|
|
// This was later added so if it is not present just assume that link sharing is enabled.
|
|
return true;
|
|
}
|
|
}
|
|
|
|
bool Capabilities::sharePublicLinkAllowUpload() const
|
|
{
|
|
return _capabilities["files_sharing"].toMap()["public"].toMap()["upload"].toBool();
|
|
}
|
|
|
|
bool Capabilities::sharePublicLinkSupportsUploadOnly() const
|
|
{
|
|
return _capabilities["files_sharing"].toMap()["public"].toMap()["supports_upload_only"].toBool();
|
|
}
|
|
|
|
bool Capabilities::sharePublicLinkEnforcePassword() const
|
|
{
|
|
return _capabilities["files_sharing"].toMap()["public"].toMap()["password"].toMap()["enforced"].toBool();
|
|
}
|
|
|
|
bool Capabilities::sharePublicLinkEnforceExpireDate() const
|
|
{
|
|
return _capabilities["files_sharing"].toMap()["public"].toMap()["expire_date"].toMap()["enforced"].toBool();
|
|
}
|
|
|
|
int Capabilities::sharePublicLinkExpireDateDays() const
|
|
{
|
|
return _capabilities["files_sharing"].toMap()["public"].toMap()["expire_date"].toMap()["days"].toInt();
|
|
}
|
|
|
|
bool Capabilities::sharePublicLinkMultiple() const
|
|
{
|
|
return _capabilities["files_sharing"].toMap()["public"].toMap()["multiple"].toBool();
|
|
}
|
|
|
|
bool Capabilities::shareResharing() const
|
|
{
|
|
return _capabilities["files_sharing"].toMap()["resharing"].toBool();
|
|
}
|
|
|
|
bool Capabilities::notificationsAvailable() const
|
|
{
|
|
// We require the OCS style API in 9.x, can't deal with the REST one only found in 8.2
|
|
return _capabilities.contains("notifications") && _capabilities["notifications"].toMap().contains("ocs-endpoints");
|
|
}
|
|
|
|
bool Capabilities::isValid() const
|
|
{
|
|
return !_capabilities.isEmpty();
|
|
}
|
|
|
|
QList<QByteArray> Capabilities::supportedChecksumTypes() const
|
|
{
|
|
QList<QByteArray> list;
|
|
foreach (const auto &t, _capabilities["checksums"].toMap()["supportedTypes"].toList()) {
|
|
list.push_back(t.toByteArray());
|
|
}
|
|
return list;
|
|
}
|
|
|
|
QByteArray Capabilities::preferredUploadChecksumType() const
|
|
{
|
|
return _capabilities["checksums"].toMap()["preferredUploadType"].toByteArray();
|
|
}
|
|
|
|
QByteArray Capabilities::uploadChecksumType() const
|
|
{
|
|
QByteArray preferred = preferredUploadChecksumType();
|
|
if (!preferred.isEmpty())
|
|
return preferred;
|
|
QList<QByteArray> supported = supportedChecksumTypes();
|
|
if (!supported.isEmpty())
|
|
return supported.first();
|
|
return QByteArray();
|
|
}
|
|
|
|
bool Capabilities::chunkingNg() const
|
|
{
|
|
static const auto chunkng = qgetenv("OWNCLOUD_CHUNKING_NG");
|
|
if (chunkng == "0")
|
|
return false;
|
|
if (chunkng == "1")
|
|
return true;
|
|
return _capabilities["dav"].toMap()["chunking"].toByteArray() >= "1.0";
|
|
}
|
|
|
|
bool Capabilities::chunkingParallelUploadDisabled() const
|
|
{
|
|
return _capabilities["dav"].toMap()["chunkingParallelUploadDisabled"].toBool();
|
|
}
|
|
|
|
bool Capabilities::privateLinkPropertyAvailable() const
|
|
{
|
|
return _capabilities["files"].toMap()["privateLinks"].toBool();
|
|
}
|
|
|
|
QList<int> Capabilities::httpErrorCodesThatResetFailingChunkedUploads() const
|
|
{
|
|
QList<int> list;
|
|
foreach (const auto &t, _capabilities["dav"].toMap()["httpErrorCodesThatResetFailingChunkedUploads"].toList()) {
|
|
list.push_back(t.toInt());
|
|
}
|
|
return list;
|
|
}
|
|
|
|
QString Capabilities::invalidFilenameRegex() const
|
|
{
|
|
return _capabilities["dav"].toMap()["invalidFilenameRegex"].toString();
|
|
}
|
|
|
|
bool Capabilities::uploadConflictFiles() const
|
|
{
|
|
static auto envIsSet = !qEnvironmentVariableIsEmpty("OWNCLOUD_UPLOAD_CONFLICT_FILES");
|
|
static int envValue = qEnvironmentVariableIntValue("OWNCLOUD_UPLOAD_CONFLICT_FILES");
|
|
if (envIsSet)
|
|
return envValue != 0;
|
|
|
|
return _capabilities["uploadConflictFiles"].toBool();
|
|
}
|
|
}
|