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