eric7/WebBrowser/FeaturePermissions/FeaturePermissionManager.py

branch
eric7
changeset 8312
800c432b34c8
parent 8243
cc717c2ae956
child 8318
962bce857696
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2015 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the feature permission manager object.
8 """
9
10 import contextlib
11
12 from PyQt5.QtCore import QObject
13 from PyQt5.QtWidgets import QDialog
14 from PyQt5.QtWebEngineWidgets import QWebEnginePage
15
16 import Globals
17 import Preferences
18
19
20 class FeaturePermissionManager(QObject):
21 """
22 Class implementing the feature permission manager object.
23 """
24 SettingsKeyFormat = "WebBrowser/FeaturePermissions/{0}"
25
26 def __init__(self, parent=None):
27 """
28 Constructor
29
30 @param parent reference to the parent object
31 @type QObject
32 """
33 super().__init__(parent)
34
35 self.__featurePermissions = {
36 QWebEnginePage.Feature.Geolocation: {
37 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: [],
38 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: [],
39 },
40 QWebEnginePage.Feature.MediaAudioCapture: {
41 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: [],
42 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: [],
43 },
44 QWebEnginePage.Feature.MediaVideoCapture: {
45 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: [],
46 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: [],
47 },
48 QWebEnginePage.Feature.MediaAudioVideoCapture: {
49 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: [],
50 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: [],
51 },
52 QWebEnginePage.Feature.MouseLock: {
53 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: [],
54 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: [],
55 },
56 QWebEnginePage.Feature.DesktopVideoCapture: {
57 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser:
58 [],
59 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser:
60 [],
61 },
62 QWebEnginePage.Feature.DesktopAudioVideoCapture: {
63 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser:
64 [],
65 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser:
66 [],
67 },
68 }
69 with contextlib.suppress(AttributeError):
70 # this was re-added in Qt 5.13.0
71 self.__featurePermissions[QWebEnginePage.Feature.Notifications] = {
72 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: [],
73 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: [],
74 }
75
76 self.__featurePermissionsKeys = {
77 (QWebEnginePage.Feature.Geolocation,
78 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
79 "GeolocationGranted",
80 (QWebEnginePage.Feature.Geolocation,
81 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
82 "GeolocationDenied",
83 (QWebEnginePage.Feature.MediaAudioCapture,
84 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
85 "MediaAudioCaptureGranted",
86 (QWebEnginePage.Feature.MediaAudioCapture,
87 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
88 "MediaAudioCaptureDenied",
89 (QWebEnginePage.Feature.MediaVideoCapture,
90 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
91 "MediaVideoCaptureGranted",
92 (QWebEnginePage.Feature.MediaVideoCapture,
93 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
94 "MediaVideoCaptureDenied",
95 (QWebEnginePage.Feature.MediaAudioVideoCapture,
96 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
97 "MediaAudioVideoCaptureGranted",
98 (QWebEnginePage.Feature.MediaAudioVideoCapture,
99 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
100 "MediaAudioVideoCaptureDenied",
101 (QWebEnginePage.Feature.MouseLock,
102 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
103 "MouseLockGranted",
104 (QWebEnginePage.Feature.MouseLock,
105 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
106 "MouseLockDenied",
107 (QWebEnginePage.Feature.DesktopVideoCapture,
108 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
109 "DesktopVideoCaptureGranted",
110 (QWebEnginePage.Feature.DesktopVideoCapture,
111 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
112 "DesktopVideoCaptureDenied",
113 (QWebEnginePage.Feature.DesktopAudioVideoCapture,
114 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
115 "DesktopAudioVideoCaptureGranted",
116 (QWebEnginePage.Feature.DesktopAudioVideoCapture,
117 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
118 "DesktopAudioVideoCaptureDenied",
119 }
120 with contextlib.suppress(AttributeError):
121 # this was re-added in Qt 5.13.0
122 self.__featurePermissionsKeys.update({
123 (QWebEnginePage.Feature.Notifications,
124 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
125 "NotificationsGranted",
126 (QWebEnginePage.Feature.Notifications,
127 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
128 "NotificationsDenied",
129 })
130
131 self.__loaded = False
132
133 def requestFeaturePermission(self, page, origin, feature):
134 """
135 Public method to request a feature permission.
136
137 @param page reference to the requesting web page
138 @type QWebEnginePage
139 @param origin security origin requesting the feature
140 @type QUrl
141 @param feature requested feature
142 @type QWebEnginePage.Feature
143 """
144 if origin is None or origin.isEmpty():
145 return
146
147 if not self.__loaded:
148 self.__loadSettings()
149
150 host = origin.host()
151
152 if feature in self.__featurePermissions:
153 for permission in self.__featurePermissions[feature]:
154 if host in self.__featurePermissions[feature][permission]:
155 page.setFeaturePermission(origin, feature, permission)
156 return
157
158 from .FeaturePermissionBar import FeaturePermissionBar
159 bar = FeaturePermissionBar(page, origin, feature, self)
160 bar.show()
161
162 def rememberFeaturePermission(self, host, feature, permission):
163 """
164 Public method to remember a user decision for a feature permission.
165
166 @param host host name to remember the decision for
167 @type str
168 @param feature feature to be remembered
169 @type QWebEnginePage.Feature
170 @param permission feature permission to be remembered
171 @type QWebEnginePage.PermissionPolicy
172 """
173 if (
174 feature in self.__featurePermissions and
175 host not in self.__featurePermissions[feature][permission]
176 ):
177 self.__featurePermissions[feature][permission].append(host)
178 self.__saveSettings()
179
180 def __loadSettings(self):
181 """
182 Private method to load the remembered feature permissions.
183 """
184 if self.__loaded:
185 # no reloading allowed
186 return
187
188 for (feature, permission), key in (
189 self.__featurePermissionsKeys.items()
190 ):
191 self.__featurePermissions[feature][permission] = (
192 Globals.toList(Preferences.Prefs.settings.value(
193 FeaturePermissionManager.SettingsKeyFormat.format(key),
194 []
195 ))
196 )
197
198 self.__loaded = True
199
200 def __saveSettings(self):
201 """
202 Private method to save the remembered feature permissions.
203 """
204 if not self.__loaded:
205 return
206
207 import WebBrowser.WebBrowserWindow
208 if WebBrowser.WebBrowserWindow.WebBrowserWindow.isPrivate():
209 return
210
211 for (feature, permission), key in (
212 self.__featurePermissionsKeys.items()
213 ):
214 Preferences.Prefs.settings.setValue(
215 FeaturePermissionManager.SettingsKeyFormat.format(key),
216 self.__featurePermissions[feature][permission])
217
218 def showFeaturePermissionsDialog(self):
219 """
220 Public method to show a dialog to manage the remembered feature
221 permissions.
222 """
223 if not self.__loaded:
224 self.__loadSettings()
225
226 from .FeaturePermissionsDialog import FeaturePermissionsDialog
227 dlg = FeaturePermissionsDialog(self.__featurePermissions)
228 if dlg.exec() == QDialog.DialogCode.Accepted:
229 newFeaturePermissions = dlg.getData()
230 self.__featurePermissions = newFeaturePermissions
231 self.__saveSettings()

eric ide

mercurial