mobvious 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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