browser_sniffer 1.1.3 → 1.2.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/lib/browser_sniffer.rb +38 -0
- data/lib/browser_sniffer/version.rb +1 -1
- data/test/shopify_agents_test.rb +104 -0
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7466e6d392be9a8f030ff7301bfae8aa97ff0f44ebe0e31a7f662b8ddd1c45a5
|
4
|
+
data.tar.gz: 22a24aa5b13e3c663416a4cb015e03c3af315193cdd398945541e18829174df1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f5a4612854ada3f81857d40d536817cb1064aec4dc6f24251d25658923dd91d45230091019defe14c594422004bd053402792a4b312d8fca5a5056b80a71479
|
7
|
+
data.tar.gz: 25b99d22d52f3e8dae0a9aeb345408121dd23076f4a3736dbd147ab398dd5b3490b7b09de7fb8e413664e4170d551c3683e4dc667e7e02d240cb2fd601501730
|
data/.travis.yml
CHANGED
data/lib/browser_sniffer.rb
CHANGED
@@ -153,4 +153,42 @@ class BrowserSniffer
|
|
153
153
|
end
|
154
154
|
result
|
155
155
|
end
|
156
|
+
|
157
|
+
def same_site_none_compatible?
|
158
|
+
return false unless user_agent
|
159
|
+
|
160
|
+
webkit_same_site_compatible? && same_site_recognized_browser?
|
161
|
+
end
|
162
|
+
|
163
|
+
def webkit_same_site_compatible?
|
164
|
+
return false unless os && os_version && browser
|
165
|
+
|
166
|
+
!(os == :ios && os_version.match(/^([0-9]|1[12])[\.\_]/)) &&
|
167
|
+
!(os == :mac && browser == :safari && os_version.match(/^10[\.\_]14/))
|
168
|
+
end
|
169
|
+
|
170
|
+
def same_site_recognized_browser?
|
171
|
+
return false unless major_browser_version
|
172
|
+
|
173
|
+
!(chromium_based? && major_browser_version >= 51 && major_browser_version <= 66) &&
|
174
|
+
!(uc_browser? && !uc_browser_version_at_least?(12, 13, 2))
|
175
|
+
end
|
176
|
+
|
177
|
+
def chromium_based?
|
178
|
+
browser_name ? browser_name.downcase.match(/chrom(e|ium)/) : false
|
179
|
+
end
|
180
|
+
|
181
|
+
def uc_browser?
|
182
|
+
user_agent ? user_agent.downcase.match(/uc\s?browser/) : false
|
183
|
+
end
|
184
|
+
|
185
|
+
def uc_browser_version_at_least?(major, minor, build)
|
186
|
+
return false unless browser_version
|
187
|
+
digits = browser_version.split('.').map(&:to_i)
|
188
|
+
return false unless digits.count >= 3
|
189
|
+
|
190
|
+
return digits[0] > major if digits[0] != major
|
191
|
+
return digits[1] > minor if digits[1] != minor
|
192
|
+
digits[2] >= build
|
193
|
+
end
|
156
194
|
end
|
data/test/shopify_agents_test.rb
CHANGED
@@ -406,6 +406,77 @@ describe "Shopify agents" do
|
|
406
406
|
}), sniffer.os_info
|
407
407
|
end
|
408
408
|
|
409
|
+
it "Shopify POS via webview can be sniffed" do
|
410
|
+
user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) "\
|
411
|
+
"AppleWebKit/ 604.1.21 (KHTML, like Gecko) Version/ 12.0 Mobile/17A6278a Safari/602.1.26 "\
|
412
|
+
"MobileMiddlewareSupported com.jadedpixel.pos Shopify POS/5.43.1 (iPad; iOS 13.1; Scale/2.00)"
|
413
|
+
sniffer = BrowserSniffer.new(user_agent)
|
414
|
+
|
415
|
+
assert_equal ({
|
416
|
+
name: 'Shopify POS',
|
417
|
+
version: '5.43.1',
|
418
|
+
}), sniffer.browser_info
|
419
|
+
|
420
|
+
assert_equal ({
|
421
|
+
type: :tablet,
|
422
|
+
scale: '2.00',
|
423
|
+
}), sniffer.device_info
|
424
|
+
|
425
|
+
assert_equal ({
|
426
|
+
type: :ios,
|
427
|
+
version: '13.1',
|
428
|
+
name: 'iOS',
|
429
|
+
}), sniffer.os_info
|
430
|
+
end
|
431
|
+
|
432
|
+
it "Shopify POS with modern user agent via webview can be sniffed" do
|
433
|
+
user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) "\
|
434
|
+
"AppleWebKit/ 604.1.21 (KHTML, like Gecko) Version/ 12.0 Mobile/17A6278a "\
|
435
|
+
"Safari/602.1.26 MobileMiddlewareSupported Shopify POS/iOS/3.12.1 "\
|
436
|
+
"(iPad4,7/com.jadedpixel.pos/10.3.1) - Build 1"
|
437
|
+
sniffer = BrowserSniffer.new(user_agent)
|
438
|
+
|
439
|
+
assert_equal ({
|
440
|
+
name: 'Shopify POS',
|
441
|
+
version: '3.12.1',
|
442
|
+
}), sniffer.browser_info
|
443
|
+
|
444
|
+
assert_equal ({
|
445
|
+
type: :tablet,
|
446
|
+
model: '4,7',
|
447
|
+
}), sniffer.device_info
|
448
|
+
|
449
|
+
assert_equal ({
|
450
|
+
type: :ios,
|
451
|
+
name: 'iOS',
|
452
|
+
version: '10.3.1',
|
453
|
+
}), sniffer.os_info
|
454
|
+
end
|
455
|
+
|
456
|
+
it "Shopify POS Next with modern user agent via webview can be sniffed" do
|
457
|
+
user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) "\
|
458
|
+
"AppleWebKit/ 604.1.21 (KHTML, like Gecko) Version/ 12.0 Mobile/17A6278a "\
|
459
|
+
"Safari/602.1.26 MobileMiddlewareSupported Shopify POS Next/iOS/3.12.1 "\
|
460
|
+
"(iPad4,7/com.jadedpixel.pos/10.3.1) - Build 1"
|
461
|
+
sniffer = BrowserSniffer.new(user_agent)
|
462
|
+
|
463
|
+
assert_equal ({
|
464
|
+
name: 'Shopify POS',
|
465
|
+
version: '3.12.1',
|
466
|
+
}), sniffer.browser_info
|
467
|
+
|
468
|
+
assert_equal ({
|
469
|
+
type: :tablet,
|
470
|
+
model: '4,7',
|
471
|
+
}), sniffer.device_info
|
472
|
+
|
473
|
+
assert_equal ({
|
474
|
+
type: :ios,
|
475
|
+
name: 'iOS',
|
476
|
+
version: '10.3.1',
|
477
|
+
}), sniffer.os_info
|
478
|
+
end
|
479
|
+
|
409
480
|
it "Shopify POS with okhttp user agent can be parsed" do
|
410
481
|
user_agent = "okhttp/3.6.0"
|
411
482
|
sniffer = BrowserSniffer.new(user_agent)
|
@@ -603,4 +674,37 @@ describe "Shopify agents" do
|
|
603
674
|
name: 'iOS',
|
604
675
|
}), sniffer.os_info
|
605
676
|
end
|
677
|
+
|
678
|
+
INCOMPATIBLE_USER_AGENTS = [
|
679
|
+
"Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko)"\
|
680
|
+
" GSA/87.0.279142407 Mobile/15E148 Safari/605.1",
|
681
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko)"\
|
682
|
+
" Version/12.1.2 Safari/605.1.15",
|
683
|
+
"Mozilla/5.0 (Linux; U; Android 7.0; en-US; SM-G935F Build/NRD90M) AppleWebKit/534.30 (KHTML, like Gecko) "\
|
684
|
+
"Version/4.0 UCBrowser/11.3.8.976 U3/0.8.0 Mobile Safari/534.30",
|
685
|
+
]
|
686
|
+
|
687
|
+
INCOMPATIBLE_USER_AGENTS.each do |user_agent|
|
688
|
+
it "user agent #{user_agent} is correctly marked as incompatible" do
|
689
|
+
sniffer = BrowserSniffer.new(user_agent)
|
690
|
+
|
691
|
+
refute sniffer.same_site_none_compatible?
|
692
|
+
end
|
693
|
+
end
|
694
|
+
|
695
|
+
COMPATIBLE_USER_AGENTS = [
|
696
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117"\
|
697
|
+
" Safari/537.36",
|
698
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:72.0) Gecko/20100101 Firefox/72.0",
|
699
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.4"\
|
700
|
+
" Safari/605.1.15",
|
701
|
+
]
|
702
|
+
|
703
|
+
COMPATIBLE_USER_AGENTS.each do |user_agent|
|
704
|
+
it "user agent #{user_agent} is correctly marked as compatible" do
|
705
|
+
sniffer = BrowserSniffer.new(user_agent)
|
706
|
+
|
707
|
+
assert sniffer.same_site_none_compatible?
|
708
|
+
end
|
709
|
+
end
|
606
710
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: browser_sniffer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -95,8 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
requirements: []
|
98
|
-
|
99
|
-
rubygems_version: 2.7.6
|
98
|
+
rubygems_version: 3.0.3
|
100
99
|
signing_key:
|
101
100
|
specification_version: 4
|
102
101
|
summary: Parses user agent strings and boils it all down to a few simple classifications.
|