Hi Bryan,

On Tue, 2016-02-09 at 01:38 -0500, Bryan Quigley wrote:
> While working on the easyhack[1] to remove export of obsolete formats

        Its prolly a good idea to close that easy-hack ;-)

> There also might be a security benefit by not having to
> consider these formats (less import code to harden).

        As JanI says, cf. the ESC minutes - being the swiss-army-knife of file
formats that loads ~anything you can throw at it is quite important.

> P.S. Please copy me on replies.

        Hopefully the list is configured to do that ;-)

        Anyhow - I share your concern wrt. the attack surface that all these
old file filters provide for us; I attach a prototype patch that adds an
'EXOTIC' annotation to our filter descriptions. It is missing a UI
Interaction Handler piece (cf. the hole with the notes and so on in
there ;-) - we'll need a new request type I guess.

        My ideal would be to pop up a dialog saying:

        "You're asking LibreOffice to open a very unusual file-type.
         Unless you are certain that this file is indeed a <Lotus
         Word Pro> file it is safest to not open it.

         [ ] - never show this again

                      [ this is an unusual file ] [get me out of here ]"

        Of some kind =) is that something you'd be interested in working on ?

        All the best,

                Michael.

-- 
 [email protected]  <><, Pseudo Engineer, itinerant idiot
From 637f57758b1bb4b951fb48cc49fe5071f9533953 Mon Sep 17 00:00:00 2001
From: Michael Meeks <[email protected]>
Date: Wed, 25 Feb 2015 15:07:19 +0000
Subject: [PATCH] First cut at annotating 'exotic' filters.

The idea being that we can improve security by warning for these.

Change-Id: I7d993417bfb6a8fe868bc3e07ccbcfe71bf285ff
---
 filter/source/config/cache/constant.hxx                            | 2 ++
 filter/source/config/cache/filtercache.cxx                         | 6 ++++++
 filter/source/config/fragments/filters/AbiWord.xcu                 | 2 +-
 filter/source/config/fragments/filters/StarOffice_XML__Base_.xcu   | 2 +-
 filter/source/config/fragments/filters/StarOffice_XML__Writer_.xcu | 2 +-
 filter/source/config/fragments/filters/T602Document.xcu            | 2 +-
 filter/source/config/fragments/filters/XPM.xcu                     | 2 +-
 filter/source/config/fragments/filters/writer_MIZI_Hwp_97.xcu      | 2 +-
 include/comphelper/documentconstants.hxx                           | 2 ++
 include/sfx2/docfilt.hxx                                           | 3 +++
 10 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/filter/source/config/cache/constant.hxx b/filter/source/config/cache/constant.hxx
index 98327f0..f21ee55 100644
--- a/filter/source/config/cache/constant.hxx
+++ b/filter/source/config/cache/constant.hxx
@@ -124,6 +124,7 @@
 #define  FLAGNAME_TEMPLATEPATH      "TEMPLATEPATH"
 #define  FLAGNAME_USESOPTIONS       "USESOPTIONS"
 #define  FLAGNAME_COMBINED          "COMBINED"
+#define  FLAGNAME_EXOTIC            "EXOTIC"
 
 /** @short  values of filter flags, sorted based on value */
 #define  FLAGVAL_IMPORT            0x00000001 // 1
@@ -144,6 +145,7 @@
 #define  FLAGVAL_CONSULTSERVICE    0x00040000 // 262144
 #define  FLAGVAL_3RDPARTYFILTER    0x00080000 // 524288
 #define  FLAGVAL_PACKED            0x00100000 // 1048576
+#define  FLAGVAL_EXOTIC            0x00200000 // 2097152
 #define  FLAGVAL_BROWSERPREFERRED  0x00400000 // 4194304
 #define  FLAGVAL_COMBINED          0x00800000 // 8388608
 #define  FLAGVAL_ENCRYPTION        0x01000000 // 16777216
