openid_ar_store 0.0.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.
Files changed (47) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +43 -0
  3. data/Rakefile +40 -0
  4. data/app/models/openid_ar_store/association.rb +15 -0
  5. data/app/models/openid_ar_store/nonce.rb +7 -0
  6. data/db/migrate/20131127045846_open_id_store.rb +23 -0
  7. data/lib/openid_ar_store/active_record_store.rb +56 -0
  8. data/lib/openid_ar_store/engine.rb +5 -0
  9. data/lib/openid_ar_store/version.rb +3 -0
  10. data/lib/openid_ar_store.rb +7 -0
  11. data/lib/tasks/openid_ar_store_tasks.rake +7 -0
  12. data/test/dummy/README.rdoc +261 -0
  13. data/test/dummy/Rakefile +7 -0
  14. data/test/dummy/app/assets/javascripts/application.js +15 -0
  15. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  16. data/test/dummy/app/controllers/application_controller.rb +3 -0
  17. data/test/dummy/app/helpers/application_helper.rb +2 -0
  18. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  19. data/test/dummy/config/application.rb +59 -0
  20. data/test/dummy/config/boot.rb +10 -0
  21. data/test/dummy/config/database.yml +25 -0
  22. data/test/dummy/config/environment.rb +5 -0
  23. data/test/dummy/config/environments/development.rb +37 -0
  24. data/test/dummy/config/environments/production.rb +67 -0
  25. data/test/dummy/config/environments/test.rb +37 -0
  26. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  27. data/test/dummy/config/initializers/inflections.rb +15 -0
  28. data/test/dummy/config/initializers/mime_types.rb +5 -0
  29. data/test/dummy/config/initializers/secret_token.rb +7 -0
  30. data/test/dummy/config/initializers/session_store.rb +8 -0
  31. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  32. data/test/dummy/config/locales/en.yml +5 -0
  33. data/test/dummy/config/routes.rb +4 -0
  34. data/test/dummy/config.ru +4 -0
  35. data/test/dummy/db/migrate/20131127050158_open_id_store.openid_ar_store.rb +24 -0
  36. data/test/dummy/db/schema.rb +31 -0
  37. data/test/dummy/db/test.sqlite3 +0 -0
  38. data/test/dummy/log/development.log +18 -0
  39. data/test/dummy/log/test.log +147 -0
  40. data/test/dummy/public/404.html +26 -0
  41. data/test/dummy/public/422.html +26 -0
  42. data/test/dummy/public/500.html +25 -0
  43. data/test/dummy/public/favicon.ico +0 -0
  44. data/test/dummy/script/rails +6 -0
  45. data/test/openid_ar_store_test.rb +206 -0
  46. data/test/test_helper.rb +15 -0
  47. metadata +196 -0
