tiddle 1.1.0 → 1.6.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +47 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +67 -9
  5. data/Appraisals +12 -10
  6. data/CHANGELOG.md +33 -0
  7. data/Gemfile +0 -2
  8. data/README.md +0 -6
  9. data/Rakefile +1 -1
  10. data/gemfiles/rails5.2.gemfile +3 -2
  11. data/gemfiles/{rails5.0.gemfile → rails6.0.gemfile} +3 -2
  12. data/gemfiles/{rails4.2.gemfile → rails6.1.gemfile} +3 -2
  13. data/lib/tiddle.rb +1 -1
  14. data/lib/tiddle/strategy.rb +8 -0
  15. data/lib/tiddle/token_issuer.rb +9 -2
  16. data/lib/tiddle/version.rb +1 -1
  17. data/spec/{rails_app → rails_app_active_record}/app/controllers/application_controller.rb +0 -0
  18. data/spec/{rails_app → rails_app_active_record}/app/controllers/long_secrets_controller.rb +0 -0
  19. data/spec/{rails_app → rails_app_active_record}/app/controllers/secrets_controller.rb +0 -0
  20. data/spec/{rails_app → rails_app_active_record}/app/models/admin_user.rb +0 -0
  21. data/spec/{rails_app → rails_app_active_record}/app/models/authentication_token.rb +0 -0
  22. data/spec/{rails_app → rails_app_active_record}/app/models/user.rb +0 -0
  23. data/spec/rails_app_active_record/config/application.rb +15 -0
  24. data/spec/rails_app_active_record/config/boot.rb +2 -0
  25. data/spec/{rails_app → rails_app_active_record}/config/environment.rb +1 -1
  26. data/spec/{rails_app → rails_app_active_record}/config/routes.rb +0 -0
  27. data/spec/{rails_app → rails_app_active_record}/config/secrets.yml +0 -0
  28. data/spec/{rails_app → rails_app_active_record}/db/migrate/20150217000000_create_tables.rb +5 -7
  29. data/spec/rails_app_mongoid/app/controllers/application_controller.rb +5 -0
  30. data/spec/rails_app_mongoid/app/controllers/long_secrets_controller.rb +7 -0
  31. data/spec/rails_app_mongoid/app/controllers/secrets_controller.rb +7 -0
  32. data/spec/rails_app_mongoid/app/models/admin_user.rb +2 -0
  33. data/spec/rails_app_mongoid/app/models/authentication_token.rb +11 -0
  34. data/spec/rails_app_mongoid/app/models/user.rb +22 -0
  35. data/spec/{rails_app → rails_app_mongoid}/config/application.rb +4 -4
  36. data/spec/rails_app_mongoid/config/boot.rb +2 -0
  37. data/spec/rails_app_mongoid/config/environment.rb +5 -0
  38. data/spec/rails_app_mongoid/config/mongoid.yml +6 -0
  39. data/spec/rails_app_mongoid/config/routes.rb +6 -0
  40. data/spec/rails_app_mongoid/config/secrets.yml +2 -0
  41. data/spec/spec_helper.rb +11 -12
  42. data/spec/strategy_spec.rb +13 -13
  43. data/spec/support/backend.rb +53 -0
  44. data/spec/support/fake_request.rb +1 -3
  45. data/spec/tiddle_spec.rb +1 -1
  46. data/tiddle.gemspec +6 -7
  47. metadata +69 -61
  48. data/.travis.yml +0 -12
  49. data/gemfiles/rails5.1.gemfile +0 -8
  50. data/spec/rails_app/config/boot.rb +0 -2
  51. data/spec/support/warningless_get.rb +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 636a498dc602f9309c1baf81f3f34276aad7e710fd14d170c02ba5af381b40f1
4
- data.tar.gz: 670f3801abc579331c721d66ee5cf68e46817a89bdadfc6356d0f02ce0276176
3
+ metadata.gz: ceda852fb296447c9da00e1f7cafabbfe6eefa599f457bcf1885aa937ba549db
4
+ data.tar.gz: 4d0133d03bd53b4e75595a26ebb6ca115cb9ab6858f3a557eb38fb70dddf01c1
5
5
  SHA512:
6
- metadata.gz: d5305d3d877befdee9203d7001f05e07ef38a3ad77abcc74563140f2217f69319d39d723be4453410b1935ed01a839995e8c296c767349b2355657b36ba7532b
7
- data.tar.gz: c114628903a18817a6a99ab3e233639d4e2c428e7216c06e46eed4407aac243f89533db8cae5edf05335d351c4903ea3559da60e1b42821b3c98ffdbf984eb0b
6
+ metadata.gz: 97f53dad24042c517c85445a98e26206995d0242e7d80f42bfd1a49dd6cc40e8f55cfcfbfb9e704aed8992b3872897f8b39b5bb8d4b145e758536bc2ce1d7712
7
+ data.tar.gz: ebdda46f4045e4aeb26ea535b233b3b75b6c434b7a2062fdc5f2342b0e529189c0f413c9d7d1e94693774efb4d95617b2f2b0082af038f1dd9ddcf8d483e28e4
@@ -0,0 +1,47 @@
1
+ name: Ruby
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ gemfile:
15
+ - rails5.2
16
+ - rails6.0
17
+ - rails6.1
18
+ ruby:
19
+ - 2.5
20
+ - 2.6
21
+ - 2.7
22
+ - 3.0
23
+ backend:
24
+ - active_record
25
+ - mongoid
26
+ exclude:
27
+ - gemfile: rails5.2
28
+ ruby: 3.0
29
+ name: ${{ matrix.gemfile }}, ruby ${{ matrix.ruby }}, ${{ matrix.backend }}
30
+ runs-on: ubuntu-latest
31
+ env:
32
+ BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
33
+ BACKEND: ${{ matrix.backend }}
34
+
35
+ steps:
36
+ - uses: actions/checkout@v2
37
+ - name: Set up Ruby
38
+ uses: ruby/setup-ruby@v1
39
+ with:
40
+ bundler-cache: true
41
+ ruby-version: ${{ matrix.ruby }}
42
+ - name: Start MongoDB
43
+ uses: supercharge/mongodb-github-action@1.3.0
44
+ if: ${{ matrix.backend == 'mongoid' }}
45
+ - name: Run tests
46
+ run: |
47
+ bundle exec rake spec
data/.gitignore CHANGED
@@ -17,3 +17,4 @@ mkmf.log
17
17
  *.sqlite3