diff --git a/filter/source/config/cache/filtercache.cxx b/filter/source/config/cache/filtercache.cxx
index 18115e4..06071bbc 100644
--- a/filter/source/config/cache/filtercache.cxx
+++ b/filter/source/config/cache/filtercache.cxx
@@ -1920,6 +1920,7 @@ css::uno::Sequence< OUString > FilterCache::impl_convertFlagField2FlagNames(sal_
     if ((nFlags & FLAGVAL_CONSULTSERVICE   ) == FLAGVAL_CONSULTSERVICE   ) lFlagNames.push_back(FLAGNAME_CONSULTSERVICE   );
     if ((nFlags & FLAGVAL_DEFAULT          ) == FLAGVAL_DEFAULT          ) lFlagNames.push_back(FLAGNAME_DEFAULT          );
     if ((nFlags & FLAGVAL_ENCRYPTION       ) == FLAGVAL_ENCRYPTION       ) lFlagNames.push_back(FLAGNAME_ENCRYPTION       );
+    if ((nFlags & FLAGVAL_EXOTIC           ) == FLAGVAL_EXOTIC           ) lFlagNames.push_back(FLAGNAME_EXOTIC           );
     if ((nFlags & FLAGVAL_EXPORT           ) == FLAGVAL_EXPORT           ) lFlagNames.push_back(FLAGNAME_EXPORT           );
     if ((nFlags & FLAGVAL_IMPORT           ) == FLAGVAL_IMPORT           ) lFlagNames.push_back(FLAGNAME_IMPORT           );
     if ((nFlags & FLAGVAL_INTERNAL         ) == FLAGVAL_INTERNAL         ) lFlagNames.push_back(FLAGNAME_INTERNAL         );
@@ -1992,6 +1993,11 @@ sal_Int32 FilterCache::impl_convertFlagNames2FlagField(const css::uno::Sequence<
             nField |= FLAGVAL_EXPORT;
             continue;
         }
+        if (pNames[i] == FLAGNAME_EXOTIC)
+        {
+            nField |= FLAGVAL_EXOTIC;
+            continue;
+        }
         if (pNames[i] == FLAGNAME_IMPORT)
         {
             nField |= FLAGVAL_IMPORT;
diff --git a/filter/source/config/fragments/filters/AbiWord.xcu b/filter/source/config/fragments/filters/AbiWord.xcu
index 32e95be..b53ef62 100644
--- a/filter/source/config/fragments/filters/AbiWord.xcu
+++ b/filter/source/config/fragments/filters/AbiWord.xcu
@@ -16,7 +16,7 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 -->
     <node oor:name="AbiWord" oor:op="replace">
-        <prop oor:name="Flags"><value>IMPORT ALIEN USESOPTIONS 3RDPARTYFILTER</value></prop>
+        <prop oor:name="Flags"><value>IMPORT ALIEN USESOPTIONS 3RDPARTYFILTER EXOTIC</value></prop>
         <prop oor:name="UIComponent"/>
         <prop oor:name="FilterService"><value>com.sun.star.comp.Writer.AbiWordImportFilter</value></prop>
         <prop oor:name="UserData"><value>ABW</value></prop>
diff --git a/filter/source/config/fragments/filters/StarOffice_XML__Base_.xcu b/filter/source/config/fragments/filters/StarOffice_XML__Base_.xcu
index 4c33a80..3448430 100644
--- a/filter/source/config/fragments/filters/StarOffice_XML__Base_.xcu
+++ b/filter/source/config/fragments/filters/StarOffice_XML__Base_.xcu
@@ -16,7 +16,7 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 -->
     <node oor:name="StarOffice XML (Base)" oor:op="replace">
-        <prop oor:name="Flags"><value>IMPORT OWN DEFAULT 3RDPARTYFILTER ENCRYPTION</value></prop>
+        <prop oor:name="Flags"><value>IMPORT OWN DEFAULT 3RDPARTYFILTER ENCRYPTION EXOTIC</value></prop>
         <prop oor:name="UIComponent"/>
         <prop oor:name="FilterService"/>
         <prop oor:name="UserData"/>
diff --git a/filter/source/config/fragments/filters/StarOffice_XML__Writer_.xcu b/filter/source/config/fragments/filters/StarOffice_XML__Writer_.xcu
index ee3638b..ba7db69 100644
--- a/filter/source/config/fragments/filters/StarOffice_XML__Writer_.xcu
+++ b/filter/source/config/fragments/filters/StarOffice_XML__Writer_.xcu
@@ -16,7 +16,7 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 -->
     <node oor:name="StarOffice XML (Writer)" oor:op="replace">
-        <prop oor:name="Flags"><value>IMPORT TEMPLATE OWN ALIEN PREFERRED ENCRYPTION</value></prop>
+        <prop oor:name="Flags"><value>IMPORT TEMPLATE OWN ALIEN PREFERRED ENCRYPTION EXOTIC</value></prop>
         <prop oor:name="UIComponent"/>
         <prop oor:name="FilterService"/>
         <prop oor:name="UserData"><value>CXML</value></prop>
diff --git a/filter/source/config/fragments/filters/T602Document.xcu b/filter/source/config/fragments/filters/T602Document.xcu
index 1d3a887..0c5b481 100644
--- a/filter/source/config/fragments/filters/T602Document.xcu
+++ b/filter/source/config/fragments/filters/T602Document.xcu
@@ -16,7 +16,7 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 -->
     <node oor:name="T602Document" oor:op="replace">
-        <prop oor:name="Flags"><value>IMPORT ALIEN USESOPTIONS 3RDPARTYFILTER PREFERRED</value></prop>
+        <prop oor:name="Flags"><value>IMPORT ALIEN USESOPTIONS 3RDPARTYFILTER PREFERRED EXOTIC</value></prop>
         <prop oor:name="UIComponent"/>
         <prop oor:name="FilterService"><value>com.sun.star.comp.Writer.T602ImportFilter</value></prop>
         <prop oor:name="UserData"><value>602</value></prop>
diff --git a/filter/source/config/fragments/filters/XPM.xcu b/filter/source/config/fragments/filters/XPM.xcu
index 83c1e32..8a67b71 100644
--- a/filter/source/config/fragments/filters/XPM.xcu
+++ b/filter/source/config/fragments/filters/XPM.xcu
@@ -16,7 +16,7 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 -->
     <node oor:name="XPM" oor:op="replace">
-        <prop oor:name="Flags"><value>IMPORT ALIEN</value></prop>
+        <prop oor:name="Flags"><value>IMPORT ALIEN EXOTIC</value></prop>
         <prop oor:name="UIComponent"/>
         <prop oor:name="FilterService"/>
         <prop oor:name="UserData"><value></value></prop>
diff --git a/filter/source/config/fragments/filters/writer_MIZI_Hwp_97.xcu b/filter/source/config/fragments/filters/writer_MIZI_Hwp_97.xcu
index 1eba0ff..2b717c8 100644
--- a/filter/source/config/fragments/filters/writer_MIZI_Hwp_97.xcu
+++ b/filter/source/config/fragments/filters/writer_MIZI_Hwp_97.xcu
@@ -16,7 +16,7 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 -->
     <node oor:name="writer_MIZI_Hwp_97" oor:op="replace">
-        <prop oor:name="Flags"><value>IMPORT ALIEN 3RDPARTYFILTER</value></prop>
+        <prop oor:name="Flags"><value>IMPORT ALIEN 3RDPARTYFILTER EXOTIC</value></prop>
         <prop oor:name="UIComponent"/>
         <prop oor:name="FilterService"><value>com.sun.comp.hwpimport.HwpImportFilter</value></prop>
         <prop oor:name="UserData"><value></value></prop>
diff --git a/include/comphelper/documentconstants.hxx b/include/comphelper/documentconstants.hxx
index 268bf99..c909906 100644
--- a/include/comphelper/documentconstants.hxx
+++ b/include/comphelper/documentconstants.hxx
@@ -98,6 +98,7 @@
 // Default                 - default filter for this document type
 // NotInFileDialog         - should be self explaining
 // NotInChooser            - as above
+// Exotic                  - an unusual/legacy file-format, we don't normally see
 
 // (The 3rdPartyFilter flag is here called StarONE)
 
@@ -124,6 +125,7 @@
 
 #define SFX_FILTER_STARONEFILTER     0x00080000L
 #define SFX_FILTER_PACKED            0x00100000L
+#define SFX_FILTER_EXOTIC            0x00200000L
 
 
 #define SFX_FILTER_ENCRYPTION        0x01000000L
diff --git a/include/sfx2/docfilt.hxx b/include/sfx2/docfilt.hxx
index 34d7130..aacb8c5 100644
--- a/include/sfx2/docfilt.hxx
+++ b/include/sfx2/docfilt.hxx
@@ -80,7 +80,10 @@ public:
     bool IsAllowedAsTemplate() const { return (nFormatType & SFX_FILTER_TEMPLATE) != 0; }
     bool IsOwnFormat() const { return (nFormatType & SFX_FILTER_OWN) != 0; }
     bool IsOwnTemplateFormat() const { return (nFormatType & SFX_FILTER_TEMPLATEPATH) != 0; }
+    /// not our built-in format
     bool IsAlienFormat() const { return (nFormatType & SFX_FILTER_ALIEN) != 0; }
+    /// an unusual/legacy file to be loading
+    bool IsExoticFormat() const { return (nFormatType & SFX_FILTER_EXOTIC) != 0; }
     bool CanImport() const { return (nFormatType & SFX_FILTER_IMPORT) != 0; }
     bool CanExport() const { return (nFormatType & SFX_FILTER_EXPORT) != 0; }
     bool IsInternal() const { return (nFormatType & SFX_FILTER_INTERNAL) != 0; }
-- 
1.8.4.5

diff --git a/include/sfx2/objsh.hxx b/include/sfx2/objsh.hxx
index d08baa9..1f7a7f2 100644
--- a/include/sfx2/objsh.hxx
+++ b/include/sfx2/objsh.hxx
@@ -689,6 +689,7 @@ public:
 
     SAL_DLLPRIVATE void ImplSign( bool bScriptingContent = false );
     SAL_DLLPRIVATE bool QuerySaveSizeExceededModules_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler );
+    SAL_DLLPRIVATE bool QueryAllowExoticFormat_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler );
 
     SAL_DLLPRIVATE void CheckOut( );
     SAL_DLLPRIVATE void CancelCheckOut( );
