diff --git a/src/gui/sharedialog.cpp b/src/gui/sharedialog.cpp index 709766a80..ca30aa4ff 100644 --- a/src/gui/sharedialog.cpp +++ b/src/gui/sharedialog.cpp @@ -25,6 +25,7 @@ #include "configfile.h" #include "theme.h" #include "thumbnailjob.h" +#include "wordlist.h" #include #include @@ -33,6 +34,20 @@ #include #include +namespace { +QString createRandomPassword() +{ + const auto words = OCC::WordList::getRandomWords(10); + + const auto addFirstLetter = [](const QString ¤t, const QString &next) { + return current + next.at(0); + }; + + return std::accumulate(std::cbegin(words), std::cend(words), QString(), addFirstLetter); +} +} + + namespace OCC { static const int thumbnailSize = 40; @@ -303,7 +318,9 @@ void ShareDialog::showSharingUi() void ShareDialog::slotCreateLinkShare() { if(_manager) { - _manager->createLinkShare(_sharePath, QString(), QString()); + const auto askOptionalPassword = _accountState->account()->capabilities().sharePublicLinkAskOptionalPassword(); + const auto password = askOptionalPassword ? createRandomPassword() : QString(); + _manager->createLinkShare(_sharePath, QString(), password); } } diff --git a/src/gui/socketapi.cpp b/src/gui/socketapi.cpp index dbc2806e7..2632a42a5 100644 --- a/src/gui/socketapi.cpp +++ b/src/gui/socketapi.cpp @@ -744,6 +744,7 @@ void SocketApi::sendSharingContextMenuOptions(const FileData &fileData, SocketLi // Is is possible to create a public link without user choices? bool canCreateDefaultPublicLink = publicLinksEnabled && !capabilities.sharePublicLinkEnforceExpireDate() + && !capabilities.sharePublicLinkAskOptionalPassword() && !capabilities.sharePublicLinkEnforcePassword(); if (canCreateDefaultPublicLink) { diff --git a/src/libsync/capabilities.cpp b/src/libsync/capabilities.cpp index 78035fa8c..47b96068f 100644 --- a/src/libsync/capabilities.cpp +++ b/src/libsync/capabilities.cpp @@ -59,6 +59,11 @@ bool Capabilities::sharePublicLinkSupportsUploadOnly() const return _capabilities["files_sharing"].toMap()["public"].toMap()["supports_upload_only"].toBool(); } +bool Capabilities::sharePublicLinkAskOptionalPassword() const +{ + return _capabilities["files_sharing"].toMap()["public"].toMap()["password"].toMap()["askForOptionalPassword"].toBool(); +} + bool Capabilities::sharePublicLinkEnforcePassword() const { return _capabilities["files_sharing"].toMap()["public"].toMap()["password"].toMap()["enforced"].toBool(); diff --git a/src/libsync/capabilities.h b/src/libsync/capabilities.h index a92db1e7c..dae0d5866 100644 --- a/src/libsync/capabilities.h +++ b/src/libsync/capabilities.h @@ -40,6 +40,7 @@ public: bool sharePublicLink() const; bool sharePublicLinkAllowUpload() const; bool sharePublicLinkSupportsUploadOnly() const; + bool sharePublicLinkAskOptionalPassword() const; bool sharePublicLinkEnforcePassword() const; bool sharePublicLinkEnforceExpireDate() const; int sharePublicLinkExpireDateDays() const;