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