filter/source/msfilter/msvbahelper.cxx             |   16 +++++++++++-----
 include/filter/msfilter/msvbahelper.hxx            |    4 +++-
 vbahelper/source/vbahelper/vbaeventshelperbase.cxx |   15 +++++++++++++--
 3 files changed, 27 insertions(+), 8 deletions(-)

New commits:
commit eaa38b0f9d672793af500222348a6cacd28910b0
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Sat Oct 8 09:07:53 2022 -0400
Commit:     Justin Luth <jl...@mail.com>
CommitDate: Tue Oct 11 03:08:13 2022 +0200

    tdf#148806 doc vba: only autoOpen PUBLIC macros
    
    Note: this should NOT apply to Document_Open which normally
    is a private subroutine and runs fine as private.
    
    I tested and it DOES apply to all three version of AutoOpen:
    -ThisDocument.AutoOpen,
    -<AnyModule>.AutoOpen,
    -AutoOpen.Main
    
    Note: this is different from Excel.
    Private Auto_Open runs just fine there.
    
    Change-Id: If10c8c90c35275c2b14dc2e15fb357674fc580b8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141114
    Tested-by: Justin Luth <jl...@mail.com>
    Reviewed-by: Justin Luth <jl...@mail.com>

diff --git a/filter/source/msfilter/msvbahelper.cxx 
b/filter/source/msfilter/msvbahelper.cxx
index 674530d1cbb1..a4e954531155 100644
--- a/filter/source/msfilter/msvbahelper.cxx
+++ b/filter/source/msfilter/msvbahelper.cxx
@@ -171,13 +171,15 @@ static SfxObjectShell* findShellForUrl( const OUString& 
sMacroURLOrPath )
 // sMod can be empty ( but we really need the library to search in )
 // if sMod is empty and a macro is found then sMod is updated
 // if sMod is empty, only standard modules will be searched (no class, 
