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))
self.view = QtWebKit.QWebView(self)
self.view.loadFinished.connect(self.load_finished)
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.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, 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()))
def load_finished(self, ok):
self.view.page().mainFrame().evaluateJavaScript("var OS_TYPE = 'linux';")
self.delegate.load_finished(ok)

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)

View file

@ -9,12 +9,12 @@
<title>Version 0.2.4</title>
<sparkle:minimumSystemVersion>10.5.0</sparkle:minimumSystemVersion>
<sparkle:releaseNotesLink>http://jabs.nu/Tentia/download/ReleaseNotes.html</sparkle:releaseNotesLink>
<pubDate>Sat, 17 Nov 2012 20:43:06 +0100</pubDate>
<pubDate>Sat, 17 Nov 2012 20:45:22 +0100</pubDate>
<enclosure url="http://jabs.nu/Tentia/download/Tentia.app.zip"
sparkle:version="0.2.4"
length="1069131"
length="1069130"
type="application/octet-stream"
sparkle:dsaSignature="MCwCFFN5Bvd7SsvrHqvnXfFje2lCF+h3AhRs3koGlp6Ze3IedFmMj3l+ZxGSIQ==" />
sparkle:dsaSignature="MC0CFCvZgr1pcB0bW0IQ8E7ffqs0SjvpAhUAioix/kjwYUqGqchCTDN6EjncmSE=" />
</item>
</channel>
</rss>

View file

@ -103,6 +103,7 @@ function(HostApp, Paths, Hmac) {
Oauth.prototype.requestAccessToken = function(responseBody) {
// /oauthtoken?code=51d0115b04d1ed94001dde751c5b360f&state=aQfH1VEohYsQr86qqyv
var urlVars = Paths.getUrlVars(responseBody);
if(this.state && this.state != "" && urlVars["state"] == this.state) {
@ -145,6 +146,7 @@ function(HostApp, Paths, Hmac) {
HostApp.setStringForKey(access["token_type"], "user_token_type");
HostApp.loggedIn();
console.log("D")
}
Oauth.prototype.logout = function() {

View file

@ -55,7 +55,7 @@ function(jQuery, HostApp, Hmac) {
data: data,
processData: false,
error: function(xhr, ajaxOptions, thrownError) {
alert("getURL " + xhr.statusText + " " + http_method + " (" + url + "): '" + xhr.responseText + "'");
console.error("getURL " + xhr.statusText + " " + http_method + " (" + url + "): '" + xhr.responseText + "'");
}
});
}
@ -86,7 +86,7 @@ function(jQuery, HostApp, Hmac) {
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert("findProfileURL " + xhr.statusText + " (" + entity + "): " + xhr.responseText);
console.error("findProfileURL " + xhr.statusText + " (" + entity + "): " + xhr.responseText);
if (errorCallback) errorCallback(xhr.statusText + " - " + xhr.responseText)
}
});

View file

@ -55,6 +55,37 @@ String.prototype.endsWith = function(suffix) {
return this.match(suffix+"$") == suffix;
};
var console = {
log: function(s) {
if (OS_TYPE == "mac") {
alert(s)
} else {
__console.log(s);
}
},
error: function(s) {
if (OS_TYPE == "mac") {
alert("ERROR: " + s);
} else {
__console.error(s);
}
},
warning: function (s) {
if (OS_TYPE == "mac") {
alert("WARNING: " + s);
} else {
__console.warning(s);
}
}
notice: function(s) {
if (OS_TYPE == "mac") {
alert("NOTICE: " + s);
} else {
__console.notice(s);
}
}
};
function loadPlugin(url) {
var plugin = document.createElement("script");
plugin.type = "text/javascript";