src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionManager.py

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

eric ide

mercurial