document, form modules)
-static bool hasMacro( SfxObjectShell const * pShell, const OUString& sLibrary, 
OUString& sMod, const OUString& sMacro )
+static bool hasMacro(SfxObjectShell const* pShell, const OUString& sLibrary, 
OUString& sMod,
+                     const OUString& sMacro, bool bOnlyPublic)
 {
 #if !HAVE_FEATURE_SCRIPTING
     (void) pShell;
     (void) sLibrary;
     (void) sMod;
     (void) sMacro;
+    (void) bOnlyPublic;
 #else
     if (sLibrary.isEmpty() || sMacro.isEmpty())
         return false;
@@ -202,7 +204,7 @@ static bool hasMacro( SfxObjectShell const * pShell, const 
OUString& sLibrary, O
         if (!pModule)
             return false;
         SbMethod* pMeth = pModule->FindMethod(sMacro, SbxClassType::Method);
-        return pMeth;
+        return pMeth && (!bOnlyPublic || !pMeth->IsSet(SbxFlagBits::Private));
     }
 
     for (auto const& rModuleRef : pBasic->GetModules())
@@ -210,6 +212,8 @@ static bool hasMacro( SfxObjectShell const * pShell, const 
OUString& sLibrary, O
         SbMethod* pMeth = rModuleRef->FindMethod(sMacro, SbxClassType::Method);
         if (pMeth)
         {
+            if (bOnlyPublic && pMeth->IsSet(SbxFlagBits::Private))
+                continue;
             sMod = rModuleRef->GetName();
             return true;
         }
@@ -257,7 +261,9 @@ static void parseMacro( const OUString& sMacro, OUString& 
sContainer, OUString&
 
 #endif
 
-OUString resolveVBAMacro( SfxObjectShell const * pShell, const OUString& 
rLibName, const OUString& rModuleName, const OUString& rMacroName )
+OUString resolveVBAMacro(SfxObjectShell const* pShell, const OUString& 
rLibName,
+                         const OUString& rModuleName, const OUString& 
rMacroName,
+                         bool bOnlyPublic)
 {
 #if !HAVE_FEATURE_SCRIPTING
     (void) pShell;
@@ -269,7 +275,7 @@ OUString resolveVBAMacro( SfxObjectShell const * pShell, 
const OUString& rLibNam
     {
         OUString aLibName = rLibName.isEmpty() ?  getDefaultProjectName( 
pShell ) : rLibName ;
         OUString aModuleName = rModuleName;
-        if( hasMacro( pShell, aLibName, aModuleName, rMacroName ) )
+        if (hasMacro( pShell, aLibName, aModuleName, rMacroName, bOnlyPublic))
             return aLibName + "." + aModuleName + "." + rMacroName;
     }
 #endif
@@ -440,7 +446,7 @@ MacroResolvedInfo resolveVBAMacro( SfxObjectShell* pShell, 
const OUString& Macro
 
     for (auto const& search : sSearchList)
     {
-        aRes.mbFound = hasMacro( pShell, search, sModule, sProcedure );
+        aRes.mbFound = hasMacro(pShell, search, sModule, sProcedure, 
/*bOnlyPublic=*/false);
         if ( aRes.mbFound )
         {
             sContainer = search;
diff --git a/include/filter/msfilter/msvbahelper.hxx 
b/include/filter/msfilter/msvbahelper.hxx
index 1568970eb697..c1ad7fdae3a2 100644
--- a/include/filter/msfilter/msvbahelper.hxx
+++ b/include/filter/msfilter/msvbahelper.hxx
@@ -58,7 +58,9 @@ struct MSFILTER_DLLPUBLIC MacroResolvedInfo
 MSFILTER_DLLPUBLIC OUString makeMacroURL( std::u16string_view sMacroName );
 MSFILTER_DLLPUBLIC OUString extractMacroName( std::u16string_view rMacroUrl );
 MSFILTER_DLLPUBLIC OUString getDefaultProjectName( SfxObjectShell const * 
pShell );
-MSFILTER_DLLPUBLIC OUString resolveVBAMacro( SfxObjectShell const * pShell, 
const OUString& rLibName, const OUString& rModuleName, const OUString& 
rMacroName );
+MSFILTER_DLLPUBLIC OUString resolveVBAMacro(SfxObjectShell const* pShell, 
const OUString& rLibName,
+                                            const OUString& rModuleName,
+                                            const OUString& rMacroName, bool 
bOnlyPublic);
 MSFILTER_DLLPUBLIC MacroResolvedInfo resolveVBAMacro( SfxObjectShell* pShell, 
const OUString& rMacroName, bool bSearchGlobalTemplates = false );
 MSFILTER_DLLPUBLIC bool executeMacro( SfxObjectShell* pShell, const OUString& 
sMacroName, css::uno::Sequence< css::uno::Any >& aArgs, css::uno::Any& aRet, 
const css::uno::Any& aCaller );
 /// @throws css::uno::RuntimeException
diff --git a/vbahelper/source/vbahelper/vbaeventshelperbase.cxx 
b/vbahelper/source/vbahelper/vbaeventshelperbase.cxx
index cbe8ca79bad7..e9bd0f476f40 100644
--- a/vbahelper/source/vbahelper/vbaeventshelperbase.cxx
+++ b/vbahelper/source/vbahelper/vbaeventshelperbase.cxx
@@ -369,8 +369,18 @@ VbaEventsHelperBase::ModulePathMap& 
VbaEventsHelperBase::updateModulePathMap( co
         const EventHandlerInfo& rInfo = rEventInfo.second;
         if( rInfo.mnModuleType == nModuleType )
         {
+            // Only in Word, Auto* only runs if defined as Public, not Private.
+            const bool bOnlyPublic
+                = getImplementationName() == "SwVbaEventsHelper"
+                  && (rInfo.mnEventId == 
css::script::vba::VBAEventId::DOCUMENT_AUTO_NEW
+                      || rInfo.mnEventId == 
css::script::vba::VBAEventId::AUTO_NEW
+                      || rInfo.mnEventId == 
css::script::vba::VBAEventId::DOCUMENT_AUTO_OPEN
+                      || rInfo.mnEventId == 
css::script::vba::VBAEventId::AUTO_OPEN
+                      || rInfo.mnEventId == 
css::script::vba::VBAEventId::DOCUMENT_AUTO_CLOSE
+                      || rInfo.mnEventId == 
css::script::vba::VBAEventId::AUTO_CLOSE);
+
             OUString sName = resolveVBAMacro(mpShell, maLibraryName, 
rModuleName,
-                                             rInfo.maMacroName);
+                                             rInfo.maMacroName, bOnlyPublic);
             // Only in Word (with lowest priority), an Auto* module can 
execute a "Public Sub Main"
             if (sName.isEmpty() && rModuleName.isEmpty()
                 && getImplementationName() == "SwVbaEventsHelper")
@@ -379,7 +389,8 @@ VbaEventsHelperBase::ModulePathMap& 
VbaEventsHelperBase::updateModulePathMap( co
                     || rInfo.mnEventId == 
css::script::vba::VBAEventId::AUTO_OPEN
                     || rInfo.mnEventId == 
css::script::vba::VBAEventId::AUTO_CLOSE)
                 {
-                    sName = resolveVBAMacro(mpShell, maLibraryName, 
rInfo.maMacroName, "Main");
+                    sName = resolveVBAMacro(mpShell, maLibraryName, 
rInfo.maMacroName, "Main",
+                                            bOnlyPublic);
                 }
             }
             rPathMap[rInfo.mnEventId] = sName;

Reply via email to