1 |
- "undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ng-token-auth"),angular.module("ng-token-auth",["ipCookie"]).provider("$auth",function(){var t,e;return t={"default":{apiUrl:"/api",signOutUrl:"/auth/sign_out",emailSignInPath:"/auth/sign_in",emailRegistrationPath:"/auth",accountUpdatePath:"/auth",accountDeletePath:"/auth",confirmationSuccessUrl:function(){return window.location.href},passwordResetPath:"/auth/password",passwordUpdatePath:"/auth/password",passwordResetSuccessUrl:function(){return window.location.href},tokenValidationPath:"/auth/validate_token",proxyIf:function(){return!1},proxyUrl:"/proxy",validateOnPageLoad:!0,omniauthWindowType:"sameWindow",storage:"cookies",tokenFormat:{"access-token":"{{ token }}","token-type":"Bearer",client:"{{ clientId }}",expiry:"{{ expiry }}",uid:"{{ uid }}"},parseExpiry:function(t){return 1e3*parseInt(t.expiry,10)||null},handleLoginResponse:function(t){return t.data},handleAccountUpdateResponse:function(t){return t.data},handleTokenValidationResponse:function(t){return t.data},authProviderPaths:{github:"/auth/github",facebook:"/auth/facebook",google:"/auth/google_oauth2"}}},e="default",{configure:function(n){var r,i,s,a,o,u,c,d,h;if(n instanceof Array&&n.length){for(a=d=0,h=n.length;h>d;a=++d){r=n[a],u=null;for(o in r)c=r[o],u=o,0===a&&(e=u);i=angular.copy(t["default"]),s={},s[u]=angular.extend(i,r[u]),angular.extend(t,s)}"default"!==e&&delete t["default"]}else{if(!(n instanceof Object))throw"Invalid argument: ng-token-auth config should be an Array or Object.";angular.extend(t["default"],n)}return t},$get:["$http","$q","$location","ipCookie","$window","$timeout","$rootScope","$interpolate",function(n){return function(r,i,s,a,o,u,c,d){return{header:null,dfd:null,user:{},mustResetPassword:!1,listener:null,initialize:function(){return this.initializeListeners(),this.cancelOmniauthInAppBrowserListeners=function(){},this.addScopeMethods()},initializeListeners:function(){return this.listener=angular.bind(this,this.handlePostMessage),o.addEventListener?o.addEventListener("message",this.listener,!1):void 0},cancel:function(t){return null!=this.requestCredentialsPollingTimer&&u.cancel(this.requestCredentialsPollingTimer),this.cancelOmniauthInAppBrowserListeners(),null!=this.dfd&&this.rejectDfd(t),u(function(t){return function(){return t.requestCredentialsPollingTimer=null}}(this),0)},destroy:function(){return this.cancel(),o.removeEventListener?o.removeEventListener("message",this.listener,!1):void 0},handlePostMessage:function(t){var e,n;return"deliverCredentials"===t.data.message&&(delete t.data.message,n=t.data.oauth_registration,delete t.data.oauth_registration,this.handleValidAuth(t.data,!0),c.$broadcast("auth:login-success",t.data),n&&c.$broadcast("auth:oauth-registration",t.data)),"authFailure"===t.data.message?(e={reason:"unauthorized",errors:[t.data.error]},this.cancel(e),c.$broadcast("auth:login-error",e)):void 0},addScopeMethods:function(){return c.user=this.user,c.authenticate=angular.bind(this,this.authenticate),c.signOut=angular.bind(this,this.signOut),c.destroyAccount=angular.bind(this,this.destroyAccount),c.submitRegistration=angular.bind(this,this.submitRegistration),c.submitLogin=angular.bind(this,this.submitLogin),c.requestPasswordReset=angular.bind(this,this.requestPasswordReset),c.updatePassword=angular.bind(this,this.updatePassword),c.updateAccount=angular.bind(this,this.updateAccount),this.getConfig().validateOnPageLoad?this.validateUser({config:this.getSavedConfig()}):void 0},submitRegistration:function(t,e){var n;return null==e&&(e={}),n=this.getResultOrValue(this.getConfig(e.config).confirmationSuccessUrl),angular.extend(t,{confirm_success_url:n,config_name:this.getCurrentConfigName(e.config)}),r.post(this.apiUrl(e.config)+this.getConfig(e.config).emailRegistrationPath,t).success(function(e){return c.$broadcast("auth:registration-email-success",t)}).error(function(t){return c.$broadcast("auth:registration-email-error",t)})},submitLogin:function(t,e){return null==e&&(e={}),this.initDfd(),r.post(this.apiUrl(e.config)+this.getConfig(e.config).emailSignInPath,t).success(function(t){return function(n){var r;return t.setConfigName(e.config),r=t.getConfig(e.config).handleLoginResponse(n,t),t.handleValidAuth(r),c.$broadcast("auth:login-success",t.user)}}(this)).error(function(t){return function(e){return t.rejectDfd({reason:"unauthorized",errors:["Invalid credentials"]}),c.$broadcast("auth:login-error",e)}}(this)),this.dfd.promise},userIsAuthenticated:function(){return this.retrieveData("auth_headers")&&this.user.signedIn&&!this.tokenHasExpired()},requestPasswordReset:function(t,e){var n;return null==e&&(e={}),n=this.getResultOrValue(this.getConfig(e.config).passwordResetSuccessUrl),t.redirect_url=n,null!=e.config&&(t.config_name=e.config),r.post(this.apiUrl(e.config)+this.getConfig(e.config).passwordResetPath,t).success(function(e){return c.$broadcast("auth:password-reset-request-success",t)}).error(function(t){return c.$broadcast("auth:password-reset-request-error",t)})},updatePassword:function(t){return r.put(this.apiUrl()+this.getConfig().passwordUpdatePath,t).success(function(t){return function(e){return c.$broadcast("auth:password-change-success",e),t.mustResetPassword=!1}}(this)).error(function(t){return c.$broadcast("auth:password-change-error",t)})},updateAccount:function(t){return r.put(this.apiUrl()+this.getConfig().accountUpdatePath,t).success(function(t){return function(e){var n,r,i,s,a,o;if(s=t.getConfig().handleAccountUpdateResponse(e),n=t.retrieveData("auth_headers"),angular.extend(t.user,s),n){i={},o=t.getConfig().tokenFormat;for(r in o)a=o[r],n[r]&&s[r]&&(i[r]=s[r]);t.setAuthHeaders(i)}return c.$broadcast("auth:account-update-success",e)}}(this)).error(function(t){return c.$broadcast("auth:account-update-error",t)})},destroyAccount:function(t){return r["delete"](this.apiUrl()+this.getConfig().accountUpdatePath,t).success(function(t){return function(e){return t.invalidateTokens(),c.$broadcast("auth:account-destroy-success",e)}}(this)).error(function(t){return c.$broadcast("auth:account-destroy-error",t)})},authenticate:function(t,e){return null==e&&(e={}),null==this.dfd&&(this.setConfigName(e.config),this.initDfd(),this.openAuthWindow(t,e)),this.dfd.promise},setConfigName:function(t){return null==t&&(t=e),this.persistData("currentConfigName",t,t)},openAuthWindow:function(t,e){var n,r;if(r=this.getConfig(e.config).omniauthWindowType,n=this.buildAuthUrl(r,t,e),"newWindow"===r)return this.requestCredentialsViaPostMessage(this.createPopup(n));if("inAppBrowser"===r)return this.requestCredentialsViaExecuteScript(this.createPopup(n));if("sameWindow"===r)return this.visitUrl(n);throw'Unsupported omniauthWindowType "#{omniauthWindowType}"'},visitUrl:function(t){return o.location.replace(t)},buildAuthUrl:function(t,e,n){var r,i,s,a;null==n&&(n={}),r=this.getConfig(n.config).apiUrl,r+=this.getConfig(n.config).authProviderPaths[e],r+="?auth_origin_url="+encodeURIComponent(o.location.href),s=angular.extend({},n.params||{},{omniauth_window_type:t});for(i in s)a=s[i],r+="&",r+=encodeURIComponent(i),r+="=",r+=encodeURIComponent(a);return r},requestCredentialsViaPostMessage:function(t){return t.closed?this.handleAuthWindowClose(t):(t.postMessage("requestCredentials","*"),this.requestCredentialsPollingTimer=u(function(e){return function(){return e.requestCredentialsViaPostMessage(t)}}(this),500))},requestCredentialsViaExecuteScript:function(t){var e,n;return this.cancelOmniauthInAppBrowserListeners(),e=this.handleAuthWindowClose.bind(this,t),n=this.handleLoadStop.bind(this,t),t.addEventListener("loadstop",n),t.addEventListener("exit",e),this.cancelOmniauthInAppBrowserListeners=function(){return t.removeEventListener("loadstop",n),t.removeEventListener("exit",e)}},handleLoadStop:function(t){return n=this,t.executeScript({code:"requestCredentials()"},function(e){var r,i;return r=e[0],r?(i=new Event("message"),i.data=r,n.cancelOmniauthInAppBrowserListeners(),o.dispatchEvent(i),n.initDfd(),t.close()):void 0})},handleAuthWindowClose:function(t){return this.cancel({reason:"unauthorized",errors:["User canceled login"]}),this.cancelOmniauthInAppBrowserListeners,c.$broadcast("auth:window-closed")},createPopup:function(t){return o.open(t,"_blank")},resolveDfd:function(){return this.dfd.resolve(this.user),u(function(t){return function(){return t.dfd=null,c.$$phase?void 0:c.$digest()}}(this),0)},buildQueryString:function(t,e){var n,r,i,s;i=[];for(r in t)s=t[r],r=e?e+"["+r+"]":r,n=angular.isObject(s)?this.buildQueryString(s,r):r+"="+encodeURIComponent(s),i.push(n);return i.join("&")},parseLocation:function(t){var e,n,r,i;i=t.substring(1).split("&"),n={},r=void 0,e=void 0;for(e in i)e=e,""!==i[e]&&(r=i[e].split("="),n[decodeURIComponent(r[0])]=decodeURIComponent(r[1]));return n},validateUser:function(t){var e,n,r,i,a,o,u,d,h;return null==t&&(t={}),n=t.config,null==this.dfd&&(this.initDfd(),this.userIsAuthenticated()?this.resolveDfd():(o=s.search(),i=this.parseLocation(window.location.search),a=0===Object.keys(o).length?i:o,u=a.auth_token||a.token,void 0!==u?(e=a.client_id,d=a.uid,r=a.expiry,n=a.config,this.setConfigName(n),this.mustResetPassword=a.reset_password,this.firstTimeLogin=a.account_confirmation_success,this.oauthRegistration=a.oauth_registration,this.setAuthHeaders(this.buildAuthHeaders({token:u,clientId:e,uid:d,expiry:r})),h=s.path()||"/",["token","client_id","uid","expiry","config","reset_password","account_confirmation_success","oauth_registration"].forEach(function(t){return delete a[t]}),Object.keys(a).length>0&&(h+="?"+this.buildQueryString(a)),s.url(h)):this.retrieveData("currentConfigName")&&(n=this.retrieveData("currentConfigName")),isEmpty(this.retrieveData("auth_headers"))?(this.rejectDfd({reason:"unauthorized",errors:["No credentials"]}),c.$broadcast("auth:invalid")):this.tokenHasExpired()?(c.$broadcast("auth:session-expired"),this.rejectDfd({reason:"unauthorized",errors:["Session expired."]})):this.validateToken({config:n}))),this.dfd.promise},validateToken:function(t){return null==t&&(t={}),this.tokenHasExpired()?this.rejectDfd({reason:"unauthorized",errors:["Expired credentials"]}):r.get(this.apiUrl(t.config)+this.getConfig(t.config).tokenValidationPath).success(function(e){return function(n){var r;return r=e.getConfig(t.config).handleTokenValidationResponse(n),e.handleValidAuth(r),e.firstTimeLogin&&c.$broadcast("auth:email-confirmation-success",e.user),e.oauthRegistration&&c.$broadcast("auth:oauth-registration",e.user),e.mustResetPassword&&c.$broadcast("auth:password-reset-confirm-success",e.user),c.$broadcast("auth:validation-success",e.user)}}(this)).error(function(t){return function(e){return t.firstTimeLogin&&c.$broadcast("auth:email-confirmation-error",e),t.mustResetPassword&&c.$broadcast("auth:password-reset-confirm-error",e),c.$broadcast("auth:validation-error",e),t.rejectDfd({reason:"unauthorized",errors:e.errors})}}(this))},tokenHasExpired:function(){var t,e;return t=this.getExpiry(),e=(new Date).getTime(),t&&e>t},getExpiry:function(){return this.getConfig().parseExpiry(this.retrieveData("auth_headers")||{})},invalidateTokens:function(){var t,e,n;n=this.user;for(t in n)e=n[t],delete this.user[t];return this.deleteData("currentConfigName"),null!=this.timer&&u.cancel(this.timer),this.deleteData("auth_headers")},signOut:function(){return r["delete"](this.apiUrl()+this.getConfig().signOutUrl).success(function(t){return function(e){return t.invalidateTokens(),c.$broadcast("auth:logout-success")}}(this)).error(function(t){return function(e){return t.invalidateTokens(),c.$broadcast("auth:logout-error",e)}}(this))},handleValidAuth:function(t,e){return null==e&&(e=!1),null!=this.requestCredentialsPollingTimer&&u.cancel(this.requestCredentialsPollingTimer),this.cancelOmniauthInAppBrowserListeners(),angular.extend(this.user,t),this.user.signedIn=!0,this.user.configName=this.getCurrentConfigName(),e&&this.setAuthHeaders(this.buildAuthHeaders({token:this.user.auth_token,clientId:this.user.client_id,uid:this.user.uid,expiry:this.user.expiry})),this.resolveDfd()},buildAuthHeaders:function(t){var e,n,r,i;e={},i=this.getConfig().tokenFormat;for(n in i)r=i[n],e[n]=d(r)(t);return e},persistData:function(t,e,n){if(this.getConfig(n).storage instanceof Object)return this.getConfig(n).storage.persistData(t,e,this.getConfig(n));switch(this.getConfig(n).storage){case"localStorage":return o.localStorage.setItem(t,JSON.stringify(e));default:return a(t,e,{path:"/",expires:9999,expirationUnit:"days"})}},retrieveData:function(t){if(this.getConfig().storage instanceof Object)return this.getConfig().storage.retrieveData(t);switch(this.getConfig().storage){case"localStorage":return JSON.parse(o.localStorage.getItem(t));default:return a(t)}},deleteData:function(t){switch(this.getConfig().storage instanceof Object&&this.getConfig().storage.deleteData(t),this.getConfig().storage){case"localStorage":return o.localStorage.removeItem(t);default:return a.remove(t,{path:"/"})}},setAuthHeaders:function(t){var e,n,r,i;return n=angular.extend(this.retrieveData("auth_headers")||{},t),i=this.persistData("auth_headers",n),e=this.getExpiry(),r=(new Date).getTime(),e>r&&(null!=this.timer&&u.cancel(this.timer),this.timer=u(function(t){return function(){return t.validateUser({config:t.getSavedConfig()})}}(this),parseInt(e-r))),i},initDfd:function(){return this.dfd=i.defer()},rejectDfd:function(t){return this.invalidateTokens(),null!=this.dfd?(this.dfd.reject(t),u(function(t){return function(){return t.dfd=null}}(this),0)):void 0},apiUrl:function(t){return this.getConfig(t).proxyIf()?this.getConfig(t).proxyUrl:this.getConfig(t).apiUrl},getConfig:function(e){return t[this.getCurrentConfigName(e)]},getResultOrValue:function(t){return"function"==typeof t?t():t},getCurrentConfigName:function(t){return t||this.getSavedConfig()},getSavedConfig:function(){var t,n,r,i;t=void 0,i="currentConfigName",r=!1;try{r=!!o.localStorage}catch(s){n=s}return r&&null==t&&(t=JSON.parse(o.localStorage.getItem(i))),null==t&&(t=a(i)),t||e}}}}(this)]}}).config(["$httpProvider",function(t){var e,n,r;return n=function(t,e){var n,r;return r=Number(t.getExpiry()),n=Number(t.getConfig().parseExpiry(e||{})),n>=r},r=function(t,e){var r,i,s,a;i={},a=t.getConfig().tokenFormat;for(r in a)s=a[r],e.headers(r)&&(i[r]=e.headers(r));return n(t,i)?t.setAuthHeaders(i):void 0},t.interceptors.push(["$injector",function(t){return{request:function(e){return t.invoke(["$http","$auth",function(t,n){var r,i,s,a;if(e.url.match(n.apiUrl())){s=n.retrieveData("auth_headers"),a=[];for(r in s)i=s[r],a.push(e.headers[r]=i);return a}}]),e},response:function(e){return t.invoke(["$http","$auth",function(t,n){return e.config.url.match(n.apiUrl())?r(n,e):void 0}]),e},responseError:function(e){return t.invoke(["$http","$auth",function(t,n){return e.config.url.match(n.apiUrl())?r(n,e):void 0}]),t.get("$q").reject(e)}}}]),e=["get","post","put","patch","delete"],angular.forEach(e,function(e){var n;return null==(n=t.defaults.headers)[e]&&(n[e]={}),t.defaults.headers[e]["If-Modified-Since"]="Mon, 26 Jul 1997 05:00:00 GMT"})}]).run(["$auth","$window","$rootScope",function(t,e,n){return t.initialize()}]),window.isOldIE=function(){var t,e,n;return e=!1,t=navigator.userAgent.toLowerCase(),t&&-1!==t.indexOf("msie")&&(n=parseInt(t.split("msie")[1]),10>n&&(e=!0)),e},window.isIE=function(){var t;return t=navigator.userAgent.toLowerCase(),t&&-1!==t.indexOf("msie")||!!navigator.userAgent.match(/Trident.*rv\:11\./)},window.isEmpty=function(t){var e,n;if(!t)return!0;if(t.length>0)return!1;if(0===t.length)return!0;for(e in t)if(n=t[e],Object.prototype.hasOwnProperty.call(t,e))return!1;return!0};
|