src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionManager.py

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

eric ide

mercurial