forms/inc/strings.hrc                         |    1 
 forms/source/xforms/submission.cxx            |   32 ++++++++++++++++++++++++--
 forms/source/xforms/submission/submission.hxx |    6 ----
 3 files changed, 32 insertions(+), 7 deletions(-)

New commits:
commit 9e745192f19dda1328231c680ee17275c3c89932
Author:     Caolán McNamara <[email protected]>
AuthorDate: Fri May 5 10:18:52 2023 +0100
Commit:     Caolán McNamara <[email protected]>
CommitDate: Fri May 5 15:51:53 2023 +0200

    Resolves: tdf#154337 allow submitting to file: if user agrees
    
    continue to allow submitting to http[s]: without further interaction.
    Don't allow for other protocols, except for file: where the user has to
    agree via dialog prompt.
    
    Change-Id: Ia915f4f33d5dba621971ce69a156c339da933b55
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151418
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/forms/inc/strings.hrc b/forms/inc/strings.hrc
index 07d39970c403..bc822b96ef55 100644
--- a/forms/inc/strings.hrc
+++ b/forms/inc/strings.hrc
@@ -82,5 +82,6 @@
 #define RID_STR_XFORMS_PATTERN_DOESNT_MATCH         
NC_("RID_STR_XFORMS_PATTERN_DOESNT_MATCH", "The string '$1' does not match the 
required regular expression '$2'.")
 #define RID_STR_XFORMS_BINDING_UI_NAME              
NC_("RID_STR_XFORMS_BINDING_UI_NAME", "Binding" )
 #define RID_STR_XFORMS_CANT_REMOVE_TYPE             
NC_("RID_STR_XFORMS_CANT_REMOVE_TYPE", "This is a built-in type and cannot be 
removed." )
+#define RID_STR_XFORMS_WARN_TARGET_IS_FILE          
NC_("RID_STR_XFORMS_WARN_TARGET_IS_FILE", "Are you sure you want to write to 
local file \"$\"?" )
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/forms/source/xforms/submission.cxx 
b/forms/source/xforms/submission.cxx
index 368673a88318..e0d312aa63f0 100644
--- a/forms/source/xforms/submission.cxx
+++ b/forms/source/xforms/submission.cxx
@@ -42,11 +42,16 @@
 #include <com/sun/star/task/XInteractionRequest.hpp>
 #include <com/sun/star/task/XInteractionContinuation.hpp>
 #include <com/sun/star/xforms/InvalidDataOnSubmitException.hpp>
+#include <com/sun/star/form/runtime/XFormController.hpp>
 #include <com/sun/star/frame/XFrame.hpp>
 #include <cppuhelper/exc_hlp.hxx>
 #include <comphelper/interaction.hxx>
 #include <comphelper/processfactory.hxx>
 #include <comphelper/servicehelper.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <frm_resource.hxx>
+#include <strings.hrc>
 #include <memory>
 #include <string_view>
 
@@ -238,8 +243,31 @@ bool Submission::doSubmit( const Reference< 
XInteractionHandler >& xHandler )
         return false;
     }
 
-    if (!xSubmission->IsWebProtocol())
-        return false;
+    const INetURLObject& rURLObject = xSubmission->GetURLObject();
+    INetProtocol eProtocol = rURLObject.GetProtocol();
+    // tdf#154337 continue to allow submitting to http[s]: without further
+    // interaction. Don't allow for other protocols, except for file:
+    // where the user has to agree first.
+    if (eProtocol != INetProtocol::Http && eProtocol != INetProtocol::Https)
+    {
+        if (eProtocol != INetProtocol::File)
+            return false;
+        else
+        {
+            Reference<css::form::runtime::XFormController> 
xFormController(xHandler, UNO_QUERY);
+            Reference<css::awt::XControl> xContainerControl(xFormController ? 
xFormController->getContainer() : nullptr, UNO_QUERY);
+            Reference<css::awt::XWindow> xParent(xContainerControl ? 
xContainerControl->getPeer() : nullptr, UNO_QUERY);
+
+            OUString aFileName(rURLObject.getFSysPath(FSysStyle::Detect));
+            std::unique_ptr<weld::MessageDialog> 
xQueryBox(Application::CreateMessageDialog(Application::GetFrameWeld(xParent),
+                                                           
VclMessageType::Question, VclButtonsType::YesNo,
+                                                           
frm::ResourceManager::loadString(RID_STR_XFORMS_WARN_TARGET_IS_FILE).replaceFirst("$",
 aFileName)));
+            xQueryBox->set_default_response(RET_NO);
+
+            if (xQueryBox->run() != RET_YES)
+                return false;
+        }
+    }
 
     CSubmission::SubmissionResult aResult = xSubmission->submit( xHandler );
 
diff --git a/forms/source/xforms/submission/submission.hxx 
b/forms/source/xforms/submission/submission.hxx
index 65631b9a21c1..26a2514c829d 100644
--- a/forms/source/xforms/submission/submission.hxx
+++ b/forms/source/xforms/submission/submission.hxx
@@ -119,11 +119,7 @@ public:
         , m_xContext(::comphelper::getProcessComponentContext())
     {}
 
-    bool IsWebProtocol() const
-    {
-        INetProtocol eProtocol = m_aURLObj.GetProtocol();
-        return eProtocol == INetProtocol::Http || eProtocol == 
INetProtocol::Https;
-    }
+    const INetURLObject& GetURLObject() const { return m_aURLObj; }
 
     virtual ~CSubmission() {}
 

Reply via email to