File indexing completed on 2024-05-26 05:00:55

0001 /* ============================================================
0002 * Falkon - Qt web browser
0003 * Copyright (C) 2013-2015  David Rosca <nowrep@gmail.com>
0004 *
0005 * This program is free software: you can redistribute it and/or modify
0006 * it under the terms of the GNU General Public License as published by
0007 * the Free Software Foundation, either version 3 of the License, or
0008 * (at your option) any later version.
0009 *
0010 * This program is distributed in the hope that it will be useful,
0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013 * GNU General Public License for more details.
0014 *
0015 * You should have received a copy of the GNU General Public License
0016 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0017 * ============================================================ */
0018 #include "html5permissionsmanager.h"
0019 #include "html5permissionsnotification.h"
0020 #include "settings.h"
0021 #include "webview.h"
0022 
0023 #include <QtWebEngineWidgetsVersion>
0024 
0025 
0026 HTML5PermissionsManager::HTML5PermissionsManager(QObject* parent)
0027     : QObject(parent)
0028 {
0029     loadSettings();
0030 }
0031 
0032 void HTML5PermissionsManager::requestPermissions(WebPage* page, const QUrl &origin, const QWebEnginePage::Feature &feature)
0033 {
0034     if (!page) {
0035         return;
0036     }
0037 
0038     if (!m_granted.contains(feature) || !m_denied.contains(feature)) {
0039         qWarning() << "HTML5PermissionsManager: Unknown feature" << feature;
0040         return;
0041     }
0042 
0043     // Permission granted
0044     if (m_granted.value(feature).contains(origin.toString())) {
0045         page->setFeaturePermission(origin, feature, QWebEnginePage::PermissionGrantedByUser);
0046         return;
0047     }
0048 
0049     // Permission denied
0050     if (m_denied.value(feature).contains(origin.toString())) {
0051         page->setFeaturePermission(origin, feature, QWebEnginePage::PermissionDeniedByUser);
0052         return;
0053     }
0054 
0055     // Ask user for permission
0056     auto* notif = new HTML5PermissionsNotification(origin, page, feature);
0057     page->view()->addNotification(notif);
0058 }
0059 
0060 void HTML5PermissionsManager::rememberPermissions(const QUrl &origin, const QWebEnginePage::Feature &feature,
0061         const QWebEnginePage::PermissionPolicy &policy)
0062 {
0063     if (origin.isEmpty()) {
0064         return;
0065     }
0066 
0067     if (policy == QWebEnginePage::PermissionGrantedByUser) {
0068         m_granted[feature].append(origin.toString());
0069     }
0070     else {
0071         m_denied[feature].append(origin.toString());
0072     }
0073 
0074     saveSettings();
0075 }
0076 
0077 void HTML5PermissionsManager::loadSettings()
0078 {
0079     Settings settings;
0080     settings.beginGroup(QSL("HTML5Notifications"));
0081 
0082     m_granted[QWebEnginePage::Notifications] = settings.value(QSL("NotificationsGranted"), QStringList()).toStringList();
0083     m_denied[QWebEnginePage::Notifications] = settings.value(QSL("NotificationsDenied"), QStringList()).toStringList();
0084 
0085     m_granted[QWebEnginePage::Geolocation] = settings.value(QSL("GeolocationGranted"), QStringList()).toStringList();
0086     m_denied[QWebEnginePage::Geolocation] = settings.value(QSL("GeolocationDenied"), QStringList()).toStringList();
0087 
0088     m_granted[QWebEnginePage::MediaAudioCapture] = settings.value(QSL("MediaAudioCaptureGranted"), QStringList()).toStringList();
0089     m_denied[QWebEnginePage::MediaAudioCapture] = settings.value(QSL("MediaAudioCaptureDenied"), QStringList()).toStringList();
0090 
0091     m_granted[QWebEnginePage::MediaVideoCapture] = settings.value(QSL("MediaVideoCaptureGranted"), QStringList()).toStringList();
0092     m_denied[QWebEnginePage::MediaVideoCapture] = settings.value(QSL("MediaVideoCaptureDenied"), QStringList()).toStringList();
0093 
0094     m_granted[QWebEnginePage::MediaAudioVideoCapture] = settings.value(QSL("MediaAudioVideoCaptureGranted"), QStringList()).toStringList();
0095     m_denied[QWebEnginePage::MediaAudioVideoCapture] = settings.value(QSL("MediaAudioVideoCaptureDenied"), QStringList()).toStringList();
0096 
0097     m_granted[QWebEnginePage::MouseLock] = settings.value(QSL("MouseLockGranted"), QStringList()).toStringList();
0098     m_denied[QWebEnginePage::MouseLock] = settings.value(QSL("MouseLockDenied"), QStringList()).toStringList();
0099 
0100     m_granted[QWebEnginePage::DesktopVideoCapture] = settings.value(QSL("DesktopVideoCaptureGranted"), QStringList()).toStringList();
0101     m_denied[QWebEnginePage::DesktopVideoCapture] = settings.value(QSL("DesktopVideoCaptureDenied"), QStringList()).toStringList();
0102 
0103     m_granted[QWebEnginePage::DesktopAudioVideoCapture] = settings.value(QSL("DesktopAudioVideoCaptureGranted"), QStringList()).toStringList();
0104     m_denied[QWebEnginePage::DesktopAudioVideoCapture] = settings.value(QSL("DesktopAudioVideoCaptureDenied"), QStringList()).toStringList();
0105 
0106     settings.endGroup();
0107 }
0108 
0109 void HTML5PermissionsManager::saveSettings()
0110 {
0111     Settings settings;
0112     settings.beginGroup(QSL("HTML5Notifications"));
0113 
0114     settings.setValue(QSL("NotificationsGranted"), m_granted[QWebEnginePage::Notifications]);
0115     settings.setValue(QSL("NotificationsDenied"), m_denied[QWebEnginePage::Notifications]);
0116 
0117     settings.setValue(QSL("GeolocationGranted"), m_granted[QWebEnginePage::Geolocation]);
0118     settings.setValue(QSL("GeolocationDenied"), m_denied[QWebEnginePage::Geolocation]);
0119 
0120     settings.setValue(QSL("MediaAudioCaptureGranted"), m_granted[QWebEnginePage::MediaAudioCapture]);
0121     settings.setValue(QSL("MediaAudioCaptureDenied"), m_denied[QWebEnginePage::MediaAudioCapture]);
0122 
0123     settings.setValue(QSL("MediaVideoCaptureGranted"), m_granted[QWebEnginePage::MediaVideoCapture]);
0124     settings.setValue(QSL("MediaVideoCaptureDenied"), m_denied[QWebEnginePage::MediaVideoCapture]);
0125 
0126     settings.setValue(QSL("MediaAudioVideoCaptureGranted"), m_granted[QWebEnginePage::MediaAudioVideoCapture]);
0127     settings.setValue(QSL("MediaAudioVideoCaptureDenied"), m_denied[QWebEnginePage::MediaAudioVideoCapture]);
0128 
0129     settings.setValue(QSL("MouseLockGranted"), m_granted[QWebEnginePage::MouseLock]);
0130     settings.setValue(QSL("MouseLockDenied"), m_denied[QWebEnginePage::MouseLock]);
0131 
0132     settings.setValue(QSL("DesktopVideoCaptureGranted"), m_granted[QWebEnginePage::DesktopVideoCapture]);
0133     settings.setValue(QSL("DesktopVideoCaptureDenied"), m_denied[QWebEnginePage::DesktopVideoCapture]);
0134 
0135     settings.setValue(QSL("DesktopAudioVideoCaptureGranted"), m_granted[QWebEnginePage::DesktopAudioVideoCapture]);
0136     settings.setValue(QSL("DesktopAudioVideoCaptureDenied"), m_denied[QWebEnginePage::DesktopAudioVideoCapture]);
0137 
0138     settings.endGroup();
0139 }