cui/source/options/optlanguagetool.cxx | 4 cui/source/options/optlanguagetool.hxx | 1 cui/uiconfig/ui/langtoolconfigpage.ui | 239 +++++----- desktop/source/lib/init.cxx | 3 include/svtools/languagetoolcfg.hxx | 6 lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx | 18 officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs | 13 svtools/source/config/languagetoolcfg.cxx | 37 + 8 files changed, 203 insertions(+), 118 deletions(-)
New commits: commit c01b2cdc792e6cbdbe79921c19ccfac0ab6c68d3 Author: Henry Castro <hcas...@collabora.com> AuthorDate: Mon Nov 21 21:27:24 2022 -0400 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Sat Jan 28 09:22:51 2023 +0000 svtools: add new entry "RestProtocol" Custom Rest API protocol Signed-off-by: Henry Castro <hcas...@collabora.com> Change-Id: If2f72330f2ed9768f230dc88296df7f757be263a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143105 Reviewed-by: Ashod Nakashian <a...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145605 Reviewed-by: Andras Timar <andras.ti...@collabora.com> Tested-by: Andras Timar <andras.ti...@collabora.com> diff --git a/include/svtools/languagetoolcfg.hxx b/include/svtools/languagetoolcfg.hxx index 3f30c4bd94a8..24c4de6408aa 100644 --- a/include/svtools/languagetoolcfg.hxx +++ b/include/svtools/languagetoolcfg.hxx @@ -39,6 +39,9 @@ public: const OUString& getBaseURL() const; void setBaseURL(const OUString& rVal); + const OUString& getRestProtocol() const; + void setRestProtocol(const OUString& rVal); + const OUString& getUsername() const; void setUsername(const OUString& rVal); diff --git a/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs b/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs index 559200946080..8c3fa98e6d4b 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs @@ -412,6 +412,12 @@ </info> <value>true</value> </prop> + <prop oor:name="RestProtocol" oor:type="xs:string"> + <info> + <desc>LanguageTool Grammar Checker REST API protocol</desc> + <label>REST API protocol</label> + </info> + </prop> </group> </group> <group oor:name="Translation"> diff --git a/svtools/source/config/languagetoolcfg.cxx b/svtools/source/config/languagetoolcfg.cxx index 3f48010141db..311cefb320f4 100644 --- a/svtools/source/config/languagetoolcfg.cxx +++ b/svtools/source/config/languagetoolcfg.cxx @@ -31,6 +31,7 @@ struct LanguageToolOptions_Impl OUString sBaseURL; OUString sUsername; OUString sApiKey; + OUString sRestProtocol; bool bEnabled; bool bSSLCertVerificatrionEnabled; }; @@ -43,6 +44,7 @@ const Sequence<OUString>& SvxLanguageToolOptions::GetPropertyNames() "LanguageTool/ApiKey", "LanguageTool/IsEnabled", "LanguageTool/SSLCertVerify", + "LanguageTool/RestProtocol" }; return aNames; } @@ -69,12 +71,23 @@ OUString SvxLanguageToolOptions::getCheckerURL() const { return pImpl->sBaseURL const OUString& SvxLanguageToolOptions::getApiKey() const { return pImpl->sApiKey; } +const OUString& SvxLanguageToolOptions::getRestProtocol() const { return pImpl->sRestProtocol; } + void SvxLanguageToolOptions::setApiKey(const OUString& rVal) { pImpl->sApiKey = rVal; SetModified(); } +void SvxLanguageToolOptions::setRestProtocol(const OUString& rVal) +{ + if (pImpl->sRestProtocol != rVal) + { + pImpl->sRestProtocol = rVal; + SetModified(); + } +} + bool SvxLanguageToolOptions::getEnabled() const { return pImpl->bEnabled; } bool SvxLanguageToolOptions::getSSLVerification() const { return pImpl->bSSLCertVerificatrionEnabled; } @@ -142,6 +155,9 @@ void SvxLanguageToolOptions::Load(const css::uno::Sequence<OUString>& aNames) case 4: pValues[nProp] >>= pImpl->bSSLCertVerificatrionEnabled; break; + case 5: + pValues[nProp] >>= pImpl->sRestProtocol; + break; default: break; } @@ -172,9 +188,12 @@ void SvxLanguageToolOptions::ImplCommit() case 4: pValues[nProp] <<= pImpl->bSSLCertVerificatrionEnabled; break; + case 5: + pValues[nProp] <<= pImpl->sRestProtocol; + break; default: break; } } PutProperties(aNames, aValues); -} \ No newline at end of file +} commit 1b6d2c6c245717fe59448710d389359919689136 Author: Mert Tumer <mert.tu...@collabora.com> AuthorDate: Mon Jul 4 19:52:49 2022 +0300 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Sat Jan 28 09:22:38 2023 +0000 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.tu...@collabora.com> Change-Id: I2bda575fa6174dfc0f6c24da45267ee732643db6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136811 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Andras Timar <andras.ti...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145604 Tested-by: Andras Timar <andras.ti...@collabora.com> 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 e562099082d3..a70385a47e17 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -7023,9 +7023,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); @@ -7034,6 +7036,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 a2ad3efdf863..1dce1845fc43 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,11 @@ 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 b9d3382ecc33..559200946080 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs @@ -405,6 +405,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..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; }