78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var path = require('path');
 | 
						|
var url = require('url');
 | 
						|
 | 
						|
var isRemoteResource = require('../utils/is-remote-resource');
 | 
						|
var hasProtocol = require('../utils/has-protocol');
 | 
						|
 | 
						|
var HTTP_PROTOCOL = 'http:';
 | 
						|
 | 
						|
function isAllowedResource(uri, isRemote, rules) {
 | 
						|
  var match;
 | 
						|
  var absoluteUri;
 | 
						|
  var allowed = !isRemote;
 | 
						|
  var rule;
 | 
						|
  var isNegated;
 | 
						|
  var normalizedRule;
 | 
						|
  var i;
 | 
						|
 | 
						|
  if (rules.length === 0) {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
 | 
						|
  if (isRemote && !hasProtocol(uri)) {
 | 
						|
    uri = HTTP_PROTOCOL + uri;
 | 
						|
  }
 | 
						|
 | 
						|
  match = isRemote
 | 
						|
    ? url.parse(uri).host
 | 
						|
    : uri;
 | 
						|
 | 
						|
  absoluteUri = isRemote
 | 
						|
    ? uri
 | 
						|
    : path.resolve(uri);
 | 
						|
 | 
						|
  for (i = 0; i < rules.length; i++) {
 | 
						|
    rule = rules[i];
 | 
						|
    isNegated = rule[0] == '!';
 | 
						|
    normalizedRule = rule.substring(1);
 | 
						|
 | 
						|
    if (isNegated && isRemote && isRemoteRule(normalizedRule)) {
 | 
						|
      allowed = allowed && !isAllowedResource(uri, true, [normalizedRule]);
 | 
						|
    } else if (isNegated && !isRemote && !isRemoteRule(normalizedRule)) {
 | 
						|
      allowed = allowed && !isAllowedResource(uri, false, [normalizedRule]);
 | 
						|
    } else if (isNegated) {
 | 
						|
      allowed = allowed && true;
 | 
						|
    } else if (rule == 'all') {
 | 
						|
      allowed = true;
 | 
						|
    } else if (isRemote && rule == 'local') {
 | 
						|
      allowed = allowed || false;
 | 
						|
    } else if (isRemote && rule == 'remote') {
 | 
						|
      allowed = true;
 | 
						|
    } else if (!isRemote && rule == 'remote') {
 | 
						|
      allowed = false;
 | 
						|
    } else if (!isRemote && rule == 'local') {
 | 
						|
      allowed = true;
 | 
						|
    } else if (rule === match) {
 | 
						|
      allowed = true;
 | 
						|
    } else if (rule === uri) {
 | 
						|
      allowed = true;
 | 
						|
    } else if (isRemote && absoluteUri.indexOf(rule) === 0) {
 | 
						|
      allowed = true;
 | 
						|
    } else if (!isRemote && absoluteUri.indexOf(path.resolve(rule)) === 0) {
 | 
						|
      allowed = true;
 | 
						|
    } else if (isRemote != isRemoteRule(normalizedRule)) {
 | 
						|
      allowed = allowed && true;
 | 
						|
    } else {
 | 
						|
      allowed = false;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return allowed;
 | 
						|
}
 | 
						|
 | 
						|
function isRemoteRule(rule) {
 | 
						|
  return isRemoteResource(rule) || url.parse(HTTP_PROTOCOL + '//' + rule).host == rule;
 | 
						|
}
 | 
						|
 | 
						|
module.exports = isAllowedResource;
 |