This is an automated email from the ASF dual-hosted git repository.

cmarcum pushed a commit to branch AOO41X
in repository https://gitbox.apache.org/repos/asf/openoffice.git


The following commit(s) were added to refs/heads/AOO41X by this push:
     new aa358bf  added help filetype to whitelist. \nPatch by: Arrigo 
Marchiori (ardovm) and Carl Marcum (cmarcum)
aa358bf is described below

commit aa358bfc895091e0ee5382ad1d25e5d51261463b
Author: cbmarcum <carl.mar...@codebuilders.net>
AuthorDate: Thu Apr 8 11:37:59 2021 -0400

    added help filetype to whitelist. \nPatch by: Arrigo Marchiori (ardovm) and 
Carl Marcum (cmarcum)
---
 .../data/org/openoffice/Office/Security.xcu        |   5 +
 main/sfx2/source/appl/appopen.cxx                  | 142 +++++++++++----------
 2 files changed, 81 insertions(+), 66 deletions(-)

diff --git a/main/officecfg/registry/data/org/openoffice/Office/Security.xcu 
b/main/officecfg/registry/data/org/openoffice/Office/Security.xcu
index 5e8a5bd..67021a9 100644
--- a/main/officecfg/registry/data/org/openoffice/Office/Security.xcu
+++ b/main/officecfg/registry/data/org/openoffice/Office/Security.xcu
@@ -464,6 +464,11 @@
                                <value>qt</value>
                        </prop>
                </node>
+               <node oor:name="m89" oor:op="replace">
+                       <prop oor:name="Extension" oor:type="xs:string">
+                               <value>xhp</value>
+                       </prop>
+               </node>
        </node>
        <node oor:name="Hyperlinks">
                <prop oor:name="Open" oor:type="xs:int">
diff --git a/main/sfx2/source/appl/appopen.cxx 
b/main/sfx2/source/appl/appopen.cxx
index d0347bc..873a302 100644
--- a/main/sfx2/source/appl/appopen.cxx
+++ b/main/sfx2/source/appl/appopen.cxx
@@ -148,45 +148,42 @@ void SAL_CALL SfxOpenDocStatusListener_Impl::disposing( 
const EventObject& ) thr
 
 SfxObjectShellRef SfxApplication::DocAlreadyLoaded
 (
-    const String&   rName,      // Name des Dokuments mit Pfad
-    sal_Bool            bSilent,    // sal_True: nicht nach neuer Sicht fragen
-    sal_Bool            bActivate,   // soll bestehende Sicht aktiviert werden
+    const String&   rName,      // Name of the Document including path
+    sal_Bool            bSilent,    // sal_True: do not ask for new view
+    sal_Bool            bActivate,   // should current view be activated 
     sal_Bool            bForbidVisible,
        const String*   pPostStr
 )
 
