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));
 |