fixed authentication in Linux, showing Timeline now

This commit is contained in:
Jeena Paradies 2012-11-18 02:20:35 +01:00
parent f58281adc3
commit b138887371
8 changed files with 196 additions and 85 deletions

View file

@ -1,38 +1,70 @@
from PyQt4 import QtCore, QtGui, QtWebKit
from PyQt4.QtCore import QTimer, QVariant, SIGNAL
from PyQt4.QtGui import *
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
from PyQt4.QtWebKit import QWebView
class WebPage(QtWebKit.QWebPage):
def __init__(self, parent):
def __init__(self, parent=0, app=None):
super(QtWebKit.QWebPage, self).__init__(parent)
self.app = app
def javaScriptConsoleMessage(self, message, lineNumber, sourceId):
print str(message) + " on line: " + str(lineNumber) + " Source: " + str(sourceId)
class WebViewCreator(QtGui.QWidget):
def __init__(self, app, delegate):
def checkRequest(self, request):
print request
class WebViewCreator(QtWebKit.QWebView):
def __init__(self, app, local=True):
QtGui.QWidget.__init__(self)
self.app = app
self.delegate = delegate
self.is_local = local
self.setPage(WebPage(self, self.app))
def load_local(self, callback=None):
self.page().settings().setAttribute(QtWebKit.QWebSettings.LocalContentCanAccessRemoteUrls, True)
self.loadFinished.connect(lambda ok: self.load_finished(ok, callback))
self.view = QtWebKit.QWebView(self)
self.view.loadFinished.connect(self.load_finished)
self.page = WebPage(self)
self.view.setPage(self.page)
self.page.settings().setAttribute(QtWebKit.QWebSettings.LocalContentCanAccessRemoteUrls, True)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.view)
frame = self.view.page().mainFrame()
frame = self.page().mainFrame()
frame.addToJavaScriptWindowObject("controller", self.app.controller)
frame.addToJavaScriptWindowObject("console", self.app.console)
frame.addToJavaScriptWindowObject("__console", self.app.console)
url = self.app.resources_uri() + "/index.html"
self.view.load(QtCore.QUrl(url))
self.load(QtCore.QUrl(url))
def load_url(self, url, callback=None):
self.loadFinished.connect(lambda ok: self.load_finished(ok, callback))
self.load(QtCore.QUrl(url))
def load_finished(self, ok):
self.view.page().mainFrame().evaluateJavaScript("var OS_TYPE = 'linux';")
self.delegate.load_finished(ok)
def load_finished(self, ok, callback=None):
if self.is_local:
self.page().mainFrame().evaluateJavaScript("var OS_TYPE = 'linux';")
if callback:
callback(ok)
class NetworkAccessManager(QNetworkAccessManager):
def __init__(self, old_manager, tentia_callback):
QNetworkAccessManager.__init__(self)
self.tentia_callback = tentia_callback
self.old_manager = old_manager
self.setCache(old_manager.cache())
self.setCookieJar(old_manager.cookieJar())
self.setProxy(old_manager.proxy())
self.setProxyFactory(old_manager.proxyFactory())
def createRequest(self, operation, request, data):
if request.url().scheme() != "tentia":
return QNetworkAccessManager.createRequest(self, operation, request, data)
else:
self.tentia_callback(request.url())
return QNetworkAccessManager.createRequest(self, QNetworkAccessManager.GetOperation, QNetworkRequest(QtCore.QUrl()))

View file

@ -1,4 +1,4 @@
import sys
import sys, urllib
from PyQt4 import QtCore, QtGui, QtWebKit
"""Html snippet."""
@ -28,6 +28,20 @@ class StupidClass(QtCore.QObject):
"""Python interpreter version property."""
pyVersion = QtCore.pyqtProperty(str, fget=_pyVersion)
def isBasicAuth(url):
url_opener = urllib.URLopener()
try:
url_opener.open(url)
except IOError, error_code:
if error_code[0] == "http error" :
if error_code[1] == 401:
return True
else:
return False
return False
def main():
app = QtGui.QApplication(sys.argv)
@ -36,7 +50,13 @@ def main():
webView = QtWebKit.QWebView()
# Make myObj exposed as JavaScript object named 'pyObj'
webView.page().mainFrame().addToJavaScriptWindowObject("pyObj", myObj)
webView.setHtml(html)
url = "http://lala.home.jeena.net:3002/admin"
if isBasicAuth(url):
print "Basic Auth"
else:
webView.load(QtCore.QUrl(url))
#webView.setHtml(html)
window = QtGui.QMainWindow()
window.setCentralWidget(webView)

View file

@ -1,27 +1,25 @@
#!/usr/bin/env python
import os, sys, pickle
from PyQt4 import QtCore, QtGui
import Windows
from PyQt4 import QtCore, QtGui, QtWebKit
import Windows, Helper
class Tentia:
def __init__(self):
self.app = QtGui.QApplication(sys.argv)
self.controller = Controller()
self.controller = Controller(self)
self.console = Console()
self.setup_url_handler()
self.setup_windows()
self.preferences.show()
self.app.exec_()
def quit(self, sender):
print "quit"
def setup_windows(self):
self.preferences = Windows.Preferences(self)
#self.timeline = Windows.Timeline(self)
#self.mentions = Windows.Timeline(self, action="mentions", title="Mentions")
self.preferences.show()
self.timeline = Windows.Timeline(self)
self.mentions = Windows.Timeline(self, "mentions", "Mentions")
if self.controller.stringForKey("user_access_token") != "":
self.logged_in_successfully(True)
self.app.exec_()
def resources_path(self):
return os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
@ -33,17 +31,31 @@ class Tentia:
self.controller.setStringForKey(entity, "entity")
self.oauth_implementation = Windows.Oauth(self)
def setup_url_handler(self):
QtGui.QDesktopServices.setUrlHandler("tentia://", self.reciveURI)
def authentification_succeded(self):
self.preferences.active(False)
self.preferences.hide()
self.init_web_views()
def reciveURI(uri):
print uri
def init_web_views(self):
self.timeline.show()
self.mentions.show()
def logged_in_successfully(self, success):
self.preferences.active(False)
if success:
self.preferences.hide()
self.timeline = Windows.Timeline(self)
self.timeline.show()
else:
print "not logged in"
class Controller(QtCore.QObject):
def __init__(self):
def __init__(self, app):
QtCore.QObject.__init__(self)
self.app = app
self.config_path = os.path.expanduser('~/.tentia.cfg')
if os.access(self.config_path, os.R_OK):
with open(self.config_path, 'r') as f:
@ -73,9 +85,10 @@ class Controller(QtCore.QObject):
@QtCore.pyqtSlot(str)
def openURL(self, url):
print url
print QtCore.QUrl(url)
QtGui.QDesktopServices.openUrl(QtCore.QUrl(url));
self.app.oauth_implementation.handle_authentication(str(url))
def loggedIn(self):
self.app.authentification_succeded()
class Console(QtCore.QObject):
@ -84,13 +97,18 @@ class Console(QtCore.QObject):
def log(self, string):
print "<js>: " + string
@QtCore.pyqtSlot(str)
def error(self, string):
print "<js ERROR>: " + string
@QtCore.pyqtSlot(str)
def warn(self, string):
print "<js WARN>: " + string
@QtCore.pyqtSlot(str)
def error(self, string):
print "<js ERROR>: " + string
def notice(self, string):
print "<js NOTICE>: " + string
if __name__ == "__main__":

View file

@ -1,5 +1,5 @@
from PyQt4 import QtCore, QtGui, QtWebKit
import Helper
import Helper, urllib
class Preferences:
@ -76,26 +76,14 @@ class Preferences:
class Timeline:
def __init__(self, app, action="home_timeline", title="Tentia"):
def __init__(self, app, action="timeline", title="Tentia"):
self.app = app
self.action = action
self.title = title
self.window = gtk.Window()
self.window.connect("delete-event", self.quit)
self.window.set_title(self.title)
self.window.set_position(gtk.WIN_POS_CENTER)
self.window.set_size_request(390, 650)
scroller = gtk.ScrolledWindow()
self.window.add(scroller)
self.web_view = webkit.WebView()
scroller.add(self.web_view)
def quit(self, widget, foo):
self.window.hide()
self.app.quit(self)
self.window = Helper.WebViewCreator(self.app)
self.window.setWindowTitle(title)
self.window.load_local(self.load_finished)
def show(self):
self.window.show()
@ -103,32 +91,52 @@ class Timeline:
def hide(self):
self.window.hide()
def init_web_view(self):
self.web_view.connect("load-finished", self.load_finished)
self.web_view.open(self.app.resources_path() + "index.html")
def load_finished(self, widget):
delay = 1
if self.action == "mentions":
delay = 1000
script = "function HostAppGo() { start('" + self.action + "'); }"
self.window.page().mainFrame().evaluateJavaScript(script)
script = "setTimeout(\
function() {\
tentia_instance = new Core('" + self.action + "');\
document.getElementsByTagName('body')[0].appendChild(tentia_instance.body);\
setTimeout(function(){ loadPlugin(controller.pluginURL()) }, 1); }, " + delay + "\
);"
self.web_view.execute_script(script)
class Oauth:
def __init__(self, app):
self.app = app
self.window = Helper.WebViewCreator(self.app, self)
self.core = Helper.WebViewCreator(self.app)
self.core.load_local(self.load_finished)
def load_finished(self, ok):
if ok:
script = "function HostAppGo() { start('oauth'); }"
self.window.view.page().mainFrame().evaluateJavaScript(script)
self.core.page().mainFrame().evaluateJavaScript(script)
def handle_authentication(self, url):
self.auth_view = Helper.WebViewCreator(self.app)
self.auth_view.setWindowTitle("Authentification")
old_manager = self.auth_view.page().networkAccessManager()
new_manager = Helper.NetworkAccessManager(old_manager, self.tentia_callback)
self.auth_view.page().setNetworkAccessManager(new_manager)
self.auth_view.show()
if self.is_basic_auth(url):
print "Basic auth"
else:
self.auth_view.load_url(url)
def is_basic_auth(self, url):
url_opener = urllib.URLopener()
try:
url_opener.open(url)
except IOError, error_code:
if error_code[0] == "http error" :
if error_code[1] == 401:
return True
return False
def tentia_callback(self, url):
script = "tentia_instance.requestAccessToken('" + url.toString() + "');"
print script
self.core.page().mainFrame().evaluateJavaScript(script)