wsd: Allow hosts to disable print, export

using these WOPI protocol extensions: DisablePrint,
DisableExport, DisableCopy. All assumed to be false if not
provided.

Change-Id: I415597d710107f9d8cbb8757f361365cc2a88eb1
This commit is contained in:
Pranav Kant
2016-12-13 17:00:43 +05:30
parent 1ddd85c77c
commit 6affbb307c
3 changed files with 46 additions and 3 deletions

View File

@ -394,10 +394,35 @@ bool ClientSession::filterMessage(const std::string& message) const
{ {
bool allowed = true; bool allowed = true;
StringTokenizer tokens(message, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); StringTokenizer tokens(message, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
if (isReadOnly())
// Set allowed flag to false depending on if particular WOPI properties are set
if (tokens[0] == "downloadas")
{ {
std::string id;
if (getTokenString(tokens[2], "id", id))
{
if (id == "print" && _wopiFileInfo && _wopiFileInfo->_disablePrint)
{
allowed = false;
LOG_WRN("WOPI host has disabled print for this session");
}
else if (id == "export" && _wopiFileInfo && _wopiFileInfo->_disableExport)
{
allowed = false;
LOG_WRN("WOPI host has disabled export for this session");
}
}
else
{
allowed = false;
LOG_WRN("No value of id in downloadas message");
}
}
else if (isReadOnly())
{
// By default, don't allow anything
allowed = false; allowed = false;
if (tokens[0] == "downloadas" || tokens[0] == "userinactive" || tokens[0] == "useractive") if (tokens[0] == "userinactive" || tokens[0] == "useractive")
{ {
allowed = true; allowed = true;
} }

View File

@ -390,6 +390,9 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const Po
bool hidePrintOption = false; bool hidePrintOption = false;
bool hideSaveOption = false; bool hideSaveOption = false;
bool hideExportOption = false; bool hideExportOption = false;
bool disablePrint = false;
bool disableExport = false;
bool disableCopy = false;
std::string resMsg; std::string resMsg;
Poco::StreamCopier::copyToString(rs, resMsg); Poco::StreamCopier::copyToString(rs, resMsg);
@ -414,6 +417,9 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const Po
getWOPIValue(object, "HideSaveOption", hideSaveOption); getWOPIValue(object, "HideSaveOption", hideSaveOption);
getWOPIValue(object, "HideExportOption", hideExportOption); getWOPIValue(object, "HideExportOption", hideExportOption);
getWOPIValue(object, "EnableOwnerTermination", enableOwnerTermination); getWOPIValue(object, "EnableOwnerTermination", enableOwnerTermination);
getWOPIValue(object, "DisablePrint", disablePrint);
getWOPIValue(object, "DisableExport", disableExport);
getWOPIValue(object, "DisableCopy", disableCopy);
} }
else else
Log::error("WOPI::CheckFileInfo is missing JSON payload"); Log::error("WOPI::CheckFileInfo is missing JSON payload");
@ -424,7 +430,7 @@ std::unique_ptr<WopiStorage::WOPIFileInfo> WopiStorage::getWOPIFileInfo(const Po
_fileInfo = FileInfo({filename, ownerId, Poco::Timestamp(), size}); _fileInfo = FileInfo({filename, ownerId, Poco::Timestamp(), size});
} }
return std::unique_ptr<WopiStorage::WOPIFileInfo>(new WOPIFileInfo({userId, userName, canWrite, postMessageOrigin, hidePrintOption, hideSaveOption, hideExportOption, enableOwnerTermination, callDuration})); return std::unique_ptr<WopiStorage::WOPIFileInfo>(new WOPIFileInfo({userId, userName, canWrite, postMessageOrigin, hidePrintOption, hideSaveOption, hideExportOption, enableOwnerTermination, disablePrint, disableExport, disableCopy, callDuration}));
} }
/// uri format: http://server/<...>/wopi*/files/<id>/content /// uri format: http://server/<...>/wopi*/files/<id>/content

View File

@ -180,6 +180,9 @@ public:
const bool hideSaveOption, const bool hideSaveOption,
const bool hideExportOption, const bool hideExportOption,
const bool enableOwnerTermination, const bool enableOwnerTermination,
const bool disablePrint,
const bool disableExport,
const bool disableCopy,
const std::chrono::duration<double> callDuration) const std::chrono::duration<double> callDuration)
: _userid(userid), : _userid(userid),
_username(username), _username(username),
@ -189,6 +192,9 @@ public:
_hideSaveOption(hideSaveOption), _hideSaveOption(hideSaveOption),
_hideExportOption(hideExportOption), _hideExportOption(hideExportOption),
_enableOwnerTermination(enableOwnerTermination), _enableOwnerTermination(enableOwnerTermination),
_disablePrint(disablePrint),
_disableExport(disableExport),
_disableCopy(disableCopy),
_callDuration(callDuration) _callDuration(callDuration)
{ {
} }
@ -209,6 +215,12 @@ public:
bool _hideExportOption; bool _hideExportOption;
/// If WOPI host has enabled owner termination feature on /// If WOPI host has enabled owner termination feature on
bool _enableOwnerTermination; bool _enableOwnerTermination;
/// If WOPI host has allowed the user to print the document
bool _disablePrint;
/// If WOPI host has allowed the user to export the document
bool _disableExport;
/// If WOPI host has allowed the user to copy to/from the document
bool _disableCopy;
/// Time it took to call WOPI's CheckFileInfo /// Time it took to call WOPI's CheckFileInfo
std::chrono::duration<double> _callDuration; std::chrono::duration<double> _callDuration;
}; };