18
18
  *.log
19
19
  *.gemfile.lock
20
+ .idea
data/.rubocop.yml CHANGED
@@ -1,11 +1,13 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.2
2
+ TargetRubyVersion: 2.5
3
3
  Include:
4
- - 'lib'
5
- - 'spec'
4
+ - 'lib/**/*.rb'
5
+ - 'spec/**/*.rb'
6
6
  Exclude:
7
7
  - 'spec/rails_app/**/*'
8
8
  - 'spec/spec_helper.rb'
9
+ - 'vendor/bundle/**/*'
10
+ SuggestExtensions: false
9
11
  Style/StringLiterals:
10
12
  Enabled: false
11
13
  Style/Documentation:
@@ -14,17 +16,73 @@ Style/FrozenStringLiteralComment:
14
16
  Enabled: false
15
17
  Style/SignalException:
16
18
  Enabled: false
17
- Metrics/LineLength:
19
+ Layout/LineLength:
18
20
  Max: 100
19
21
  Gemspec/OrderedDependencies:
20
22
  Enabled: false
21
- Naming/FileName:
22
- Exclude:
23
- - 'Rakefile'
24
- - 'Gemfile'
25
- - 'Appraisals'
26
23
  Metrics/BlockLength:
27
24
  Exclude:
28
25
  - 'spec/**/*'
29
26
  Metrics/MethodLength:
30
27
  Max: 15
28
+
29
+ Gemspec/DateAssignment:
30
+ Enabled: true
31
+ Layout/SpaceBeforeBrackets:
32
+ Enabled: true
33
+ Lint/AmbiguousAssignment:
34
+ Enabled: true
35
+ Lint/DeprecatedConstants:
36
+ Enabled: true
37
+ Lint/DuplicateBranch:
38
+ Enabled: true
39
+ Lint/DuplicateRegexpCharacterClassElement:
40
+ Enabled: true
41
+ Lint/EmptyBlock:
42
+ Enabled: true
43
+ Lint/EmptyClass:
44
+ Enabled: true
45
+ Lint/LambdaWithoutLiteralBlock:
46
+ Enabled: true
47
+ Lint/NoReturnInBeginEndBlocks:
48
+ Enabled: true
49
+ Lint/NumberedParameterAssignment:
50
+ Enabled: true
51
+ Lint/OrAssignmentToConstant:
52
+ Enabled: true
53
+ Lint/RedundantDirGlobSort:
54
+ Enabled: true
55
+ Lint/SymbolConversion:
56
+ Enabled: true
57
+ Lint/ToEnumArguments:
58
+ Enabled: true
59
+ Lint/TripleQuotes:
60
+ Enabled: true
61
+ Lint/UnexpectedBlockArity:
62
+ Enabled: true
63
+ Lint/UnmodifiedReduceAccumulator:
64
+ Enabled: true
65
+ Style/ArgumentsForwarding:
66
+ Enabled: true
67
+ Style/CollectionCompact:
68
+ Enabled: true
69
+ Style/DocumentDynamicEvalDefinition:
70
+ Enabled: true
71
+ Style/EndlessMethod:
72
+ Enabled: true
73
+ Style/HashConversion:
74
+ Enabled: true
75
+ Style/HashExcept:
76
+ Enabled: true
77
+ Style/IfWithBooleanLiteralBranches:
78
+ Enabled: true
79
+ Style/NegatedIfElseCondition:
80
+ Enabled: true
81
+ Style/NilLambda:
82
+ Enabled: true
83
+ Style/RedundantArgument:
84
+ Enabled: true
85
+ Style/StringChars:
86
+ Enabled: true
87
+ Style/SwapValues:
88
+ Enabled: true
data/Appraisals CHANGED
@@ -1,15 +1,17 @@
1
- appraise "rails4.2" do
2
- gem "rails", "~> 4.2.0"
3
- end
4
-
5
- appraise "rails5.0" do
6
- gem "rails", "~> 5.0.0"
1
+ appraise "rails5.2" do
2
+ gem "rails", "~> 5.2.1"
3
+ gem "mongoid", "~> 6"
4
+ gem "sqlite3", "~> 1.3.13"
7
5
  end
8
6
 
9
- appraise "rails5.1" do
10
- gem "rails", "~> 5.1.0"
7
+ appraise "rails6.0" do
8
+ gem "rails", "~> 6.0.0"
9
+ gem "mongoid", "~> 7"
10
+ gem "sqlite3"
11
11
  end
12
12
 
13
- appraise "rails5.2" do
14
- gem "rails", "5.2.0.beta2"
13
+ appraise "rails6.1" do
14
+ gem "rails", "~> 6.1.0"
15
+ gem "mongoid"
16
+ gem "sqlite3"
15
17
  end
