cui/source/options/optlanguagetool.cxx | 4 cui/source/options/optlanguagetool.hxx | 1 cui/uiconfig/ui/langtoolconfigpage.ui | 227 +++++----- desktop/source/lib/init.cxx | 3 include/svtools/languagetoolcfg.hxx | 3 lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx | 16 officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs | 7 svtools/source/config/languagetoolcfg.cxx | 16 8 files changed, 172 insertions(+), 105 deletions(-)
New commits: commit 3a7a58d8b86bffed074bee56ad96fd3e673ef040 Author: Mert Tumer <[email protected]> AuthorDate: Mon Jul 4 19:52:49 2022 +0300 Commit: Andras Timar <[email protected]> CommitDate: Tue Jul 5 11:28:39 2022 +0200 Added option to disable ssl verification for languagetool This will allow to use self-signed certificates with local run languagetool APIs Signed-off-by: Mert Tumer <[email protected]> Change-Id: I2bda575fa6174dfc0f6c24da45267ee732643db6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136811 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Andras Timar <[email protected]> diff --git a/cui/source/options/optlanguagetool.cxx b/cui/source/options/optlanguagetool.cxx index 38807bc337d3..fc7a42536051 100644 --- a/cui/source/options/optlanguagetool.cxx +++ b/cui/source/options/optlanguagetool.cxx @@ -29,6 +29,7 @@ OptLanguageToolTabPage::OptLanguageToolTabPage(weld::Container* pPage, , m_xUsernameED(m_xBuilder->weld_entry("username")) , m_xApiKeyED(m_xBuilder->weld_entry("apikey")) , m_xActivateBox(m_xBuilder->weld_check_button("activate")) + , m_xSSLDisableVerificationBox(m_xBuilder->weld_check_button("verifyssl")) , m_xApiSettingsFrame(m_xBuilder->weld_frame("apisettings")) { m_xActivateBox->connect_toggled(LINK(this, OptLanguageToolTabPage, CheckHdl)); @@ -44,6 +45,7 @@ void OptLanguageToolTabPage::EnableControls(bool bEnable) rLanguageOpts.setEnabled(bEnable); m_xApiSettingsFrame->set_visible(bEnable); m_xActivateBox->set_active(bEnable); + m_xSSLDisableVerificationBox->set_active(rLanguageOpts.getSSLVerification() != true); } IMPL_LINK_NOARG(OptLanguageToolTabPage, CheckHdl, weld::Toggleable&, void) @@ -57,6 +59,7 @@ void OptLanguageToolTabPage::Reset(const SfxItemSet*) m_xBaseURLED->set_text(rLanguageOpts.getBaseURL()); m_xUsernameED->set_text(rLanguageOpts.getUsername()); m_xApiKeyED->set_text(rLanguageOpts.getApiKey()); + m_xSSLDisableVerificationBox->set_active(rLanguageOpts.getSSLVerification() != true); } bool OptLanguageToolTabPage::FillItemSet(SfxItemSet*) @@ -65,6 +68,7 @@ bool OptLanguageToolTabPage::FillItemSet(SfxItemSet*) rLanguageOpts.setBaseURL(m_xBaseURLED->get_text()); rLanguageOpts.setUsername(m_xUsernameED->get_text()); rLanguageOpts.setApiKey(m_xApiKeyED->get_text()); + rLanguageOpts.setSSLVerification(m_xSSLDisableVerificationBox->get_active() != true); return false; } diff --git a/cui/source/options/optlanguagetool.hxx b/cui/source/options/optlanguagetool.hxx index 46a60ecbe103..85e0238b0318 100644 --- a/cui/source/options/optlanguagetool.hxx +++ b/cui/source/options/optlanguagetool.hxx @@ -36,6 +36,7 @@ private: std::unique_ptr<weld::Entry> m_xUsernameED; std::unique_ptr<weld::Entry> m_xApiKeyED; std::unique_ptr<weld::CheckButton> m_xActivateBox; + std::unique_ptr<weld::CheckButton> m_xSSLDisableVerificationBox; std::unique_ptr<weld::Frame> m_xApiSettingsFrame; void EnableControls(bool bEnable); diff --git a/cui/uiconfig/ui/langtoolconfigpage.ui b/cui/uiconfig/ui/langtoolconfigpage.ui index 7b822325e3f1..237040fa76b7 100644 --- a/cui/uiconfig/ui/langtoolconfigpage.ui +++ b/cui/uiconfig/ui/langtoolconfigpage.ui @@ -76,16 +76,130 @@ <object class="GtkGrid" id="grid1"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="row_spacing">5</property> - <property name="column_spacing">12</property> <child> - <object class="GtkLabel" id="base"> + <object class="GtkGrid" id="grid2"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes" context="langtoolconfigpage|base">Base URL:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">baseurl</property> + <property name="row_spacing">5</property> + <property name="column_spacing">12</property> + <child> + <object class="GtkLabel" id="base"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="langtoolconfigpage|base">Base URL:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">baseurl</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="baseurl"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="usernamelbl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="langtoolconfigpage|usernamelbl">User name:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">username</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="apikeylbl"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="langtoolconfigpage|apikeylbl">API key:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">apikey</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">4</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="username"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="apikey"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">4</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="urldesc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="langtoolconfigpage|urldesc">Please use the base URL e.g. without "/check" at the end.</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="usernamedesc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="langtoolconfigpage|usernamedesc">Your LanguageTool account's username for premium usage.</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="apikeydesc"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="langtoolconfigpage|apikeydesc">Your LanguageTool account's api key for premium usage.</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">5</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> </object> <packing> <property name="left_attach">0</property> @@ -93,109 +207,20 @@ </packing> </child> <child> - <object class="GtkEntry" id="baseurl"> + <object class="GtkCheckButton" id="verifyssl"> + <property name="label" translatable="yes" context="langtoolconfigpage|verifyssl">Disable SSL Certificate Verification</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hexpand">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="usernamelbl"> - <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="receives_default">False</property> <property name="halign">start</property> - <property name="label" translatable="yes" context="langtoolconfigpage|usernamelbl">User name:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">username</property> + <property name="margin_top">5</property> + <property name="draw_indicator">True</property> </object> <packing> <property name="left_attach">0</property> - <property name="top_attach">2</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="apikeylbl"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes" context="langtoolconfigpage|apikeylbl">API key:</property> - <property name="use_underline">True</property> - <property name="mnemonic_widget">apikey</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">4</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="username"> - <property name="visible">True</property> - <property name="can_focus">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="apikey"> - <property name="visible">True</property> - <property name="can_focus">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">4</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="urldesc"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes" context="langtoolconfigpage|urldesc">Please use the base URL e.g. without "/check" at the end.</property> - </object> - <packing> - <property name="left_attach">1</property> <property name="top_attach">1</property> </packing> </child> - <child> - <object class="GtkLabel" id="usernamedesc"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes" context="langtoolconfigpage|usernamedesc">Your LanguageTool account's username for premium usage.</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">3</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="apikeydesc"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes" context="langtoolconfigpage|apikeydesc">Your LanguageTool account's api key for premium usage.</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">5</property> - </packing> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> </object> </child> <child type="label"> diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 5b4434b75e22..07276ebd1eea 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -6568,9 +6568,11 @@ void setLanguageToolConfig() const char* pBaseUrlString = ::getenv("LANGUAGETOOL_BASEURL"); const char* pUsername = ::getenv("LANGUAGETOOL_USERNAME"); const char* pApikey = ::getenv("LANGUAGETOOL_APIKEY"); + const char* pSSLVerification = ::getenv("LANGUAGETOOL_SSL_VERIFICATION"); if (pEnabled && pBaseUrlString) { OUString aEnabled = OStringToOUString(pEnabled, RTL_TEXTENCODING_UTF8); + OUString aSSLVerification = OStringToOUString(pSSLVerification, RTL_TEXTENCODING_UTF8); if (aEnabled != "true") return; OUString aBaseUrl = OStringToOUString(pBaseUrlString, RTL_TEXTENCODING_UTF8); @@ -6579,6 +6581,7 @@ void setLanguageToolConfig() SvxLanguageToolOptions& rLanguageOpts = SvxLanguageToolOptions::Get(); rLanguageOpts.setBaseURL(aBaseUrl); rLanguageOpts.setEnabled(true); + rLanguageOpts.setSSLVerification(aSSLVerification == "true"); if (pUsername && pApikey) { OUString aUsername = OStringToOUString(pUsername, RTL_TEXTENCODING_UTF8); diff --git a/include/svtools/languagetoolcfg.hxx b/include/svtools/languagetoolcfg.hxx index 7578ad6ba281..3f30c4bd94a8 100644 --- a/include/svtools/languagetoolcfg.hxx +++ b/include/svtools/languagetoolcfg.hxx @@ -51,6 +51,9 @@ public: bool getEnabled() const; void setEnabled(bool enabled); + bool getSSLVerification() const; + void setSSLVerification(bool enabled); + private: std::unique_ptr<LanguageToolOptions_Impl> pImpl; void Load(const css::uno::Sequence<OUString>& rPropertyNames); diff --git a/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx b/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx index 5479e67e82c4..da0d133a6965 100644 --- a/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx +++ b/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx @@ -41,6 +41,7 @@ #include <com/sun/star/uno/Any.hxx> #include <unotools/lingucfg.hxx> #include <osl/mutex.hxx> +#include <sal/log.hxx> using namespace osl; using namespace com::sun::star; @@ -332,8 +333,12 @@ std::string LanguageToolGrammarChecker::makeHttpRequest(std::string_view aURL, H curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, static_cast<void*>(&response_body)); - curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYPEER, false); - curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYHOST, false); + // allow unknown or self-signed certificates + if (rLanguageOpts.getSSLVerification() == false) + { + curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYPEER, false); + curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYHOST, false); + } curl_easy_setopt(curl.get(), CURLOPT_TIMEOUT, CURL_TIMEOUT); if (method == HTTP_METHOD::HTTP_POST) @@ -350,8 +355,11 @@ std::string LanguageToolGrammarChecker::makeHttpRequest(std::string_view aURL, H } } - /*CURLcode cc = */ - curl_easy_perform(curl.get()); + CURLcode cc = curl_easy_perform(curl.get()); + if (cc != CURLE_OK) + { + SAL_WARN("languagetool", "CURL request returned with error: " << static_cast<sal_Int32>(cc)); + } curl_easy_getinfo(curl.get(), CURLINFO_RESPONSE_CODE, &nStatusCode); return response_body; } diff --git a/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs b/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs index 8a9239e570f4..a3fc5f1296c8 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs @@ -435,6 +435,13 @@ </info> <value>false</value> </prop> + <prop oor:name="SSLCertVerify" oor:type="xs:boolean" oor:nillable="false"> + <info> + <desc>Enable or disable SSL certificate verification for HTTPS requests</desc> + <label>API SSL verification control</label> + </info> + <value>true</value> + </prop> </group> </group> <group oor:name="Hyphenation"> diff --git a/svtools/source/config/languagetoolcfg.cxx b/svtools/source/config/languagetoolcfg.cxx index 9f81c8e787f1..3f48010141db 100644 --- a/svtools/source/config/languagetoolcfg.cxx +++ b/svtools/source/config/languagetoolcfg.cxx @@ -32,6 +32,7 @@ struct LanguageToolOptions_Impl OUString sUsername; OUString sApiKey; bool bEnabled; + bool bSSLCertVerificatrionEnabled; }; const Sequence<OUString>& SvxLanguageToolOptions::GetPropertyNames() @@ -41,6 +42,7 @@ const Sequence<OUString>& SvxLanguageToolOptions::GetPropertyNames() "LanguageTool/Username", "LanguageTool/ApiKey", "LanguageTool/IsEnabled", + "LanguageTool/SSLCertVerify", }; return aNames; } @@ -75,6 +77,14 @@ void SvxLanguageToolOptions::setApiKey(const OUString& rVal) bool SvxLanguageToolOptions::getEnabled() const { return pImpl->bEnabled; } +bool SvxLanguageToolOptions::getSSLVerification() const { return pImpl->bSSLCertVerificatrionEnabled; } + +void SvxLanguageToolOptions::setSSLVerification(bool bEnabled) +{ + pImpl->bSSLCertVerificatrionEnabled = bEnabled; + SetModified(); +} + void SvxLanguageToolOptions::setEnabled(bool bEnabled) { pImpl->bEnabled = bEnabled; @@ -129,6 +139,9 @@ void SvxLanguageToolOptions::Load(const css::uno::Sequence<OUString>& aNames) case 3: pValues[nProp] >>= pImpl->bEnabled; break; + case 4: + pValues[nProp] >>= pImpl->bSSLCertVerificatrionEnabled; + break; default: break; } @@ -156,6 +169,9 @@ void SvxLanguageToolOptions::ImplCommit() case 3: pValues[nProp] <<= pImpl->bEnabled; break; + case 4: + pValues[nProp] <<= pImpl->bSSLCertVerificatrionEnabled; + break; default: break; }
