Skip to content

Commit

Permalink
Fix pesky QTWebEngineProfile object leak which emitted "Release of pr…
Browse files Browse the repository at this point in the history
…ofile requested but WebEnginePage still not deleted. Expect troubles !" on exit.
  • Loading branch information
mikedarcy committed Apr 16, 2021
1 parent 3f86435 commit a7def15
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 32 deletions.
39 changes: 20 additions & 19 deletions deriva/qt/auth_agent/ui/auth_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ def __init__(self, parent, config=None, credential_file=None, cookie_persistence
self._session = requests.session()
self.token = None
self.default_profile = QWebEngineProfile("deriva-auth", self)
self.private_profile = QWebEngineProfile(self)

logging.getLogger().setLevel(log_level)
info = "%s v%s [Python: %s (PyQt: %s), %s]" % (
Expand Down Expand Up @@ -125,12 +126,14 @@ def login(self):
logging.info("Authenticating with host: %s" % self.auth_url.toString())
qApp.setOverrideCursor(Qt.WaitCursor)
self._cleanup()
self.authn_session_page = \
QWebEnginePage(QWebEngineProfile(self), self.parent) \
self.authn_session_page = QWebEnginePage(self.private_profile, self.parent) \
if not self.cookie_persistence else QWebEnginePage(self.default_profile, self.parent)
self.authn_session_page.profile().setPersistentCookiesPolicy(
QWebEngineProfile.ForcePersistentCookies if self.cookie_persistence else
QWebEngineProfile.NoPersistentCookies)
if self.cookie_persistence:
logging.debug("QTWebEngine persistent storage located at: %s" %
self.authn_session_page.profile().persistentStoragePath())
self.authn_session_page.profile().cookieStore().cookieAdded.connect(self._onCookieAdded)
self.authn_session_page.profile().cookieStore().cookieRemoved.connect(self._onCookieRemoved)
self.authn_session_page.loadProgress.connect(self._onLoadProgress)
Expand All @@ -142,21 +145,20 @@ def login(self):
def logout(self, delete_cookies=False):
if not (self.auth_url and (self.auth_url.host() and self.auth_url.scheme())):
return
if not self.authenticated():
return
try:
logging.info("Logging out of host: %s" % self.auth_url.toString())
if delete_cookies and self.cookie_persistence:
self.authn_session_page.profile().cookieStore().deleteAllCookies()
self._session.delete(self.auth_url.toString() + "/authn/session")
if self.credential_file:
creds = read_credential(self.credential_file, create_default=True)
host = self.auth_url.host()
if creds.get(host):
del creds[host]
write_credential(self.credential_file, creds)
except Exception as e:
logging.warning("Logout error: %s" % format_exception(e))
if self.authenticated():
try:
logging.info("Logging out of host: %s" % self.auth_url.toString())
if delete_cookies and self.cookie_persistence:
self.authn_session_page.profile().cookieStore().deleteAllCookies()
self._session.delete(self.auth_url.toString() + "/authn/session")
if self.credential_file:
creds = read_credential(self.credential_file, create_default=True)
host = self.auth_url.host()
if creds.get(host):
del creds[host]
write_credential(self.credential_file, creds)
except Exception as e:
logging.warning("Logout error: %s" % format_exception(e))
self._cleanup()

def setSuccessCallback(self, callback=None):
Expand Down Expand Up @@ -244,6 +246,7 @@ def _onLoadFinished(self, result):
self.authn_session_page.toPlainText(self._onSessionContent)
else:
if self.page() != self.authn_session_page:
self.page().deleteLater()
self.setPage(self.authn_session_page)

def _onLoadProgress(self, progress):
Expand Down Expand Up @@ -300,7 +303,5 @@ def _cleanup(self):
self.authn_session_page.loadFinished.disconnect(self._onLoadFinished)
self.authn_session_page.profile().cookieStore().cookieAdded.disconnect(self._onCookieAdded)
self.authn_session_page.profile().cookieStore().cookieRemoved.disconnect(self._onCookieRemoved)
if self.default_profile != self.authn_session_page.profile():
self.authn_session_page.profile().deleteLater()
self.authn_session_page.deleteLater()
self.authn_session_page = None
25 changes: 12 additions & 13 deletions deriva/qt/auth_agent/ui/auth_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,20 +310,19 @@ def changeEvent(self, event):
super(AuthWindow, self).changeEvent(event)

def closeEvent(self, event):
if not self.authenticated():
return
if self.authenticated():
msg = QMessageBox()
msg.setIcon(QMessageBox.Warning)
msg.setWindowTitle("Confirm Action")
msg.setText("Are you sure you wish to exit?")
msg.setInformativeText(
"If you close the application, your credentials will be invalidated once the application has exited.")
msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
ret = msg.exec_()
if ret == QMessageBox.No:
event.ignore()
return

msg = QMessageBox()
msg.setIcon(QMessageBox.Warning)
msg.setWindowTitle("Confirm Action")
msg.setText("Are you sure you wish to exit?")
msg.setInformativeText(
"If you close the application, your credentials will be invalidated once the application has exited.")
msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
ret = msg.exec_()
if ret == QMessageBox.No:
event.ignore()
return
self.logout()
self.systemTrayIcon.hide()
self.deleteLater()
Expand Down

0 comments on commit a7def15

Please sign in to comment.