1 /**************************************************************************
2 * Otter Browser: Web browser controlled by the user, not vice-versa.
3 * Copyright (C) 2015 - 2018 Michal Dutkiewicz aka Emdek <michal@emdek.pl>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 **************************************************************************/
19
20 #include "WebsiteInformationDialog.h"
21 #include "CertificateDialog.h"
22 #include "../core/Application.h"
23 #include "../core/ThemesManager.h"
24 #include "../core/Utils.h"
25
26 #include "ui_WebsiteInformationDialog.h"
27
28 namespace Otter
29 {
30
WebsiteInformationDialog(WebWidget * widget,QWidget * parent)31 WebsiteInformationDialog::WebsiteInformationDialog(WebWidget *widget, QWidget *parent) : Dialog(parent),
32 m_sslInformation(widget->getSslInformation()),
33 m_ui(new Ui::WebsiteInformationDialog)
34 {
35 m_ui->setupUi(this);
36
37 const WebWidget::ContentStates state(widget->getContentState());
38 const QString characterEncoding(widget->getCharacterEncoding());
39 QString host(widget->getUrl().host());
40
41 if (host.isEmpty())
42 {
43 host = (widget->getUrl().scheme() == QLatin1String("file") ? QLatin1String("localhost") : tr("(unknown)"));
44 }
45
46 if (state.testFlag(WebWidget::FraudContentState))
47 {
48 m_ui->stateLabel->setText(tr("This website was marked as fraud."));
49 m_ui->stateIconLabel->setPixmap(ThemesManager::createIcon(QLatin1String("badge-fraud"), false).pixmap(16, 16));
50 }
51 else if (state.testFlag(WebWidget::MixedContentState))
52 {
53 m_ui->stateLabel->setText(tr("Your connection with this website is not private."));
54 m_ui->stateIconLabel->setPixmap(ThemesManager::createIcon(QLatin1String("badge-mixed"), false).pixmap(16, 16));
55 }
56 else if (state.testFlag(WebWidget::SecureContentState))
57 {
58 m_ui->stateLabel->setText(tr("Your connection with this website is private."));
59 m_ui->stateIconLabel->setPixmap(ThemesManager::createIcon(QLatin1String("badge-secure"), false).pixmap(16, 16));
60 }
61 else if (state.testFlag(WebWidget::RemoteContentState))
62 {
63 m_ui->stateLabel->setText(tr("Your connection with this website is not private."));
64 m_ui->stateIconLabel->setPixmap(ThemesManager::createIcon(QLatin1String("badge-remote"), false).pixmap(16, 16));
65 }
66 else if (state.testFlag(WebWidget::LocalContentState))
67 {
68 m_ui->stateLabel->setText(tr("You are viewing content from your local filesystem."));
69 m_ui->stateIconLabel->setPixmap(ThemesManager::createIcon(QLatin1String("badge-local"), false).pixmap(16, 16));
70 }
71 else if (state.testFlag(WebWidget::ApplicationContentState))
72 {
73 m_ui->stateLabel->setText(tr("You are viewing safe page from Otter Browser."));
74 m_ui->stateIconLabel->setPixmap(ThemesManager::createIcon(QLatin1String("otter-browser"), false).pixmap(16, 16));
75 }
76 else
77 {
78 m_ui->stateLabel->setText(tr("No information."));
79 m_ui->stateIconLabel->setPixmap(ThemesManager::createIcon(QLatin1String("badge-unknown"), false).pixmap(16, 16));
80 }
81
82 m_ui->hostLabel->setText(host);
83 m_ui->addressLabelWidget->setText(widget->getUrl().toString());
84 m_ui->titleLabelWidget->setText(widget->getTitle());
85 m_ui->encodingLabelWidget->setText(characterEncoding.isEmpty() ? tr("unknown") : characterEncoding);
86 m_ui->sizeLabelWidget->setText(Utils::formatUnit(widget->getPageInformation(WebWidget::TotalBytesTotalInformation).toLongLong(), false, 1, true));
87 m_ui->elementsLabelWidget->setText((widget->getPageInformation(WebWidget::RequestsBlockedInformation).toInt() > 0) ? tr("%1 (%n blocked)", "", widget->getPageInformation(WebWidget::RequestsBlockedInformation).toInt()).arg(widget->getPageInformation(WebWidget::RequestsStartedInformation).toInt()) : QString::number(widget->getPageInformation(WebWidget::RequestsStartedInformation).toInt()));
88 m_ui->downloadDateLabelWidget->setText(Utils::formatDateTime(widget->getPageInformation(WebWidget::LoadingFinishedInformation).toDateTime()));
89
90 const QString cookiesPolicy(widget->getOption(SettingsManager::Network_CookiesPolicyOption).toString());
91
92 if (cookiesPolicy == QLatin1String("acceptExisting"))
93 {
94 m_ui->cookiesValueLabel->setText(tr("Only existing"));
95 }
96 else if (cookiesPolicy == QLatin1String("readOnly"))
97 {
98 m_ui->cookiesValueLabel->setText(tr("Only read existing"));
99 }
100 else if (cookiesPolicy == QLatin1String("ignore"))
101 {
102 m_ui->cookiesValueLabel->setText(tr("Never"));
103 }
104 else
105 {
106 m_ui->cookiesValueLabel->setText(tr("Always"));
107 }
108
109 const QString thirdPartyCookiesPolicy(widget->getOption(SettingsManager::Network_ThirdPartyCookiesPolicyOption).toString());
110
111 if (thirdPartyCookiesPolicy == QLatin1String("acceptExisting"))
112 {
113 m_ui->thirdPartyCookiesValueLabel->setText(tr("Only existing"));
114 }
115 else if (thirdPartyCookiesPolicy == QLatin1String("ignore"))
116 {
117 m_ui->thirdPartyCookiesValueLabel->setText(tr("Never"));
118 }
119 else
120 {
121 m_ui->thirdPartyCookiesValueLabel->setText(tr("Always"));
122 }
123
124 const QString pluginsPolicy(widget->getOption(SettingsManager::Permissions_EnablePluginsOption).toString());
125
126 if (pluginsPolicy == QLatin1String("enabled"))
127 {
128 m_ui->pluginsValueLabel->setText(tr("Always"));
129 }
130 else if (pluginsPolicy == QLatin1String("disabled"))
131 {
132 m_ui->pluginsValueLabel->setText(tr("Never"));
133 }
134 else
135 {
136 m_ui->pluginsValueLabel->setText(tr("On demand"));
137 }
138
139 const QString imagesPolicy(widget->getOption(SettingsManager::Permissions_EnableImagesOption).toString());
140
141 if (imagesPolicy == QLatin1String("onlyCached"))
142 {
143 m_ui->imagesValueLabel->setText(tr("Only cached"));
144 }
145 else if (imagesPolicy == QLatin1String("disabled"))
146 {
147 m_ui->imagesValueLabel->setText(tr("Never"));
148 }
149 else
150 {
151 m_ui->imagesValueLabel->setText(tr("Always"));
152 }
153
154 m_ui->javascriptValueLabel->setText(widget->getOption(SettingsManager::Permissions_EnableJavaScriptOption).toBool() ? tr("Always") : tr("Never"));
155
156 const QString geolocationPolicy(widget->getOption(SettingsManager::Permissions_EnableGeolocationOption).toString());
157
158 if (geolocationPolicy == QLatin1String("allow"))
159 {
160 m_ui->geolocationValueLabel->setText(tr("Always"));
161 }
162 else if (geolocationPolicy == QLatin1String("disallow"))
163 {
164 m_ui->geolocationValueLabel->setText(tr("Never"));
165 }
166 else
167 {
168 m_ui->geolocationValueLabel->setText(tr("Always ask"));
169 }
170
171 const QString fullScreenPolicy(widget->getOption(SettingsManager::Permissions_EnableFullScreenOption).toString());
172
173 if (fullScreenPolicy == QLatin1String("allow"))
174 {
175 m_ui->fullScreenValueLabel->setText(tr("Always"));
176 }
177 else if (fullScreenPolicy == QLatin1String("disallow"))
178 {
179 m_ui->fullScreenValueLabel->setText(tr("Never"));
180 }
181 else
182 {
183 m_ui->fullScreenValueLabel->setText(tr("Always ask"));
184 }
185
186 const QString notificationsPolicy(widget->getOption(SettingsManager::Permissions_EnableNotificationsOption).toString());
187
188 if (notificationsPolicy == QLatin1String("allow"))
189 {
190 m_ui->notificationsValueLabel->setText(tr("Always"));
191 }
192 else if (notificationsPolicy == QLatin1String("disallow"))
193 {
194 m_ui->notificationsValueLabel->setText(tr("Never"));
195 }
196 else
197 {
198 m_ui->notificationsValueLabel->setText(tr("Always ask"));
199 }
200
201 const QString popupsPolicy(widget->getOption(SettingsManager::Permissions_ScriptsCanOpenWindowsOption).toString());
202
203 if (popupsPolicy == QLatin1String("openAll"))
204 {
205 m_ui->popupsValueLabel->setText(tr("Always"));
206 }
207 else if (popupsPolicy == QLatin1String("openAllInBackground"))
208 {
209 m_ui->popupsValueLabel->setText(tr("Always (open in backgound)"));
210 }
211 else if (popupsPolicy == QLatin1String("blockAll"))
212 {
213 m_ui->popupsValueLabel->setText(tr("Never"));
214 }
215 else
216 {
217 m_ui->popupsValueLabel->setText(tr("Ask"));
218 }
219
220 if (m_sslInformation.certificates.isEmpty())
221 {
222 m_ui->tabWidget->setTabEnabled(2, false);
223 }
224 else
225 {
226 const QSslCertificate certificate(m_sslInformation.certificates.first());
227
228 m_ui->certificateIssuedToLabelWidget->setText(certificate.subjectInfo(QSslCertificate::CommonName).join(QLatin1String(", ")));
229 m_ui->certificateIssuedByLabelWidget->setText(certificate.issuerInfo(QSslCertificate::CommonName).join(QLatin1String(", ")));
230 m_ui->certificateIssuedOnLabelWidget->setText(Utils::formatDateTime(certificate.effectiveDate(), {}, false));
231 m_ui->certificateExpiresOnLabelWidget->setText(Utils::formatDateTime(certificate.expiryDate(), {}, false));
232 m_ui->cipherProtocolLabelWidget->setText(m_sslInformation.cipher.protocolString());
233 m_ui->cipherAuthenticationMethodLabelWidget->setText(m_sslInformation.cipher.authenticationMethod());
234 m_ui->cipherEncryptionMethodLabelWidget->setText(m_sslInformation.cipher.encryptionMethod());
235 m_ui->cipherKeyExchangeMethodLabelWidget->setText(m_sslInformation.cipher.keyExchangeMethod());
236 }
237
238 if (m_sslInformation.errors.isEmpty())
239 {
240 m_ui->sslErrorsHeaderLabel->hide();
241 m_ui->sslErrorsViewWidget->hide();
242 }
243 else
244 {
245 QStandardItemModel *sslErrorsModel(new QStandardItemModel(this));
246 sslErrorsModel->setHorizontalHeaderLabels({tr("Error Message"), tr("URL")});
247
248 for (int i = 0; i < m_sslInformation.errors.count(); ++i)
249 {
250 QList<QStandardItem*> items({new QStandardItem(m_sslInformation.errors.at(i).error.errorString()), new QStandardItem(m_sslInformation.errors.at(i).url.toDisplayString())});
251 items[0]->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
252 items[0]->setToolTip(items[0]->text());
253 items[1]->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
254 items[1]->setToolTip(items[1]->text());
255
256 sslErrorsModel->appendRow(items);
257 }
258
259 m_ui->sslErrorsViewWidget->setModel(sslErrorsModel);
260 }
261
262 setWindowTitle(tr("Information for %1").arg(host));
263
264 connect(m_ui->preferencesDetailsButton, &QPushButton::clicked, [&]()
265 {
266 Application::triggerAction(ActionsManager::WebsitePreferencesAction, {}, this);
267 });
268 connect(m_ui->certificateDetailsButton, &QPushButton::clicked, [&]()
269 {
270 CertificateDialog *dialog(new CertificateDialog(m_sslInformation.certificates));
271 dialog->setAttribute(Qt::WA_DeleteOnClose);
272 dialog->show();
273 });
274 }
275
~WebsiteInformationDialog()276 WebsiteInformationDialog::~WebsiteInformationDialog()
277 {
278 delete m_ui;
279 }
280
changeEvent(QEvent * event)281 void WebsiteInformationDialog::changeEvent(QEvent *event)
282 {
283 QDialog::changeEvent(event);
284
285 if (event->type() == QEvent::LanguageChange)
286 {
287 m_ui->retranslateUi(this);
288
289 if (m_ui->sslErrorsViewWidget->isVisible() && m_ui->sslErrorsViewWidget->getSourceModel())
290 {
291 m_ui->sslErrorsViewWidget->getSourceModel()->setHorizontalHeaderLabels({tr("Error Message"), tr("URL")});
292 }
293 }
294 }
295
296 }
297