data/CHANGELOG.md CHANGED
@@ -1,3 +1,36 @@
1
+ ### 1.6.0
2
+
3
+ Add Rails 6.1 support
4
+
5
+ Add Ruby 3.0 support
6
+
7
+ Remove Rails 4.2 support
8
+
9
+ Remove Ruby 2.4 support
10
+
11
+
12
+ ### 1.5.0
13
+
14
+ Add Rails 6 support
15
+
16
+ Fix warning on Ruby 2.7 (Andy Klimczak)
17
+
18
+ Skip CSRF clean up (Marcelo Silveira)
19
+
20
+ ### 1.4.0
21
+
22
+ Support for Devise 4.6.
23
+
24
+ Relax dependency on Devise.
25
+
26
+ ### 1.3.0
27
+
28
+ Support for Devise 4.5
29
+
30
+ ### 1.2.0
31
+
32
+ Adds support for MongoDB.
33
+
1
34
  ### 1.1.0
2
35
 
3
36
  New feature: optional token expiration after period of inactivity - #37
data/Gemfile CHANGED
@@ -1,6 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem "rubocop", "~> 0.52.0"
4
-
5
3
  # Specify your gem's dependencies in tiddle.gemspec
6
4
  gemspec
data/README.md CHANGED
@@ -1,17 +1,11 @@
1
1
  # Tiddle
2
2
 
