You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							77 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							77 lines
						
					
					
						
							2.0 KiB
						
					
					
				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 ? false : true; | 
						|
  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;
 | 
						|
 |