Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
hd-community-waf / usr / local / share / lua / 5.1 / resty / woothee / browser.lua
Size: Mime:
local _M = { }

local util = require('resty.woothee.util')
local dataset = require('resty.woothee.dataset')

function _M.challenge_MSIE(ua, result)
  if not string.find(ua, 'compatible; MSIE', 1, true) and not string.find(ua, 'Trident/', 1, true) and not string.find(ua, 'IEMobile/', 1, true) then
    return false;
  end

  local version = dataset.VALUE_UNKNOWN;
  local match, err
  match, err = util.check_regex_single(ua, [[MSIE ([.0-9]+);]])
  if match then
    version = match[1]
  else
    local match1, err1 = util.check_regex_single(ua, [[Trident/([.0-9]+);]])
    local match2, err2 = util.check_regex_single(ua, [[ rv:([.0-9]+)]])
    if match1 and match2 then
      version = match2[1]
    else
      match, err = util.check_regex_single(ua, [[IEMobile/([.0-9]+);]])
      if match then
        version = match[1]
      end
    end
  end

  util.update_map(result, dataset.get('MSIE'))
  util.update_version(result, version)
  return true;
end


function _M.challenge_safari_chrome(ua, result)
  if not string.find(ua, 'Safari/', 1, true) then
    return false
  elseif string.find(ua, 'Chrome', 1, true) and string.find(ua, 'wv', 1, true) then
    return false
  elseif string.find(ua, 'Google Web Preview', 1, true) then
    -- really????
    return false
  end

  local version = dataset.VALUE_UNKNOWN;
  local match_regex_list = {
    "Edge/([.0-9]+)",
    "Edg/([.0-9]+)",
    "EdgiOS/([.0-9]+)",
    "EdgA/([.0-9]+)"
  }

  for _, regex in ipairs(match_regex_list) do
    local match, err = util.check_regex_single(ua, regex)
    if match then
      version = match[1]
      util.update_map(result, dataset.get('Edge'))
      util.update_version(result, version)
      return true
    end
  end

  local match, err = util.check_regex_single(ua, [[FxiOS/([.0-9]+)]])
  if match then
    version = match[1]
    util.update_map(result, dataset.get('Firefox'))
    util.update_version(result, version)
    return true
  end

  local match_regex_list = {
  "Chrome/([.0-9]+)",
  "CrMo/([.0-9]+)",
  "CriOS/([.0-9]+)"
  }

  for _, regex in ipairs(match_regex_list) do
    local match, err = util.check_regex_single(ua, regex)
    if match then
      local match_ob, err = util.check_regex_single(ua, [[OPR/([.0-9]+)]])
      if match_ob then
        -- Opera w/ blink
        version = match_ob[1]
        util.update_map(result, dataset.get('Opera'))
        util.update_version(result, version)
        return true
      end
  
      -- Chrome
      version = match[1]
      util.update_map(result, dataset.get('Chrome'))
      util.update_version(result, version)
      return true
    end
  end

  match, err = util.check_regex_single(ua, [[GSA/([.0-9]+)]])
  if match then
    version = match[1]
    util.update_map(result, dataset.get('GSA'))
    util.update_version(result, version)
    return true
  end

  match, err = util.check_regex_single(ua, [[Version/([.0-9]+)]])
  if match then
    version = match[1]
  end

  util.update_map(result, dataset.get('Safari'))
  util.update_version(result, version)
  return true;
end


function _M.challenge_firefox(ua, result)
  if not string.find(ua, 'Firefox/', 1, true) then
    return false
  end

  local version = dataset.VALUE_UNKNOWN
  local match, err = util.check_regex_single(ua, [[Firefox/([.0-9]+)]])
  if match then
    version = match[1]
  end

  util.update_map(result, dataset.get('Firefox'))
  util.update_version(result, version)
  return true
end


function _M.challenge_yandexbrowser(ua, result)
  if not string.find(ua, 'YaBrowser/', 1, true) then
    return false
  end

  local version = dataset.VALUE_UNKNOWN
  local match, err = util.check_regex_single(ua, [[YaBrowser/(%d+%.%d+%.%d+%.%d+)]])
  if match then
    version = match[1]
  end

  util.update_map(result, dataset.get('YaBrowser'))
  util.update_version(result, version)
  return true
end


function _M.challenge_opera(ua, result)
  if not string.find(ua, 'Opera', 1, true) then
    return false
  end

  local version = dataset.VALUE_UNKNOWN
  local match, err = util.check_regex_single(ua, [[Version/([.0-9]+)]])
  if match then
    version = match[1]
  else
    local match, err = util.check_regex_single(ua, [[Opera[/ ]([.0-9]+)]])
    if match then
      version = match[1]
    end
  end

  util.update_map(result, dataset.get('Opera'))
  util.update_version(result, version)
  return true;
end

function _M.challenge_webview(ua, result)
  local version = dataset.VALUE_UNKNOWN

  if string.find(ua, 'Chrome', 1, true) and string.find(ua, 'wv', 1, true) then
    local match, err = util.check_regex_single(ua, [[Version/([.0-9]+)]])
    if match then
      version = match[1]
    end
    util.update_map(result, dataset.get('Webview'))
    util.update_version(result, version)
    return true
  end

  local match_regex_list = {
    "iPhone; (.*)like Mac OS X",
    "iPad; (.*)like Mac OS X",
    "iPod (.*)like Mac OS"
  }

  for _, regex in ipairs(match_regex_list) do
    local match, err = util.check_regex_single(ua, regex)
    if match then
      if string.find(ua, 'Safari/', 1, true) then
        return false
      end
  
      local match, err = util.check_regex_single(ua, [[Version/([.0-9]+)]])
      if match then
        version = match[1]
      end

      util.update_map(result, dataset.get('Webview'))
      util.update_version(result, version)
      return true
    end
  end

  return false
end

function _M.challenge_sleipnir(ua, result)
  if not string.find(ua, 'Sleipnir/', 1, true) then
    return false
  end

  local version = dataset.VALUE_UNKNOWN
  local match, err = util.check_regex_single(ua, [[Sleipnir/([.0-9]+)]])
  if match then
    version = match[1]
  end
  util.update_map(result, dataset.get('Sleipnir'))
  util.update_version(result, version)

  -- [[
 --   Sleipnir's user-agent doesn't contain Windows version, so put 'Windows UNKNOWN Ver'.
 --   Sleipnir is IE component browser, so for Windows only.
 -- ]]

  local win = dataset.get('Win')
  util.update_category(result, win[dataset.KEY_CATEGORY])
  util.update_os(result, win[dataset.KEY_NAME])

  return true
end

function _M.challenge_vivaldi(ua, result)
  if not string.find(ua, 'Vivaldi/', 1, true) then
    return false
  end

  local version = dataset.VALUE_UNKNOWN
  local match, err = util.check_regex_single(ua, [[Vivaldi/([.0-9]+)]])
  if match then
    version = match[1]
  end
  util.update_map(result, dataset.get('Vivaldi'))
  util.update_version(result, version)

  return true
end

function _M.challenge_samsung(ua, result)
  if not string.find(ua, 'SamsungBrowser/', 1, true) then
    return false
  end
  local version = dataset.VALUE_UNKNOWN
  local match, err = util.check_regex_single(ua, [[SamsungBrowser/([.0-9]+)]])
  if match then
    version = match[1]
  end

  util.update_map(result, dataset.get('SamsungBrowser'))
  util.update_version(result, version)
  return true
end

return _M