-/*  [Beschreibung]
-
-    Stellt fest, ob ein Dokument mit dem Namen 'rName' bereits geladen
-    ist und liefert einen Pointer darauf zu"uck.
-
-    Ist das Dokument noch nicht geladen, wird ein 0-Pointer zur"uckgeliefert.
+/*  [description]
+    assert if Document with the name 'rname' has been loaded and delivers the
+    pointer. Otherwise a zeropointer will be returned
 */
 
 {
-    // zu suchenden Namen als URL aufbereiten
+    // create URL from searchable name
     INetURLObject aUrlToFind( rName );
     DBG_ASSERT( aUrlToFind.GetProtocol() != INET_PROT_NOT_VALID, "Invalid URL" 
);
        String aPostString;
        if (  pPostStr )
                aPostString = *pPostStr;
 
-    // noch offen?
+    // still open?
     SfxObjectShellRef xDoc;
 
     if ( !aUrlToFind.HasError() )
     {
-               // dann bei den normal geoeffneten Docs
+               // check at normal opened documents
                if ( !xDoc.Is() )
                {
-                       xDoc = SfxObjectShell::GetFirst( 0, sal_False ); // 
auch hidden Docs
+                       xDoc = SfxObjectShell::GetFirst( 0, sal_False ); // 
include hidden files
                        while( xDoc.Is() )
                        {
                                if ( xDoc->GetMedium() &&
                                         xDoc->GetCreateMode() == 
SFX_CREATE_MODE_STANDARD &&
                                         !xDoc->IsAbortingImport() && 
!xDoc->IsLoading() )
                                {
-                                       // Vergleiche anhand der URLs
+                                       // compare by URLs
                     INetURLObject aUrl( xDoc->GetMedium()->GetName() );
                                        if ( !aUrl.HasError() && aUrl == 
aUrlToFind &&
                          (!bForbidVisible || !SfxViewFrame::GetFirst( xDoc, 
sal_True )) &&
@@ -200,11 +197,11 @@ SfxObjectShellRef SfxApplication::DocAlreadyLoaded
                }
     }
 
-    // gefunden?
+    // found?
     if ( xDoc.Is() && bActivate )
     {
         DBG_ASSERT(
-            !bForbidVisible, "Unsichtbares kann nicht aktiviert werden" );
+            !bForbidVisible, "Invisible files cannot be activated" );
 
                SfxViewFrame* pFrame;
         for( pFrame = SfxViewFrame::GetFirst( xDoc );
@@ -267,8 +264,8 @@ private:
     try
     {
         // check the encryption data
-        // if the data correct is the stream will be opened successfuly
-        // and immediatelly closed
+        // if the data correct is the stream will be opened successfully
+        // and immediately closed
         ::comphelper::OStorageHelper::SetCommonStorageEncryptionData( 
mxStorage, rEncryptionData );
 
         mxStorage->openStreamElement(
@@ -297,19 +294,17 @@ private:
 
 sal_uInt32 CheckPasswd_Impl
 (
-    //Window *pWin,             // Parent des Dialogs
+    //Window *pWin,             // Parent of dialog
     SfxObjectShell*  pDoc,
-    SfxItemPool&     /*rPool*/, // Pool, falls ein Set erzeugt werden mus
-    SfxMedium*       pFile      // das Medium, dessen Passwort gfs. erfragt 
werden soll
+    SfxItemPool&     /*rPool*/, // Pool, if we need to create a set
+    SfxMedium*       pFile      // Medium that needs a password (if necessary)
 )
 
-/*  [Beschreibung]
-
-    Zu einem Medium das Passwort erfragen; funktioniert nur, wenn es sich
-    um einen Storage handelt.
-    Wenn in der Documentinfo das Passwort-Flag gesetzt ist, wird
-    das Passwort vom Benutzer per Dialog erfragt und an dem Set
-    des Mediums gesetzt; das Set wird, wenn nicht vorhanden, erzeugt.
+/*  [description]
+    To query a passwort on a medium works only if the medium is a storage.
+    If in documentinfo the password-flag is set, a dialog will query the user 
+    for the password. The password will be saved in a set. If the set does not 
+    exist, a set will be created.
 */
 {
     sal_uIntPtr nRet = ERRCODE_NONE;
@@ -552,7 +547,7 @@ void SfxApplication::NewDocDirectExec_Impl( SfxRequest& 
rReq )
     aReq.AppendItem( SfxFrameItem( SID_DOCFRAME, GetFrame() ) );
     aReq.AppendItem( SfxStringItem( SID_TARGETNAME, String::CreateFromAscii( 
"_default" ) ) );
 
-    // TODO/LATER: Should the other arguments be transfered as well?
+    // TODO/LATER: Should the other arguments be transferred as well?
     SFX_REQUEST_ARG( rReq, pDefaultPathItem, SfxStringItem, 
SID_DEFAULTFILEPATH, sal_False);
     if ( pDefaultPathItem )
         aReq.AppendItem( *pDefaultPathItem );
@@ -572,7 +567,7 @@ void SfxApplication::NewDocExec_Impl( SfxRequest& rReq )
 {
     DBG_MEMTEST();
 
-    // keine Parameter vom BASIC nur Factory angegeben?
+    // No Parameters given and only factory given by BASIC ?
     SFX_REQUEST_ARG(rReq, pTemplNameItem, SfxStringItem, SID_TEMPLATE_NAME, 
sal_False);
     SFX_REQUEST_ARG(rReq, pTemplFileNameItem, SfxStringItem, SID_FILE_NAME, 
sal_False);
     SFX_REQUEST_ARG(rReq, pTemplRegionNameItem, SfxStringItem, 
SID_TEMPLATE_REGIONNAME, sal_False);
@@ -580,7 +575,7 @@ void SfxApplication::NewDocExec_Impl( SfxRequest& rReq )
     SfxObjectShellLock xDoc;
 
     String  aTemplateRegion, aTemplateName, aTemplateFileName;
-    sal_Bool    bDirect = sal_False; // "uber FileName anstelle Region/Template
+    sal_Bool    bDirect = sal_False; // use filename instead of region/template
     SfxErrorContext aEc(ERRCTX_SFX_NEWDOC);
     if ( !pTemplNameItem && !pTemplFileNameItem )
     {
@@ -762,7 +757,7 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq )
                        rReq.AppendItem( SfxBoolItem( SID_TEMPLATE, sal_False ) 
);
 
             // This helper wraps an existing (or may new created 
InteractionHandler)
-            // intercept all incoming interactions and provide usefull 
informations
+            // intercept all incoming interactions and provide useful 
informations
             // later if the following transaction was finished.
 
             ::framework::PreventDuplicateInteraction*                 pHandler 
      = new 
::framework::PreventDuplicateInteraction(::comphelper::getProcessServiceFactory());
@@ -793,8 +788,7 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq )
                 rReq.RemoveItem( SID_FILE_NAME );
                 rReq.AppendItem( SfxStringItem( SID_FILE_NAME, aURL ) );
 
-                // synchron ausf"uhren, damit beim Reschedulen nicht schon das 
n"achste Dokument
-                // geladen wird
+                // execute synchronous, to avoid next document load at 
reschedule
                 // TODO/LATER: use URLList argument and always remove one 
document after another, each step in asychronous execution, until finished
                 // but only if reschedule is a problem
                 GetDispatcher_Impl()->Execute( SID_OPENDOC, 
SFX_CALLMODE_SYNCHRON, *rReq.GetArgs() );
@@ -828,7 +822,7 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq )
 
     if ( !rReq.IsSynchronCall() )
     {
-        // now check wether a stream is already there
+        // now check whether a stream is already there
         // if not: download it in a thread and restart the call
         // return;
     }
@@ -846,7 +840,7 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq )
         rReq.AppendItem( SfxBoolItem( SID_TEMPLATE, sal_False ) );
     }
     // pass URL to OS by using ShellExecuter or open it internal
-    // if it seams to be an own format.
+    // if it seems to be an own format.
     /* Attention!
             There exist two possibilities to open hyperlinks:
             a) using SID_OPENHYPERLINK (new)
@@ -932,42 +926,58 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq )
                        Reference < XURLTransformer > xTrans( 
::comphelper::getProcessServiceFactory()->createInstance(
                                                                                
                        
::rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" )), 
UNO_QUERY );
                        xTrans->parseStrict( aURL );
-
-                       INetProtocol aINetProtocol = INetURLObject( 
aURL.Complete ).GetProtocol();
+            INetURLObject aINetURLObject(aURL.Complete);
+                       INetProtocol aINetProtocol = 
aINetURLObject.GetProtocol();
                        SvtExtendedSecurityOptions aExtendedSecurityOptions;
                        SvtExtendedSecurityOptions::OpenHyperlinkMode eMode = 
aExtendedSecurityOptions.GetOpenHyperlinkMode();
                        if ( eMode == 
SvtExtendedSecurityOptions::OPEN_WITHSECURITYCHECK )
                        {
-                               if ( aINetProtocol == INET_PROT_FILE )
-                               {
-/*!!! pb: #i49802# no security warning any longer
-                                       // Check if file URL is a directory. 
This is not insecure!
-                                       osl::Directory aDir( aURL.Main );
-                                       sal_Bool bIsDir = ( aDir.open() == 
osl::Directory::E_None );
-
-                    if ( !bIsDir && 
!aExtendedSecurityOptions.IsSecureHyperlink( aURL.Complete ) )
-                                       {
-                                               // Security check for local 
files depending on the extension
-                                               vos::OGuard aGuard( 
Application::GetSolarMutex() );
-                                               Window *pWindow = 
SFX_APP()->GetTopWindow();
+                /*!!! pb: #i49802# no security warning any longer
+                ardovm: Restored security checks in March 2021 */
+                // Check if file URL is a directory. This is not insecure!
+                sal_Bool bIsDir = aINetURLObject.hasFinalSlash() ||
+                    ( osl::Directory(aURL.Main).open() ==
+                      osl::Directory::E_None );
+                // Use SvtExtendedSecurityOptions::IsSecureHyperlink()
+                // to check the extension of the link destination.
+                sal_Bool bSafeExtension = 
aExtendedSecurityOptions.IsSecureHyperlink(aURL.Complete);
+                // We consider some protocols unsafe
+                sal_Bool bUnsafeProtocol;
+                switch (aINetProtocol) {
+                // case INET_PROT_FTP:
+                case INET_PROT_VND_SUN_STAR_HELP:
+                case INET_PROT_HTTP:
+                case INET_PROT_HTTPS:
+                case INET_PROT_MAILTO:
+                    bUnsafeProtocol = false;
+                    break;
+                default: // Anything else, including INET_PROT_FILE
+                    bUnsafeProtocol = true;
+                    break;
+                }
+                if ( (!bIsDir && !bSafeExtension) || bUnsafeProtocol )
+                {
+                    // Security check for local files depending on the 
extension
+                    vos::OGuard aGuard( Application::GetSolarMutex() );
+                    Window *pWindow = SFX_APP()->GetTopWindow();
 
-                                               String 
aSecurityWarningBoxTitle( SfxResId( RID_SECURITY_WARNING_TITLE ));
-                                               WarningBox      
aSecurityWarningBox( pWindow, SfxResId( RID_SECURITY_WARNING_HYPERLINK ));
-                                               aSecurityWarningBox.SetText( 
aSecurityWarningBoxTitle );
+                    String aSecurityWarningBoxTitle( SfxResId( 
RID_SECURITY_WARNING_TITLE ));
+                    WarningBox aSecurityWarningBox( pWindow, SfxResId( 
RID_SECURITY_WARNING_HYPERLINK ));
+                    aSecurityWarningBox.SetText( aSecurityWarningBoxTitle );
 
-                                               // Replace %s with the real 
file name
-                                               String aMsgText = 
aSecurityWarningBox.GetMessText();
-                                               String aMainURL( aURL.Main );
-                                               String aFileName;
+                    // Replace %s with the real file name
+                    String aMsgText = aSecurityWarningBox.GetMessText();
+                    String aMainURL( aURL.Main );
+                    String aFileNameInMsg;
 
-                                               
utl::LocalFileHelper::ConvertURLToPhysicalName( aMainURL, aFileName );
-                                               aMsgText.SearchAndReplaceAscii( 
"%s", aFileName );
-                                               
aSecurityWarningBox.SetMessText( aMsgText );
+                    if (!utl::LocalFileHelper::ConvertURLToPhysicalName( 
aMainURL, aFileNameInMsg )) {
+                        aFileNameInMsg = aMainURL;
+                    }
+                    aMsgText.SearchAndReplaceAscii( "%s", aFileNameInMsg );
+                    aSecurityWarningBox.SetMessText( aMsgText );
 
-                                               if( 
aSecurityWarningBox.Execute() == RET_NO )
-                                                       return;
-                                       }
-*/
+                    if( aSecurityWarningBox.Execute() == RET_NO )
+                        return;
                                }
                        }
             else if ( eMode == SvtExtendedSecurityOptions::OPEN_NEVER && 
aINetProtocol != INET_PROT_VND_SUN_STAR_HELP )
@@ -1217,7 +1227,7 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq )
     Reference < XController > xController;
 //    if ( ( !bIsBlankTarget && pFrame ) || pLinkItem || 
!rReq.IsSynchronCall() )
 //    {
-        // if a frame is given, it must be used for the starting point of the 
targetting mechanism
+        // if a frame is given, it must be used for the starting point of the 
targeting mechanism
         // this code is also used if asynchronous loading is possible, because 
loadComponent always is synchron
         if ( !xTargetFrame.is() )
         {
@@ -1252,7 +1262,7 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq )
         if( bHidden || pLinkItem || rReq.IsSynchronCall() )
         {
             // if loading must be done synchron, we must wait for completion 
to get a return value
-            // find frame by myself; I must konw the exact frame to get the 
controller for the return value from it
+            // find frame by myself; I must know the exact frame to get the 
controller for the return value from it
             //if( aTarget.getLength() )
             //    xTargetFrame = xTargetFrame->findFrame( aTarget, 
FrameSearchFlag::ALL );
             Reference < XComponent > xComp;

Reply via email to