diff --git a/sfx2/source/doc/objstor.cxx b/sfx2/source/doc/objstor.cxx
index 59cb2e8..114e523 100644
--- a/sfx2/source/doc/objstor.cxx
+++ b/sfx2/source/doc/objstor.cxx
@@ -660,6 +660,10 @@ bool SfxObjectShell::DoLoad( SfxMedium *pMed )
     pImp->nLoadedFlags = 0;
     pImp->bModelInitialized = false;
 
+    if ( pFilter && pFilter->IsExoticFormat() &&
+         !QueryAllowExoticFormat_Impl( getInteractionHandler() ) )
+        SetError( ERRCODE_IO_ABORT, OUString( OSL_LOG_PREFIX ) );
+
     //TODO/LATER: make a clear strategy how to handle "UsesStorage" etc.
     bool bOwnStorageFormat = IsOwnStorageFormat_Impl( *pMedium );
     bool bHasStorage = IsPackageStorageFormat_Impl( *pMedium );
@@ -882,6 +886,7 @@ sal_uInt32 SfxObjectShell::HandleFilter( SfxMedium* pMedium, SfxObjectShell* pDo
     SfxItemSet* pSet = pMedium->GetItemSet();
     SFX_ITEMSET_ARG( pSet, pOptions, SfxStringItem, SID_FILE_FILTEROPTIONS, false );
     SFX_ITEMSET_ARG( pSet, pData, SfxUnoAnyItem, SID_FILTER_DATA, false );
+
     if ( !pData && !pOptions )
     {
         com::sun::star::uno::Reference< XMultiServiceFactory > xServiceManager = ::comphelper::getProcessServiceFactory();
@@ -2190,6 +2195,7 @@ bool SfxObjectShell::ImportFrom(SfxMedium& rMedium,
         rMedium.GetItemSet()->Put( SfxStringItem( SID_FILTER_NAME, aFilterName ) );
     }
 
+    bool bExotic = false;
     OUString aFilterImplName;
     sal_Int32 nFilterProps = aProps.getLength();
     for ( sal_Int32 nFilterProp = 0; nFilterProp<nFilterProps; nFilterProp++ )
@@ -2198,10 +2204,19 @@ bool SfxObjectShell::ImportFrom(SfxMedium& rMedium,
         if (rFilterProp.Name == "FilterService")
         {
             rFilterProp.Value >>= aFilterImplName;
-            break;
+        }
+        if (rFilterProp.Name == "Flags")
+        {
+            sal_Int32 nFlags = 0;
+            bExotic = (rFilterProp.Value >>= nFlags) && (nFlags & SFX_FILTER_EXOTIC);
         }
     }
 
+    if (bExotic)
+    {
+        fprintf (stderr, "Odd file format !\n");
+    }
+
     uno::Reference< document::XFilter > xLoader;
     if ( !aFilterImplName.isEmpty() )
     {
@@ -3645,6 +3660,59 @@ bool SfxObjectShell::QuerySaveSizeExceededModules_Impl( const uno::Reference< ta
     return true;
 }
 
+bool SfxObjectShell::QueryAllowExoticFormat_Impl( const uno::Reference< task::XInteractionHandler >& xHandler )
+{
+    if ( xHandler.is() )
+    {
+     // labouriously create interaction request
+forms/source/xforms/submission.cxx-            comphelper::OInteractionRequest* pRequest
+forms/source/xforms/submission.cxx-                = new comphelper::OInteractionRequest(
+forms/source/xforms/submission.cxx-                    makeAny( aInvalidDataException ) );
+forms/source/xforms/submission.cxx:            Reference<XInteractionRequest> xRequest = pRequest;
+
+
+        // FIXME: iahndl.cxx -> handles interaction requests like this ...
+        uno::Sequence<OUString> aEmpty;
+        ModuleSizeExceeded* pReq = new ModuleSizeExceeded( aEmpty );
+        uno::Reference< task::XInteractionRequest > xReq( pReq );
+        xHandler->handle( xReq );
+        return pReq->isApprove();
+
+        from forms: ... make this less laborious !? ...
+                + re-factor that to be simpler ? ... =) [!] ...
+
+           // labouriously create interaction request
+            comphelper::OInteractionRequest* pRequest
+                = new comphelper::OInteractionRequest(
+                    makeAny( aInvalidDataException ) );
+            Reference<XInteractionRequest> xRequest = pRequest;
+
+            comphelper::OInteractionApprove* pContinue
+                = new comphelper::OInteractionApprove();
+            Reference<XInteractionContinuation> xContinue = pContinue;
+            pRequest->addContinuation( xContinue );
+
+            comphelper::OInteractionDisapprove* pCancel
+                = new comphelper::OInteractionDisapprove();
+            Reference<XInteractionContinuation> xCancel = pCancel;
+            pRequest->addContinuation( xCancel );
+
+            // ask the handler...
+            _rxHandler->handle( xRequest );
+            OSL_ENSURE( pContinue->wasSelected() || pCancel->wasSelected(),
+                        "handler didn't select" );
+
+            // and continue, if user chose 'continue'
+            if( pContinue->wasSelected() )
+                bValid = true;
+
+
+
+    }
+    // No interaction handler, default is to continue to load
+    return true;
+}
+
 uno::Reference< task::XInteractionHandler > SfxObjectShell::getInteractionHandler() const
 {
     uno::Reference< task::XInteractionHandler > xRet;
_______________________________________________
LibreOffice mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to