mobvious 0.1.0 → 0.1.1
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/Gemfile +0 -1
- data/Rakefile +9 -0
- data/lib/mobvious.rb +7 -0
- data/lib/mobvious/strategies/cookie.rb +12 -3
- data/lib/mobvious/strategies/mobileesp.rb +3 -2
- data/lib/mobvious/version.rb +1 -1
- data/mobvious.gemspec +1 -1
- data/spec/mobvious/manager_spec.rb +1 -1
- data/spec/mobvious/mobvious_spec.rb +9 -3
- data/spec/mobvious/strategies/cookie_spec.rb +12 -2
- data/spec/mobvious/strategies/mobileesp_spec.rb +3 -3
- data/spec/mobvious/strategies/url_spec.rb +1 -1
- metadata +29 -29
data/Gemfile
CHANGED
@@ -7,6 +7,5 @@ gemspec
|
|
7
7
|
|
8
8
|
# temporarily switched for this fork, because the current version of guard-minitest has broken notifications
|
9
9
|
gem 'guard-minitest', git: 'git://github.com/aspiers/guard-minitest', ref: '4b660261d35'
|
10
|
-
gem 'mobileesp', git: 'git://github.com/jistr/mobileesp'
|
11
10
|
gem 'mocha', require: false
|
12
11
|
gem 'turn', require: false
|
data/Rakefile
CHANGED
data/lib/mobvious.rb
CHANGED
@@ -13,6 +13,13 @@ require "mobvious/manager"
|
|
13
13
|
#
|
14
14
|
# See {Mobvious::Strategies} for predefined strategies or roll out your own.
|
15
15
|
module Mobvious
|
16
|
+
# A configuration method, evaluates the block in the context of the Mobvious.config object.
|
17
|
+
def self.configure &block
|
18
|
+
raise "Configure method needs to be passed a block." unless block_given?
|
19
|
+
|
20
|
+
config.instance_eval &block
|
21
|
+
end
|
22
|
+
|
16
23
|
# An accessor for the global Mobvious configuration object.
|
17
24
|
# See {Config} for configuration options.
|
18
25
|
def self.config
|
@@ -13,18 +13,27 @@ module Mobvious
|
|
13
13
|
class Cookie
|
14
14
|
# Creates a new Cookie strategy instance.
|
15
15
|
#
|
16
|
+
# @param allowed_device_types [Array<Symbol>]
|
17
|
+
# A whitelist of all device types that can be returned by this strategy. This is
|
18
|
+
# a security measure against modifying the cookies on client side.
|
16
19
|
# @param cookie_expires [Integer]
|
17
20
|
# Amount of seconds to hold device type cookie. Defaults to one year (365*24*60*60).
|
18
|
-
def initialize(cookie_expires = (365*24*60*60))
|
21
|
+
def initialize(allowed_device_types, cookie_expires = (365*24*60*60))
|
19
22
|
@cookie_expires = cookie_expires
|
23
|
+
|
24
|
+
# device types must be compared with the cookie as strings to prevent attacks
|
25
|
+
# against .to_sym that could lead to memory leaks
|
26
|
+
@allowed_device_types = allowed_device_types.map {|device_type| device_type.to_s }
|
20
27
|
end
|
21
28
|
|
22
|
-
# Gets device type using a pre-set cookie. Returns nil if the cookie is not set
|
29
|
+
# Gets device type using a pre-set cookie. Returns nil if the cookie is not set or its
|
30
|
+
# value is not listed among `allowed_device_types` (the list can be defined in {#initialize}).
|
23
31
|
#
|
24
32
|
# @param request [Rack::Request]
|
25
33
|
# @return [Symbol] device type or nil
|
26
34
|
def get_device_type(request)
|
27
|
-
|
35
|
+
cookie_value = request.cookies['mobvious.device_type']
|
36
|
+
cookie_value.to_sym if @allowed_device_types.include? cookie_value
|
28
37
|
end
|
29
38
|
|
30
39
|
# Automatically sets the device type cookie again to prolong its expiration date.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'mobileesp_converted'
|
2
2
|
|
3
3
|
module Mobvious
|
4
4
|
module Strategies
|
@@ -35,7 +35,8 @@ module Mobvious
|
|
35
35
|
# @param request [Rack::Request]
|
36
36
|
# @return [Symbol] device type or nil
|
37
37
|
def get_device_type(request)
|
38
|
-
|
38
|
+
return nil if request.user_agent.nil? || request.env['HTTP_ACCEPT'].nil?
|
39
|
+
mobileesp = MobileESPConverted::UserAgentInfo.new(request.user_agent, request.env['HTTP_ACCEPT'])
|
39
40
|
@detection_procedure.call(mobileesp)
|
40
41
|
end
|
41
42
|
end
|
data/lib/mobvious/version.rb
CHANGED
data/mobvious.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '../spec_helper'
|
2
2
|
|
3
3
|
class MobviousSpec < MiniTest::Spec
|
4
4
|
describe Mobvious do
|
@@ -6,8 +6,8 @@ describe Mobvious do
|
|
6
6
|
before do
|
7
7
|
require 'mobvious/strategies/cookie'
|
8
8
|
require 'mobvious/strategies/mobileesp'
|
9
|
-
@cookie = Mobvious::Strategies::Cookie.new
|
10
|
-
@cookie2 = Mobvious::Strategies::Cookie.new
|
9
|
+
@cookie = Mobvious::Strategies::Cookie.new [:mobile, :desktop]
|
10
|
+
@cookie2 = Mobvious::Strategies::Cookie.new [:mobile, :desktop]
|
11
11
|
@mobileesp = Mobvious::Strategies::Mobileesp.new
|
12
12
|
Mobvious.config.strategies = [
|
13
13
|
@cookie,
|
@@ -16,6 +16,12 @@ describe Mobvious do
|
|
16
16
|
]
|
17
17
|
end
|
18
18
|
|
19
|
+
it "yields itself in configure block" do
|
20
|
+
Mobvious.configure do
|
21
|
+
strategies.must_equal Mobvious.config.strategies
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
19
25
|
it "gets the right strategy by class name" do
|
20
26
|
Mobvious.strategy('Mobileesp').must_equal @mobileesp
|
21
27
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
|
1
|
+
require_relative '../../spec_helper'
|
2
2
|
require 'mobvious/strategies/cookie'
|
3
3
|
|
4
4
|
module Mobvious::Strategies
|
5
5
|
class CookieSpec < MiniTest::Spec
|
6
6
|
describe Cookie do
|
7
7
|
before do
|
8
|
-
@strategy = Cookie.new
|
8
|
+
@strategy = Cookie.new [:desktop, :tablet, :mobile]
|
9
9
|
@app = mock 'app'
|
10
10
|
@uri = URI("http://foo.com/")
|
11
11
|
|
@@ -44,6 +44,16 @@ class CookieSpec < MiniTest::Spec
|
|
44
44
|
@request.cookies['mobvious.device_type'] = 'tablet'
|
45
45
|
end
|
46
46
|
|
47
|
+
it "returns nil if cookie has invalid value" do
|
48
|
+
@request.cookies['mobvious.device_type'] = 'memory_leak_attack'
|
49
|
+
@app.expects(:call).returns([@response.status, @response.headers, @response.body])
|
50
|
+
.with do |env|
|
51
|
+
@strategy.get_device_type(@request).must_equal nil
|
52
|
+
true
|
53
|
+
end
|
54
|
+
mock_response = @mock_session.request @uri, @env
|
55
|
+
end
|
56
|
+
|
47
57
|
it "gets device type from cookie" do
|
48
58
|
@app.expects(:call).returns([@response.status, @response.headers, @response.body])
|
49
59
|
.with do |env|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '../../spec_helper'
|
2
2
|
require 'mobvious/strategies/mobileesp'
|
3
3
|
|
4
4
|
module Mobvious::Strategies
|
@@ -20,7 +20,7 @@ module Mobvious::Strategies
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "categorizes Android tablet as :desktop" do
|
23
|
-
@request.stubs(:user_agent).returns("Mozilla/5.0 (Linux; U; Android 3.0;
|
23
|
+
@request.stubs(:user_agent).returns("Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13")
|
24
24
|
@strategy.get_device_type(@request).must_equal :desktop
|
25
25
|
end
|
26
26
|
|
@@ -47,7 +47,7 @@ module Mobvious::Strategies
|
|
47
47
|
end
|
48
48
|
|
49
49
|
it "categorizes Android tablet as :tablet" do
|
50
|
-
@request.stubs(:user_agent).returns("Mozilla/5.0 (Linux; U; Android 3.0;
|
50
|
+
@request.stubs(:user_agent).returns("Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13")
|
51
51
|
@strategy.get_device_type(@request).must_equal :tablet
|
52
52
|
end
|
53
53
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mobvious
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-03-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
16
|
-
requirement: &
|
16
|
+
requirement: &13559960 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,21 +21,21 @@ dependencies:
|
|
21
21
|
version: 1.2.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *13559960
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement: &
|
26
|
+
name: mobileesp_converted
|
27
|
+
requirement: &13559160 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
|
-
- -
|
30
|
+
- - ~>
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
32
|
+
version: 0.2.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *13559160
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: pry
|
38
|
-
requirement: &
|
38
|
+
requirement: &13558600 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *13558600
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: minitest
|
49
|
-
requirement: &
|
49
|
+
requirement: &13557860 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *13557860
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: mocha
|
60
|
-
requirement: &
|
60
|
+
requirement: &13556780 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *13556780
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rack-test
|
71
|
-
requirement: &
|
71
|
+
requirement: &13555880 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *13555880
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: guard
|
82
|
-
requirement: &
|
82
|
+
requirement: &13555380 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *13555380
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: guard-minitest
|
93
|
-
requirement: &
|
93
|
+
requirement: &13554440 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *13554440
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: rb-inotify
|
104
|
-
requirement: &
|
104
|
+
requirement: &13642280 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *13642280
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: libnotify
|
115
|
-
requirement: &
|
115
|
+
requirement: &13641840 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *13641840
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: turn
|
126
|
-
requirement: &
|
126
|
+
requirement: &13641400 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ! '>='
|
@@ -131,7 +131,7 @@ dependencies:
|
|
131
131
|
version: '0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *13641400
|
135
135
|
description: Rack middleware for choosing a version of an interface to render for
|
136
136
|
given request
|
137
137
|
email:
|
@@ -173,7 +173,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
173
173
|
version: '0'
|
174
174
|
segments:
|
175
175
|
- 0
|
176
|
-
hash:
|
176
|
+
hash: 2708548775781943004
|
177
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
178
|
none: false
|
179
179
|
requirements:
|
@@ -182,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
182
182
|
version: '0'
|
183
183
|
segments:
|
184
184
|
- 0
|
185
|
-
hash:
|
185
|
+
hash: 2708548775781943004
|
186
186
|
requirements: []
|
187
187
|
rubyforge_project:
|
188
188
|
rubygems_version: 1.8.11
|