@@ -0,0 +1,206 @@
1
+ require 'test_helper'
2
+
3
+ module StoreTestCase
4
+ @@allowed_handle = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
5
+ @@allowed_nonce = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
6
+
7
+ def _gen_nonce
8
+ OpenID::CryptUtil.random_string(8, @@allowed_nonce)
9
+ end
10
+
11
+ def _gen_handle(n)
12
+ OpenID::CryptUtil.random_string(n, @@allowed_handle)
13
+ end
14
+
15
+ def _gen_secret(n, chars=nil)
16
+ OpenID::CryptUtil.random_string(n, chars)
17
+ end
18
+
19
+ def _gen_assoc(issued, lifetime=600)
20
+ secret = _gen_secret(20)
21
+ handle = _gen_handle(128)
22
+ OpenID::Association.new(handle, secret, Time.now + issued, lifetime,
23
+ 'HMAC-SHA1')
24
+ end
25
+
26
+ def _check_retrieve(url, handle=nil, expected=nil)
27
+ ret_assoc = @store.get_association(url, handle)
28
+
29
+ if expected.nil?
30
+ assert_nil(ret_assoc)
31
+ else
32
+ assert_equal(expected, ret_assoc)
33
+ assert_equal(expected.handle, ret_assoc.handle)
34
+ assert_equal(expected.secret, ret_assoc.secret)
35
+ end
36
+ end
37
+
38
+ def _check_remove(url, handle, expected)
39
+ present = @store.remove_association(url, handle)
40
+ assert_equal(expected, present)
41
+ end
42
+
43
+ def test_store
44
+ server_url = "http://www.myopenid.com/openid"
45
+ assoc = _gen_assoc(issued=0)
46
+
47
+ # Make sure that a missing association returns no result
48
+ _check_retrieve(server_url)
49
+
50
+ # Check that after storage, getting returns the same result
51
+ @store.store_association(server_url, assoc)
52
+ _check_retrieve(server_url, nil, assoc)
53
+
54
+ # more than once
55
+ _check_retrieve(server_url, nil, assoc)
56
+
57
+ # Storing more than once has no ill effect
58
+ @store.store_association(server_url, assoc)
59
+ _check_retrieve(server_url, nil, assoc)
60
+
61
+ # Removing an association that does not exist returns not present
62
+ _check_remove(server_url, assoc.handle + 'x', false)
63
+
64
+ # Removing an association that does not exist returns not present
65
+ _check_remove(server_url + 'x', assoc.handle, false)
66
+
67
+ # Removing an association that is present returns present
68
+ _check_remove(server_url, assoc.handle, true)
69
+
70
+ # but not present on subsequent calls
71
+ _check_remove(server_url, assoc.handle, false)
72
+
73
+ # Put assoc back in the store
74
+ @store.store_association(server_url, assoc)
75
+
76
+ # More recent and expires after assoc
77
+ assoc2 = _gen_assoc(issued=1)
78
+ @store.store_association(server_url, assoc2)
79
+
80
+ # After storing an association with a different handle, but the
81
+ # same server_url, the handle with the later expiration is returned.
82
+ _check_retrieve(server_url, nil, assoc2)
83
+
84
+ # We can still retrieve the older association
85
+ _check_retrieve(server_url, assoc.handle, assoc)
86
+
87
+ # Plus we can retrieve the association with the later expiration
88
+ # explicitly
89
+ _check_retrieve(server_url, assoc2.handle, assoc2)
90
+
91
+ # More recent, and expires earlier than assoc2 or assoc. Make sure
92
+ # that we're picking the one with the latest issued date and not
93
+ # taking into account the expiration.
94
+ assoc3 = _gen_assoc(issued=2, lifetime=100)
95
+ @store.store_association(server_url, assoc3)
96
+
97
+ _check_retrieve(server_url, nil, assoc3)
98
+ _check_retrieve(server_url, assoc.handle, assoc)
99
+ _check_retrieve(server_url, assoc2.handle, assoc2)
100
+ _check_retrieve(server_url, assoc3.handle, assoc3)
101
+
102
+ _check_remove(server_url, assoc2.handle, true)
103
+
104
+ _check_retrieve(server_url, nil, assoc3)
105
+ _check_retrieve(server_url, assoc.handle, assoc)
106
+ _check_retrieve(server_url, assoc2.handle, nil)
107
+ _check_retrieve(server_url, assoc3.handle, assoc3)
108
+
109
+ _check_remove(server_url, assoc2.handle, false)
110
+ _check_remove(server_url, assoc3.handle, true)
111
+
112
+ _check_retrieve(server_url, nil, assoc)
113
+ _check_retrieve(server_url, assoc.handle, assoc)
114
+ _check_retrieve(server_url, assoc2.handle, nil)
115
+ _check_retrieve(server_url, assoc3.handle, nil)
116
+
117
+ _check_remove(server_url, assoc2.handle, false)
118
+ _check_remove(server_url, assoc.handle, true)
119
+ _check_remove(server_url, assoc3.handle, false)
120
+
121
+ _check_retrieve(server_url, nil, nil)
122
+ _check_retrieve(server_url, assoc.handle, nil)
123
+ _check_retrieve(server_url, assoc2.handle, nil)
124
+ _check_retrieve(server_url, assoc3.handle, nil)
125
+
126
+ _check_remove(server_url, assoc2.handle, false)
127
+ _check_remove(server_url, assoc.handle, false)
128
+ _check_remove(server_url, assoc3.handle, false)
129
+
130
+ assocValid1 = _gen_assoc(-3600, 7200)
131
+ assocValid2 = _gen_assoc(-5)
132
+ assocExpired1 = _gen_assoc(-7200, 3600)
133
+ assocExpired2 = _gen_assoc(-7200, 3600)
134
+
135
+ @store.cleanup_associations
136
+ @store.store_association(server_url + '1', assocValid1)
137
+ @store.store_association(server_url + '1', assocExpired1)
138
+ @store.store_association(server_url + '2', assocExpired2)
139
+ @store.store_association(server_url + '3', assocValid2)
140
+
141
+ cleaned = @store.cleanup_associations()
142
+ assert_equal(2, cleaned, "cleaned up associations")
143
+ end
144
+
145
+ def _check_use_nonce(nonce, expected, server_url, msg='')
146
+ stamp, salt = OpenID::Nonce::split_nonce(nonce)
147
+ actual = @store.use_nonce(server_url, stamp, salt)
148
+ assert_equal(expected, actual, msg)
149
+ end
150
+
151
+ def test_nonce
152
+ server_url = "http://www.myopenid.com/openid"
153
+ [server_url, ''].each{|url|
154
+ nonce1 = OpenID::Nonce::mk_nonce
155
+
156
+ _check_use_nonce(nonce1, true, url, "#{url}: nonce allowed by default")
157
+ _check_use_nonce(nonce1, false, url, "#{url}: nonce not allowed twice")
158
+ _check_use_nonce(nonce1, false, url, "#{url}: nonce not allowed third time")
159
+
160
+ # old nonces shouldn't pass
161
+ old_nonce = OpenID::Nonce::mk_nonce(3600)
162
+ _check_use_nonce(old_nonce, false, url, "Old nonce #{old_nonce.inspect} passed")
163
+
164
+ }
165
+
166
+ now = Time.now.to_i
167
+ old_nonce1 = OpenID::Nonce::mk_nonce(now - 20000)
168
+ old_nonce2 = OpenID::Nonce::mk_nonce(now - 10000)
169
+ recent_nonce = OpenID::Nonce::mk_nonce(now - 600)
170
+
171
+ orig_skew = OpenID::Nonce.skew
172
+ OpenID::Nonce.skew = 0
173
+ count = @store.cleanup_nonces
174
+ OpenID::Nonce.skew = 1000000
175
+ ts, salt = OpenID::Nonce::split_nonce(old_nonce1)
176
+ assert(@store.use_nonce(server_url, ts, salt), "oldnonce1")
177
+ ts, salt = OpenID::Nonce::split_nonce(old_nonce2)
178
+ assert(@store.use_nonce(server_url, ts, salt), "oldnonce2")
179
+ ts, salt = OpenID::Nonce::split_nonce(recent_nonce)
180
+ assert(@store.use_nonce(server_url, ts, salt), "recent_nonce")
181
+
182
+
183
+ OpenID::Nonce.skew = 1000
184
+ cleaned = @store.cleanup_nonces
185
+ assert_equal(2, cleaned, "Cleaned #{cleaned} nonces")
186
+
187
+ OpenID::Nonce.skew = 100000
188
+ ts, salt = OpenID::Nonce::split_nonce(old_nonce1)
189
+ assert(@store.use_nonce(server_url, ts, salt), "oldnonce1 after cleanup")
190
+ ts, salt = OpenID::Nonce::split_nonce(old_nonce2)
191
+ assert(@store.use_nonce(server_url, ts, salt), "oldnonce2 after cleanup")
192
+ ts, salt = OpenID::Nonce::split_nonce(recent_nonce)
193
+ assert(!@store.use_nonce(server_url, ts, salt), "recent_nonce after cleanup")
194
+
195
+ OpenID::Nonce.skew = orig_skew
196
+
197
+ end
198
+ end
199
+
200
+ class OpenidArStoreTest < ActiveSupport::TestCase
201
+ include StoreTestCase
202
+
203
+ def setup
204
+ @store = OpenIDArStore::ActiveRecordStore.new
205
+ end
206
+ end
@@ -0,0 +1,15 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+ require "rails/test_help"
6
+
7
+ Rails.backtrace_cleaner.remove_silencers!
8
+
9
+ # Load support files
10
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
11
+
12
+ # Load fixtures from the engine
13
+ if ActiveSupport::TestCase.method_defined?(:fixture_path=)
14
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
15
+ end
metadata ADDED
@@ -0,0 +1,196 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: openid_ar_store
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - kamechb
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-11-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.2.15
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 3.2.15
30
+ - !ruby/object:Gem::Dependency
31
+ name: sqlite3
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: ruby-openid
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 2.3.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.3.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: activerecord
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: OpenID ActiveRecord Store.
79
+ email:
80
+ - kamechb@gmail.com
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - app/models/openid_ar_store/association.rb
86
+ - app/models/openid_ar_store/nonce.rb
87
+ - db/migrate/20131127045846_open_id_store.rb
88
+ - lib/openid_ar_store/active_record_store.rb
89
+ - lib/openid_ar_store/version.rb
90
+ - lib/openid_ar_store/engine.rb
91
+ - lib/openid_ar_store.rb
92
+ - lib/tasks/openid_ar_store_tasks.rake
93
+ - MIT-LICENSE
94
+ - Rakefile
95
+ - README.md
96
+ - test/openid_ar_store_test.rb
97
+ - test/test_helper.rb
98
+ - test/dummy/db/test.sqlite3
99
+ - test/dummy/db/migrate/20131127050158_open_id_store.openid_ar_store.rb
100
+ - test/dummy/db/schema.rb
101
+ - test/dummy/README.rdoc
102
+ - test/dummy/config/application.rb
103
+ - test/dummy/config/boot.rb
104
+ - test/dummy/config/initializers/mime_types.rb
105
+ - test/dummy/config/initializers/inflections.rb
106
+ - test/dummy/config/initializers/wrap_parameters.rb
107
+ - test/dummy/config/initializers/secret_token.rb
108
+ - test/dummy/config/initializers/backtrace_silencers.rb
109
+ - test/dummy/config/initializers/session_store.rb
110
+ - test/dummy/config/routes.rb
111
+ - test/dummy/config/environments/production.rb
112
+ - test/dummy/config/environments/development.rb
113
+ - test/dummy/config/environments/test.rb
114
+ - test/dummy/config/locales/en.yml
115
+ - test/dummy/config/database.yml
116
+ - test/dummy/config/environment.rb
117
+ - test/dummy/public/favicon.ico
118
+ - test/dummy/public/422.html
119
+ - test/dummy/public/500.html
120
+ - test/dummy/public/404.html
121
+ - test/dummy/config.ru
122
+ - test/dummy/Rakefile
123
+ - test/dummy/app/assets/stylesheets/application.css
124
+ - test/dummy/app/assets/javascripts/application.js
125
+ - test/dummy/app/controllers/application_controller.rb
126
+ - test/dummy/app/helpers/application_helper.rb
127
+ - test/dummy/app/views/layouts/application.html.erb
128
+ - test/dummy/log/development.log
129
+ - test/dummy/log/test.log
130
+ - test/dummy/script/rails
131
+ homepage: ''
132
+ licenses: []
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ segments:
144
+ - 0
145
+ hash: 2052238444622905218
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ none: false
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ segments:
153
+ - 0
154
+ hash: 2052238444622905218
155
+ requirements: []
156
+ rubyforge_project:
157
+ rubygems_version: 1.8.23
158
+ signing_key:
159
+ specification_version: 3
160
+ summary: OpenID ActiveRecord Store.
161
+ test_files:
162
+ - test/openid_ar_store_test.rb
163
+ - test/test_helper.rb
164
+ - test/dummy/db/test.sqlite3
165
+ - test/dummy/db/migrate/20131127050158_open_id_store.openid_ar_store.rb
166
+ - test/dummy/db/schema.rb
167
+ - test/dummy/README.rdoc
168
+ - test/dummy/config/application.rb
169
+ - test/dummy/config/boot.rb
170
+ - test/dummy/config/initializers/mime_types.rb
171
+ - test/dummy/config/initializers/inflections.rb
172
+ - test/dummy/config/initializers/wrap_parameters.rb
173
+ - test/dummy/config/initializers/secret_token.rb
174
+ - test/dummy/config/initializers/backtrace_silencers.rb
175
+ - test/dummy/config/initializers/session_store.rb
176
+ - test/dummy/config/routes.rb
177
+ - test/dummy/config/environments/production.rb
178
+ - test/dummy/config/environments/development.rb
179
+ - test/dummy/config/environments/test.rb
180
+ - test/dummy/config/locales/en.yml
181
+ - test/dummy/config/database.yml
182
+ - test/dummy/config/environment.rb
183
+ - test/dummy/public/favicon.ico
184
+ - test/dummy/public/422.html
185
+ - test/dummy/public/500.html
186
+ - test/dummy/public/404.html
187
+ - test/dummy/config.ru
188
+ - test/dummy/Rakefile
189
+ - test/dummy/app/assets/stylesheets/application.css
190
+ - test/dummy/app/assets/javascripts/application.js
191
+ - test/dummy/app/controllers/application_controller.rb
192
+ - test/dummy/app/helpers/application_helper.rb
193
+ - test/dummy/app/views/layouts/application.html.erb
194
+ - test/dummy/log/development.log
195
+ - test/dummy/log/test.log
196
+ - test/dummy/script/rails