159 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
 | 
						|
  // TODO move to a test / lint suite?
 | 
						|
  oauth3._lintPromise = function (PromiseA) {
 | 
						|
    var promise;
 | 
						|
    var x = 1;
 | 
						|
 | 
						|
    // tests that this promise has all of the necessary api
 | 
						|
    promise = new PromiseA(function (resolve, reject) {
 | 
						|
      //console.log('x [2]', x);
 | 
						|
      if (x !== 1) {
 | 
						|
        throw new Error("bad promise, create not Synchronous [0]");
 | 
						|
      }
 | 
						|
 | 
						|
      PromiseA.resolve().then(function () {
 | 
						|
        var promise2;
 | 
						|
 | 
						|
        //console.log('x resolve', x);
 | 
						|
        if (x !== 2) {
 | 
						|
          throw new Error("bad promise, resolve not Asynchronous [1]");
 | 
						|
        }
 | 
						|
 | 
						|
        promise2 = PromiseA.reject().then(reject, function () {
 | 
						|
          //console.log('x reject', x);
 | 
						|
          if (x !== 4) {
 | 
						|
            throw new Error("bad promise, reject not Asynchronous [2]");
 | 
						|
          }
 | 
						|
 | 
						|
          if ('undefined' === typeof angular) {
 | 
						|
            throw new Error("[NOT AN ERROR] Dear angular users: ignore this error-handling test");
 | 
						|
          } else {
 | 
						|
            return PromiseA.reject(new Error("[NOT AN ERROR] ignore this error-handling test"));
 | 
						|
          }
 | 
						|
        });
 | 
						|
 | 
						|
        x = 4;
 | 
						|
 | 
						|
        return promise2;
 | 
						|
      }).catch(function (e) {
 | 
						|
        if (e.message.match('NOT AN ERROR')) {
 | 
						|
          resolve({ success: true });
 | 
						|
        } else {
 | 
						|
          reject(e);
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      x = 3;
 | 
						|
    });
 | 
						|
 | 
						|
    x = 2;
 | 
						|
    return promise;
 | 
						|
  };
 | 
						|
 | 
						|
  oauth3._lintDirectives = function (providerUri, directives) {
 | 
						|
    var params = { directives: directives };
 | 
						|
    console.log('DEBUG oauth3._discoverHelper', directives);
 | 
						|
    var err;
 | 
						|
    if (!params.directives) {
 | 
						|
      err = new Error(params.error_description || "Unknown error when discoving provider '" + providerUri + "'");
 | 
						|
      err.code = params.error || "E_UNKNOWN_ERROR";
 | 
						|
      return OAUTH3.PromiseA.reject(err);
 | 
						|
    }
 | 
						|
 | 
						|
    try {
 | 
						|
      directives = JSON.parse(atob(params.directives));
 | 
						|
      console.log('DEBUG oauth3._discoverHelper directives', directives);
 | 
						|
    } catch(e) {
 | 
						|
      err = new Error(params.error_description || "could not parse directives for provider '" + providerUri + "'");
 | 
						|
      err.code = params.error || "E_PARSE_DIRECTIVE";
 | 
						|
      return OAUTH3.PromiseA.reject(err);
 | 
						|
    }
 | 
						|
    if (
 | 
						|
        (directives.authorization_dialog && directives.authorization_dialog.url)
 | 
						|
      || (directives.access_token && directives.access_token.url)
 | 
						|
    ) {
 | 
						|
      // TODO lint directives
 | 
						|
      // TODO self-reference in directive for providerUri?
 | 
						|
      directives.provider_uri = providerUri;
 | 
						|
      localStorage.setItem('oauth3.' + providerUri + '.directives', JSON.stringify(directives));
 | 
						|
      localStorage.setItem('oauth3.' + providerUri + '.directives.updated_at', new Date().toISOString());
 | 
						|
 | 
						|
      return OAUTH3.PromiseA.resolve(directives);
 | 
						|
    } else {
 | 
						|
      // ignore
 | 
						|
      console.error("the directives provided by '" + providerUri + "' were invalid.");
 | 
						|
      params.error = params.error || "E_INVALID_DIRECTIVE";
 | 
						|
      params.error_description = params.error_description
 | 
						|
        || "directives did not include authorization_dialog.url";
 | 
						|
      err = new Error(params.error_description || "Unknown error when discoving provider '" + providerUri + "'");
 | 
						|
      err.code = params.error;
 | 
						|
      return OAUTH3.PromiseA.reject(err);
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  core.tokenState = function (session) {
 | 
						|
    var fresh;
 | 
						|
    fresh = (Date.now() / 1000) >= (parseInt(session._accessTokenData.exp) || 0);
 | 
						|
    if (!fresh) {
 | 
						|
      console.log("[os] isn't fresh", session._accessTokenData.exp);
 | 
						|
    }
 | 
						|
  };
 | 
						|
  oauth3._lintRequest = function (preq, opts) {
 | 
						|
    var providerUri;
 | 
						|
 | 
						|
    console.log('[os] request meta opts', opts);
 | 
						|
 | 
						|
    // check that the JWT is not expired
 | 
						|
    // TODO check that this request applies to the aud and azp
 | 
						|
    if (!(preq.session && preq.session.accessToken)) {
 | 
						|
      console.log('[os] no session/accessTokenData');
 | 
						|
      return oauth3.PromiseA.resolve(preq);
 | 
						|
    }
 | 
						|
 | 
						|
    preq.headers = preq.headers || {};
 | 
						|
    preq.headers.Authorization = 'Bearer ' + preq.session.accessToken;
 | 
						|
 | 
						|
    if (!preq.session._accessTokenData) {
 | 
						|
      console.log('[os] no _accessTokenData');
 | 
						|
      preq.session._accessTokenData = core.jwt.decode(preq.session.accessToken).payload;
 | 
						|
    }
 | 
						|
 | 
						|
    if (!preq.url.match(preq.session._accessTokenData.aud)) {
 | 
						|
      console.log("[os] doesn't match audience", preq.session._accessTokenData.aud);
 | 
						|
      return oauth3.PromiseA.resolve(preq);
 | 
						|
    }
 | 
						|
 | 
						|
    switch (core.tokenState(session)) {
 | 
						|
      case 'fresh':
 | 
						|
        return oauth3.PromiseA.resolve(preq);
 | 
						|
      case 'stale':
 | 
						|
      case 'useless':
 | 
						|
        break;
 | 
						|
    }
 | 
						|
 | 
						|
    if (!preq.session.refreshToken) {
 | 
						|
      console.log("[os] can't refresh", preq.session);
 | 
						|
      return oauth3.PromiseA.resolve(preq);
 | 
						|
    }
 | 
						|
 | 
						|
    opts.refreshToken = preq.session.refreshToken;
 | 
						|
    console.log('[oauth3.js] refreshToken attempt');
 | 
						|
 | 
						|
    // TODO include directive?
 | 
						|
    providerUri = preq.session.providerUri || preq.session._accessTokenData.iss;
 | 
						|
    //opts.
 | 
						|
    return oauth3.refreshToken(providerUri, opts).then(function (res) {
 | 
						|
      console.log('[oauth3.js] refreshToken result:', res);
 | 
						|
 | 
						|
      if (!res.data.accessToken) {
 | 
						|
        return preq;
 | 
						|
      }
 | 
						|
 | 
						|
      // TODO fire session update event
 | 
						|
      res.data.providerUri = preq.session.providerUri;
 | 
						|
      preq.session = res.data;
 | 
						|
      preq.headers.Authorization = 'Bearer ' + preq.session.accessToken;
 | 
						|
      return preq;
 | 
						|
    });
 | 
						|
  };
 |