98 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
;(function (exports) {
 | 
						|
  'use strict';
 | 
						|
 | 
						|
  var OAUTH3 = window.OAUTH3 || require('./oauth3.js');
 | 
						|
 | 
						|
  OAUTH3.authz = OAUTH3.authz || {};
 | 
						|
  OAUTH3.authz.scopes = function (providerUri, session, clientParams) {
 | 
						|
    // OAuth3.requests.grants(providerUri, {});         // return list of grants
 | 
						|
    // OAuth3.checkGrants(providerUri, {});             //
 | 
						|
    var clientUri = OAUTH3.core.normalizeUri(clientParams.client_id || clientParams.client_uri);
 | 
						|
    var scope = clientParams.scope || '';
 | 
						|
    var clientObj = clientParams;
 | 
						|
 | 
						|
    if (!scope) {
 | 
						|
      scope = 'oauth3_authn';
 | 
						|
    }
 | 
						|
 | 
						|
    return OAUTH3.requests.grants(providerUri, {
 | 
						|
      method: 'GET'
 | 
						|
    , client_id: clientUri
 | 
						|
    , client_uri: clientUri
 | 
						|
    , session: session
 | 
						|
    }).then(function (grants) {
 | 
						|
      var myGrants;
 | 
						|
      var grantedScopes;
 | 
						|
      var grantedScopesMap;
 | 
						|
      var pendingScopes;
 | 
						|
      var acceptedScopes;
 | 
						|
      var acceptedScopesMap;
 | 
						|
      var scopes = OAUTH3.core.parsescope(scope);
 | 
						|
      var callbackUrl;
 | 
						|
 | 
						|
      console.log('previous grants:');
 | 
						|
      console.log(grants);
 | 
						|
 | 
						|
      // it doesn't matter who the referrer is as long as the destination
 | 
						|
      // is an authorized destination for the client in question
 | 
						|
      // (though it may not hurt to pass the referrer's info on to the client)
 | 
						|
      if (!OAUTH3.checkRedirect(grants.client, clientObj)) {
 | 
						|
        callbackUrl = 'https://oauth3.org/docs/errors#E_REDIRECT_ATTACK'
 | 
						|
          + '?redirect_uri=' + clientObj.redirect_uri
 | 
						|
          + '&allowed_urls=' + grants.client.url
 | 
						|
          + '&client_id=' + clientUri
 | 
						|
          + '&referrer_uri=' + OAUTH3.core.normalizeUri(window.document.referrer)
 | 
						|
          ;
 | 
						|
        location.href = callbackUrl;
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      console.warn("What are grants? Baby don't hurt me. Don't hurt me. No more.");
 | 
						|
      console.warn(grants);
 | 
						|
 | 
						|
      myGrants = grants.grants.filter(function (grant) {
 | 
						|
        if (clientUri === (grant.azp || grant.oauth_client_id || grant.oauthClientId)) {
 | 
						|
          return true;
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      grantedScopesMap = {};
 | 
						|
      acceptedScopesMap = {};
 | 
						|
      pendingScopes = scopes.filter(function (requestedScope) {
 | 
						|
        return myGrants.every(function (grant) {
 | 
						|
          if (!grant.scope) {
 | 
						|
            grant.scope = 'oauth3_authn';
 | 
						|
          }
 | 
						|
          var gscopes = grant.scope.split(/[+, ]/g);
 | 
						|
          gscopes.forEach(function (s) { grantedScopesMap[s] = true; });
 | 
						|
          if (-1 !== gscopes.indexOf(requestedScope)) {
 | 
						|
            // already accepted in the past
 | 
						|
            acceptedScopesMap[requestedScope] = true;
 | 
						|
          }
 | 
						|
          else {
 | 
						|
            // true, is pending
 | 
						|
            return true;
 | 
						|
          }
 | 
						|
        });
 | 
						|
      });
 | 
						|
      grantedScopes = Object.keys(grantedScopesMap);
 | 
						|
      acceptedScopes = Object.keys(acceptedScopesMap);
 | 
						|
 | 
						|
      return {
 | 
						|
        pending: pendingScopes    // not yet accepted
 | 
						|
      , granted: grantedScopes    // all granted, ever
 | 
						|
      , requested: scopes         // all requested, now
 | 
						|
      , accepted: acceptedScopes  // granted (ever) and requested (now)
 | 
						|
      , client: grants.client
 | 
						|
      , grants: grants.grants
 | 
						|
      };
 | 
						|
    });
 | 
						|
  };
 | 
						|
 | 
						|
  exports.OAUTH3_PROVIDER = OAUTH3;
 | 
						|
 | 
						|
  if ('undefined' !== typeof module) {
 | 
						|
    module.exports = OAUTH3;
 | 
						|
  }
 | 
						|
}('undefined' !== typeof exports ? exports : window));
 |