mongoid-tokens 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YTEzN2VhODk2ZmI0Yjg0YjZiYzBmZjk1YmMyMGU5NDAyYjJkZTg0Ng==
5
+ data.tar.gz: !binary |-
6
+ YTQwYWRjOTc1MzIzMWE0ZWQ1YmNkNDFkNjU2ODFhYjIzNDQ2MDM5Ng==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZWZiZDZiYTIwYTdjZTBkOTlkYTFkNDg4ZGViYThhOTI2NDljYWVmNDllMGM2
10
+ MGVjMzlmZGY0YmM3NjNhZTk2MWJhNGU1ZmQyMTVlM2UzOWRkNmZkMjZkODNm
11
+ MjMyNjY4YjVhODY1YjhhOTI3NDQyMmNhNzg0Mzc0YzM4YTQ5MDM=
12
+ data.tar.gz: !binary |-
13
+ YjBiYWE3NTE2MDY2MzRkMGQ0ZjJmOTI5NGQ5YTdhODhiYjU1NWM3MzVlZThj
14
+ NDE4Nzg3NTFkYTRlYjMwN2VkM2ViMGVjMGE1M2VhYWZkZWM4NjI3NzI2ZjEz
15
+ MDgyODdjYjk4OTM0YzQ0NDQyZjg2MDI3MDM0ZTRmY2ZjMWRlODE=
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ pkg
2
+ .bundle
3
+ *.log
4
+ gemfiles/*.lock
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,144 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ mongoid-tokens (2.1.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ actionmailer (4.1.1)
10
+ actionpack (= 4.1.1)
11
+ actionview (= 4.1.1)
12
+ mail (~> 2.5.4)
13
+ actionpack (4.1.1)
14
+ actionview (= 4.1.1)
15
+ activesupport (= 4.1.1)
16
+ rack (~> 1.5.2)
17
+ rack-test (~> 0.6.2)
18
+ actionview (4.1.1)
19
+ activesupport (= 4.1.1)
20
+ builder (~> 3.1)
21
+ erubis (~> 2.7.0)
22
+ activemodel (4.1.1)
23
+ activesupport (= 4.1.1)
24
+ builder (~> 3.1)
25
+ activerecord (4.1.1)
26
+ activemodel (= 4.1.1)
27
+ activesupport (= 4.1.1)
28
+ arel (~> 5.0.0)
29
+ activesupport (4.1.1)
30
+ i18n (~> 0.6, >= 0.6.9)
31
+ json (~> 1.7, >= 1.7.7)
32
+ minitest (~> 5.1)
33
+ thread_safe (~> 0.1)
34
+ tzinfo (~> 1.1)
35
+ arel (5.0.1.20140414130214)
36
+ awesome_print (1.2.0)
37
+ bson (2.3.0)
38
+ builder (3.2.2)
39
+ coderay (1.1.0)
40
+ connection_pool (2.1.0)
41
+ database_cleaner (1.3.0)
42
+ diff-lcs (1.2.5)
43
+ erubis (2.7.0)
44
+ hike (1.2.3)
45
+ i18n (0.6.9)
46
+ json (1.8.1)
47
+ mail (2.5.4)
48
+ mime-types (~> 1.16)
49
+ treetop (~> 1.4.8)
50
+ method_source (0.8.2)
51
+ mime-types (1.25.1)
52
+ minitest (5.3.4)
53
+ mongoid (4.0.0)
54
+ activemodel (~> 4.0)
55
+ moped (~> 2.0.0)
56
+ origin (~> 2.1)
57
+ tzinfo (>= 0.3.37)
58
+ moped (2.0.3)
59
+ bson (~> 2.2)
60
+ connection_pool (~> 2.0)
61
+ optionable (~> 0.2.0)
62
+ multi_json (1.10.1)
63
+ optionable (0.2.0)
64
+ origin (2.1.1)
65
+ polyglot (0.3.5)
66
+ pry (0.9.12.6)
67
+ coderay (~> 1.0)
68
+ method_source (~> 0.8)
69
+ slop (~> 3.4)
70
+ pry-meta (0.0.7)
71
+ awesome_print
72
+ pry
73
+ pry-nav
74
+ pry-remote
75
+ pry-nav (0.2.3)
76
+ pry (~> 0.9.10)
77
+ pry-remote (0.1.8)
78
+ pry (~> 0.9)
79
+ slop (~> 3.0)
80
+ rack (1.5.2)
81
+ rack-test (0.6.2)
82
+ rack (>= 1.0)
83
+ rails (4.1.1)
84
+ actionmailer (= 4.1.1)
85
+ actionpack (= 4.1.1)
86
+ actionview (= 4.1.1)
87
+ activemodel (= 4.1.1)
88
+ activerecord (= 4.1.1)
89
+ activesupport (= 4.1.1)
90
+ bundler (>= 1.3.0, < 2.0)
91
+ railties (= 4.1.1)
92
+ sprockets-rails (~> 2.0)
93
+ railties (4.1.1)
94
+ actionpack (= 4.1.1)
95
+ activesupport (= 4.1.1)
96
+ rake (>= 0.8.7)
97
+ thor (>= 0.18.1, < 2.0)
98
+ rake (10.3.2)
99
+ rspec-core (3.0.0)
100
+ rspec-support (~> 3.0.0)
101
+ rspec-expectations (3.0.0)
102
+ diff-lcs (>= 1.2.0, < 2.0)
103
+ rspec-support (~> 3.0.0)
104
+ rspec-mocks (3.0.0)
105
+ rspec-support (~> 3.0.0)
106
+ rspec-rails (3.0.1)
107
+ actionpack (>= 3.0)
108
+ activesupport (>= 3.0)
109
+ railties (>= 3.0)
110
+ rspec-core (~> 3.0.0)
111
+ rspec-expectations (~> 3.0.0)
112
+ rspec-mocks (~> 3.0.0)
113
+ rspec-support (~> 3.0.0)
114
+ rspec-support (3.0.0)
115
+ slop (3.5.0)
116
+ sprockets (2.12.1)
117
+ hike (~> 1.2)
118
+ multi_json (~> 1.0)
119
+ rack (~> 1.0)
120
+ tilt (~> 1.1, != 1.3.0)
121
+ sprockets-rails (2.1.3)
122
+ actionpack (>= 3.0)
123
+ activesupport (>= 3.0)
124
+ sprockets (~> 2.8)
125
+ thor (0.19.1)
126
+ thread_safe (0.3.4)
127
+ tilt (1.4.1)
128
+ treetop (1.4.15)
129
+ polyglot
130
+ polyglot (>= 0.3.1)
131
+ tzinfo (1.2.1)
132
+ thread_safe (~> 0.1)
133
+
134
+ PLATFORMS
135
+ ruby
136
+
137
+ DEPENDENCIES
138
+ database_cleaner
139
+ mongoid
140
+ mongoid-tokens!
141
+ pry-meta
142
+ rails
143
+ rake
144
+ rspec-rails
data/README.md ADDED
@@ -0,0 +1,99 @@
1
+ # Mongoid Tokens
2
+
3
+ Porting for Mongoid of the great [tokens](https://github.com/fnando/tokens) gem by fnando.
4
+
5
+ ## Usage
6
+
7
+ ### Installation
8
+
9
+ ```bash
10
+ gem install tokens
11
+ ```
12
+
13
+ ### Setting up
14
+
15
+ Finally, add the macro `tokenizable` to your model and be happy!
16
+
17
+ ```ruby
18
+ class User < ActiveRecord::Base
19
+ tokenizable
20
+ end
21
+
22
+ # create a new user; remember that the token requires an existing record
23
+ # because it depends on its id
24
+ user = User.create(username: "fnando")
25
+
26
+ # create token that never expires
27
+ user.add_token(:activate)
28
+
29
+ # uses custom expires_at
30
+ user.add_token(:activate, expires_at: 10.days.from_now)
31
+
32
+ # uses the default size (12 characters)
33
+ user.add_token(:activate)
34
+
35
+ # uses custom size (up to 122)
36
+ user.add_token(:activate, size: 20)
37
+
38
+ # uses custom token value
39
+ user.add_token(:activate, token: 'abc123')
40
+
41
+ # create token with arbitrary data.
42
+ user.add_token(:activate, data: {action: "do something"})
43
+
44
+ # find token by name
45
+ user.find_token_by_name(:reset_account)
46
+
47
+ # find valid token per user context.
48
+ user.find_valid_token(:reset_account, "ea2f14aeac40")
49
+
50
+ # find token by hash
51
+ user.find_token("ea2f14aeac40")
52
+
53
+ # check if a token has expired
54
+ user.tokens.first.expired?
55
+
56
+ # find user by token
57
+ User.find_by_token(:activate, "ea2f14aeac40")
58
+
59
+ # remove all expired tokens except those with NULL values
60
+ Token.clean
61
+
62
+ # generate a token as string, without saving it
63
+ User.generate_token
64
+
65
+ # remove a token by its name
66
+ user.remove_token(:activate)
67
+
68
+ # find user by valid token (same name, same hash, not expired)
69
+ User.find_by_valid_token(:activate, "ea2f14aeac40")
70
+
71
+ # find a token using class scope
72
+ User.find_token(:activate, "ea2f14aeac40")
73
+
74
+ # Token hash
75
+ token.to_s #=> ea2f14aeac40
76
+ ```
77
+
78
+ ## License
79
+
80
+ Copyright (c) 2008-2013 Nando Vieira, released under the MIT license
81
+
82
+ Permission is hereby granted, free of charge, to any person obtaining
83
+ a copy of this software and associated documentation files (the
84
+ "Software"), to deal in the Software without restriction, including
85
+ without limitation the rights to use, copy, modify, merge, publish,
86
+ distribute, sublicense, and/or sell copies of the Software, and to
87
+ permit persons to whom the Software is furnished to do so, subject to
88
+ the following conditions:
89
+
90
+ The above copyright notice and this permission notice shall be
91
+ included in all copies or substantial portions of the Software.
92
+
93
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
94
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
95
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
96
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
97
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
98
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
99
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler"
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require "rspec/core/rake_task"
5
+ RSpec::Core::RakeTask.new
@@ -0,0 +1,8 @@
1
+ require 'mongoid'
2
+ require 'securerandom'
3
+ require 'tokens/mongoid'
4
+ require 'tokens/token'
5
+ require 'tokens/version'
6
+ require 'tokens/railtie' if defined?(Rails)
7
+
8
+ ::Mongoid::Document.send :include, MongoidTokens::Mongoid
@@ -0,0 +1,12 @@
1
+ require "rails/generators/base"
2
+
3
+ module Tokens
4
+ class InstallGenerator < ::Rails::Generators::Base
5
+ source_root File.dirname(__FILE__) + "/../../templates"
6
+
7
+ def copy_migrations
8
+ stamp = proc {|time| time.utc.strftime("%Y%m%d%H%M%S")}
9
+ copy_file "tokens.rb", "db/migrate/#{stamp[Time.now]}_create_tokens.rb"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,164 @@
1
+ module MongoidTokens
2
+ module Mongoid
3
+ extend ActiveSupport::Concern
4
+
5
+ def self.included(base)
6
+ base.class_eval { extend ClassMethods }
7
+ end
8
+
9
+ module Serializer
10
+ class << self
11
+ # Set the serializer adapter. Defaults to JSON.
12
+ attr_accessor :adapter
13
+ end
14
+
15
+ require "json"
16
+ self.adapter = ::JSON
17
+
18
+ def self.load(data)
19
+ data ? JSON.load(data) : {}
20
+ end
21
+
22
+ def self.dump(data)
23
+ data ? JSON.dump(data) : nil
24
+ end
25
+ end
26
+
27
+ module ClassMethods
28
+ # Set up model for using tokens.
29
+ #
30
+ # class User < ActiveRecord::Base
31
+ # tokenizable
32
+ # end
33
+ #
34
+ def tokenizable
35
+ has_many :tokens, as: "tokenizable", dependent: :destroy
36
+ include InstanceMethods
37
+ end
38
+
39
+ # Generate token with specified length.
40
+ #
41
+ # User.generate_token(10)
42
+ #
43
+ def generate_token(size)
44
+ validity = Proc.new {|token| Token.where(:token => token).first.nil?}
45
+
46
+ begin
47
+ token = SecureRandom.hex(size)[0, size]
48
+ token = token.encode("UTF-8")
49
+ end while validity[token] == false
50
+
51
+ token
52
+ end
53
+
54
+ # Find a token
55
+ #
56
+ # User.find_token(:activation, "abcdefg")
57
+ # User.find_token(name: activation, token: "abcdefg")
58
+ # User.find_token(name: activation, token: "abcdefg", tokenizable_id: 1)
59
+ #
60
+ def find_token(*args)
61
+ if args.first.kind_of?(Hash)
62
+ options = args.first
63
+ else
64
+ options = {
65
+ name: args.first,
66
+ token: args.last
67
+ }
68
+ end
69
+
70
+ options.merge!(name: options[:name].to_s, tokenizable_type: self.name)
71
+ Token.where(options).first
72
+ end
73
+
74
+ # Find object by token.
75
+ #
76
+ # User.find_by_token(:activation, "abcdefg")
77
+ #
78
+ def find_by_token(name, hash)
79
+ token = find_token(name: name.to_s, token: hash)
80
+ return unless token
81
+ token.tokenizable
82
+ end
83
+
84
+ # Find object by valid token (same name, same hash, not expired).
85
+ #
86
+ # User.find_by_valid_token(:activation, "abcdefg")
87
+ #
88
+ def find_by_valid_token(name, hash)
89
+ token = find_token(name: name.to_s, token: hash)
90
+ return if !token || token.expired?
91
+ token.tokenizable
92
+ end
93
+ end
94
+
95
+ module InstanceMethods
96
+ # Verify if given token is valid.
97
+ #
98
+ # @user.valid_token?(:active, "abcdefg")
99
+ #
100
+ def valid_token?(name, hash)
101
+ self.tokens.where(name: name.to_s, token: hash.to_s).first != nil
102
+ end
103
+
104
+ # Find a token.
105
+ #
106
+ # @user.find_token(:activation, "abcdefg")
107
+ #
108
+ def find_token(name, token)
109
+ self.class.find_token(
110
+ tokenizable_id: self.id,
111
+ name: name.to_s,
112
+ token: token
113
+ )
114
+ end
115
+
116
+ # Find token by its name.
117
+ def find_token_by_name(name)
118
+ self.tokens.where(name: name.to_s).first
119
+ end
120
+
121
+ # Return <tt>Token</tt> instance when token is valid.
122
+ def find_valid_token(name, token)
123
+ token = find_token(name, token)
124
+ return unless token
125
+ !token.expired? && token
126
+ end
127
+
128
+ # Remove token.
129
+ #
130
+ # @user.remove_token(:activate)
131
+ #
132
+ def remove_token(name)
133
+ return if new_record?
134
+ token = find_token_by_name(name)
135
+ token && token.destroy
136
+ end
137
+
138
+ # Add a new token.
139
+ #
140
+ # @user.add_token(:api_key, token: 'abc123')
141
+ # @user.add_token(:api_key, expires_at: nil)
142
+ # @user.add_token(:api_key, size: 20)
143
+ # @user.add_token(:api_key, data: {when: Time.now})
144
+ #
145
+ def add_token(name, options={})
146
+ options.reverse_merge!({
147
+ expires_at: 2.days.from_now,
148
+ size: 12,
149
+ data: nil
150
+ })
151
+
152
+ remove_token(name)
153
+ attrs = {
154
+ name: name.to_s,
155
+ token: options[:token] || self.class.generate_token(options[:size]),
156
+ expires_at: options[:expires_at],
157
+ data: options.fetch(:data) || {}
158
+ }
159
+
160
+ self.tokens.create!(attrs)
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,9 @@
1
+ require "rails/railtie"
2
+
3
+ module Tokens
4
+ class Railtie < Rails::Railtie
5
+ generators do
6
+ require "tokens/generator"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,32 @@
1
+ class Token
2
+ include Mongoid::Document
3
+ include Mongoid::Timestamps
4
+ include Mongoid::Attributes::Dynamic
5
+ belongs_to :tokenizable, polymorphic: true
6
+
7
+ field :name, type: String
8
+ field :token, type: String
9
+ field :expires_at, type: DateTime
10
+
11
+ # index :tokens, [:tokenizable_type, :tokenizable_id]
12
+ # index :tokens, :token
13
+ # index :tokens, :expires_at
14
+ # index :tokens, [:tokenizable_id, :tokenizable_type, :name], unique: true
15
+
16
+ def self.clean
17
+ where(:expires_at.lt => Time.now, :expires_at.exists => true).delete
18
+ #where("expires_at < ? AND expires_at IS NOT NULL", Time.now).delete_all
19
+ end
20
+
21
+ def data
22
+ read_attribute(:data) || {}
23
+ end
24
+
25
+ def to_s
26
+ token
27
+ end
28
+
29
+ def expired?
30
+ expires_at && expires_at < Time.now
31
+ end
32
+ end
@@ -0,0 +1,8 @@
1
+ module MongoidTokens
2
+ module Version
3
+ MAJOR = 1
4
+ MINOR = 0
5
+ PATCH = 0
6
+ STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
+ end
8
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'tokens/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'mongoid-tokens'
7
+ s.version = MongoidTokens::Version::STRING
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Andrea Campolonghi']
10
+ s.email = ['acampolonghi@gild.com']
11
+ s.homepage = 'http://rubygems.org/gems/tokens'
12
+ s.summary = 'Porting of tokens of Nando Vieira http://rubygems.org/gems/tokens for Mongoid'
13
+ s.description = s.summary
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ['lib']
19
+
20
+ s.add_development_dependency 'rails'
21
+ s.add_development_dependency 'rake'
22
+ s.add_development_dependency 'rspec-rails'
23
+ s.add_development_dependency 'mongoid'
24
+ s.add_development_dependency 'pry-meta'
25
+ s.add_development_dependency 'database_cleaner'
26
+ end
data/spec/schema.rb ADDED
@@ -0,0 +1,25 @@
1
+ ActiveRecord::Schema.define(:version => 0) do
2
+ create_table :users do |t|
3
+ t.string :name
4
+ end
5
+
6
+ create_table :posts do |t|
7
+ t.string :title
8
+ end
9
+
10
+ create_table :tokens do |t|
11
+ t.string :name, null: false
12
+ t.belongs_to :tokenizable, null: false, polymorphic: true
13
+ t.string :token, null: false
14
+ t.text :data, null: true
15
+ t.datetime :expires_at, null: true
16
+ t.datetime :created_at, null: false
17
+ end
18
+
19
+ add_index :tokens, :tokenizable_type
20
+ add_index :tokens, :tokenizable_id
21
+ add_index :tokens, [:tokenizable_type, :tokenizable_id]
22
+ add_index :tokens, :token
23
+ add_index :tokens, :expires_at
24
+ add_index :tokens, [:tokenizable_id, :tokenizable_type, :name], unique: true
25
+ end
@@ -0,0 +1,41 @@
1
+ ENV['RAILS_ENV'] = 'test'
2
+
3
+ require 'bundler/setup'
4
+ require 'rails/railtie'
5
+ require 'action_controller/railtie'
6
+ require 'rspec/rails'
7
+ require 'mongoid'
8
+ require 'mongoid_tokens'
9
+ require 'database_cleaner'
10
+
11
+
12
+ Mongoid.load!("#{File.dirname(__FILE__)}/support/mongoid.yml", ENV['RAILS_ENV'])
13
+
14
+ module Tokens
15
+ class Application < Rails::Application
16
+ config.root = File.dirname(__FILE__) + '/..'
17
+ config.active_support.deprecation = :log
18
+ config.eager_load = true
19
+ end
20
+ end
21
+
22
+ Tokens::Application.initialize!
23
+
24
+ require 'support/models'
25
+
26
+ RSpec.configure do |config|
27
+ config.mock_with :rspec
28
+
29
+ config.before(:suite) do
30
+ DatabaseCleaner[:mongoid].strategy = :truncation
31
+ DatabaseCleaner[:mongoid].clean_with(:truncation)
32
+ end
33
+
34
+ config.before(:each) do
35
+ DatabaseCleaner.start
36
+ end
37
+
38
+ config.after(:each) do
39
+ DatabaseCleaner.clean
40
+ end
41
+ end
@@ -0,0 +1,15 @@
1
+ class User
2
+ include Mongoid::Document
3
+ include Mongoid::Timestamps
4
+ tokenizable
5
+
6
+ field :name
7
+ end
8
+
9
+ class Post
10
+ include Mongoid::Document
11
+ include Mongoid::Timestamps
12
+ tokenizable
13
+
14
+ field :title
15
+ end
@@ -0,0 +1,6 @@
1
+ test:
2
+ sessions:
3
+ default:
4
+ database: mongoid_tokens_test
5
+ hosts:
6
+ - localhost:27017
@@ -0,0 +1,187 @@
1
+ require "spec_helper"
2
+
3
+ describe Tokens do
4
+ before do
5
+ User.delete_all
6
+ Post.delete_all
7
+
8
+ @user = User.create(name: "Homer")
9
+ @another_user = User.create(name: "Bart")
10
+ @post = Post.create(title: "How to make donuts")
11
+ @expire = 3.days.from_now.to_i
12
+ end
13
+
14
+ it "has tokens association" do
15
+ expect { @user.tokens }.to_not raise_error
16
+ end
17
+
18
+ it "removes all expired tokens" do
19
+ expect {
20
+ %w(uid activation_code reset_password_code).each do |name|
21
+ @user.add_token(name, :expires_at => 3.days.ago)
22
+ end
23
+ }.to change(Token, :count).by(3)
24
+
25
+ expect(Token.clean).to eql(3)
26
+ end
27
+
28
+ it "generates token without saving it" do
29
+ expect {
30
+ User.generate_token(32)
31
+ }.to_not change(Token, :count)
32
+ end
33
+
34
+ it "generates token with custom size" do
35
+ expect(User.generate_token(8).size).to eql(8)
36
+ end
37
+
38
+ it "sets alias for token method" do
39
+ token = @user.add_token(:uid)
40
+ expect(token.to_s).to eql(token.token)
41
+ end
42
+
43
+ it "finds user by token" do
44
+ token = @user.add_token(:uid)
45
+ expect(User.find_by_token(:uid, token.to_s)).to eql(@user)
46
+ end
47
+
48
+ it "returns user by its valid token without expiration time" do
49
+ token = @user.add_token(:uid)
50
+ expect(User.find_by_valid_token(:uid, token.to_s)).to eql(@user)
51
+ end
52
+
53
+ it "returns user by its valid token with expiration time" do
54
+ token = @user.add_token(:uid, :expires_at => @expire)
55
+ expect(User.find_by_valid_token(:uid, token.to_s)).to eql(@user)
56
+ end
57
+
58
+ it "finds token using class method with one argument (hash only)" do
59
+ token = @user.add_token(:uid)
60
+ expect(User.find_token(:name => :uid, :token => token.to_s)).to eql(token)
61
+ end
62
+
63
+ it "doesn't conflict with other models" do
64
+ user_token = @user.add_token(:uid)
65
+ post_token = @post.add_token(:uid)
66
+
67
+ expect(User.find_token(post_token.to_s)).to be_nil
68
+ User.find_token(name: :uid)
69
+ end
70
+
71
+ it "to_s should return hash" do
72
+ token = @user.add_token(:uid)
73
+ expect(token.to_s).to eql(token.to_s)
74
+ end
75
+
76
+ describe Token do
77
+ it "is created" do
78
+ expect { @user.add_token(:uid) }.to change(Token, :count)
79
+ end
80
+
81
+ it "is created for different users" do
82
+ expect(@user.add_token(:uid)).to be_valid
83
+ expect(@another_user.add_token(:uid)).to be_valid
84
+ end
85
+
86
+ it "is created with expiration date" do
87
+ expect(@user.add_token(:uid, expires_at: @expire).expires_at.to_i).to eql(@expire)
88
+ end
89
+
90
+ it "serializes data" do
91
+ token = @user.add_token(:uid, data: {name: "John Doe"})
92
+ token.reload
93
+
94
+ expect(token.data).to include("name" => "John Doe")
95
+ end
96
+
97
+ it "returns empty hash as serialized data" do
98
+ expect(Token.new.data).to eql({})
99
+ end
100
+
101
+ it "is created with custom size" do
102
+ expect(@user.add_token(:uid, :size => 6).to_s.size).to eql(6)
103
+ end
104
+
105
+ it "finds token by its name" do
106
+ token = @user.add_token(:uid)
107
+ expect(@user.find_token_by_name(:uid)).to eql(token)
108
+ end
109
+
110
+ it "returns nil nil when no token is found" do
111
+ expect(@user.find_token(:uid, "abcdef")).to be_nil
112
+ expect(@user.find_token_by_name(:uid)).to be_nil
113
+ end
114
+
115
+ it "is a valid token" do
116
+ token = @user.add_token(:uid)
117
+ expect(@user.valid_token?(:uid, token.to_s)).to be_truthy
118
+ end
119
+
120
+ it "isn't a valid token" do
121
+ expect(@user.valid_token?(:uid, "invalid")).to be_falsy
122
+ end
123
+
124
+ it "finds token by its name and hash" do
125
+ token = @user.add_token(:uid)
126
+ expect(@user.find_token(:uid, token.to_s)).to eql(token)
127
+ end
128
+
129
+ it "isn't expired when have no expiration date" do
130
+ expect(@user.add_token(:uid)).not_to be_expired
131
+ end
132
+
133
+ it "isn't expired when have a future expiration date" do
134
+ expect(@user.add_token(:uid, expires_at: 3.days.from_now)).not_to be_expired
135
+ end
136
+
137
+ it "is expired" do
138
+ expect(@user.add_token(:uid, :expires_at => 3.days.ago)).to be_expired
139
+ end
140
+
141
+ it "removes token" do
142
+ @user.add_token(:uid)
143
+ expect(@user.remove_token(:uid)).to be_truthy
144
+ end
145
+
146
+ it "doesn't remove other users tokens" do
147
+ @user.add_token(:uid)
148
+ @another_user.add_token(:uid)
149
+
150
+ @user.remove_token(:uid)
151
+
152
+ expect(@user.find_token_by_name(:uid)).to be_nil
153
+ expect(@another_user.find_token_by_name(:uid)).to be_an_instance_of(Token)
154
+ end
155
+
156
+ it "isn't duplicated" do
157
+ @user.add_token(:uid)
158
+ @user.add_token(:uid)
159
+
160
+ expect(@user.tokens.where(name: "uid").count).to eql(1)
161
+ end
162
+
163
+ it "returns valid token" do
164
+ token = @user.add_token(:uid)
165
+ expect(@user.find_valid_token(:uid, token.to_s)).to eql(token)
166
+ end
167
+
168
+ it "returns nothing for invalid token" do
169
+ token = @user.add_token(:uid)
170
+ expect(@user.find_valid_token(:uid, "invalid")).to be_nil
171
+ end
172
+
173
+ it "returns nothing for missing token" do
174
+ expect(@user.find_valid_token(:uid, "invalid")).to be_nil
175
+ end
176
+
177
+ it "returns nothing for expired token" do
178
+ token = @user.add_token(:uid, expires_at: 2.weeks.ago)
179
+ expect(@user.find_valid_token(:uid, "invalid")).to be_nil
180
+ end
181
+
182
+ it "creates token with provided value" do
183
+ token = @user.add_token(:uid, token: 'abc123')
184
+ expect(token.to_s).to eq("abc123")
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,17 @@
1
+ class CreateTokens < ActiveRecord::Migration
2
+ def change
3
+ create_table :tokens do |t|
4
+ t.string :name, null: false
5
+ t.belongs_to :tokenizable, null: false, polymorphic: true
6
+ t.string :token, null: false
7
+ t.text :data, null: true
8
+ t.datetime :expires_at, null: true
9
+ t.datetime :created_at, null: false
10
+ end
11
+
12
+ add_index :tokens, [:tokenizable_type, :tokenizable_id]
13
+ add_index :tokens, :token
14
+ add_index :tokens, :expires_at
15
+ add_index :tokens, [:tokenizable_id, :tokenizable_type, :name], unique: true
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mongoid-tokens
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrea Campolonghi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mongoid
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-meta
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: database_cleaner
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Porting of tokens of Nando Vieira http://rubygems.org/gems/tokens for
98
+ Mongoid
99
+ email:
100
+ - acampolonghi@gild.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - .gitignore
106
+ - Gemfile
107
+ - Gemfile.lock
108
+ - README.md
109
+ - Rakefile
110
+ - lib/mongoid_tokens.rb
111
+ - lib/tokens/generator.rb
112
+ - lib/tokens/mongoid.rb
113
+ - lib/tokens/railtie.rb
114
+ - lib/tokens/token.rb
115
+ - lib/tokens/version.rb
116
+ - mongoid-tokens.gemspec
117
+ - spec/schema.rb
118
+ - spec/spec_helper.rb
119
+ - spec/support/models.rb
120
+ - spec/support/mongoid.yml
121
+ - spec/tokens_spec.rb
122
+ - templates/tokens.rb
123
+ homepage: http://rubygems.org/gems/tokens
124
+ licenses: []
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ! '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ! '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.4.4
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Porting of tokens of Nando Vieira http://rubygems.org/gems/tokens for Mongoid
146
+ test_files:
147
+ - spec/schema.rb
148
+ - spec/spec_helper.rb
149
+ - spec/support/models.rb
150
+ - spec/support/mongoid.yml
151
+ - spec/tokens_spec.rb
152
+ has_rdoc: