super_token 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ecc5d2fae093eb6123d5b016b48d1e63977f1f0f
4
+ data.tar.gz: 1192d3a13440aff01cbbf43316447db20e5e6f9a
5
+ SHA512:
6
+ metadata.gz: 4e5d89fc1795b0f6d3350f87ff2ecd22a8b5036b5409d0849cce5123129cdf2cb98f3f27bef37a6190411c52ccf40d11bd906e64fbd4bf15c3af039e2c7ad4b3
7
+ data.tar.gz: 9bc9b3e09da2cb9b0b480260dc1028a6b9904366b8fcb4dec8b9881e98f1c2c50e2b3f0e974a796a60f758b6ba0382987093af54a653dc1a851ec01f22ec17cd
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
@@ -0,0 +1,21 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1
6
+ - 2.2
7
+ gemfile:
8
+ - gemfiles/rails3.gemfile
9
+ - gemfiles/rails4_0.gemfile
10
+ - gemfiles/rails4_1.gemfile
11
+ - gemfiles/rails4_2.gemfile
12
+ before_install:
13
+ - gem update --system
14
+ - gem install bundler
15
+ install: bundle install
16
+ script: bundle exec rake build
17
+ env:
18
+ global:
19
+ secure: 0dc92adb26454f7a8fcf0639f9f85150fd82b08cabfe8a66e0c5dc85a9cdddbc83b38468f863048af3e7dec3dd3e354e0a50c1b327a1a9f556357897e13e8bc6
20
+ notifications:
21
+ email: false
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+ # Specify your gem's dependencies in has_secure_password.gemspec
3
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 robertomiranda
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,85 @@
1
+ [![Build Status](https://travis-ci.org/robertomiranda/has_secure_token.png)](https://travis-ci.org/robertomiranda/has_secure_token)
2
+ [![Gem Version](https://badge.fury.io/rb/has_secure_token.svg)](http://badge.fury.io/rb/has_secure_token)
3
+ [![Dependency Status](https://gemnasium.com/robertomiranda/has_secure_token.svg)](https://gemnasium.com/robertomiranda/has_secure_token)
4
+ [![Code Climate](https://codeclimate.com/github/robertomiranda/has_secure_token/badges/gpa.svg)](https://codeclimate.com/github/robertomiranda/has_secure_token)
5
+
6
+ # HasSecureToken
7
+
8
+ HasSecureToken provides an easy way to generate uniques random tokens for any model in ruby on rails. **SecureRandom::base58** is used to generate the 24-character unique tokens, so collisions are highly unlikely.
9
+
10
+ **Note** If you're worried about possible collissions, there's a way to generate a race condition in the database in the same way that [validates_uniqueness_of](http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html) can. You're encouraged to add an unique index in the database to deal with this even more unlikely scenario.
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ gem 'has_secure_token'
17
+
18
+ And then run:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install has_secure_token
25
+
26
+ ## Setting your Model
27
+
28
+ The first step is to generate a migration in order to add the token key field.
29
+
30
+ ```ruby
31
+ rails g migration AddTokenToUsers token:string
32
+ =>
33
+ invoke active_record
34
+ create db/migrate/20150424010931_add_token_to_users.rb
35
+ ```
36
+
37
+ Then run `rake db:migrate` in order to update users table in the database. The next step is to add `has_secure_token`
38
+ to the model:
39
+ ```ruby
40
+ # Schema: User(token:string, auth_token:string)
41
+ class User < ActiveRecord::Base
42
+ has_secure_token
43
+ end
44
+
45
+ user = User.new
46
+ user.save
47
+ user.token # => "pX27zsMN2ViQKta1bGfLmVJE"
48
+ user.regenerate_token # => true
49
+ ```
50
+
51
+ To use a custom column to store the token key field you can specify the column_name option. See example above (e.g: auth_token):
52
+
53
+ ```ruby
54
+ # Schema: User(token:string, auth_token:string)
55
+ class User < ActiveRecord::Base
56
+ has_secure_token :auth_token
57
+ end
58
+
59
+ user = User.new
60
+ user.save
61
+ user.auth_token # => "pX27zsMN2ViQKta1bGfLmVJE"
62
+ user.regenerate_auth_token # => true
63
+ ```
64
+
65
+ ## Running tests
66
+
67
+ Running
68
+
69
+ ```shell
70
+ $ rake test
71
+ ```
72
+
73
+ Should return
74
+
75
+ ```shell
76
+ 5 runs, 9 assertions, 0 failures, 0 errors, 0 skips
77
+ ```
78
+
79
+ ## Contributing
80
+
81
+ 1. Fork it ( https://github.com/robertomiranda/has_secure_token/fork )
82
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
83
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
84
+ 4. Push to the branch (`git push origin my-new-feature`)
85
+ 5. Create a new Pull Request
@@ -0,0 +1,22 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ task :help do
6
+ puts "Available rake tasks: "
7
+ puts "rake console - Run a IRB console with all enviroment loaded"
8
+ puts "rake test - Run tests"
9
+ end
10
+
11
+ task :test do
12
+ Dir.chdir('test')
13
+ end
14
+
15
+ Rake::TestTask.new(:test) do |t|
16
+ t.libs << '../lib'
17
+ t.libs << '../test'
18
+ t.test_files = FileList['*_test.rb']
19
+ t.verbose = false
20
+ end
21
+
22
+ task :default => :test
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => '../'
3
+
4
+ group :development, :test do
5
+ gem 'activerecord', '~> 3.2.0'
6
+ end
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => '../'
3
+
4
+ group :development, :test do
5
+ gem 'activerecord', '~> 4.0.0'
6
+ gem 'minitest', '~> 4.2'
7
+ end
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => '../'
3
+
4
+ group :development, :test do
5
+ gem 'activerecord', '~> 4.1.0'
6
+ end
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+ gemspec :path => '../'
3
+
4
+ group :development, :test do
5
+ gem 'activerecord', '~> 4.2.0'
6
+ end
@@ -0,0 +1,23 @@
1
+ require 'securerandom'
2
+
3
+ module SecureRandom
4
+ BASE58_ALPHABET = ('0'..'9').to_a + ('A'..'Z').to_a + ('a'..'z').to_a - ['0', 'O', 'I', 'l']
5
+ # SecureRandom.base58 generates a random base58 string.
6
+ #
7
+ # The argument _n_ specifies the length, of the random string to be generated.
8
+ #
9
+ # If _n_ is not specified or is nil, 16 is assumed. It may be larger in the future.
10
+ #
11
+ # The result may contain alphanumeric characters except 0, O, I and l
12
+ #
13
+ # p SecureRandom.base58 #=> "4kUgL2pdQMSCQtjE"
14
+ # p SecureRandom.base58(24) #=> "77TMHrHJFvFDwodq8w7Ev2m7"
15
+ #
16
+ def self.base58(n = 16)
17
+ SecureRandom.random_bytes(n).unpack("C*").map do |byte|
18
+ idx = byte % 64
19
+ idx = SecureRandom.random_number(58) if idx >= 58
20
+ BASE58_ALPHABET[idx]
21
+ end.join
22
+ end
23
+ end
@@ -0,0 +1,43 @@
1
+ require 'active_record'
2
+ module ActiveRecord
3
+ module SecureToken
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ # Example using #has_secure_token
8
+ #
9
+ # # Schema: User(token:string, auth_token:string, api_key:string)
10
+ # class User < ActiveRecord::Base
11
+ # has_secure_token
12
+ # has_secure_token :auth_token, prefix: 'ut_'
13
+ # has_secure_token :api_key, prefix: 'ak_', length: 42
14
+ # end
15
+ #
16
+ # user = User.new
17
+ # user.save
18
+ # user.token # => "pX27zsMN2ViQKta1bGfLmVJE"
19
+ # user.auth_token # => "77TMHrHJFvFDwodq8w7Ev2m7"
20
+ # user.api_key # => "ak_1wkenr7vcAb9tH1jyQzvBdxBg8jC2bSv8ySM335"
21
+ # user.regenerate_token # => true
22
+ # user.regenerate_auth_token # => true
23
+ #
24
+ # <tt>SecureRandom::base58</tt> is used to generate the 24-character unique token, so collisions are highly unlikely.
25
+ #
26
+ # Note that it's still possible to generate a race condition in the database in the same way that
27
+ # {validates_uniqueness_of}[rdoc-ref:Validations::ClassMethods#validates_uniqueness_of] can.
28
+ # You're encouraged to add a unique index in the database to deal with this even more unlikely scenario.
29
+ def has_secure_token(attribute = :token, length: 24, prefix: '')
30
+ # Load securerandom only when has_secure_token is used.
31
+ require 'active_support/core_ext/securerandom'
32
+ define_method("regenerate_#{attribute}") { update! attribute => self.class.generate_unique_secure_token(length, prefix) }
33
+ before_create { self.send("#{attribute}=", self.class.generate_unique_secure_token(length, prefix)) unless self.send("#{attribute}?")}
34
+ end
35
+
36
+ def generate_unique_secure_token(length, prefix)
37
+ token_length = length - prefix.length
38
+ prefix + SecureRandom.base58(token_length)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ ActiveRecord::Base.send(:include, ActiveRecord::SecureToken)
@@ -0,0 +1,3 @@
1
+ module SuperToken
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'super_token/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "super_token"
8
+ spec.version = SuperToken::VERSION
9
+ spec.authors = ["Roberto Miranda Altamar", "Abdulaziz Alshetwi"]
10
+ spec.email = ["rjmaltamar@gmail.com", "e@ecleel.com"]
11
+ spec.summary = %q{HasSecureToken with more options}
12
+ spec.description = %q{SecureToken provides you an easily way to geneatre uniques random tokens for any model in ruby on rails. **SecureRandom::base58** is used to generate the 24-character unique token, so collisions are highly unlikely.}
13
+ spec.homepage = "https://github.com/ecleel/super_token"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "activerecord", ">= 3.0"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "minitest"
26
+ spec.add_development_dependency 'sqlite3'
27
+ end
@@ -0,0 +1,61 @@
1
+ require "test_helper"
2
+
3
+ class SecureTokenTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ @user = User.new
6
+ end
7
+
8
+ def test_token_values_are_generated_for_specified_attributes_and_persisted_on_save
9
+ @user.save
10
+ refute_nil @user.token
11
+ refute_nil @user.auth_token
12
+ end
13
+
14
+ def test_regenerating_the_secure_token
15
+ @user.save
16
+ old_token = @user.token
17
+ old_auth_token = @user.auth_token
18
+ @user.regenerate_token
19
+ @user.regenerate_auth_token
20
+
21
+ refute_equal @user.token, old_token
22
+ refute_equal @user.auth_token, old_auth_token
23
+ end
24
+
25
+ def test_token_value_not_overwritten_when_present
26
+ @user.token = "custom-secure-token"
27
+ @user.save
28
+
29
+ assert_equal @user.token, "custom-secure-token"
30
+ end
31
+
32
+ def test_token_value_default_length_is_24
33
+ default_length = 24
34
+ @user.save
35
+
36
+ assert_equal default_length, @user.token.length
37
+ assert_equal default_length, @user.auth_token.length
38
+ refute_equal default_length, @user.api_key.length
39
+ end
40
+
41
+ def test_token_length_option_change_token_length
42
+ @user.save
43
+
44
+ assert_equal 42, @user.api_key.length
45
+ end
46
+
47
+ def test_regenerating_token_with_same_length
48
+ @user.save
49
+ @user.regenerate_api_key
50
+
51
+ assert_equal 24, @user.token.length
52
+ assert_equal 24, @user.auth_token.length
53
+ assert_equal 42, @user.api_key.length
54
+ end
55
+
56
+ def test_prefix_prepend_in_token
57
+ @user.save
58
+
59
+ assert @user.api_key.start_with?("ak_")
60
+ end
61
+ end
@@ -0,0 +1,5 @@
1
+ class User < ActiveRecord::Base
2
+ has_secure_token
3
+ has_secure_token :auth_token, prefix: 'ut_'
4
+ has_secure_token :api_key, prefix: 'ak_', length: 42
5
+ end
@@ -0,0 +1,7 @@
1
+ ActiveRecord::Schema.define(:version => 1) do
2
+ create_table :users do |t|
3
+ t.string :token
4
+ t.string :auth_token
5
+ t.string :api_key
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ require "test_helper"
2
+
3
+ class SecureRandomTest < MiniTest::Unit::TestCase
4
+ def test_base58
5
+ s1 = SecureRandom.base58
6
+ s2 = SecureRandom.base58
7
+
8
+ refute_equal s1, s2
9
+ assert_equal 16, s1.length
10
+ end
11
+
12
+ def test_base58_with_length
13
+ s1 = SecureRandom.base58(24)
14
+ s2 = SecureRandom.base58(24)
15
+
16
+ refute_equal s1, s2
17
+ assert_equal 24, s1.length
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ testdir = File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift testdir unless $LOAD_PATH.include?(testdir)
3
+
4
+ libdir = File.dirname(File.dirname(__FILE__)) + '/lib'
5
+ $LOAD_PATH.unshift libdir unless $LOAD_PATH.include?(libdir)
6
+
7
+ require "rubygems"
8
+ require "super_token"
9
+ require "minitest/autorun"
10
+ require "minitest/unit"
11
+
12
+ Dir["models/*.rb"].each {|file| require file }
13
+
14
+ def assert_not_nil(exp, msg=nil)
15
+ msg = message(msg) { "<#{mu_pp(exp)}> expected to not be nil" }
16
+ assert(!exp.nil?, msg)
17
+ end
18
+
19
+ DB_FILE = 'tmp/test_db'
20
+ FileUtils.mkdir_p File.dirname(DB_FILE)
21
+ FileUtils.rm_f DB_FILE
22
+
23
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => DB_FILE
24
+
25
+ load 'schema.rb'
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: super_token
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Roberto Miranda Altamar
8
+ - Abdulaziz Alshetwi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-05-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activerecord
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '3.0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '3.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.3'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.3'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: minitest
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: sqlite3
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ description: SecureToken provides you an easily way to geneatre uniques random tokens
85
+ for any model in ruby on rails. **SecureRandom::base58** is used to generate the
86
+ 24-character unique token, so collisions are highly unlikely.
87
+ email:
88
+ - rjmaltamar@gmail.com
89
+ - e@ecleel.com
90
+ executables: []
91
+ extensions: []
92
+ extra_rdoc_files: []
93
+ files:
94
+ - ".gitignore"
95
+ - ".travis.yml"
96
+ - Gemfile
97
+ - LICENSE.txt
98
+ - README.md
99
+ - Rakefile
100
+ - gemfiles/rails3.gemfile
101
+ - gemfiles/rails4_0.gemfile
102
+ - gemfiles/rails4_1.gemfile
103
+ - gemfiles/rails4_2.gemfile
104
+ - lib/active_support/core_ext/securerandom.rb
105
+ - lib/super_token.rb
106
+ - lib/super_token/version.rb
107
+ - super_token.gemspec
108
+ - test/has_secure_token_test.rb
109
+ - test/models/user.rb
110
+ - test/schema.rb
111
+ - test/securerandom_test.rb
112
+ - test/test_helper.rb
113
+ homepage: https://github.com/ecleel/super_token
114
+ licenses:
115
+ - MIT
116
+ metadata: {}
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubyforge_project:
133
+ rubygems_version: 2.4.5.1
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: HasSecureToken with more options
137
+ test_files:
138
+ - test/has_secure_token_test.rb
139
+ - test/models/user.rb
140
+ - test/schema.rb
141
+ - test/securerandom_test.rb
142
+ - test/test_helper.rb