summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMert Tumer <mert.tumer@collabora.com>2022-07-04 19:52:49 +0300
committerHenry Castro <hcastro@collabora.com>2023-01-30 22:12:03 +0000
commit1fb964276c184b0fb052503fe7dbc05bf0331211 (patch)
tree780afc0573b9407aa1bc2d4b05e1216d2b868e13
parented68634db25103cd7d2adc29f3973f80fbaec324 (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.cxx4
-rw-r--r--cui/source/options/optlanguagetool.hxx1
-rw-r--r--cui/uiconfig/ui/langtoolconfigpage.ui239
-rw-r--r--desktop/source/lib/init.cxx3
-rw-r--r--include/sal/log-areas.dox4
-rw-r--r--include/svtools/languagetoolcfg.hxx3
-rw-r--r--lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx19
-rw-r--r--officecfg/registry/schema/org/openoffice/Office/Linguistic.xcs7
-rw-r--r--svtools/source/config/languagetoolcfg.cxx24
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;
}