Blame view

node_modules/clean-css/lib/reader/is-allowed-resource.js 2.02 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  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;