agent_orange 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/agent_orange_example +3 -1
- data/lib/agent_orange/engine.rb +70 -35
- data/lib/agent_orange/user_agent.rb +8 -6
- data/lib/agent_orange/version.rb +1 -1
- metadata +4 -4
data/bin/agent_orange_example
CHANGED
@@ -20,10 +20,12 @@ user_agent_strings = [
|
|
20
20
|
def process_user_agent(ua_str)
|
21
21
|
puts
|
22
22
|
puts '='*120
|
23
|
-
puts "User
|
23
|
+
puts "Original User Agent:"
|
24
24
|
puts " #{ua_str}"
|
25
25
|
puts
|
26
26
|
ua = AgentOrange::UserAgent.new(:user_agent => ua_str)
|
27
|
+
puts "Parsed Object String:"
|
28
|
+
puts " #{ua}"
|
27
29
|
puts '='*120
|
28
30
|
end
|
29
31
|
|
data/lib/agent_orange/engine.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'agent_orange/browser'
|
2
2
|
require 'agent_orange/version'
|
3
|
+
require 'pp'
|
3
4
|
|
4
5
|
module AgentOrange
|
5
6
|
class Engine
|
@@ -9,7 +10,9 @@ module AgentOrange
|
|
9
10
|
ENGINES = {
|
10
11
|
:gecko => 'Gecko',
|
11
12
|
:presto => 'Presto',
|
12
|
-
:
|
13
|
+
:trident => 'Trident',
|
14
|
+
:webkit => 'AppleWebKit',
|
15
|
+
:other => 'Other'
|
13
16
|
}
|
14
17
|
|
15
18
|
def initialize(user_agent)
|
@@ -18,52 +21,84 @@ module AgentOrange
|
|
18
21
|
|
19
22
|
def parse(user_agent)
|
20
23
|
AgentOrange.debug "ENGINE PARSING", 2
|
21
|
-
|
22
|
-
groups
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
#
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
# Determine engine type
|
36
|
-
if name =~ /(#{ENGINES[:gecko]})/i
|
37
|
-
self.type = "gecko"
|
24
|
+
results = user_agent.scan(/([^\/[:space:]]*)(\/([^[:space:]]*))?([[:space:]]*\[[a-zA-Z][a-zA-Z]\])?[[:space:]]*(\((([^()]|(\([^()]*\)))*)\))?[[:space:]]*/i)
|
25
|
+
groups = scan_results_into_groups(results)
|
26
|
+
groups.each_with_index do |content,i|
|
27
|
+
if content[:name] =~ /(#{ENGINES.collect{|cat,regex| regex}.join(')|(')})/i
|
28
|
+
# Matched group against name
|
29
|
+
self.populate(content)
|
30
|
+
elsif content[:comment] =~ /(#{ENGINES.collect{|cat,regex| regex}.join(')|(')})/i
|
31
|
+
# Matched group against comment
|
32
|
+
chosen_content = { :name => nil, :version => nil }
|
33
|
+
additional_groups = parse_comment(content[:comment])
|
34
|
+
additional_groups.each do |additional_content|
|
35
|
+
if additional_content[:name] =~ /(#{ENGINES.collect{|cat,regex| regex}.join(')|(')})/i
|
36
|
+
chosen_content = additional_content
|
37
|
+
end
|
38
38
|
end
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
if name =~ /(#{ENGINES[:webkit]})/i
|
43
|
-
self.type = "webkit"
|
44
|
-
end
|
45
|
-
|
46
|
-
# Determine engine name
|
47
|
-
self.name = name
|
48
|
-
|
49
|
-
# Determine device version
|
50
|
-
self.version = AgentOrange::Version.new(version)
|
51
|
-
|
39
|
+
|
40
|
+
self.populate(chosen_content)
|
52
41
|
end
|
53
|
-
|
54
42
|
end
|
55
43
|
|
44
|
+
self.analysis
|
45
|
+
self.browser = AgentOrange::Browser.new(user_agent)
|
46
|
+
end
|
47
|
+
|
48
|
+
def scan_results_into_groups(results)
|
49
|
+
groups = []
|
50
|
+
results.each do |result|
|
51
|
+
if result[0] != "" # Add the group of content if name isn't blank
|
52
|
+
groups << { :name => result[0], :version => result[2], :comment => result[5] }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
groups
|
56
|
+
end
|
57
|
+
|
58
|
+
def parse_comment(comment)
|
59
|
+
groups = []
|
60
|
+
comment.split('; ').each do |piece|
|
61
|
+
content = { :name => nil, :version => nil }
|
62
|
+
if piece =~ /(.+)[ \/]([\w.]+)$/i
|
63
|
+
chopped = piece.scan(/(.+)[ \/]([\w.]+)$/i)[0]
|
64
|
+
groups << { :name => chopped[0], :version => chopped[1] }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
groups
|
68
|
+
end
|
69
|
+
|
70
|
+
def determine_type(content="")
|
71
|
+
# Determine type
|
72
|
+
type = nil
|
73
|
+
ENGINES.each do |key, value|
|
74
|
+
type = key if content =~ /(#{value})/i
|
75
|
+
end
|
76
|
+
type = "other" if type.nil?
|
77
|
+
type
|
78
|
+
end
|
79
|
+
|
80
|
+
def populate(content={})
|
81
|
+
AgentOrange.debug " Raw Name : #{content[:name]}", 2
|
82
|
+
AgentOrange.debug " Raw Version: #{content[:version]}", 2
|
83
|
+
AgentOrange.debug " Raw Comment: #{content[:comment]}", 2
|
84
|
+
AgentOrange.debug "", 2
|
85
|
+
|
86
|
+
self.type = self.determine_type(content[:name])
|
87
|
+
self.name = ENGINES[self.type.to_sym]
|
88
|
+
self.version = AgentOrange::Version.new(content[:version])
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
def analysis
|
56
93
|
AgentOrange.debug "ENGINE ANALYSIS", 2
|
57
94
|
AgentOrange.debug " Type: #{self.type}", 2
|
58
95
|
AgentOrange.debug " Name: #{self.name}", 2
|
59
96
|
AgentOrange.debug " Version: #{self.version}", 2
|
60
97
|
AgentOrange.debug "", 2
|
61
|
-
|
62
|
-
self.browser = AgentOrange::Browser.new(user_agent)
|
63
98
|
end
|
64
99
|
|
65
100
|
def to_s
|
66
|
-
[self.name, self.version].compact.join(' ')
|
101
|
+
[self.name, self.version].compact.join(' ') || "Unknown"
|
67
102
|
end
|
68
103
|
end
|
69
104
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'agent_orange/device'
|
2
2
|
|
3
3
|
module AgentOrange
|
4
|
-
DEBUG =
|
5
|
-
DEBUG_LEVEL =
|
4
|
+
DEBUG = false
|
5
|
+
DEBUG_LEVEL = 1
|
6
6
|
|
7
7
|
class UserAgent
|
8
8
|
attr_accessor :user_agent_string
|
@@ -26,9 +26,6 @@ module AgentOrange
|
|
26
26
|
AgentOrange.debug "Browser = #{self.device.engine.browser}"
|
27
27
|
|
28
28
|
self.summary
|
29
|
-
|
30
|
-
AgentOrange.debug "", 2
|
31
|
-
AgentOrange.debug "user_agent.to_s = #{self}", 2
|
32
29
|
end
|
33
30
|
|
34
31
|
def is_computer?(type=nil)
|
@@ -44,7 +41,12 @@ module AgentOrange
|
|
44
41
|
end
|
45
42
|
|
46
43
|
def to_s
|
47
|
-
[self.device,
|
44
|
+
[self.device,
|
45
|
+
self.device.platform,
|
46
|
+
self.device.operating_system,
|
47
|
+
self.device.engine,
|
48
|
+
self.device.engine.browser
|
49
|
+
].compact.join(", ")
|
48
50
|
end
|
49
51
|
|
50
52
|
def to_human_string
|
data/lib/agent_orange/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module AgentOrange
|
2
|
-
VERSION = "0.0.
|
2
|
+
VERSION = "0.0.6" # This is for the gem and does not conflict with the rest of the functionality
|
3
3
|
|
4
4
|
class Version
|
5
5
|
attr_accessor :major, :minor, :patch_level, :build_number
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: agent_orange
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kevin Elliott
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-12 00:00:00 Z
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description: Parse and process User Agents like a secret one
|