diff options
author | Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de> | 2019-10-22 11:32:09 +0200 |
---|---|---|
committer | Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de> | 2019-10-23 12:17:00 +0200 |
commit | ec0a3db0cbb5413d10e70c9843e679bbf2327c15 (patch) | |
tree | b014c4a8d600fa2e7ee50b01f2ec80df34e57772 | |
parent | 942d1d2ea59bf4605f2c464a6b29c967fa9f8de8 (diff) |
Add document-level option to lock down file export
Setting this option will disable any export command
(File->Export*, File->Send*, graphic/chart export context menu,
save as, mailmerge wizard, ...)
Change-Id: I07a2a3b9179b494ac839e7d1e407194600679aa1
Reviewed-on: https://gerrit.libreoffice.org/81316
Tested-by: Jenkins
Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
-rw-r--r-- | include/sfx2/sfxsids.hrc | 1 | ||||
-rw-r--r-- | include/sfx2/viewsh.hxx | 1 | ||||
-rw-r--r-- | offapi/com/sun/star/document/MediaDescriptor.idl | 8 | ||||
-rw-r--r-- | offapi/com/sun/star/frame/XModel2.idl | 1 | ||||
-rw-r--r-- | sc/source/ui/docshell/docsh4.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/drawfunc/chartsh.cxx | 3 | ||||
-rw-r--r-- | sc/source/ui/drawfunc/graphsh.cxx | 6 | ||||
-rw-r--r-- | sd/sdi/_drvwsh.sdi | 1 | ||||
-rw-r--r-- | sd/source/ui/view/drviews7.cxx | 3 | ||||
-rw-r--r-- | sd/source/ui/view/drviewsj.cxx | 5 | ||||
-rw-r--r-- | sfx2/source/appl/appuno.cxx | 14 | ||||
-rw-r--r-- | sfx2/source/doc/objserv.cxx | 16 | ||||
-rw-r--r-- | sfx2/source/doc/sfxbasemodel.cxx | 5 | ||||
-rw-r--r-- | sfx2/source/view/viewsh.cxx | 24 | ||||
-rw-r--r-- | sw/sdi/wrtapp.sdi | 1 | ||||
-rw-r--r-- | sw/source/uibase/app/apphdl.cxx | 7 | ||||
-rw-r--r-- | sw/source/uibase/app/docsh.cxx | 6 | ||||
-rw-r--r-- | sw/source/uibase/shells/grfsh.cxx | 2 |
18 files changed, 96 insertions, 10 deletions
diff --git a/include/sfx2/sfxsids.hrc b/include/sfx2/sfxsids.hrc index 6124255f2756..0b5eeb73a32b 100644 --- a/include/sfx2/sfxsids.hrc +++ b/include/sfx2/sfxsids.hrc @@ -259,6 +259,7 @@ class SvxSearchItem; #define SID_NO_FILE_SYNC (SID_SFX_START + 1729) #define SID_NO_THUMBNAIL (SID_SFX_START + 1730) #define SID_LOCK_CONTENT_EXTRACTION (SID_SFX_START + 1731) +#define SID_LOCK_EXPORT (SID_SFX_START + 1732) // Used to export a temporary file for preview in Mail Merge Wizard, where saving the data source is // not required for preview, but interferes with not-yet-saved embedded data source for main document. #define SID_NO_EMBEDDED_DS TypedWhichId<SfxBoolItem>(SID_SFX_START + 1731) diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx index fff76219ea3b..525cc111d216 100644 --- a/include/sfx2/viewsh.hxx +++ b/include/sfx2/viewsh.hxx @@ -289,6 +289,7 @@ public: void AddRemoveClipboardListener( const css::uno::Reference < css::datatransfer::clipboard::XClipboardListener>&, bool ); css::uno::Reference< css::datatransfer::clipboard::XClipboardNotifier > GetClipboardNotifier() const; bool isContentExtractionLocked(); + bool isExportLocked(); SAL_DLLPRIVATE SfxInPlaceClient* GetUIActiveIPClient_Impl() const; SAL_DLLPRIVATE void AddContextMenuInterceptor_Impl( const css::uno::Reference < css::ui::XContextMenuInterceptor >& xInterceptor ); diff --git a/offapi/com/sun/star/document/MediaDescriptor.idl b/offapi/com/sun/star/document/MediaDescriptor.idl index 0a4ba28f611b..f7c248d85803 100644 --- a/offapi/com/sun/star/document/MediaDescriptor.idl +++ b/offapi/com/sun/star/document/MediaDescriptor.idl @@ -568,6 +568,14 @@ service MediaDescriptor @since LibreOffice 6.4 */ [optional,property] boolean LockContentExtraction; + + /** Setting this option will prevent exporting document content to any file. + Export, Send, save as, etc will be disabled, + as well as individual graphic/chart export and mail merge. + + @since LibreOffice 6.4 + */ + [optional,property] boolean LockExport; }; diff --git a/offapi/com/sun/star/frame/XModel2.idl b/offapi/com/sun/star/frame/XModel2.idl index c3a8d18a71b6..3cdbda4dfc09 100644 --- a/offapi/com/sun/star/frame/XModel2.idl +++ b/offapi/com/sun/star/frame/XModel2.idl @@ -143,6 +143,7 @@ interface XModel2 : com::sun::star::frame::XModel <li>com::sun::star::document::MediaDescriptor::SuggestedSaveAsDir</li> <li>com::sun::star::document::MediaDescriptor::SuggestedSaveAsName</li> <li>com::sun::star::document::MediaDescriptor::LockContentExtraction</li> + <li>com::sun::star::document::MediaDescriptor::LockExport</li> </ul> @throws com::sun::star::lang::IllegalArgumentException When trying to set an unsupported property diff --git a/sc/source/ui/docshell/docsh4.cxx b/sc/source/ui/docshell/docsh4.cxx index 40d694e6df8a..54acb863a18d 100644 --- a/sc/source/ui/docshell/docsh4.cxx +++ b/sc/source/ui/docshell/docsh4.cxx @@ -1977,7 +1977,7 @@ void ScDocShell::GetState( SfxItemSet &rSet ) case SID_SHARE_DOC: { - if ( IsReadOnly() ) + if ( IsReadOnly() || GetBestViewShell()->isExportLocked() ) { rSet.DisableItem( nWhich ); } diff --git a/sc/source/ui/drawfunc/chartsh.cxx b/sc/source/ui/drawfunc/chartsh.cxx index 0e9bfe3521f1..b70ce15e57c2 100644 --- a/sc/source/ui/drawfunc/chartsh.cxx +++ b/sc/source/ui/drawfunc/chartsh.cxx @@ -73,6 +73,9 @@ void ScChartShell::GetExportAsGraphicState( SfxItemSet& rSet ) bEnable = true; } + if (GetViewShell()->isExportLocked()) + bEnable = false; + if( !bEnable ) rSet.DisableItem( SID_EXPORT_AS_GRAPHIC ); } diff --git a/sc/source/ui/drawfunc/graphsh.cxx b/sc/source/ui/drawfunc/graphsh.cxx index 8fcbc8a586bd..c3c5dd4b5f5c 100644 --- a/sc/source/ui/drawfunc/graphsh.cxx +++ b/sc/source/ui/drawfunc/graphsh.cxx @@ -145,6 +145,9 @@ void ScGraphicShell::GetExternalEditState( SfxItemSet& rSet ) bEnable = true; } + if (GetViewShell()->isExportLocked()) + bEnable = false; + if( !bEnable ) rSet.DisableItem( SID_EXTERNAL_EDIT ); } @@ -304,6 +307,9 @@ void ScGraphicShell::GetSaveGraphicState(SfxItemSet &rSet) bEnable = true; } + if (GetViewShell()->isExportLocked()) + bEnable = false; + if( !bEnable ) rSet.DisableItem( SID_SAVE_GRAPHIC ); } diff --git a/sd/sdi/_drvwsh.sdi b/sd/sdi/_drvwsh.sdi index b49088f395c0..6a30f87e9b59 100644 --- a/sd/sdi/_drvwsh.sdi +++ b/sd/sdi/_drvwsh.sdi @@ -2785,6 +2785,7 @@ interface DrawView SID_PRESENTATION_MINIMIZER [ ExecMethod = FuTemporary ; + StateMethod = GetMenuState ; ] SID_GO_TO_NEXT_PAGE [ diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx index e405a987fc84..7372d2327ff0 100644 --- a/sd/source/ui/view/drviews7.cxx +++ b/sd/source/ui/view/drviews7.cxx @@ -1596,6 +1596,9 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet ) rSet.DisableItem(SID_SAVE_BACKGROUND); } + if (GetViewShell()->isExportLocked()) + rSet.DisableItem(SID_PRESENTATION_MINIMIZER); + GetModeSwitchingMenuState (rSet); } diff --git a/sd/source/ui/view/drviewsj.cxx b/sd/source/ui/view/drviewsj.cxx index 80882a93394e..ee65cb87fa94 100644 --- a/sd/source/ui/view/drviewsj.cxx +++ b/sd/source/ui/view/drviewsj.cxx @@ -508,6 +508,11 @@ void DrawViewShell::GetMenuStateSel( SfxItemSet &rSet ) rSet.DisableItem(SID_COPY); rSet.DisableItem(SID_CUT); } + if(GetViewShell()->isExportLocked()) + { + rSet.DisableItem(SID_SAVE_GRAPHIC); + rSet.DisableItem(SID_EXTERNAL_EDIT); + } } } // end of namespace sd diff --git a/sfx2/source/appl/appuno.cxx b/sfx2/source/appl/appuno.cxx index e947abd17d61..cc2912f452db 100644 --- a/sfx2/source/appl/appuno.cxx +++ b/sfx2/source/appl/appuno.cxx @@ -170,6 +170,7 @@ static char const sDocumentService[] = "DocumentService"; static char const sFilterProvider[] = "FilterProvider"; static char const sImageFilter[] = "ImageFilter"; static char const sLockContentExtraction[] = "LockContentExtraction"; +static char const sLockExport[] = "LockExport"; static bool isMediaDescriptor( sal_uInt16 nSlotId ) { @@ -852,6 +853,14 @@ void TransformParameters( sal_uInt16 nSlotId, const uno::Sequence<beans::Propert if (bOK) rSet.Put( SfxBoolItem( SID_LOCK_CONTENT_EXTRACTION, bVal ) ); } + else if (aName == sLockExport) + { + bool bVal = false; + bool bOK = (rProp.Value >>= bVal); + DBG_ASSERT( bOK, "invalid type for LockExport" ); + if (bOK) + rSet.Put( SfxBoolItem( SID_LOCK_EXPORT, bVal ) ); + } #ifdef DBG_UTIL else --nFoundArgs; @@ -1623,6 +1632,11 @@ void TransformItems( sal_uInt16 nSlotId, const SfxItemSet& rSet, uno::Sequence<b pValue[nActProp].Name = sLockContentExtraction; pValue[nActProp++].Value <<= static_cast<const SfxBoolItem*>(pItem)->GetValue() ; } + if ( rSet.GetItemState( SID_LOCK_EXPORT, false, &pItem ) == SfxItemState::SET ) + { + pValue[nActProp].Name = sLockExport; + pValue[nActProp++].Value <<= static_cast<const SfxBoolItem*>(pItem)->GetValue() ; + } } rArgs = aSequ; diff --git a/sfx2/source/doc/objserv.cxx b/sfx2/source/doc/objserv.cxx index afcbfe14e14a..8c7c5ab3f8af 100644 --- a/sfx2/source/doc/objserv.cxx +++ b/sfx2/source/doc/objserv.cxx @@ -1118,7 +1118,8 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet) { case SID_DOCTEMPLATE : { - if ( !GetFactory().GetTemplateFilter() ) + SfxViewFrame *pFrame = SfxViewFrame::GetFirst(this); + if ( pFrame && pFrame->GetViewShell()->isExportLocked()) rSet.DisableItem( nWhich ); break; } @@ -1221,7 +1222,9 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet) case SID_SAVEASDOC: { - if( !( pImpl->nLoadedFlags & SfxLoadedFlags::MAINDOCUMENT ) ) + SfxViewFrame *pFrame = SfxViewFrame::GetFirst(this); + if (!(pImpl->nLoadedFlags & SfxLoadedFlags::MAINDOCUMENT) + || (pFrame && pFrame->GetViewShell()->isExportLocked())) { rSet.DisableItem( nWhich ); break; @@ -1235,7 +1238,9 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet) case SID_SAVEACOPY: { - if( !( pImpl->nLoadedFlags & SfxLoadedFlags::MAINDOCUMENT ) ) + SfxViewFrame *pFrame = SfxViewFrame::GetFirst(this); + if (!(pImpl->nLoadedFlags & SfxLoadedFlags::MAINDOCUMENT) + || (pFrame && pFrame->GetViewShell()->isExportLocked())) { rSet.DisableItem( nWhich ); break; @@ -1247,13 +1252,18 @@ void SfxObjectShell::GetState_Impl(SfxItemSet &rSet) break; } + case SID_EXPORTDOC: case SID_EXPORTDOCASPDF: case SID_DIRECTEXPORTDOCASPDF: case SID_EXPORTDOCASEPUB: case SID_DIRECTEXPORTDOCASEPUB: case SID_REDACTDOC: case SID_AUTOREDACTDOC: + case SID_SAVEASREMOTE: { + SfxViewFrame *pFrame = SfxViewFrame::GetFirst(this); + if (pFrame && pFrame->GetViewShell()->isExportLocked()) + rSet.DisableItem( nWhich ); break; } diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx index f4019db6b98d..bb6a1484befd 100644 --- a/sfx2/source/doc/sfxbasemodel.cxx +++ b/sfx2/source/doc/sfxbasemodel.cxx @@ -1079,6 +1079,11 @@ void SAL_CALL SfxBaseModel::setArgs(const Sequence<beans::PropertyValue>& aArgs) rArg.Value >>= bValue; pMedium->GetItemSet()->Put(SfxBoolItem(SID_LOCK_CONTENT_EXTRACTION, bValue)); } + else if (rArg.Name == "LockExport") + { + rArg.Value >>= bValue; + pMedium->GetItemSet()->Put(SfxBoolItem(SID_LOCK_EXPORT, bValue)); + } else { throw lang::IllegalArgumentException("Setting property not supported: " + rArg.Name, diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx index 4866fcabc4bc..e8638badac64 100644 --- a/sfx2/source/view/viewsh.cxx +++ b/sfx2/source/view/viewsh.cxx @@ -673,16 +673,27 @@ void SfxViewShell::GetState_Impl( SfxItemSet &rSet ) { switch ( nSID ) { -#if HAVE_FEATURE_MACOSX_SANDBOX + case SID_BLUETOOTH_SENDDOC: case SID_MAIL_SENDDOC: case SID_MAIL_SENDDOCASFORMAT: case SID_MAIL_SENDDOCASMS: case SID_MAIL_SENDDOCASOOO: case SID_MAIL_SENDDOCASPDF: + { +#if HAVE_FEATURE_MACOSX_SANDBOX rSet.DisableItem(nSID); - break; #endif + if (isExportLocked()) + rSet.DisableItem(nSID); + break; + } + case SID_WEBHTML: + { + if (isExportLocked()) + rSet.DisableItem(nSID); + break; + } // Printer functions case SID_PRINTDOC: case SID_PRINTDOCDIRECT: @@ -1745,6 +1756,15 @@ bool SfxViewShell::isContentExtractionLocked() return aArgs.getOrDefault("LockContentExtraction", false); } +bool SfxViewShell::isExportLocked() +{ + Reference<XModel> xModel = GetCurrentDocument(); + if (!xModel.is()) + return false; + comphelper::NamedValueCollection aArgs(xModel->getArgs()); + return aArgs.getOrDefault("LockExport", false); +} + Reference < XController > SfxViewShell::GetController() const { return pImpl->m_pController.get(); diff --git a/sw/sdi/wrtapp.sdi b/sw/sdi/wrtapp.sdi index e3680a229843..138c22fb4ecb 100644 --- a/sw/sdi/wrtapp.sdi +++ b/sw/sdi/wrtapp.sdi @@ -60,6 +60,7 @@ interface StarWriter FN_MAILMERGE_WIZARD [ ExecMethod = ExecOther ; + StateMethod = StateOther ; ] FN_MAILMERGE_FIRST_ENTRY diff --git a/sw/source/uibase/app/apphdl.cxx b/sw/source/uibase/app/apphdl.cxx index bc5bbf8020bb..a2a2ff35b455 100644 --- a/sw/source/uibase/app/apphdl.cxx +++ b/sw/source/uibase/app/apphdl.cxx @@ -155,6 +155,13 @@ void SwModule::StateOther(SfxItemSet &rSet) rSet.Put( SfxBoolItem( nWhich, m_pModuleConfig-> IsInsTableFormatNum( bWebView ))); break; + case FN_MAILMERGE_WIZARD: + { + SwView* pView = ::GetActiveView(); + if (pView && pView->GetViewShell()->isExportLocked()) + rSet.DisableItem(nWhich); + break; + } case FN_MAILMERGE_FIRST_ENTRY: case FN_MAILMERGE_PREV_ENTRY: case FN_MAILMERGE_NEXT_ENTRY: diff --git a/sw/source/uibase/app/docsh.cxx b/sw/source/uibase/app/docsh.cxx index d9b49fc7789b..08cdb0ca6245 100644 --- a/sw/source/uibase/app/docsh.cxx +++ b/sw/source/uibase/app/docsh.cxx @@ -1062,7 +1062,7 @@ void SwDocShell::GetState(SfxItemSet& rSet) case FN_OUTLINE_TO_IMPRESS: { SvtModuleOptions aMOpt; - if ( !aMOpt.IsImpress() ) + if ( !aMOpt.IsImpress() || GetViewShell()->isExportLocked() ) rSet.DisableItem( nWhich ); } [[fallthrough]]; @@ -1084,12 +1084,12 @@ void SwDocShell::GetState(SfxItemSet& rSet) break; case FN_NEW_GLOBAL_DOC: - if ( dynamic_cast< const SwGlobalDocShell *>( this ) != nullptr ) + if ( dynamic_cast< const SwGlobalDocShell *>( this ) != nullptr || GetViewShell()->isExportLocked() ) rSet.DisableItem( nWhich ); break; case FN_NEW_HTML_DOC: - if( dynamic_cast< const SwWebDocShell *>( this ) != nullptr ) + if( dynamic_cast< const SwWebDocShell *>( this ) != nullptr || GetViewShell()->isExportLocked() ) rSet.DisableItem( nWhich ); break; diff --git a/sw/source/uibase/shells/grfsh.cxx b/sw/source/uibase/shells/grfsh.cxx index 19c1a6558fc1..9bc4d34fcf1b 100644 --- a/sw/source/uibase/shells/grfsh.cxx +++ b/sw/source/uibase/shells/grfsh.cxx @@ -769,7 +769,7 @@ void SwGrfShell::GetAttrState(SfxItemSet &rSet) case SID_SAVE_GRAPHIC: case SID_EXTERNAL_EDIT: - if( rSh.GetGraphicType() == GraphicType::NONE ) + if( rSh.GetGraphicType() == GraphicType::NONE || GetView().isExportLocked()) bDisable = true; break; |