3
- [![Build Status](https://travis-ci.org/adamniedzielski/tiddle.svg?branch=master)](https://travis-ci.org/adamniedzielski/tiddle)
4
- [![Coverage Status](https://coveralls.io/repos/adamniedzielski/tiddle/badge.svg?branch=master)](https://coveralls.io/r/adamniedzielski/tiddle?branch=master)
5
3
  [![Code Climate](https://codeclimate.com/github/adamniedzielski/tiddle/badges/gpa.svg)](https://codeclimate.com/github/adamniedzielski/tiddle)
6
4
 
7
5
  Tiddle provides Devise strategy for token authentication in API-only Ruby on Rails applications. Its main feature is **support for multiple tokens per user**.
8
6
 
9
7
  Tiddle is lightweight and non-configurable. It does what it has to do and leaves some manual implementation to you.
10
8
 
11
- ## Versions
12
-
13
- Versions 0.7.x+ are meant to support Rails 5.0, but they require Devise 4. If you want to use Devise 3 with Rails 4.2 then take a look at the ```0.6.x``` branch.
14
-
15
9
  ## Installation
16
10
 
17
11
  Add this line to your application's Gemfile:
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'appraisal'
6
6
  RSpec::Core::RakeTask.new(spec: :rubocop)
7
7
  RuboCop::RakeTask.new(:rubocop)
8
8
 
9
- if !ENV["APPRAISAL_INITIALIZED"] && !ENV["TRAVIS"]
9
+ if !ENV["APPRAISAL_INITIALIZED"]
10
10
  task default: :appraisal
11
11
  else
12
12
  task default: :spec
@@ -2,7 +2,8 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubocop", "~> 0.52.0"
6
- gem "rails", "5.2.0.beta2"
5
+ gem "rails", "~> 5.2.1"
6
+ gem "mongoid", "~> 6"
7
+ gem "sqlite3", "~> 1.3.13"
7
8
 
8
9
  gemspec path: "../"
@@ -2,7 +2,8 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubocop", "~> 0.52.0"
6
- gem "rails", "~> 5.0.0"
5
+ gem "rails", "~> 6.0.0"
6
+ gem "mongoid", "~> 7"
7
+ gem "sqlite3"
7
8
 
8
9
  gemspec path: "../"
@@ -2,7 +2,8 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "rubocop", "~> 0.52.0"
6
- gem "rails", "~> 4.2.0"
5
+ gem "rails", "~> 6.1.0"
6
+ gem "mongoid"
7
+ gem "sqlite3"
7
8
 
8
9
  gemspec path: "../"
data/lib/tiddle.rb CHANGED
@@ -6,7 +6,7 @@ require "tiddle/token_issuer"
6
6
 
7
7
  module Tiddle
8
8
  def self.create_and_return_token(resource, request, options = {})
9
- TokenIssuer.build.create_and_return_token(resource, request, options)
9
+ TokenIssuer.build.create_and_return_token(resource, request, **options)
10
10
  end
11
11
 
12
12
  def self.expire_token(resource, request)
@@ -28,6 +28,14 @@ module Devise
28
28
  false
29
29
  end
30
30
 
31
+ # Avoid CSRF clean up for token authentication as it might trigger session creation in API
32
+ # environments even if CSRF prevention is not being used.
33
+ # Devise provides a `clean_up_csrf_token_on_authentication` option but it's not always viable
34
+ # in applications with multiple user models and authentication strategies.
35
+ def clean_up_csrf?
36
+ false
37
+ end
38
+
31
39
  private
32
40
 
33
41
  def authentication_keys_from_headers
@@ -31,7 +31,8 @@ module Tiddle
31
31
  def find_token(resource, token_from_headers)
32
32
  token_class = authentication_token_class(resource)
33
33
  token_body = Devise.token_generator.digest(token_class, :body, token_from_headers)
34
- resource.authentication_tokens.find_by(body: token_body)
34
+ # 'find_by' behaves differently in AR vs Mongoid, so using 'where' instead
35
+ resource.authentication_tokens.where(body: token_body).first
35
36
  end
36
37
 
37
38
  def purge_old_tokens(resource)
@@ -46,7 +47,13 @@ module Tiddle
46
47
  attr_accessor :maximum_tokens_per_user
47
48
 
48
49
  def authentication_token_class(resource)
49
- resource.association(:authentication_tokens).klass
50
+ if resource.respond_to?(:association) # ActiveRecord
51
+ resource.association(:authentication_tokens).klass
52
+ elsif resource.respond_to?(:relations) # Mongoid
53
+ resource.relations['authentication_tokens'].klass
54
+ else
55
+ raise 'Cannot determine authentication token class, unsupported ORM/ODM?'
56
+ end
50
57
  end
51
58
 
52
59
  def token_attributes(token_body, request, expires_in)
@@ -1,3 +1,3 @@
1
1
  module Tiddle
2
- VERSION = "1.1.0".freeze
2
+ VERSION = "1.6.0".freeze
3
3
  end
@@ -0,0 +1,15 @@
1
+ require File.expand_path('boot', __dir__)
2
+
3
+ require "active_model/railtie"
4
+ require "active_record/railtie"
5
+ require "action_controller/railtie"
6
+ require "action_view/railtie"
7
+
8
+ module RailsApp
9
+ class Application < Rails::Application
10
+ config.eager_load = true
11
+ config.root = File.expand_path('..', __dir__)
12
+ config.consider_all_requests_local = true
13
+ config.active_record.sqlite3.represent_boolean_as_integer = true if config.active_record.sqlite3
14
+ end
15
+ end
@@ -0,0 +1,2 @@
1
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../../../Gemfile', __dir__)
2
+ require 'bundler/setup'
@@ -1,5 +1,5 @@
1
1
  # Load the Rails application.
2
- require File.expand_path('../application', __FILE__)
2
+ require File.expand_path('application', __dir__)
3
3
 
4
4
  # Initialize the Rails application.
5
5
  Rails.application.initialize!
@@ -1,10 +1,6 @@
1
- if Rails::VERSION::MAJOR > 4
2
- migration_class = ActiveRecord::Migration[4.2]
3
- else
4
- migration_class = ActiveRecord::Migration
5
- end
6
-
7
- class CreateTables < migration_class
1
+ class CreateTables < ActiveRecord::Migration[4.2]
2
+ # rubocop:disable Metrics/AbcSize
3
+ # rubocop:disable Metrics/MethodLength
8
4
  def change
9
5
  create_table(:users) do |t|
10
6
  ## Database authenticatable
@@ -63,4 +59,6 @@ class CreateTables < migration_class
63
59
  t.timestamps null: false
64
60
  end
65
61
  end
62
+ # rubocop:enable Metrics/AbcSize
63
+ # rubocop:enable Metrics/MethodLength
66
64
  end
@@ -0,0 +1,5 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+ end
@@ -0,0 +1,7 @@
1
+ class LongSecretsController < ApplicationController
2
+ before_action :authenticate_admin_user!
3
+
4
+ def index
5
+ head :ok
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class SecretsController < ApplicationController
2
+ before_action :authenticate_user!
3
+
4
+ def index
5
+ head :ok
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ class AdminUser < User
2
+ end
@@ -0,0 +1,11 @@
1
+ class AuthenticationToken
2
+ include Mongoid::Document
3
+
4
+ belongs_to :user
5
+
6
+ field :body, type: String
7
+ field :last_used_at, type: Time
8
+ field :ip_address, type: String
9
+ field :user_agent, type: String
10
+ field :expires_in, type: Integer, default: 0
11
+ end
@@ -0,0 +1,22 @@
1
+ class User
2
+ include Mongoid::Document
3
+
4
+ devise :database_authenticatable,
5
+ :registerable,
6
+ :recoverable,
7
+ :trackable,
8
+ #:validatable Triggers callback to will_save_change_to_email?, fails with mongoid
9
+ :token_authenticatable
10
+
11
+ has_many :authentication_tokens
12
+
13
+ field :email, type: String, default: ''
14
+ field :encrypted_password, type: String, default: ''
15
+ field :reset_password_token, type: String
16
+ field :reset_password_sent_at, type: Time
17
+ field :sign_in_count, type: Integer, default: 0
18
+ field :current_sign_in_at, type: Time
19
+ field :last_sign_in_at, type: Time
20
+ field :current_sign_in_ip, type: String
21
+ field :nick_name, type: String
22
+ end
@@ -1,15 +1,15 @@
1
- require File.expand_path('../boot', __FILE__)
1
+ require File.expand_path('boot', __dir__)
2
2
 
3
3
  require "active_model/railtie"
4
- require "active_record/railtie"
4
+ require "active_job/railtie"
5
5
  require "action_controller/railtie"
6
+ require "action_mailer/railtie"
6
7
  require "action_view/railtie"
7
8
 
8
9
  module RailsApp
9
10
  class Application < Rails::Application
10
11
  config.eager_load = true
11
- config.root = File.expand_path('../../.', __FILE__)
12
+ config.root = File.expand_path('..', __dir__)
12
13
  config.consider_all_requests_local = true
13
14
  end
14
15
  end
15
-
@@ -0,0 +1,2 @@
1
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../../../Gemfile', __dir__)
2
+ require 'bundler/setup'
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require File.expand_path('application', __dir__)
3
+
4
+ # Initialize the Rails application.
5
+ Rails.application.initialize!
@@ -0,0 +1,6 @@
1
+ test:
2
+ clients:
3
+ default:
4
+ database: tiddle_test
5
+ hosts:
6
+ - 0.0.0.0:27017
@@ -0,0 +1,6 @@
1
+ Rails.application.routes.draw do
2
+ devise_for :users
3
+ devise_for :admin_users
4
+ resources :secrets, only: [:index], defaults: { format: 'json' }
5
+ resources :long_secrets, only: [:index], defaults: { format: 'json' }
6
+ end
@@ -0,0 +1,2 @@
1
+ test:
2
+ secret_key_base: 01c37cff57639eef8aa511ae6ab64298c1da89dc32dfdda363473716f49e25d2473e48b6253c69d17c8ae8c9b6a027ec5a4ac0ffbd6c06defe1b70dd2ef32df8
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,6 @@
1
1
  require 'bundler/setup'
2
2
  require 'simplecov'
3
- require 'coveralls'
4
3
 
5
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
6
- SimpleCov::Formatter::HTMLFormatter,
7
- Coveralls::SimpleCov::Formatter
8
- ])
9
4
  SimpleCov.start do
10
5
  add_filter "/spec/"
11
6
  end
@@ -13,15 +8,15 @@ end
13
8
  ENV["RAILS_ENV"] = 'test'
14
9
  ENV["DATABASE_URL"] = "sqlite3:db/test.sqlite3"
15
10
 
16
- require 'rails/all'
17
- require 'rspec/rails'
11
+ Dir[__dir__ + "/support/**/*.rb"].each { |f| require f }
12
+
18
13
  require 'devise'
19
- require 'devise/orm/active_record'
20
14
  require 'tiddle'
21
15
 
22
- require 'rails_app/config/environment'
16
+ backend = Backend.from_name(ENV['BACKEND'])
17
+ backend.load!
23
18
 
24
- Dir[__dir__ + "/support/**/*.rb"].each { |f| require f }
19
+ require 'rspec/rails'
25
20
 
26
21
  # This file was generated by the `rspec --init` command. Conventionally, all
27
22
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
@@ -66,8 +61,12 @@ RSpec.configure do |config|
66
61
  end
67
62
 
68
63
  config.before(:suite) do
69
- # Do initial migration
70
- ActiveRecord::Migrator.migrate(File.expand_path("rails_app/db/migrate/", File.dirname(__FILE__)))
64
+ backend.setup_database_cleaner
65
+ backend.migrate!
66
+ end
67
+
68
+ config.before(:each) do
69
+ DatabaseCleaner.clean if defined?(DatabaseCleaner)
71
70
  end
72
71
 
73
72
  config.use_transactional_fixtures = true
@@ -6,7 +6,7 @@ describe "Authentication using Tiddle strategy", type: :request do
6
6
  end
7
7
 
8
8
  it "allows to access endpoints which require authentication" do
9
- warningless_get(
9
+ get(
10
10
  secrets_path,
11
11
  headers: {
12
12
  "X-USER-EMAIL" => "test@example.com",
@@ -25,14 +25,14 @@ describe "Authentication using Tiddle strategy", type: :request do
25
25
 
26
26
  it "updates last_used_at field" do
27
27
  expect do
28
- warningless_get(
28
+ get(
29
29
  secrets_path,
30
30
  headers: {
31
31
  "X-USER-EMAIL" => "test@example.com",
32
32
  "X-USER-TOKEN" => @token
33
33
  }
34
34
  )
35
- end.to(change { @user.authentication_tokens.last.last_used_at })
35
+ end.to(change { @user.reload.authentication_tokens.last.last_used_at })
36
36
  end
37
37
  end
38
38
 
@@ -43,7 +43,7 @@ describe "Authentication using Tiddle strategy", type: :request do
43
43
 
44
44
  it "does not update last_used_at field" do
45
45
  expect do
46
- warningless_get(
46
+ get(
47
47
  secrets_path,
48
48
  headers: {
49
49
  "X-USER-EMAIL" => "test@example.com",
@@ -57,7 +57,7 @@ describe "Authentication using Tiddle strategy", type: :request do
57
57
 
58
58
  context "when email contains uppercase letters" do
59
59
  it "converts email to lower case and authenticates user" do
60
- warningless_get(
60
+ get(
61
61
  secrets_path,
62
62
  headers: {
63
63
  "X-USER-EMAIL" => "TEST@example.com",
@@ -76,7 +76,7 @@ describe "Authentication using Tiddle strategy", type: :request do
76
76
  end
77
77
 
78
78
  it "does not allow to access endpoints which require authentication" do
79
- warningless_get(
79
+ get(
80
80
  secrets_path,
81
81
  headers: {
82
82
  "X-USER-EMAIL" => "wrong@example.com",
@@ -94,7 +94,7 @@ describe "Authentication using Tiddle strategy", type: :request do
94
94
  end
95
95
 
96
96
  it "does not allow to access endpoints which require authentication" do
97
- warningless_get(
97
+ get(
98
98
  secrets_path,
99
99
  headers: {
100
100
  "X-USER-EMAIL" => "test@example.com",
@@ -107,7 +107,7 @@ describe "Authentication using Tiddle strategy", type: :request do
107
107
 
108
108
  context "when no headers are passed" do
109
109
  it "does not allow to access endpoints which require authentication" do
110
- warningless_get secrets_path, headers: {}
110
+ get secrets_path, headers: {}
111
111
  expect(response.status).to eq 401
112
112
  end
113
113
  end
@@ -119,7 +119,7 @@ describe "Authentication using Tiddle strategy", type: :request do
119
119
  end
120
120
 
121
121
  it "allows to access endpoints which require authentication" do
122
- warningless_get(
122
+ get(
123
123
  long_secrets_path,
124
124
  headers: {
125
125
  "X-ADMIN-USER-EMAIL" => "test@example.com",
@@ -152,7 +152,7 @@ describe "Authentication using Tiddle strategy", type: :request do
152
152
 
153
153
  it "allows to access endpoints which require authentication with valid \
154
154
  nick name and token" do
155
- warningless_get(
155
+ get(
156
156
  secrets_path,
157
157
  headers: { "X-USER-NICK-NAME" => "test", "X-USER-TOKEN" => @token }
158
158
  )
@@ -168,7 +168,7 @@ describe "Authentication using Tiddle strategy", type: :request do
168
168
 
169
169
  describe "token is not expired" do
170
170
  it "does allow to access endpoints which require authentication" do
171
- warningless_get(
171
+ get(
172
172
  secrets_path,
173
173
  headers: {
174
174
  "X-USER-EMAIL" => "test@example.com",
@@ -181,12 +181,12 @@ describe "Authentication using Tiddle strategy", type: :request do
181
181
 
182
182
  describe "token is expired" do
183
183
  before do
184
- token = @user.authentication_tokens.order(:id).last
184
+ token = @user.authentication_tokens.max_by(&:id)
185
185
  token.update_attribute(:last_used_at, 1.month.ago)
186
186
  end
187
187
 
188
188
  it "does not allow to access endpoints which require authentication" do
189
- warningless_get(
189
+ get(
190
190
  secrets_path,
191
191
  headers: {
192
192
  "X-USER-EMAIL" => "test@example.com",
@@ -0,0 +1,53 @@
1
+ module Backend
2
+ def self.from_name(name)
3
+ puts "Backend: #{name}"
4
+ case name
5
+ when 'mongoid'
6
+ MongoidBackend.new
7
+ else
8
+ ActiveRecordBackend.new
9
+ end
10
+ end
11
+
12
+ class ActiveRecordBackend
13
+ def load!
14
+ require 'devise/orm/active_record'
15
+ require 'rails_app_active_record/config/environment'
16
+ end
17
+
18
+ def setup_database_cleaner
19
+ # Not necessary
20
+ end
21
+
22
+ def migrate!
23
+ # Do initial migration
24
+ path = File.expand_path("../rails_app_active_record/db/migrate/", File.dirname(__FILE__))
25
+
26
+ if Gem::Requirement.new(">= 6.0.0") =~ Rails.gem_version
27
+ ActiveRecord::MigrationContext.new(
28
+ path,
29
+ ActiveRecord::SchemaMigration
30
+ ).migrate
31
+ else
32
+ ActiveRecord::MigrationContext.new(path).migrate
33
+ end
34
+ end
35
+ end
36
+
37
+ class MongoidBackend
38
+ def load!
39
+ require 'mongoid'
40
+ require 'devise/orm/mongoid'
41
+ require 'rails_app_mongoid/config/environment'
42
+ require 'database_cleaner-mongoid'
43
+ end
44
+
45
+ def setup_database_cleaner
46
+ DatabaseCleaner.allow_remote_database_url = true
47
+ end
48
+
49
+ def migrate!
50
+ # Not necessary
51
+ end
52
+ end
53
+ end
@@ -9,7 +9,5 @@ class FakeRequest
9
9
  self.headers = headers
10
10
  end
11
11
 
12
- attr_accessor :remote_ip
13
- attr_accessor :user_agent
14
- attr_accessor :headers
12
+ attr_accessor :remote_ip, :user_agent, :headers
15
13
  end
data/spec/tiddle_spec.rb CHANGED
@@ -23,7 +23,7 @@ describe Tiddle do
23
23
 
24
24
  it "sets last_used_at field" do
25
25
  Tiddle.create_and_return_token(@user, FakeRequest.new)
26
- expect(@user.authentication_tokens.last.last_used_at)
26
+ expect(@user.authentication_tokens.last.last_used_at.to_time)
27
27
  .to be_within(1).of(Time.current)
28
28
  end
29
29
 
data/tiddle.gemspec CHANGED
@@ -16,16 +16,15 @@ Gem::Specification.new do |spec|
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
17
  spec.require_paths = ["lib"]
18
18
 
19
- spec.required_ruby_version = '>= 2.2.0'
19
+ spec.required_ruby_version = '>= 2.5.0'
20
20
 
21
- spec.add_dependency "devise", ">= 4.0.0.rc1", "< 4.5"
22
- spec.add_dependency "activerecord", ">= 4.2.0"
23
- spec.add_development_dependency "bundler", "~> 1.7"
24
- spec.add_development_dependency "rake", "~> 12.0"
21
+ spec.add_dependency "devise", ">= 4.0.0.rc1", "< 5"
22
+ spec.add_dependency "activerecord", ">= 5.2.0"
23
+ spec.add_development_dependency "rake"
25
24
  spec.add_development_dependency "rspec-rails"
26
25
  spec.add_development_dependency "appraisal"
27
- spec.add_development_dependency "sqlite3"
28
- spec.add_development_dependency "coveralls"
29
26
  spec.add_development_dependency "simplecov"
30
27
  spec.add_development_dependency "rubocop"
28
+ spec.add_development_dependency "database_cleaner-active_record"
29
+ spec.add_development_dependency "database_cleaner-mongoid"
31
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tiddle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Niedzielski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-16 00:00:00.000000000 Z
11
+ date: 2021-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: devise
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 4.0.0.rc1
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '4.5'
22
+ version: '5'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,49 +29,35 @@ dependencies:
29
29
  version: 4.0.0.rc1
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '4.5'
32
+ version: '5'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: activerecord
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: 4.2.0
39
+ version: 5.2.0
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 4.2.0
47
- - !ruby/object:Gem::Dependency
48
- name: bundler
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '1.7'
54
- type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
59
- - !ruby/object:Gem::Version
60
- version: '1.7'
46
+ version: 5.2.0
61
47
  - !ruby/object:Gem::Dependency
62
48
  name: rake
63
49
  requirement: !ruby/object:Gem::Requirement
64
50
  requirements:
65
- - - "~>"
51
+ - - ">="
66
52
  - !ruby/object:Gem::Version
67
- version: '12.0'
53
+ version: '0'
68
54
  type: :development
69
55
  prerelease: false
70
56
  version_requirements: !ruby/object:Gem::Requirement
71
57
  requirements:
72
- - - "~>"
58
+ - - ">="
73
59
  - !ruby/object:Gem::Version
74
- version: '12.0'
60
+ version: '0'
75
61
  - !ruby/object:Gem::Dependency
76
62
  name: rspec-rails
77
63
  requirement: !ruby/object:Gem::Requirement
@@ -101,7 +87,7 @@ dependencies:
101
87
  - !ruby/object:Gem::Version
102
88
  version: '0'
103
89
  - !ruby/object:Gem::Dependency
104
- name: sqlite3
90
+ name: simplecov
105
91
  requirement: !ruby/object:Gem::Requirement
106
92
  requirements:
107
93
  - - ">="
@@ -115,7 +101,7 @@ dependencies:
115
101
  - !ruby/object:Gem::Version
116
102
  version: '0'
117
103
  - !ruby/object:Gem::Dependency
118
- name: coveralls
104
+ name: rubocop
119
105
  requirement: !ruby/object:Gem::Requirement
120
106
  requirements:
121
107
  - - ">="
@@ -129,7 +115,7 @@ dependencies:
129
115
  - !ruby/object:Gem::Version
130
116
  version: '0'
131
117
  - !ruby/object:Gem::Dependency
132
- name: simplecov
118
+ name: database_cleaner-active_record
133
119
  requirement: !ruby/object:Gem::Requirement
134
120
  requirements:
135
121
  - - ">="
@@ -143,7 +129,7 @@ dependencies:
143
129
  - !ruby/object:Gem::Version
144
130
  version: '0'
145
131
  - !ruby/object:Gem::Dependency
146
- name: rubocop
132
+ name: database_cleaner-mongoid
147
133
  requirement: !ruby/object:Gem::Requirement
148
134
  requirements:
149
135
  - - ">="
@@ -163,10 +149,10 @@ executables: []
163
149
  extensions: []
164
150
  extra_rdoc_files: []
165
151
  files:
152
+ - ".github/workflows/ruby.yml"
166
153
  - ".gitignore"
167
154
  - ".rspec"
168
155
  - ".rubocop.yml"
169
- - ".travis.yml"
170
156
  - Appraisals
171
157
  - CHANGELOG.md
172
158
  - CONTRIBUTING.md
@@ -175,10 +161,9 @@ files:
175
161
  - README.md
176
162
  - Rakefile
177
163
  - config/locales/en.yml
178
- - gemfiles/rails4.2.gemfile
179
- - gemfiles/rails5.0.gemfile
180
- - gemfiles/rails5.1.gemfile
181
164
  - gemfiles/rails5.2.gemfile
165
+ - gemfiles/rails6.0.gemfile
166
+ - gemfiles/rails6.1.gemfile
182
167
  - lib/tiddle.rb
183
168
  - lib/tiddle/model.rb
184
169
  - lib/tiddle/model_name.rb
@@ -186,22 +171,34 @@ files:
186
171
  - lib/tiddle/strategy.rb
187
172
  - lib/tiddle/token_issuer.rb
188
173
  - lib/tiddle/version.rb
189
- - spec/rails_app/app/controllers/application_controller.rb
190
- - spec/rails_app/app/controllers/long_secrets_controller.rb
191
- - spec/rails_app/app/controllers/secrets_controller.rb
192
- - spec/rails_app/app/models/admin_user.rb
193
- - spec/rails_app/app/models/authentication_token.rb
194
- - spec/rails_app/app/models/user.rb
195
- - spec/rails_app/config/application.rb
196
- - spec/rails_app/config/boot.rb
197
- - spec/rails_app/config/environment.rb
198
- - spec/rails_app/config/routes.rb
199
- - spec/rails_app/config/secrets.yml
200
- - spec/rails_app/db/migrate/20150217000000_create_tables.rb
174
+ - spec/rails_app_active_record/app/controllers/application_controller.rb
175
+ - spec/rails_app_active_record/app/controllers/long_secrets_controller.rb
176
+ - spec/rails_app_active_record/app/controllers/secrets_controller.rb
177
+ - spec/rails_app_active_record/app/models/admin_user.rb
178
+ - spec/rails_app_active_record/app/models/authentication_token.rb
179
+ - spec/rails_app_active_record/app/models/user.rb
180
+ - spec/rails_app_active_record/config/application.rb
181
+ - spec/rails_app_active_record/config/boot.rb
182
+ - spec/rails_app_active_record/config/environment.rb
183
+ - spec/rails_app_active_record/config/routes.rb
184
+ - spec/rails_app_active_record/config/secrets.yml
185
+ - spec/rails_app_active_record/db/migrate/20150217000000_create_tables.rb
186
+ - spec/rails_app_mongoid/app/controllers/application_controller.rb
187
+ - spec/rails_app_mongoid/app/controllers/long_secrets_controller.rb
188
+ - spec/rails_app_mongoid/app/controllers/secrets_controller.rb
189
+ - spec/rails_app_mongoid/app/models/admin_user.rb
190
+ - spec/rails_app_mongoid/app/models/authentication_token.rb
191
+ - spec/rails_app_mongoid/app/models/user.rb
192
+ - spec/rails_app_mongoid/config/application.rb
193
+ - spec/rails_app_mongoid/config/boot.rb
194
+ - spec/rails_app_mongoid/config/environment.rb
195
+ - spec/rails_app_mongoid/config/mongoid.yml
196
+ - spec/rails_app_mongoid/config/routes.rb
197
+ - spec/rails_app_mongoid/config/secrets.yml
201
198
  - spec/spec_helper.rb
202
199
  - spec/strategy_spec.rb
200
+ - spec/support/backend.rb
203
201
  - spec/support/fake_request.rb
204
- - spec/support/warningless_get.rb
205
202
  - spec/tiddle_spec.rb
206
203
  - tiddle.gemspec
207
204
  homepage: ''
@@ -216,33 +213,44 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
213
  requirements:
217
214
  - - ">="
218
215
  - !ruby/object:Gem::Version
219
- version: 2.2.0
216
+ version: 2.5.0
220
217
  required_rubygems_version: !ruby/object:Gem::Requirement
221
218
  requirements:
222
219
  - - ">="
223
220
  - !ruby/object:Gem::Version
224
221
  version: '0'
225
222
  requirements: []
226
- rubyforge_project:
227
- rubygems_version: 2.7.3
223
+ rubygems_version: 3.1.2
228
224
  signing_key:
229
225
  specification_version: 4
230
226
  summary: Token authentication for Devise which supports multiple tokens per model
231
227
  test_files:
232
- - spec/rails_app/app/controllers/application_controller.rb
233
- - spec/rails_app/app/controllers/long_secrets_controller.rb
234
- - spec/rails_app/app/controllers/secrets_controller.rb
235
- - spec/rails_app/app/models/admin_user.rb
236
- - spec/rails_app/app/models/authentication_token.rb
237
- - spec/rails_app/app/models/user.rb
238
- - spec/rails_app/config/application.rb
239
- - spec/rails_app/config/boot.rb
240
- - spec/rails_app/config/environment.rb
241
- - spec/rails_app/config/routes.rb
242
- - spec/rails_app/config/secrets.yml
243
- - spec/rails_app/db/migrate/20150217000000_create_tables.rb
228
+ - spec/rails_app_active_record/app/controllers/application_controller.rb
229
+ - spec/rails_app_active_record/app/controllers/long_secrets_controller.rb
230
+ - spec/rails_app_active_record/app/controllers/secrets_controller.rb
231
+ - spec/rails_app_active_record/app/models/admin_user.rb
232
+ - spec/rails_app_active_record/app/models/authentication_token.rb
233
+ - spec/rails_app_active_record/app/models/user.rb
234
+ - spec/rails_app_active_record/config/application.rb
235
+ - spec/rails_app_active_record/config/boot.rb
236
+ - spec/rails_app_active_record/config/environment.rb
237
+ - spec/rails_app_active_record/config/routes.rb
238
+ - spec/rails_app_active_record/config/secrets.yml
239
+ - spec/rails_app_active_record/db/migrate/20150217000000_create_tables.rb
240
+ - spec/rails_app_mongoid/app/controllers/application_controller.rb
241
+ - spec/rails_app_mongoid/app/controllers/long_secrets_controller.rb
242
+ - spec/rails_app_mongoid/app/controllers/secrets_controller.rb
243
+ - spec/rails_app_mongoid/app/models/admin_user.rb
244
+ - spec/rails_app_mongoid/app/models/authentication_token.rb
245
+ - spec/rails_app_mongoid/app/models/user.rb
246
+ - spec/rails_app_mongoid/config/application.rb
247
+ - spec/rails_app_mongoid/config/boot.rb
248
+ - spec/rails_app_mongoid/config/environment.rb
249
+ - spec/rails_app_mongoid/config/mongoid.yml
250
+ - spec/rails_app_mongoid/config/routes.rb
251
+ - spec/rails_app_mongoid/config/secrets.yml
244
252
  - spec/spec_helper.rb
245
253
  - spec/strategy_spec.rb
254
+ - spec/support/backend.rb
246
255
  - spec/support/fake_request.rb
247
- - spec/support/warningless_get.rb
248
256
  - spec/tiddle_spec.rb
data/.travis.yml DELETED
@@ -1,12 +0,0 @@
1
- language: ruby
2
- before_install: gem update --system
3
- rvm:
4
- - "2.2.8"
5
- - "2.3.5"
6
- - "2.4.2"
7
- - "2.5.0"
8
- gemfile:
9
- - "gemfiles/rails4.2.gemfile"
10
- - "gemfiles/rails5.0.gemfile"
11
- - "gemfiles/rails5.1.gemfile"
12
- - "gemfiles/rails5.2.gemfile"
@@ -1,8 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "rubocop", "~> 0.52.0"
6
- gem "rails", "~> 5.1.0"
7
-
8
- gemspec path: "../"
@@ -1,2 +0,0 @@
1
- ENV['BUNDLE_GEMFILE'] = File.expand_path('../../../../Gemfile', __FILE__)
2
- require 'bundler/setup'
@@ -1,7 +0,0 @@
1
- def warningless_get(path, headers:)
2
- if Rails::VERSION::MAJOR >= 5
3
- get path, headers: headers
4
- else
5
- get path, {}, headers
6
- end
7
- end