/** * stormpath-sdk-angularjs * Copyright Stormpath, Inc. 2017 * * @version v2.0.1-dev-2017-04-04 * @link https://github.com/stormpath/stormpath-sdk-angularjs * @license Apache-2.0 */ "undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="stormpath"),function(a,b,c){"use strict";b.module("stormpath",["stormpath.CONFIG","stormpath.utils","stormpath.auth","stormpath.userService","stormpath.viewModelService","stormpath.socialLogin","stormpath.oauth"]).factory("StormpathAgentInterceptor",["$isCurrentDomain","$spHeaders",function(a,c){function d(){}return d.prototype.request=function(a){var d=["/change$","/forgot$","/login$","/logout$","/me$","/oauth/token$","/oauth/token$","/register$","/revoke$","/verify$"];return d.some(function(b){return new RegExp(b).test(a.url)})&&(a.headers=b.extend(a.headers,c)),a},new d}]).config(["$httpProvider",function(a){a.interceptors.push("StormpathAgentInterceptor")}]).provider("$stormpath",[function(){this.$get=["$user","$injector","STORMPATH_CONFIG","$rootScope","$location",function(a,b,d,e,f){function g(){var a=new m;return this.encodeUrlForm=a.encode.bind(a),b.has("$state")&&(n=b.get("$state")),b.has("$route")&&(o=b.get("$route")),this}function h(a,b){e.$broadcast(d.STATE_CHANGE_UNAUTHENTICATED,a,b)}function i(a,b){e.$broadcast(d.STATE_CHANGE_UNAUTHORIZED,a,b)}function j(b,c){var d=b;if(d&&d.authorize&&d.authorize.group)return a.currentUser.inGroup(d.authorize.group);if(c){var e=c.filter(function(b){return a.currentUser.inGroup(b)});return e.length>0}return console.error("Unknown authorize configuration for spStateConfig",b),!1}function k(a){e.$broadcast(d.ROUTE_CHANGE_UNAUTHENTICATED,a)}function l(a){e.$broadcast(d.ROUTE_CHANGE_UNAUTHORIZED,a)}function m(){return this.delimiter="&",this.arrayPrefixGenerators={brackets:function(a){return a+"[]"},indices:function(a,b){return a+"["+b+"]"},repeat:function(a){return a}},this}var n,o;return g.prototype.stateChangeInterceptor=function(b){e.$on("$stateChangeStart",function(d,e,f){var g=e.sp||{},k=e.data&&e.data.authorities?e.data.authorities:c;(g.authenticate||g.authorize||k&&k.length)&&!a.currentUser?(d.preventDefault(),a.get().then(function(){g.authorize||k&&k.length?j(g,k)?n.go(e.name,f):i(e,f):n.go(e.name,f)},function(){h(e,f)})):g.waitForUser&&null===a.currentUser?(d.preventDefault(),a.get()["finally"](function(){n.go(e.name,f)})):a.currentUser&&(g.authorize||k&&k.length)?j(g,k)||(d.preventDefault(),i(e,f)):e.name===b.loginState&&a.currentUser!==!1&&(d.preventDefault(),a.get()["finally"](function(){a.currentUser&&a.currentUser.href?n.go(b.defaultPostLoginState):n.go(e.name,f)}))})},g.prototype.routeChangeInterceptor=function(b){function c(a){setTimeout(function(){a.$$route.originalPath===f.path()?o.reload():f.path(a)})}e.$on("$routeChangeStart",function(d,e){if(e.$$route){var f=e.$$route.sp||{};!f.authenticate&&!f.authorize||a.currentUser?f.waitForUser&&null===a.currentUser?(d.preventDefault(),a.get()["finally"](function(){c(e)})):a.currentUser&&f.authorize?j(f)||(d.preventDefault(),l(e)):e.$$route.originalPath===b.loginRoute&&a.currentUser&&a.currentUser.href&&(d.preventDefault(),c(b.defaultPostLoginRoute)):(d.preventDefault(),a.get().then(function(){f.authorize?j(f)?c(e):i(e):c(e)},function(){k(e)}))}})},g.prototype.uiRouter=function(a){var b=this;a="object"==typeof a?a:{},this.stateChangeInterceptor(a),a.loginState&&(b.unauthenticatedWather=e.$on(d.STATE_CHANGE_UNAUTHENTICATED,function(c,d,e){b.postLogin={toState:d,toParams:e},n.go(a.loginState)})),e.$on(d.AUTHENTICATION_SUCCESS_EVENT_NAME,function(){b.postLogin&&a.autoRedirect!==!1?n.go(b.postLogin.toState,b.postLogin.toParams).then(function(){b.postLogin=null}):a.defaultPostLoginState&&n.go(a.defaultPostLoginState)}),a.forbiddenState&&(b.forbiddenWatcher=e.$on(d.STATE_CHANGE_UNAUTHORIZED,function(){n.go(a.forbiddenState)}))},g.prototype.ngRouter=function(a){var b=this;a="object"==typeof a?a:{},this.routeChangeInterceptor(a),a.loginRoute&&(this.unauthenticatedWather=e.$on(d.ROUTE_CHANGE_UNAUTHENTICATED,function(c,d){b.postLogin={toRoute:d},f.path(a.loginRoute)})),e.$on(d.AUTHENTICATION_SUCCESS_EVENT_NAME,function(){b.postLogin&&a.autoRedirect!==!1?(f.path(b.postLogin.toRoute),b.postLogin=null):a.defaultPostLoginRoute&&f.path(a.defaultPostLoginRoute)}),a.forbiddenRoute&&(this.forbiddenWatcher=e.$on(d.ROUTE_CHANGE_UNAUTHORIZED,function(){f.path(a.forbiddenRoute)}))},g.prototype.regexAttrParser=function(a){var b;return b=a instanceof RegExp?a:a&&/^\/.+\/[gim]?$/.test(a)?new RegExp(a.split("/")[1],a.split("/")[2]):a},m.prototype.stringify=function(a,b,c){if(a instanceof Date?a=a.toISOString():null===a&&(a=""),"string"==typeof a||"number"==typeof a||"boolean"==typeof a)return[encodeURIComponent(b)+"="+encodeURIComponent(a)];var d=[];if("undefined"==typeof a)return d;for(var e=Object.keys(a),f=0,g=e.length;f=new Date(b.exp)){var g=f.get("StormpathOAuth");return g.refresh().then(function(){return a.getAccessToken()})}return e})},g.prototype.getRefreshToken=function(){return this.getTokenResponse().then(function(a){return a?a.refreshToken:c.reject()})},g.prototype.getTokenType=function(){return this.getTokenResponse().then(function(a){return a?a.tokenType:c.reject()})},new g},this.$get.$inject=["$q","$normalizeObjectKeys","TokenStoreManager","$injector"]}]).provider("StormpathOAuth",["STORMPATH_CONFIG",function(a){var c;this.$get=function(d,e,f){function g(){return this.refreshPromise=null,this}return g.prototype.authenticate=function(c,g){var h=b.extend({grant_type:"password"},c),i=b.extend({Accept:"application/json"},g);return d(e.formPost({url:a.getUrl("OAUTH_AUTHENTICATION_ENDPOINT"),method:"POST",headers:i,data:h})).then(function(a){return f.setTokenResponse(a.data),a})},g.prototype.revoke=function(){return f.getTokenResponse().then(function(b){var c={token:b.refreshToken||b.accessToken,token_type_hint:b.refreshToken?"refresh_token":"access_token"};return d(e.formPost({url:a.getUrl("OAUTH_REVOKE_ENDPOINT"),method:"POST",data:c}))["finally"](function(a){return f.removeToken(),a})})},g.prototype.refresh=function(c,g){var h=this;return h.refreshPromise?h.refreshPromise:h.refreshPromise=f.getRefreshToken().then(function(i){var j=b.extend({grant_type:"refresh_token",refresh_token:i},c),k=b.extend({Accept:"application/json"},g);return d(e.formPost({url:a.getUrl("OAUTH_AUTHENTICATION_ENDPOINT"),method:"POST",headers:k,data:j})).then(function(a){return f.setTokenResponse(a.data),a})["catch"](function(a){return f.removeToken(),a})["finally"](function(){h.refreshPromise=null})})},c||(c=new g),c},this.$get.$inject=["$http","$spFormEncoder","StormpathOAuthToken"]}]).factory("StormpathOAuthInterceptor",["$isCurrentDomain","$rootScope","$q","$injector","StormpathOAuthToken","STORMPATH_CONFIG",function(a,b,c,d,e,f){function g(){}return g.prototype.request=function(a){return f.AUTO_AUTHORIZED_URIS.some(function(b){var c=b instanceof RegExp?b:new RegExp(b);return c.test(a.url)})?e.getAccessToken().then(function(b){return a.headers.Authorization="Bearer "+b,a})["catch"](function(){return a}):a},new g}]).config(["$httpProvider",function(a){a.interceptors.push("StormpathOAuthInterceptor")}]),b.module("stormpath").controller("SpPasswordResetRequestCtrl",["$scope","$user",function(a,b){a.sent=!1,a.posting=!1,a.formModel={username:""},a.error=null,a.submit=function(){a.posting=!0,a.error=null,b.passwordResetRequest({email:a.formModel.email}).then(function(){a.sent=!0})["catch"](function(b){a.error=b.message})["finally"](function(){a.posting=!1})}}]).controller("SpPasswordResetCtrl",["$scope","$location","$user",function(a,b,c){var d=b.search().sptoken;a.showVerificationError=!1,a.verifying=!1,a.verified=!1,a.posting=!1,a.reset=!1,a.error=null,a.resendFailed=!1,a.formModel={password:"",confirmPassword:""},"string"==typeof d?(a.verifying=!0,c.verifyPasswordResetToken(d).then(function(){a.verified=!0})["catch"](function(){a.showVerificationError=!0})["finally"](function(){a.verifying=!1})):a.showVerificationError=!0,a.submit=function(){return a.formModel.password!==a.formModel.confirmPassword?void(a.error="Passwords do not match"):(a.posting=!0,a.error=null,a.showVerificationError=!1,void c.resetPassword(d,{password:a.formModel.password}).then(function(){a.reset=!0})["catch"](function(b){a.error=b.message})["finally"](function(){a.posting=!1}))}}]).directive("spPasswordResetRequestForm",function(){return{templateUrl:function(a,b){return b.templateUrl||"spPasswordResetRequestForm.tpl.html"},controller:"SpPasswordResetRequestCtrl"}}).directive("spPasswordResetForm",function(){return{templateUrl:function(a,b){return b.templateUrl||"spPasswordResetForm.tpl.html"},controller:"SpPasswordResetCtrl"}}),b.module("stormpath").controller("SpRegistrationFormCtrl",["$scope","$user","$auth","$location","$viewModel","$injector",function(a,b,c,d,e,f){a.formModel="object"==typeof a.formModel?a.formModel:{},a.created=!1,a.enabled=!1,a.creating=!1,a.authenticating=!1,a.viewModel=null,e.getRegisterModel().then(function(b){b.accountStores=b.accountStores.filter(function(a){return a.authorizeUri&&null!==a.authorizeUri}),a.viewModel=b})["catch"](function(a){throw new Error("Could not load login view model from back-end: "+a.message)}),a.submit=function(){a.creating=!0,a.error=null,b.create(a.formModel).then(function(b){a.created=!0,a.enabled="ENABLED"===b.status,a.enabled&&a.autoLogin?(a.authenticating=!0,c.authenticate({username:a.formModel.email,password:a.formModel.password}).then(function(){var b=f.has("$state")?f.get("$state"):null;a.postLoginState&&b?b.go(a.postLoginState):a.postLoginPath&&d.path(a.postLoginPath)})["catch"](function(b){a.error=b.message})["finally"](function(){a.authenticating=!1,a.creating=!1})):a.creating=!1})["catch"](function(b){a.creating=!1,a.error=b.message})}}]).directive("spRegistrationForm",function(){return{templateUrl:function(a,b){return b.templateUrl||"spRegistrationForm.tpl.html"},controller:"SpRegistrationFormCtrl",link:function(a,b,c){a.autoLogin="true"===c.autoLogin,a.postLoginPath=c.postLoginPath||"",a.postLoginState=c.postLoginState||""}}}),function(){function a(a,b,c,d,e){this.providersPromise=null,this.STORMPATH_CONFIG=a,this.$encodeQueryParams=b,this.$getLocalUrl=c,this.$http=d,this.$window=e}a.prototype.authorize=function(a,c){var d=b.extend({response_type:this.STORMPATH_CONFIG.SOCIAL_LOGIN_RESPONSE_TYPE,account_store_href:a.href,redirect_uri:this.$getLocalUrl(this.STORMPATH_CONFIG.SOCIAL_LOGIN_REDIRECT_URI)},c),e=this.$encodeQueryParams(d),f=a.authorizeUri+e;this.$window.location=f},b.module("stormpath.socialLogin",["stormpath.CONFIG","stormpath.utils"]).config(["$injector","STORMPATH_CONFIG",function(b,c){var d=["$encodeQueryParams","$http","$window","$getLocalUrl",function(b,d,e,f){return new a(c,b,f,d,e)}];b.get("$provide").factory(c.SOCIAL_LOGIN_SERVICE_NAME,d)}]).directive("spSocialLogin",["$viewModel","$auth","$http","$injector","STORMPATH_CONFIG",function(a,c,d,e,f){return{link:function(a,c,d){var g=a.$eval(d.spSocialLogin),h=["href","providerId","clientId"],i=e.get(f.SOCIAL_LOGIN_SERVICE_NAME);a.providerName=g.provider.providerId,c.bind("click",function(){var a={};b.forEach(g.provider,function(b,c){b&&h.indexOf(c)!==-1&&(a[c]=b)}),a=b.extend(a,f.getSocialLoginConfiguration(g.provider.providerId)),i.authorize(g,a)})}}}]).factory("$processSocialAuthToken",["STORMPATH_CONFIG","$parseUrl","$window","$injector","$q","$rootScope",function(a,b,c,d,e,f){return function(){var g=b(c.location.href);if(g.search.jwtResponse){var h=d.get(a.AUTH_SERVICE_NAME);return h.authenticate({grant_type:"stormpath_token",token:g.search.jwtResponse}).then(function(){c.location.search="",f.$broadcast(a.AUTHENTICATION_SUCCESS_EVENT_NAME)})["catch"](function(b){throw f.$broadcast(a.AUTHENTICATION_FAILURE_EVENT_NAME),b})}return e.resolve()}}])}(),b.module("storpath.tokenStore",["stormpath.CONFIG"]).provider("TokenStoreManager",function(){var a={};this.$get=function(){return{registerTokenStore:function(c,d){var e=["get","put","remove"],f=d&&e.reduce(function(a,c){return a&&b.isFunction(d[c])},!0);if(!f)throw new Error("Invalid token store. `get`, `put` and `remove` methods must be implemented");a[c]=d},getTokenStore:function(c){if(b.isUndefined(a[c]))throw new Error("Unrecognised token store: "+c);return a[c]}}}}).factory("LocalStorageTokenStore",["$q",function(a){function d(){this._checkAvailability()}return d.prototype._checkAvailability=function(){if(typeof localStorage===c)this.hasLocalStorage=!1;else try{localStorage.setItem("sp:feature_test","test"),"test"===localStorage.getItem("sp:feature_test")?(localStorage.removeItem("sp:feature_test"),this.hasLocalStorage=!0):this.hasLocalStorage=!1}catch(a){this.hasLocalStorage=!1}},d.prototype._notImplementedError=function(){return a.reject({error:{message:"Local storage not supported in this environment"}})},d.prototype.put=function(b,c){if(!this.hasLocalStorage)return this._notImplementedError();var d;try{d=JSON.stringify(c)}catch(e){return a.reject(e)}return localStorage.setItem(b,d),a.resolve()},d.prototype.get=function(c){if(!this.hasLocalStorage)return this._notImplementedError();var d=localStorage.getItem(c);if(b.isDefined(d))try{return a.resolve(JSON.parse(d))}catch(e){return a.reject(e)}return a.reject(new Error("Token not found"))},d.prototype.remove=function(b){return this.hasLocalStorage?(localStorage.removeItem(b),a.resolve()):this._notImplementedError()},new d}]).run(["TokenStoreManager","LocalStorageTokenStore",function(a,b){a.registerTokenStore("localStorage",b)}]),b.module("stormpath.userService",["stormpath.CONFIG","stormpath.utils","stormpath.socialLogin"]).provider("$user",[function(){function a(a){var b=this;Object.keys(a).map(function(c){b[c]=a[c]})}a.prototype.inGroup=function(a){return this.groups.items.filter(function(b){return b.name===a}).length>0},a.prototype.matchesGroupExpression=function(a){return this.groups.items.filter(function(b){return a.test(b.name)}).length>0},a.prototype.groupTest=function(a){return!!(a instanceof RegExp&&this.matchesGroupExpression(a))||!!this.inGroup(a)},this.$get=["$q","$http","STORMPATH_CONFIG","$rootScope","$spFormEncoder","$spErrorTransformer","$processSocialAuthToken",function(b,c,d,e,f,g,h){function i(){return this.cachedUserOp=null,this.currentUser=null,this}function j(a){e.$broadcast(d.REGISTERED_EVENT_NAME,a)}function k(a){e.$broadcast(d.GET_USER_EVENT,a)}function l(){e.$broadcast(d.NOT_LOGGED_IN_EVENT)}i.prototype.create=function(a){return c({url:d.getUrl("REGISTER_URI"),method:"POST",data:a}).then(function(a){var c=a.data.account||a.data;return j(c),b.resolve(c)},function(a){return b.reject(g.transformError(a))})},i.prototype.get=function(e){var f=b.defer(),g=this;if(g.cachedUserOp)return g.cachedUserOp.promise;if(null!==g.currentUser&&g.currentUser!==!1&&e!==!0)return f.resolve(g.currentUser),f.promise;g.cachedUserOp=f;var i=g.currentUser?b.resolve():h();return i.then(function(){return c.get(d.getUrl("CURRENT_USER_URI")).then(function(b){g.cachedUserOp=null,g.currentUser=new a(b.data.account||b.data),k(g.currentUser),f.resolve(g.currentUser)},function(a){g.currentUser=!1,401===a.status&&l(),g.cachedUserOp=null,f.reject(a)}),f.promise})},i.prototype.resendVerificationEmail=function(a){return c({method:"POST",url:d.getUrl("EMAIL_VERIFICATION_ENDPOINT"),data:a})},i.prototype.verify=function(a){return c({url:d.getUrl("EMAIL_VERIFICATION_ENDPOINT")+"?sptoken="+a})},i.prototype.verifyPasswordResetToken=function(a){return c({url:d.getUrl("CHANGE_PASSWORD_ENDPOINT")+"?sptoken="+a})},i.prototype.passwordResetRequest=function(a){return c({method:"POST",url:d.getUrl("FORGOT_PASSWORD_ENDPOINT"),data:a})["catch"](function(a){return b.reject(g.transformError(a))})},i.prototype.resetPassword=function(a,e){return e.sptoken=a,c({method:"POST",url:d.getUrl("CHANGE_PASSWORD_ENDPOINT"),data:e})["catch"](function(a){return b.reject(g.transformError(a))})};var m=new i;return e.$on(d.SESSION_END_EVENT,function(){m.currentUser=!1}),m}]}]),b.module("stormpath.utils",["stormpath.CONFIG"]).factory("$isCurrentDomain",["$window",function(a){return function(b){var c=a.document.createElement("a");return c.href=b,""===c.host||a.location.host===c.host.replace(/:443$/,"")}}]).constant("$spHeaders",{"X-Stormpath-Agent":"stormpath-sdk-angularjs/2.0.1 angularjs/"+b.version.full}).provider("$spErrorTransformer",[function(){this.$get=[function(){function a(){}return a.prototype.transformError=function(a){var b=null;a.data&&(b=a.data.message||a.data.error),b||(b="An error occured when communicating with the server.");var c=new Error(b);return c.httpResponse=a,c.statusCode=a.status,c},new a}]}]).provider("$spFormEncoder",[function(){this.$get=[function(){function a(){var a=new b;return this.encodeUrlForm=a.encode.bind(a),this}function b(){return this.delimiter="&",this.arrayPrefixGenerators={brackets:function(a){return a+"[]"},indices:function(a,b){return a+"["+b+"]"},repeat:function(a){return a}},this}return a.prototype.formPost=function(a){var b=a.headers?a.headers:a.headers={};return b["Content-Type"]="application/x-www-form-urlencoded",a.data=this.encodeUrlForm(a.data),a},b.prototype.stringify=function(a,b,c){if(a instanceof Date?a=a.toISOString():null===a&&(a=""),"string"==typeof a||"number"==typeof a||"boolean"==typeof a)return[encodeURIComponent(b)+"="+encodeURIComponent(a)];var d=[];if("undefined"==typeof a)return d;for(var e=Object.keys(a),f=0,g=e.length;f