diff options
author | Mert Tumer <mert.tumer@collabora.com> | 2022-07-04 19:52:49 +0300 |
---|---|---|
committer | Henry Castro <hcastro@collabora.com> | 2023-01-30 22:12:03 +0000 |
commit | 1fb964276c184b0fb052503fe7dbc05bf0331211 (patch) | |
tree | 780afc0573b9407aa1bc2d4b05e1216d2b868e13 | |
parent | ed68634db25103cd7d2adc29f3973f80fbaec324 (diff) |
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 <mert.tumer@collabora.com>
Change-Id: I2bda575fa6174dfc0f6c24da45267ee732643db6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136811
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Andras Timar <andras.timar@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145594
Tested-by: Jenkins
Reviewed-by: Henry Castro <hcastro@collabora.com>
-rw-r--r-- | cui/source/options/optlanguagetool.cxx | 4 | ||||
-rw-r--r-- | cui/source/options/optlanguagetool.hxx | 1 | ||||
-rw-r--r-- | cui/uiconfig/ui/langtoolconfigpage.ui | 239 | ||||
-rw-r--r-- | desktop/source/lib/init.cxx | 3 | ||||
-rw-r--r-- | include/sal/log-areas.dox | 4 | ||||
-rw-r--r-- | include/svtools/languagetoolcfg.hxx | 3 | ||||
-rw-r--r-- | lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx | 19 | ||||
-rw-r--r-- | officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs | 7 | ||||
-rw-r--r-- | svtools/source/config/languagetoolcfg.cxx | 24 |
9 files changed, 183 insertions, 121 deletions
diff --git a/cui/source/options/optlanguagetool.cxx b/cui/source/options/optlanguagetool.cxx index 309ff2a09b52..f0006d1dd0e0 100644 --- a/cui/source/options/optlanguagetool.cxx +++ b/cui/source/options/optlanguagetool.cxx @@ -31,6 +31,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)); @@ -51,6 +52,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) @@ -71,6 +73,7 @@ void OptLanguageToolTabPage::Reset(const SfxItemSet*) m_xUsernameED->set_text(rLanguageOpts.getUsername()); m_xApiKeyED->set_text(rLanguageOpts.getApiKey()); + m_xSSLDisableVerificationBox->set_active(rLanguageOpts.getSSLVerification() != true); } bool OptLanguageToolTabPage::FillItemSet(SfxItemSet*) @@ -86,6 +89,7 @@ bool OptLanguageToolTabPage::FillItemSet(SfxItemSet*) 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 8ee83ed4e367..666512804c62 100644 --- a/cui/source/options/optlanguagetool.hxx +++ b/cui/source/options/optlanguagetool.hxx @@ -39,6 +39,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 38aa184c2469..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,121 +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="truncate-multiline">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">Username:</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="truncate-multiline">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="truncate-multiline">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, i.e., without “/check”, at the end.</property> - <attributes> - <attribute name="scale" value="0.9"/> - </attributes> - </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> - <attributes> - <attribute name="scale" value="0.9"/> - </attributes> - </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> - <attributes> - <attribute name="scale" value="0.9"/> - </attributes> - </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 78f03b8a0d43..45b2b126fadb 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -7043,9 +7043,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); @@ -7054,6 +7056,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/sal/log-areas.dox b/include/sal/log-areas.dox index bf3a269f2f66..15bcf5a03573 100644 --- a/include/sal/log-areas.dox +++ b/include/sal/log-areas.dox @@ -315,6 +315,10 @@ certain functionality. @li @c jfw.level1 @li @c jfw.level2 +@section LanguageTool + +@li @c languagetool + @section LibreOfficeKit @li @c lok 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 a2ad3efdf863..b868e4744ac7 100644 --- a/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx +++ b/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx @@ -41,6 +41,9 @@ #include <tools/long.hxx> #include <com/sun/star/uno/Any.hxx> #include <comphelper/propertyvalue.hxx> +#include <unotools/lingucfg.hxx> +#include <osl/mutex.hxx> +#include <sal/log.hxx> using namespace osl; using namespace com::sun::star; @@ -341,8 +344,12 @@ std::string LanguageToolGrammarChecker::makeHttpRequest(std::string_view aURL, H (void)curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, WriteCallback); (void)curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, static_cast<void*>(&response_body)); - (void)curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYPEER, false); - (void)curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYHOST, false); + // allow unknown or self-signed certificates + if (rLanguageOpts.getSSLVerification() == false) + { + (void)curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYPEER, false); + (void)curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYHOST, false); + } (void)curl_easy_setopt(curl.get(), CURLOPT_TIMEOUT, CURL_TIMEOUT); if (method == HTTP_METHOD::HTTP_POST) @@ -359,8 +366,12 @@ std::string LanguageToolGrammarChecker::makeHttpRequest(std::string_view aURL, H } } - /*CURLcode cc = */ - (void)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 95c9297d5a86..968c9554fde7 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs @@ -422,6 +422,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="Translation"> diff --git a/svtools/source/config/languagetoolcfg.cxx b/svtools/source/config/languagetoolcfg.cxx index 9f81c8e787f1..fbc48d70fde7 100644 --- a/svtools/source/config/languagetoolcfg.cxx +++ b/svtools/source/config/languagetoolcfg.cxx @@ -32,15 +32,14 @@ struct LanguageToolOptions_Impl OUString sUsername; OUString sApiKey; bool bEnabled; + bool bSSLCertVerificatrionEnabled; }; const Sequence<OUString>& SvxLanguageToolOptions::GetPropertyNames() { static Sequence<OUString> const aNames{ - "LanguageTool/BaseURL", - "LanguageTool/Username", - "LanguageTool/ApiKey", - "LanguageTool/IsEnabled", + "LanguageTool/BaseURL", "LanguageTool/Username", "LanguageTool/ApiKey", + "LanguageTool/IsEnabled", "LanguageTool/SSLCertVerify", }; return aNames; } @@ -75,6 +74,17 @@ 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; } |