37#include <QAuthenticator>
38#include <QDialogButtonBox>
39#include <QNetworkReply>
40#include <QNetworkProxy>
41#include <QWebEngineProfile>
42#include <QtWebEngineWidgetsVersion>
44#include <QWebEngineUrlScheme>
47 : QNetworkAccessManager(parent)
53 mApp->webProfile()->installUrlSchemeHandler(QByteArrayLiteral(
"extension"), m_extensionScheme);
59 mApp->webProfile()->setUrlRequestInterceptor(m_urlInterceptor);
64 connect(
this, &QNetworkAccessManager::authenticationRequired,
this, [
this](QNetworkReply *reply, QAuthenticator *auth) {
68 connect(
this, &QNetworkAccessManager::proxyAuthenticationRequired,
this, [
this](
const QNetworkProxy &proxy, QAuthenticator *auth) {
75 const QString &host = error.url().host();
76 const auto errorType = error.type();
78 if (m_rejectedSslErrors.contains(host) && m_rejectedSslErrors.value(host) == errorType) {
82 if ((m_ignoredSslErrors.contains(host) && m_ignoredSslErrors.value(host) == errorType)
83 || m_ignoredSslHosts.contains(host)) {
88 if (error.isOverridable())
91 QString title = tr(
"SSL Certificate Error!");
92 QString text1 = tr(
"The page you are trying to access has the following errors in the SSL certificate:");
93 QString text2 = tr(
"Would you like to make an exception for this certificate?");
95 const auto errorDescription = error.description();
96 QString message =
QSL(
"<b>%1</b><p>%2</p><ul><li>%3</li></ul><p>%4</p>").arg(title, text1, errorDescription, text2);
102 switch (dialog.
result()) {
104 m_ignoredSslHosts.append(host);
105 saveIgnoredSslHosts();
109 m_ignoredSslErrors[host] = errorType;
113 m_rejectedSslErrors[host] = errorType;
123 auto* dialog =
new QDialog(parent);
124 dialog->setWindowTitle(tr(
"Authorization required"));
126 auto* formLa =
new QFormLayout(dialog);
128 auto* label =
new QLabel(dialog);
129 auto* userLab =
new QLabel(dialog);
130 auto* passLab =
new QLabel(dialog);
131 userLab->setText(tr(
"Username: "));
132 passLab->setText(tr(
"Password: "));
134 auto* user =
new QLineEdit(dialog);
135 auto* pass =
new QLineEdit(dialog);
136 pass->setEchoMode(QLineEdit::Password);
137 auto* save =
new QCheckBox(dialog);
138 save->setText(tr(
"Save username and password for this site"));
140 auto* box =
new QDialogButtonBox(dialog);
141 box->addButton(QDialogButtonBox::Ok);
142 box->addButton(QDialogButtonBox::Cancel);
143 connect(box, &QDialogButtonBox::rejected, dialog, &QDialog::reject);
144 connect(box, &QDialogButtonBox::accepted, dialog, &QDialog::accept);
146 label->setText(tr(
"A username and password are being requested by %1. "
147 "The site says: \"%2\"").arg(url.host(), auth->realm().toHtmlEscaped()));
149 formLa->addRow(label);
150 formLa->addRow(userLab, user);
151 formLa->addRow(passLab, pass);
152 formLa->addRow(save);
153 formLa->addWidget(box);
157 QString storedPassword;
158 bool shouldUpdateEntry =
false;
161 const QVector<PasswordEntry> &data = fill->
getFormData(url);
162 if (!data.isEmpty()) {
163 save->setChecked(
true);
164 shouldUpdateEntry =
true;
165 storedUser = data.at(0).username;
166 storedPassword = data.at(0).password;
167 user->setText(storedUser);
168 pass->setText(storedPassword);
173 if (
mApp->isPrivate()) {
174 save->setVisible(
false);
177 if (dialog->exec() != QDialog::Accepted) {
178 *auth = QAuthenticator();
183 auth->setUser(user->text());
184 auth->setPassword(pass->text());
186 if (save->isChecked()) {
187 if (shouldUpdateEntry) {
188 if (storedUser != user->text() || storedPassword != pass->text()) {
189 fill->
updateEntry(url, user->text(), pass->text());
193 fill->
addEntry(url, user->text(), pass->text());
202 const QNetworkProxy proxy = QNetworkProxy::applicationProxy();
203 if (!proxy.user().isEmpty() && !proxy.password().isEmpty()) {
204 auth->setUser(proxy.user());
205 auth->setPassword(proxy.password());
209 auto* dialog =
new QDialog(parent);
210 dialog->setWindowTitle(tr(
"Proxy authorization required"));
212 auto* formLa =
new QFormLayout(dialog);
214 auto* label =
new QLabel(dialog);
215 auto* userLab =
new QLabel(dialog);
216 auto* passLab =
new QLabel(dialog);
217 userLab->setText(tr(
"Username: "));
218 passLab->setText(tr(
"Password: "));
220 auto* user =
new QLineEdit(dialog);
221 auto* pass =
new QLineEdit(dialog);
222 pass->setEchoMode(QLineEdit::Password);
224 auto* box =
new QDialogButtonBox(dialog);
225 box->addButton(QDialogButtonBox::Ok);
226 box->addButton(QDialogButtonBox::Cancel);
227 connect(box, &QDialogButtonBox::rejected, dialog, &QDialog::reject);
228 connect(box, &QDialogButtonBox::accepted, dialog, &QDialog::accept);
230 label->setText(tr(
"A username and password are being requested by proxy %1. ").arg(proxyHost));
231 formLa->addRow(label);
232 formLa->addRow(userLab, user);
233 formLa->addRow(passLab, pass);
234 formLa->addWidget(box);
236 if (dialog->exec() != QDialog::Accepted) {
237 *auth = QAuthenticator();
242 auth->setUser(user->text());
243 auth->setPassword(pass->text());
278 const int proxyType = settings.
value(
QSL(
"ProxyType"), 2).toInt();
279 proxy.setHostName(settings.
value(
QSL(
"HostName"), QString()).toString());
280 proxy.setPort(settings.
value(
QSL(
"Port"), 8080).toInt());
281 proxy.setUser(settings.
value(
QSL(
"Username"), QString()).toString());
282 proxy.setPassword(settings.
value(
QSL(
"Password"), QString()).toString());
285 if (proxyType == 0) {
286 proxy.setType(QNetworkProxy::NoProxy);
287 }
else if (proxyType == 3) {
288 proxy.setType(QNetworkProxy::HttpProxy);
289 }
else if (proxyType == 4) {
290 proxy.setType(QNetworkProxy::Socks5Proxy);
293 if (proxyType == 2) {
294 QNetworkProxy::setApplicationProxy(QNetworkProxy());
295 QNetworkProxyFactory::setUseSystemConfiguration(
true);
297 QNetworkProxy::setApplicationProxy(proxy);
298 QNetworkProxyFactory::setUseSystemConfiguration(
false);
304 m_ignoredSslHosts = settings.
value(
QSL(
"IgnoredSslHosts"), QStringList()).toStringList();
308void NetworkManager::saveIgnoredSslHosts()
312 settings.
setValue(
QSL(
"IgnoredSslHosts"), m_ignoredSslHosts);
318 mApp->webProfile()->setUrlRequestInterceptor(
nullptr);
319 saveIgnoredSslHosts();
325 QWebEngineUrlScheme falkonScheme(
"falkon");
326 falkonScheme.setFlags(QWebEngineUrlScheme::SecureScheme | QWebEngineUrlScheme::ContentSecurityPolicyIgnored);
327 falkonScheme.setSyntax(QWebEngineUrlScheme::Syntax::Path);
328 QWebEngineUrlScheme::registerScheme(falkonScheme);
329 QWebEngineUrlScheme extensionScheme(
"extension");
330 extensionScheme.setFlags(QWebEngineUrlScheme::SecureScheme | QWebEngineUrlScheme::ContentSecurityPolicyIgnored);
331 extensionScheme.setSyntax(QWebEngineUrlScheme::Syntax::Path);
332 QWebEngineUrlScheme::registerScheme(extensionScheme);
337 QNetworkRequest req = request;
340 return QNetworkAccessManager::createRequest(op, req, outgoingData);
static QByteArray generateHeader(const QStringList &langs)
static QStringList defaultLanguage()
void addEntry(const QUrl &url, const QString &name, const QString &pass)
void updateEntry(const QUrl &url, const QString &name, const QString &pass)
QVector< PasswordEntry > getFormData(const QUrl &url)
bool isStored(const QUrl &url)
void unregisterHandler(ExtensionSchemeHandler *handler)
void registerHandler(const QString &name, ExtensionSchemeHandler *handler)
void authentication(const QUrl &url, QAuthenticator *auth, QWidget *parent=nullptr)
NetworkManager(QObject *parent=nullptr)
void registerExtensionSchemeHandler(const QString &name, ExtensionSchemeHandler *handler)
void unregisterExtensionSchemeHandler(ExtensionSchemeHandler *handler)
void proxyAuthentication(const QString &proxyHost, QAuthenticator *auth, QWidget *parent=nullptr)
static void registerSchemes()
QNetworkReply * createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData) override
bool certificateError(QWebEngineCertificateError &error, QWidget *parent=nullptr)
void removeUrlInterceptor(UrlInterceptor *interceptor)
void installUrlInterceptor(UrlInterceptor *interceptor)
void installUrlInterceptor(UrlInterceptor *interceptor)
void removeUrlInterceptor(UrlInterceptor *interceptor)
void beginGroup(const QString &prefix)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
void setValue(const QString &key, const QVariant &defaultValue=QVariant())
void setText(const QString &text)
static void addSupportedScheme(const QString &scheme)