super_token 1.0.0

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