summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2013-07-24 17:42:43 +0200
committerGravatar RaNaN <Mast3rRaNaN@hotmail.de> 2013-07-24 17:42:56 +0200
commitf0bfb8a13b6b488c561084a4a33acc9b75984b03 (patch)
tree22ef409a315a5afdb2bb93157dd751f2d61d8a71
parentDebridItaliaCom: two more hosters supported (diff)
downloadpyload-f0bfb8a13b6b488c561084a4a33acc9b75984b03.tar.xz
improved login mechanism
-rw-r--r--pyload/remote/json_converter.py2
-rw-r--r--pyload/web/api_app.py14
-rw-r--r--pyload/web/app/scripts/controller.js11
-rw-r--r--pyload/web/app/scripts/default.js2
-rw-r--r--pyload/web/app/scripts/models/UserSession.js28
-rw-r--r--pyload/web/app/scripts/views/headerView.js6
-rw-r--r--pyload/web/app/scripts/views/loginView.js24
-rw-r--r--pyload/web/app/templates/default/header/layout.html2
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%">