Move the unknown token broadcast to the interceptor. Return the $http promise and not a wrapped one via $q. Everything now needs a level deeper nesting. Fixed registration and login.
							parent
							
								
									76005c44f7
								
							
						
					
					
						commit
						db3e1d73c6
					
				| 
						 | 
				
			
			@ -42,20 +42,20 @@ matrixWebClient.config(['$routeProvider', '$provide', '$httpProvider',
 | 
			
		|||
                redirectTo: '/rooms'
 | 
			
		||||
            });
 | 
			
		||||
            
 | 
			
		||||
        $provide.factory('AccessTokenInterceptor', function ($q) {
 | 
			
		||||
        $provide.factory('AccessTokenInterceptor', ['$q', '$rootScope', 
 | 
			
		||||
            function ($q, $rootScope) {
 | 
			
		||||
            return {
 | 
			
		||||
                responseError: function(rejection) {
 | 
			
		||||
                    console.log("Rejection: " + JSON.stringify(rejection));
 | 
			
		||||
                    if (rejection.status === 403 && "data" in rejection && 
 | 
			
		||||
                            "errcode" in rejection.data && 
 | 
			
		||||
                            rejection.data.errcode === "M_UNKNOWN_TOKEN") {
 | 
			
		||||
                        console.log("TODO: Got a 403 with an unknown token. Logging out.")
 | 
			
		||||
                        // TODO logout
 | 
			
		||||
                        console.log("Got a 403 with an unknown token. Logging out.")
 | 
			
		||||
                        $rootScope.$broadcast("M_UNKNOWN_TOKEN");
 | 
			
		||||
                    }
 | 
			
		||||
                    return $q.reject(rejection);
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
        });
 | 
			
		||||
        }]);
 | 
			
		||||
        $httpProvider.interceptors.push('AccessTokenInterceptor');
 | 
			
		||||
    }]);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,32 +49,13 @@ angular.module('matrixService', [])
 | 
			
		|||
        if (path.indexOf(prefixPath) !== 0) {
 | 
			
		||||
            path = prefixPath + path;
 | 
			
		||||
        }
 | 
			
		||||
        // Do not directly return the $http instance but return a promise
 | 
			
		||||
        // with enriched or cleaned information
 | 
			
		||||
        var deferred = $q.defer();
 | 
			
		||||
        $http({
 | 
			
		||||
        return $http({
 | 
			
		||||
            method: method,
 | 
			
		||||
            url: baseUrl + path,
 | 
			
		||||
            params: params,
 | 
			
		||||
            data: data,
 | 
			
		||||
            headers: headers
 | 
			
		||||
        })
 | 
			
		||||
        .success(function(data, status, headers, config) {
 | 
			
		||||
            deferred.resolve(data, status, headers, config);
 | 
			
		||||
        })
 | 
			
		||||
        .error(function(data, status, headers, config) {
 | 
			
		||||
            // Enrich the error callback with an human readable error reason
 | 
			
		||||
            var reason = data.error;
 | 
			
		||||
            if (!data.error) {
 | 
			
		||||
                reason = JSON.stringify(data);
 | 
			
		||||
            }
 | 
			
		||||
            deferred.reject(reason, data, status, headers, config);
 | 
			
		||||
 | 
			
		||||
            if (403 === status && "M_UNKNOWN_TOKEN" === data.errcode) {
 | 
			
		||||
                // The access token is no more valid, broadcast the issue
 | 
			
		||||
                $rootScope.$broadcast("M_UNKNOWN_TOKEN");
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return deferred.promise;
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,14 +39,13 @@ angular.module('LoginController', ['matrixService'])
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        matrixService.register($scope.account.desired_user_name, $scope.account.pwd1).then(
 | 
			
		||||
            function(data) {
 | 
			
		||||
            function(response) {
 | 
			
		||||
                $scope.feedback = "Success";
 | 
			
		||||
 | 
			
		||||
                // Update the current config 
 | 
			
		||||
                var config = matrixService.config();
 | 
			
		||||
                angular.extend(config, {
 | 
			
		||||
                    access_token: data.access_token,
 | 
			
		||||
                    user_id: data.user_id
 | 
			
		||||
                    access_token: response.data.access_token,
 | 
			
		||||
                    user_id: response.data.user_id
 | 
			
		||||
                });
 | 
			
		||||
                matrixService.setConfig(config);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -74,7 +73,7 @@ angular.module('LoginController', ['matrixService'])
 | 
			
		|||
                    matrixService.setConfig({
 | 
			
		||||
                        homeserver: $scope.account.homeserver,
 | 
			
		||||
                        user_id: $scope.account.user_id,
 | 
			
		||||
                        access_token: response.access_token
 | 
			
		||||
                        access_token: response.data.access_token
 | 
			
		||||
                    });
 | 
			
		||||
                    matrixService.saveConfig();
 | 
			
		||||
                    $location.path("rooms");
 | 
			
		||||
| 
						 | 
				
			
			@ -82,6 +81,11 @@ angular.module('LoginController', ['matrixService'])
 | 
			
		|||
                else {
 | 
			
		||||
                    $scope.feedback = "Failed to login: " + JSON.stringify(response);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            function(error) {
 | 
			
		||||
                if (error.data.errcode === "M_FORBIDDEN") {
 | 
			
		||||
                    $scope.login_error_msg = "Incorrect username or password.";
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        );
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@
 | 
			
		|||
    <h3>Got an account?</h3>
 | 
			
		||||
    <form novalidate>
 | 
			
		||||
        <!-- Login with an registered user -->
 | 
			
		||||
        <div>{{ login_error_msg }} </div>
 | 
			
		||||
        <div>
 | 
			
		||||
            <input id="user_id" size="70" type="text" auto-focus ng-model="account.user_id" placeholder="User ID (ex:@bob:localhost)"/>
 | 
			
		||||
            <br />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue