parse_external_profile.coffee 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. OmegaTarget = require('omega-target')
  2. OmegaPac = OmegaTarget.OmegaPac
  3. module.exports = (details, options, fixedProfileConfig) ->
  4. if details.name
  5. details
  6. else
  7. switch details.value.mode
  8. when 'system'
  9. OmegaPac.Profiles.byName('system')
  10. when 'direct'
  11. OmegaPac.Profiles.byName('direct')
  12. when 'auto_detect'
  13. OmegaPac.Profiles.create({
  14. profileType: 'PacProfile'
  15. name: ''
  16. pacUrl: 'http://wpad/wpad.dat'
  17. })
  18. when 'pac_script'
  19. url = details.value.pacScript.url
  20. if url
  21. profile = null
  22. OmegaPac.Profiles.each options, (key, p) ->
  23. if p.profileType == 'PacProfile' and p.pacUrl == url
  24. profile = p
  25. profile ? OmegaPac.Profiles.create({
  26. profileType: 'PacProfile'
  27. name: ''
  28. pacUrl: url
  29. })
  30. else do ->
  31. profile = null
  32. script = details.value.pacScript.data
  33. OmegaPac.Profiles.each options, (key, p) ->
  34. if p.profileType == 'PacProfile' and p.pacScript == script
  35. profile = p
  36. return profile if profile
  37. # Try to parse the prefix used by this class.
  38. script = script.trim()
  39. magic = '/*OmegaProfile*'
  40. if script.substr(0, magic.length) == magic
  41. end = script.indexOf('*/')
  42. if end > 0
  43. i = magic.length
  44. tokens = script.substring(magic.length, end).split('*')
  45. [profileName, revision] = tokens
  46. try
  47. profileName = JSON.parse(profileName)
  48. catch
  49. profileName = null
  50. if profileName and revision
  51. profile = OmegaPac.Profiles.byName(profileName, options)
  52. if OmegaPac.Revision.compare(profile.revision, revision) == 0
  53. return profile
  54. return OmegaPac.Profiles.create({
  55. profileType: 'PacProfile'
  56. name: ''
  57. pacScript: script
  58. })
  59. when 'fixed_servers'
  60. props = ['proxyForHttp', 'proxyForHttps', 'proxyForFtp',
  61. 'fallbackProxy', 'singleProxy']
  62. proxies = {}
  63. for prop in props
  64. result = OmegaPac.Profiles.pacResult(details.value.rules[prop])
  65. if prop == 'singleProxy' and details.value.rules[prop]?
  66. proxies['fallbackProxy'] = result
  67. else
  68. proxies[prop] = result
  69. bypassSet = {}
  70. bypassCount = 0
  71. if details.value.rules.bypassList
  72. for pattern in details.value.rules.bypassList
  73. bypassSet[pattern] = true
  74. bypassCount++
  75. if bypassSet['<local>']
  76. for host in OmegaPac.Conditions.localHosts when bypassSet[host]
  77. delete bypassSet[host]
  78. bypassCount--
  79. profile = null
  80. OmegaPac.Profiles.each options, (key, p) ->
  81. return if p.profileType != 'FixedProfile'
  82. return if p.bypassList.length != bypassCount
  83. for condition in p.bypassList
  84. return unless bypassSet[condition.pattern]
  85. rules = fixedProfileConfig(p).rules
  86. if rules['singleProxy']
  87. rules['fallbackProxy'] = rules['singleProxy']
  88. delete rules['singleProxy']
  89. return unless rules?
  90. for prop in props when rules[prop] or proxies[prop]
  91. if OmegaPac.Profiles.pacResult(rules[prop]) != proxies[prop]
  92. return
  93. profile = p
  94. if profile
  95. profile
  96. else
  97. profile = OmegaPac.Profiles.create({
  98. profileType: 'FixedProfile'
  99. name: ''
  100. })
  101. for prop in props when details.value.rules[prop]
  102. if prop == 'singleProxy'
  103. profile['fallbackProxy'] = details.value.rules[prop]
  104. else
  105. profile[prop] = details.value.rules[prop]
  106. profile.bypassList =
  107. for own pattern of bypassSet
  108. {conditionType: 'BypassCondition', pattern: pattern}
  109. profile