| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- OmegaTarget = require('omega-target')
- OmegaPac = OmegaTarget.OmegaPac
- module.exports = (details, options, fixedProfileConfig) ->
- if details.name
- details
- else
- switch details.value.mode
- when 'system'
- OmegaPac.Profiles.byName('system')
- when 'direct'
- OmegaPac.Profiles.byName('direct')
- when 'auto_detect'
- OmegaPac.Profiles.create({
- profileType: 'PacProfile'
- name: ''
- pacUrl: 'http://wpad/wpad.dat'
- })
- when 'pac_script'
- url = details.value.pacScript.url
- if url
- profile = null
- OmegaPac.Profiles.each options, (key, p) ->
- if p.profileType == 'PacProfile' and p.pacUrl == url
- profile = p
- profile ? OmegaPac.Profiles.create({
- profileType: 'PacProfile'
- name: ''
- pacUrl: url
- })
- else do ->
- profile = null
- script = details.value.pacScript.data
- OmegaPac.Profiles.each options, (key, p) ->
- if p.profileType == 'PacProfile' and p.pacScript == script
- profile = p
- return profile if profile
- # Try to parse the prefix used by this class.
- script = script.trim()
- magic = '/*OmegaProfile*'
- if script.substr(0, magic.length) == magic
- end = script.indexOf('*/')
- if end > 0
- i = magic.length
- tokens = script.substring(magic.length, end).split('*')
- [profileName, revision] = tokens
- try
- profileName = JSON.parse(profileName)
- catch
- profileName = null
- if profileName and revision
- profile = OmegaPac.Profiles.byName(profileName, options)
- if OmegaPac.Revision.compare(profile.revision, revision) == 0
- return profile
- return OmegaPac.Profiles.create({
- profileType: 'PacProfile'
- name: ''
- pacScript: script
- })
- when 'fixed_servers'
- props = ['proxyForHttp', 'proxyForHttps', 'proxyForFtp',
- 'fallbackProxy', 'singleProxy']
- proxies = {}
- for prop in props
- result = OmegaPac.Profiles.pacResult(details.value.rules[prop])
- if prop == 'singleProxy' and details.value.rules[prop]?
- proxies['fallbackProxy'] = result
- else
- proxies[prop] = result
- bypassSet = {}
- bypassCount = 0
- if details.value.rules.bypassList
- for pattern in details.value.rules.bypassList
- bypassSet[pattern] = true
- bypassCount++
- if bypassSet['<local>']
- for host in OmegaPac.Conditions.localHosts when bypassSet[host]
- delete bypassSet[host]
- bypassCount--
- profile = null
- OmegaPac.Profiles.each options, (key, p) ->
- return if p.profileType != 'FixedProfile'
- return if p.bypassList.length != bypassCount
- for condition in p.bypassList
- return unless bypassSet[condition.pattern]
- rules = fixedProfileConfig(p).rules
- if rules['singleProxy']
- rules['fallbackProxy'] = rules['singleProxy']
- delete rules['singleProxy']
- return unless rules?
- for prop in props when rules[prop] or proxies[prop]
- if OmegaPac.Profiles.pacResult(rules[prop]) != proxies[prop]
- return
- profile = p
- if profile
- profile
- else
- profile = OmegaPac.Profiles.create({
- profileType: 'FixedProfile'
- name: ''
- })
- for prop in props when details.value.rules[prop]
- if prop == 'singleProxy'
- profile['fallbackProxy'] = details.value.rules[prop]
- else
- profile[prop] = details.value.rules[prop]
- profile.bypassList =
- for own pattern of bypassSet
- {conditionType: 'BypassCondition', pattern: pattern}
- profile
|