diff options
author | 2013-07-24 17:42:43 +0200 | |
---|---|---|
committer | 2013-07-24 17:42:56 +0200 | |
commit | f0bfb8a13b6b488c561084a4a33acc9b75984b03 (patch) | |
tree | 22ef409a315a5afdb2bb93157dd751f2d61d8a71 | |
parent | DebridItaliaCom: two more hosters supported (diff) | |
download | pyload-f0bfb8a13b6b488c561084a4a33acc9b75984b03.tar.xz |
improved login mechanism
-rw-r--r-- | pyload/remote/json_converter.py | 2 | ||||
-rw-r--r-- | pyload/web/api_app.py | 14 | ||||
-rw-r--r-- | pyload/web/app/scripts/controller.js | 11 | ||||
-rw-r--r-- | pyload/web/app/scripts/default.js | 2 | ||||
-rw-r--r-- | pyload/web/app/scripts/models/UserSession.js | 28 | ||||
-rw-r--r-- | pyload/web/app/scripts/views/headerView.js | 6 | ||||
-rw-r--r-- | pyload/web/app/scripts/views/loginView.js | 24 | ||||
-rw-r--r-- | pyload/web/app/templates/default/header/layout.html | 2 |
8 files changed, 69 insertions, 20 deletions
diff --git a/pyload/remote/json_converter.py b/pyload/remote/json_converter.py index 3e6c7f797..df397e8ba 100644 --- a/pyload/remote/json_converter.py +++ b/pyload/remote/json_converter.py @@ -49,7 +49,7 @@ def convert_obj(dct): return dct def dumps(*args, **kwargs): - if 'compact' in kwargs: + if 'compact' in kwargs and kwargs['compact']: kwargs['cls'] = BaseEncoderCompact del kwargs['compact'] else: diff --git a/pyload/web/api_app.py b/pyload/web/api_app.py index 3ffc507aa..c88be0519 100644 --- a/pyload/web/api_app.py +++ b/pyload/web/api_app.py @@ -8,12 +8,13 @@ from traceback import format_exc, print_exc from bottle import route, request, response, HTTPError, parse_auth from utils import set_session, get_user_api -from webinterface import PYLOAD +from webinterface import PYLOAD, session from pyload.Api import ExceptionObject -from pyload.remote.json_converter import loads, dumps +from pyload.remote.json_converter import loads, dumps, BaseEncoder from pyload.utils import remove_chars + def add_header(r): r.headers.replace("Content-type", "application/json") r.headers.append("Cache-Control", "no-cache, must-revalidate") @@ -95,10 +96,13 @@ def login(): # get the session id by dirty way, documentations seems wrong try: sid = s._headers["cookie_out"].split("=")[1].split(";")[0] - return dumps(sid) + # reuse old session id except: - print "Could not get session" - return dumps(True) + sid = request.get_header(session.options['key']) + + result = BaseEncoder().default(user) + result["session"] = sid + return dumps(result) @route("/api/logout") diff --git a/pyload/web/app/scripts/controller.js b/pyload/web/app/scripts/controller.js index 60f604e5b..683454522 100644 --- a/pyload/web/app/scripts/controller.js +++ b/pyload/web/app/scripts/controller.js @@ -1,6 +1,7 @@ define([ 'app', 'backbone', + 'jquery', 'underscore', // Views @@ -13,7 +14,7 @@ define([ 'views/settings/settingsView', 'views/accounts/accountListView' ], function( - App, Backbone, _, HeaderView, NotificationView, DashboardView, SelectionView, FilterView, LoginView, SettingsView, AccountListView) { + App, Backbone, $, _, HeaderView, NotificationView, DashboardView, SelectionView, FilterView, LoginView, SettingsView, AccountListView) { 'use strict'; // TODO some views does not need to be loaded instantly @@ -45,7 +46,13 @@ define([ }, logout: function() { - alert('Not implemented'); + $.ajax(App.apiRequest('logout', null, { + success: function() { + App.user.destroy(); + App.navigate('login'); + } + } + )); }, settings: function() { diff --git a/pyload/web/app/scripts/default.js b/pyload/web/app/scripts/default.js index 6c5ee9afb..428ec2b28 100644 --- a/pyload/web/app/scripts/default.js +++ b/pyload/web/app/scripts/default.js @@ -21,7 +21,7 @@ define('default', ['backbone', 'jquery', 'app', 'router', 'models/UserSession'], }; $(function() { - App.session = new UserSession(); + App.user = new UserSession(); App.router = new Router(); App.start(); }); diff --git a/pyload/web/app/scripts/models/UserSession.js b/pyload/web/app/scripts/models/UserSession.js index a7e9aa848..7bf6abd8f 100644 --- a/pyload/web/app/scripts/models/UserSession.js +++ b/pyload/web/app/scripts/models/UserSession.js @@ -1,20 +1,38 @@ -define(['jquery', 'backbone', 'underscore', 'utils/apitypes', 'cookie'], - function($, Backbone, _, Api) { +define(['jquery', 'backbone', 'underscore', 'utils/apitypes', 'app'], + function($, Backbone, _, Api, App) { 'use strict'; + // Used in app -> can not have a dependency on app return Backbone.Model.extend({ - idAttribute: 'username', + idAttribute: 'name', defaults: { - username: null, + uid: -1, + name: 'User', permissions: null, session: null }, // Model Constructor initialize: function() { - this.set('session', $.cookie('beaker.session.id')); + this.set(JSON.parse(localStorage.getItem('user'))); + }, + + save: function() { + localStorage.setItem('user', JSON.stringify(this.toJSON())); + }, + + destroy: function() { + localStorage.removeItem('user'); + }, + + // TODO + fetch: function(options) { + options = App.apiRequest('todo', null, options); + + return Backbone.Model.prototype.fetch.call(this, options); } + }); });
\ No newline at end of file diff --git a/pyload/web/app/scripts/views/headerView.js b/pyload/web/app/scripts/views/headerView.js index b4ffbc35d..e6e763b26 100644 --- a/pyload/web/app/scripts/views/headerView.js +++ b/pyload/web/app/scripts/views/headerView.js @@ -7,6 +7,10 @@ define(['jquery', 'underscore', 'backbone', 'app', 'models/ServerStatus', 'colle // Renders the header with all information return Backbone.Marionette.ItemView.extend({ + modelEvents: { + 'change': 'render' + }, + events: { 'click .icon-list': 'toggle_taskList', 'click .popover .close': 'toggle_taskList', @@ -42,6 +46,8 @@ define(['jquery', 'underscore', 'backbone', 'app', 'models/ServerStatus', 'colle var self = this; this.notificationView = new NotificationView(); + this.model = App.user; + this.status = new ServerStatus(); this.listenTo(this.status, 'change', this.update); diff --git a/pyload/web/app/scripts/views/loginView.js b/pyload/web/app/scripts/views/loginView.js index 891b3ec99..9c96f625b 100644 --- a/pyload/web/app/scripts/views/loginView.js +++ b/pyload/web/app/scripts/views/loginView.js @@ -17,20 +17,34 @@ define(['jquery', 'backbone', 'underscore', 'app', 'hbs!tpl/login'], login: function(e) { e.stopPropagation(); + var self = this; var options = App.apiRequest('login', null, { data: this.ui.form.serialize(), - type : 'post', + type: 'post', success: function(data) { - // TODO: go to last page, better error - if (data) + console.log('User logged in', data); + // TODO: go to last page + if (data) { + App.user.set(data); + App.user.save(); App.navigate(''); - else - alert('Wrong login'); + } + else { + self.wrongLogin(); + } + }, + error: function() { + self.wrongLogin(); } }); $.ajax(options); return false; + }, + + // TODO: improve + wrongLogin: function() { + alert('Wrong login'); } }); diff --git a/pyload/web/app/templates/default/header/layout.html b/pyload/web/app/templates/default/header/layout.html index 0fe61c4e3..14a7f0424 100644 --- a/pyload/web/app/templates/default/header/layout.html +++ b/pyload/web/app/templates/default/header/layout.html @@ -31,7 +31,7 @@ <div class="header-btn"> <div class="btn-group"> - <a class="btn btn-blue btn-small" href="#"><i class="icon-user icon-white"></i> User</a> + <a class="btn btn-blue btn-small" href="#"><i class="icon-user icon-white"></i> {{ name }}</a> <a class="btn btn-blue btn-small dropdown-toggle" data-toggle="dropdown" href="#"><span class="caret"></span></a> <ul class="dropdown-menu" style="right: 0; left: -100%"> |