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 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
@@ -1 +1,10 @@
1
+ #!/usr/bin/env rake
1
2
  require "bundler/gem_tasks"
3
+ require 'rake/testtask'
4
+
5
+ task :default => [:test]
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.pattern = "spec/**/*_spec.rb"
9
+ end
10
+
@@ -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
- request.cookies['mobvious.device_type'].to_sym if request.cookies['mobvious.device_type']
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 'mobileesp'
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
- mobileesp = MobileESP::UserAgentInfo.new(request.user_agent, request.env['HTTP_ACCEPT'])
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
@@ -1,3 +1,3 @@
1
1
  module Mobvious
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.require_paths = ["lib"]
18
18
 
19
19
  s.add_runtime_dependency "rack", ">= 1.2.0"
20
- s.add_runtime_dependency "mobileesp"
20
+ s.add_runtime_dependency "mobileesp_converted", '~> 0.2.0'
21
21
 
22
22
 
23
23
  # == DEVELOPMENT DEPENDENCIES ==
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require_relative '../spec_helper'
2
2
 
3
3
  module Mobvious
4
4
  class ManagerSpec < MiniTest::Spec
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
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
- require 'spec_helper'
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
- require 'spec_helper'
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; xx-xx; Xoom Build/HRI39) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2")
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; xx-xx; Xoom Build/HRI39) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2")
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
 
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require_relative '../../spec_helper'
2
2
  require 'mobvious/strategies/url'
3
3
 
4
4
  module Mobvious::Strategies
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.0
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-02-24 00:00:00.000000000 Z
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: &12832380 !ruby/object:Gem::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: *12832380
24
+ version_requirements: *13559960
25
25
  - !ruby/object:Gem::Dependency
26
- name: mobileesp
27
- requirement: &12831840 !ruby/object:Gem::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: '0'
32
+ version: 0.2.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *12831840
35
+ version_requirements: *13559160
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: pry
38
- requirement: &12830900 !ruby/object:Gem::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: *12830900
46
+ version_requirements: *13558600
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: minitest
49
- requirement: &12830320 !ruby/object:Gem::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: *12830320
57
+ version_requirements: *13557860
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: mocha
60
- requirement: &12829740 !ruby/object:Gem::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: *12829740
68
+ version_requirements: *13556780
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rack-test
71
- requirement: &12828900 !ruby/object:Gem::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: *12828900
79
+ version_requirements: *13555880
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: guard
82
- requirement: &12828080 !ruby/object:Gem::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: *12828080
90
+ version_requirements: *13555380
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: guard-minitest
93
- requirement: &12827000 !ruby/object:Gem::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: *12827000
101
+ version_requirements: *13554440
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rb-inotify
104
- requirement: &12826340 !ruby/object:Gem::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: *12826340
112
+ version_requirements: *13642280
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: libnotify
115
- requirement: &12825660 !ruby/object:Gem::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: *12825660
123
+ version_requirements: *13641840
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: turn
126
- requirement: &12824960 !ruby/object:Gem::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: *12824960
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: -335408179176031834
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: -335408179176031834
185
+ hash: 2708548775781943004
186
186
  requirements: []
187
187
  rubyforge_project:
188
188
  rubygems_version: 1.8.11