Make API object propagate authentication failures
[blerg.git] / www / jssrc / blerg / API.js
index ecf7cd3..64b1108 100644 (file)
@@ -21,9 +21,9 @@ enyo.kind({
             return;
         }
 
-        if (enyo.getCookie('auth') && enyo.getCookie('username')) {
+        if (enyo.getCookie('auth')) {
             blerg.API.loggedIn = true;
-            blerg.API.username = enyo.getCookie('username');
+            blerg.API.username = enyo.getCookie('auth').split('/')[0];
             // Defer the signal until everything's initialized
             setTimeout(function() {
                 this.bubble('onLoginSuccessful', {username: blerg.API.username});
@@ -66,41 +66,44 @@ enyo.kind({
             if (inResponse.status == 'success') {
                 blerg.API.loggedIn = true;
                 blerg.API.username = username;
-                enyo.setCookie('username', username);
                 this.bubble('onLoginSuccessful', {username: username});
             } else {
-                enyo.setCookie('username', '', {"Max-Age": 0});
                 this.bubble('onLoginFailed');
             }
         });
         req.error(this, function() {
-            enyo.setCookie('username', '', {"Max-Age": 0});
             this.bubble('onLoginFailed');
         });
         req.go();
     },
+    expireClientAuthentication: function() {
+        blerg.API.loggedIn = false;
+        blerg.API.username = '';
+        enyo.setCookie('auth', '', {"Max-Age": 0});
+    },
     logout: function() {
         var req = new enyo.Ajax({
             url: baseURL + '/logout',
-            method: 'POST',
-            postBody: {
-                username: blerg.API.username
-            }
+            method: 'POST'
         });
-        req.response(this, function(inSender, inResponse) {
-            blerg.API.loggedIn = false;
-            enyo.setCookie('auth', '', {"Max-Age": 0});
+        var logout_func = function() {
+            this.expireClientAuthentication();
             this.bubble('onLogoutSuccessful');
-        });
+        }.bind(this);
+        req.response(this, logout_func);
+        req.error(this, logout_func);
         req.go();
-        enyo.setCookie('username', '', {"Max-Age": 0});
+    },
+    authenticationFailed: function() {
+        enyo.log("Authentication failed -- logging out");
+        this.expireClientAuthentication();
+        this.bubble('onAuthFailure');
     },
     changePassword: function(oldpassword, newpassword) {
         var req = new enyo.Ajax({
             url: baseURL + '/passwd',
             method: 'POST',
             postBody: {
-                username: blerg.API.username,
                 password: oldpassword,
                 new_password: newpassword
             }
@@ -186,15 +189,16 @@ enyo.kind({
             throw new Error('Cannot request feed status when not logged in');
 
         var req = new enyo.Ajax({
-            url: baseURL + '/status',
-            method: 'POST',
-            postBody: {
-                username: blerg.API.username
-            }
+            url: baseURL + '/status'
         });
         req.response(this, function(inSender, inResponse) {
             this.bubble('onStatus', inResponse);
         });
+        req.error(this, function() {
+            if (req.xhrResponse.status == 403) {
+                this.authenticationFailed();
+            }
+        });
         req.go();
     },
     clearStatus: function(type) {
@@ -208,7 +212,6 @@ enyo.kind({
             url: baseURL + '/status',
             method: 'POST',
             postBody: {
-                username: blerg.API.username,
                 clear: type
             }
         });
@@ -216,6 +219,11 @@ enyo.kind({
             inResponse.type = type;
             this.bubble('onClearStatus', inResponse);
         });
+        req.error(this, function() {
+            if (req.xhrResponse.status == 403) {
+                this.authenticationFailed();
+            }
+        });
         req.go();
     },
     loadFeed: function() {
@@ -223,11 +231,7 @@ enyo.kind({
             throw new Error('Cannot request feed status when not logged in');
 
         var req = new enyo.Ajax({
-            url: baseURL + '/feed',
-            method: 'POST',
-            postBody: {
-                username: blerg.API.username
-            }
+            url: baseURL + '/feed'
         });
         req.response(this, function(inSender, inResponse) {
             this.bubble('onItemsLoaded', {
@@ -235,15 +239,16 @@ enyo.kind({
                 entries: inResponse
             });
         });
+        req.error(this, function() {
+            if (req.xhrResponse.status == 403) {
+                this.authenticationFailed();
+            }
+        });
         req.go();
     },
     getSubscriptionStatus: function(username) {
         var req = new enyo.Ajax({
-            url: baseURL + '/status/' + username,
-            method: 'POST',
-            postBody: {
-                username: blerg.API.username
-            }
+            url: baseURL + '/status/' + username
         });
         req.response(this, function(inSender, inResponse) {
             this.bubble('onSubscriptionStatus', {
@@ -251,46 +256,46 @@ enyo.kind({
                 subscribed: inResponse.subscribed
             });
         });
+        req.error(this, function() {
+            if (req.xhrResponse.status == 403) {
+                this.authenticationFailed();
+            }
+        });
         req.go();
     },
-    subscribe: function(username) {
+    subscription: function(username, v) {
+        var subv = v ? true : false;
         var req = new enyo.Ajax({
             url: baseURL + '/subscribe/' + username,
             method: 'POST',
             postBody: {
-                username: blerg.API.username
+                subscribed: subv
             }
         });
         req.response(this, function(inSender, inResponse) {
             this.bubble('onSubscriptionStatus', {
                 username: username,
-                subscribed: inResponse.status == "success"
+                subscribed: inResponse.status == "success" && subv
             });
         });
-        req.go();
-    },
-    unsubscribe: function(username) {
-        var req = new enyo.Ajax({
-            url: baseURL + '/unsubscribe/' + username,
-            method: 'POST',
-            postBody: {
-                username: blerg.API.username
+        req.error(this, function() {
+            if (req.xhrResponse.status == 403) {
+                this.authenticationFailed();
             }
         });
-        req.response(this, function(inSender, inResponse) {
-            this.bubble('onSubscriptionStatus', {
-                username: username,
-                subscribed: inResponse.status != "success"
-            });
-        });
         req.go();
     },
+    subscribe: function(username) {
+        this.subscription(username, true);
+    },
+    unsubscribe: function(username) {
+        this.subscription(username, false);
+    },
     post: function(data) {
         var req = new enyo.Ajax({
             url: baseURL + '/put',
             method: 'POST',
             postBody: {
-                username: blerg.API.username,
                 data: data
             }
         });
@@ -307,6 +312,11 @@ enyo.kind({
                 });
             }
         });
+        req.error(this, function() {
+            if (req.xhrResponse.status == 403) {
+                this.authenticationFailed();
+            }
+        });
         req.go();
     }
 });