omniauth-multipassword 0.4.2 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.editorconfig +12 -0
- data/.github/workflows/maintenance-cache-wipe.yml +13 -0
- data/.github/workflows/maintenance-workflow-cleanup.yml +17 -0
- data/.github/workflows/test.yml +62 -0
- data/.gitignore +5 -5
- data/.rspec +1 -0
- data/.rubocop.yml +10 -0
- data/Appraisals +9 -0
- data/CHANGELOG.md +27 -0
- data/Gemfile +18 -4
- data/Rakefile +3 -1
- data/gemfiles/omniauth_2.0.gemfile +21 -0
- data/gemfiles/omniauth_2.1.gemfile +21 -0
- data/lib/omniauth/multipassword/base.rb +19 -10
- data/lib/omniauth/multipassword/version.rb +6 -4
- data/lib/omniauth/strategies/multi_password.rb +22 -17
- data/lib/omniauth-multipassword.rb +5 -3
- data/omniauth-multipassword.gemspec +18 -13
- data/renovate.json +6 -0
- data/spec/omniauth/multipassword/base_spec.rb +17 -25
- data/spec/omniauth/strategy/multi_password_spec.rb +8 -21
- data/spec/spec_helper.rb +16 -19
- data/spec/support/strategies.rb +27 -0
- metadata +24 -13
- data/.travis.yml +0 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 22cda2cc2846bbe4d81087736f52e35f63c590595e6fc384006b0af8da14802f
|
|
4
|
+
data.tar.gz: 0600cb2dbafa41d13aeee34bda46ecb0263546489903aa68444d05126ade735c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f3148c680d27dd56bae5325280e49670cd905d42d6e79cb668b01f0eb8951605bd27816233f3f55cef452c1a67215a94c6b25280dc6083eae3796c1eb12c2ce3
|
|
7
|
+
data.tar.gz: 6b48ab914cd47ff3b8b9641d52f1618050b5cafec8e1f171528eae6f7c8cbe909dd4095fbadc2b92caca6a9f25c002a06e9ab4ee837e8b504d1c031502772f26
|
data/.editorconfig
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: maintenance-workflow-cleanup
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "0 0 1 * *"
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
delete-workflow-runs:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: Mattraks/delete-workflow-runs@v2
|
|
13
|
+
with:
|
|
14
|
+
token: ${{ github.token }}
|
|
15
|
+
repository: ${{ github.repository }}
|
|
16
|
+
retain_days: 180
|
|
17
|
+
keep_minimum_runs: 50
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test
|
|
3
|
+
on:
|
|
4
|
+
- push
|
|
5
|
+
- pull_request
|
|
6
|
+
- workflow_dispatch
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
rspec:
|
|
10
|
+
name: "Ruby ${{ matrix.ruby }} / ${{ matrix.gemfile }}"
|
|
11
|
+
runs-on: ubuntu-22.04
|
|
12
|
+
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: false
|
|
15
|
+
matrix:
|
|
16
|
+
ruby:
|
|
17
|
+
- "3.3"
|
|
18
|
+
- "3.2"
|
|
19
|
+
- "3.1"
|
|
20
|
+
- "3.0"
|
|
21
|
+
- "2.7"
|
|
22
|
+
gemfile:
|
|
23
|
+
- omniauth_2.0
|
|
24
|
+
- omniauth_2.1
|
|
25
|
+
|
|
26
|
+
env:
|
|
27
|
+
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
|
|
28
|
+
BUNDLE_WITHOUT: development
|
|
29
|
+
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@master
|
|
32
|
+
- uses: ruby/setup-ruby@v1
|
|
33
|
+
with:
|
|
34
|
+
ruby-version: ${{ matrix.ruby }}
|
|
35
|
+
bundler-cache: true
|
|
36
|
+
env:
|
|
37
|
+
BUNDLE_JOBS: 4
|
|
38
|
+
BUNDLE_RETRY: 3
|
|
39
|
+
|
|
40
|
+
- run: |
|
|
41
|
+
bundle exec rspec --color --format documentation
|
|
42
|
+
|
|
43
|
+
- uses: codecov/codecov-action@v4
|
|
44
|
+
with:
|
|
45
|
+
fail_ci_if_error: true
|
|
46
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
47
|
+
|
|
48
|
+
rubocop:
|
|
49
|
+
name: rubocop
|
|
50
|
+
runs-on: ubuntu-22.04
|
|
51
|
+
|
|
52
|
+
steps:
|
|
53
|
+
- uses: actions/checkout@master
|
|
54
|
+
- uses: ruby/setup-ruby@v1
|
|
55
|
+
with:
|
|
56
|
+
ruby-version: "3.3"
|
|
57
|
+
bundler-cache: true
|
|
58
|
+
env:
|
|
59
|
+
BUNDLE_JOBS: 4
|
|
60
|
+
BUNDLE_RETRY: 3
|
|
61
|
+
|
|
62
|
+
- run: bundle exec rubocop --parallel --fail-level E
|
data/.gitignore
CHANGED
data/.rspec
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
--backtrace
|
data/.rubocop.yml
ADDED
data/Appraisals
ADDED
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
This project adheres to [Semantic Versioning](http://semver.org/) and [Keep a Changelog](http://keepachangelog.com/).
|
|
5
|
+
|
|
6
|
+
## [Unreleased]
|
|
7
|
+
|
|
8
|
+
## [2.0.1] - 2024-07-20
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- Version bump due to wrong tag
|
|
13
|
+
|
|
14
|
+
## [2.0.0] - 2024-07-20
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- Add compatibility with newer Rack and OmniAuth 2.1+
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Updated strategy to OmniAuth >= 2.0
|
|
23
|
+
- Drop support for Ruby < 2.7
|
|
24
|
+
|
|
25
|
+
[Unreleased]: https://github.com/jgraichen/omniauth-multipassword/compare/v2.0.1...HEAD
|
|
26
|
+
[2.0.1]: https://github.com/jgraichen/omniauth-multipassword/compare/v2.0.0...v2.0.1
|
|
27
|
+
[2.0.0]: https://github.com/jgraichen/omniauth-multipassword/releases/tag/v2.0.0
|
data/Gemfile
CHANGED
|
@@ -1,10 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
source 'https://rubygems.org'
|
|
2
4
|
|
|
3
5
|
# Specify your gem's dependencies in omniauth-multipassword.gemspec
|
|
4
6
|
gemspec
|
|
5
7
|
|
|
8
|
+
gem 'appraisal'
|
|
9
|
+
|
|
6
10
|
gem 'rake'
|
|
7
|
-
gem '
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
gem
|
|
11
|
+
gem 'rake-release'
|
|
12
|
+
|
|
13
|
+
group :test do
|
|
14
|
+
gem 'rack-test'
|
|
15
|
+
|
|
16
|
+
gem 'rspec', '~> 3.0'
|
|
17
|
+
|
|
18
|
+
gem 'simplecov'
|
|
19
|
+
gem 'simplecov-cobertura'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
group :development do
|
|
23
|
+
gem 'rubocop-config', github: 'jgraichen/rubocop-config', ref: 'v12'
|
|
24
|
+
end
|
data/Rakefile
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# This file was generated by Appraisal
|
|
2
|
+
|
|
3
|
+
source "https://rubygems.org"
|
|
4
|
+
|
|
5
|
+
gem "appraisal"
|
|
6
|
+
gem "rake"
|
|
7
|
+
gem "rake-release"
|
|
8
|
+
gem "omniauth", "~> 2.0.0"
|
|
9
|
+
|
|
10
|
+
group :test do
|
|
11
|
+
gem "rack-test"
|
|
12
|
+
gem "rspec", "~> 3.0"
|
|
13
|
+
gem "simplecov"
|
|
14
|
+
gem "simplecov-cobertura"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
group :development do
|
|
18
|
+
gem "rubocop-config", github: "jgraichen/rubocop-config", ref: "v12"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
gemspec path: "../"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# This file was generated by Appraisal
|
|
2
|
+
|
|
3
|
+
source "https://rubygems.org"
|
|
4
|
+
|
|
5
|
+
gem "appraisal"
|
|
6
|
+
gem "rake"
|
|
7
|
+
gem "rake-release"
|
|
8
|
+
gem "omniauth", "~> 2.1"
|
|
9
|
+
|
|
10
|
+
group :test do
|
|
11
|
+
gem "rack-test"
|
|
12
|
+
gem "rspec", "~> 3.0"
|
|
13
|
+
gem "simplecov"
|
|
14
|
+
gem "simplecov-cobertura"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
group :development do
|
|
18
|
+
gem "rubocop-config", github: "jgraichen/rubocop-config", ref: "v12"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
gemspec path: "../"
|
|
@@ -1,25 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module OmniAuth
|
|
2
4
|
module MultiPassword
|
|
3
5
|
module Base
|
|
4
6
|
def self.included(base)
|
|
5
7
|
base.class_eval do
|
|
6
|
-
option :title,
|
|
7
|
-
option :fields, [
|
|
8
|
+
option :title, 'Restricted Access'
|
|
9
|
+
option :fields, %i[username password]
|
|
8
10
|
|
|
9
|
-
uid
|
|
11
|
+
uid { username }
|
|
10
12
|
end
|
|
11
13
|
end
|
|
12
14
|
|
|
13
15
|
def username_id
|
|
14
|
-
options
|
|
16
|
+
options.dig(:fields, 0) || 'username'
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
def password_id
|
|
18
|
-
options
|
|
20
|
+
options.dig(:fields, 1) || 'password'
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
def username
|
|
22
|
-
@username || request[username_id].to_s
|
|
24
|
+
@username || request.params[username_id.to_s].to_s
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
def init_authenticator(request, env, username)
|
|
@@ -29,7 +31,7 @@ module OmniAuth
|
|
|
29
31
|
end
|
|
30
32
|
|
|
31
33
|
def callback_phase
|
|
32
|
-
if authenticate(username, request[password_id])
|
|
34
|
+
if authenticate(username, request.params[password_id.to_s])
|
|
33
35
|
super
|
|
34
36
|
else
|
|
35
37
|
fail!(:invalid_credentials)
|
|
@@ -37,11 +39,18 @@ module OmniAuth
|
|
|
37
39
|
end
|
|
38
40
|
|
|
39
41
|
def request_phase
|
|
40
|
-
OmniAuth::Form.build(:
|
|
41
|
-
f.text_field
|
|
42
|
-
f.password_field
|
|
42
|
+
OmniAuth::Form.build(title: options.title, url: callback_url) do |f|
|
|
43
|
+
f.text_field 'Username', username_id
|
|
44
|
+
f.password_field 'Password', password_id
|
|
43
45
|
end.to_response
|
|
44
46
|
end
|
|
47
|
+
|
|
48
|
+
def other_phase
|
|
49
|
+
# OmniAuth, by default, disables "GET" requests for security reasons.
|
|
50
|
+
# This effectively disables showing a password form on a GET request to
|
|
51
|
+
# the `request_phase`. Instead, we hook the GET requests here.
|
|
52
|
+
request_phase if on_request_path?
|
|
53
|
+
end
|
|
45
54
|
end
|
|
46
55
|
end
|
|
47
56
|
end
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Omniauth
|
|
2
4
|
module Multipassword
|
|
3
5
|
module VERSION
|
|
4
|
-
MAJOR =
|
|
5
|
-
MINOR =
|
|
6
|
-
PATCH =
|
|
6
|
+
MAJOR = 2
|
|
7
|
+
MINOR = 0
|
|
8
|
+
PATCH = 1
|
|
7
9
|
STAGE = nil
|
|
8
10
|
|
|
9
11
|
def self.to_s
|
|
10
|
-
[MAJOR, MINOR, PATCH, STAGE].
|
|
12
|
+
[MAJOR, MINOR, PATCH, STAGE].compact.join '.'
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
15
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'omniauth'
|
|
4
|
+
require 'omniauth/multipassword/base'
|
|
3
5
|
|
|
4
6
|
module OmniAuth
|
|
5
7
|
module Strategies
|
|
@@ -8,12 +10,16 @@ module OmniAuth
|
|
|
8
10
|
include OmniAuth::MultiPassword::Base
|
|
9
11
|
|
|
10
12
|
def initialize(app, *args, &block)
|
|
11
|
-
super(app, *args) do
|
|
13
|
+
super(app, *args) do
|
|
14
|
+
# Do pass an empty block, as otherwise the captured block would be
|
|
15
|
+
# passed to `super`, but this needs to be evaluate inside this
|
|
16
|
+
# middleware, not omniauth's Rack builder instance.
|
|
17
|
+
end
|
|
12
18
|
|
|
13
|
-
if block.arity
|
|
14
|
-
instance_eval
|
|
19
|
+
if block.arity.zero?
|
|
20
|
+
instance_eval(&block)
|
|
15
21
|
else
|
|
16
|
-
|
|
22
|
+
yield self
|
|
17
23
|
end
|
|
18
24
|
end
|
|
19
25
|
|
|
@@ -25,25 +31,25 @@ module OmniAuth
|
|
|
25
31
|
def authenticator(klass, *args, &block)
|
|
26
32
|
unless klass.is_a?(Class)
|
|
27
33
|
begin
|
|
28
|
-
klass = OmniAuth::Strategies.const_get(
|
|
34
|
+
klass = OmniAuth::Strategies.const_get(OmniAuth::Utils.camelize(klass.to_s).to_s)
|
|
29
35
|
rescue NameError
|
|
30
|
-
raise LoadError
|
|
31
|
-
|
|
36
|
+
raise LoadError.new("Could not find matching strategy for #{klass.inspect}." \
|
|
37
|
+
"You may need to install an additional gem (such as omniauth-#{klass}).")
|
|
32
38
|
end
|
|
33
39
|
end
|
|
34
40
|
|
|
35
41
|
args << block if block
|
|
36
42
|
@authenticators ||= []
|
|
37
|
-
@authenticators << [
|
|
43
|
+
@authenticators << [klass, args]
|
|
38
44
|
end
|
|
39
45
|
|
|
40
46
|
def callback_phase
|
|
41
|
-
username = request[username_id].to_s
|
|
42
|
-
password = request[password_id].to_s
|
|
47
|
+
username = request.params[username_id.to_s].to_s
|
|
48
|
+
password = request.params[password_id.to_s].to_s
|
|
43
49
|
if authenticate(username, password)
|
|
44
50
|
super
|
|
45
51
|
else
|
|
46
|
-
|
|
52
|
+
fail!(:invalid_credentials)
|
|
47
53
|
end
|
|
48
54
|
end
|
|
49
55
|
|
|
@@ -52,11 +58,9 @@ module OmniAuth
|
|
|
52
58
|
begin
|
|
53
59
|
@authenticator = auth[0].new @app, *auth[1]
|
|
54
60
|
@authenticator.init_authenticator(@request, @env, username)
|
|
55
|
-
if @authenticator.authenticate(username, password)
|
|
56
|
-
return true
|
|
57
|
-
end
|
|
61
|
+
return true if @authenticator.authenticate(username, password)
|
|
58
62
|
rescue Error => e
|
|
59
|
-
OmniAuth.logger.warn "OmniAuth ERR >>> "
|
|
63
|
+
OmniAuth.logger.warn "OmniAuth ERR >>> #{e}"
|
|
60
64
|
end
|
|
61
65
|
@authenticator = nil
|
|
62
66
|
end
|
|
@@ -65,6 +69,7 @@ module OmniAuth
|
|
|
65
69
|
|
|
66
70
|
def name
|
|
67
71
|
return @authenticator.name if @authenticator
|
|
72
|
+
|
|
68
73
|
super
|
|
69
74
|
end
|
|
70
75
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
require
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'omniauth/multipassword/base'
|
|
4
|
+
require 'omniauth/multipassword/version'
|
|
5
|
+
require 'omniauth/strategies/multi_password'
|
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require File.expand_path('lib/omniauth/multipassword/version', __dir__)
|
|
3
4
|
|
|
4
5
|
Gem::Specification.new do |gem|
|
|
5
|
-
gem.
|
|
6
|
-
gem.
|
|
7
|
-
gem.
|
|
8
|
-
gem.
|
|
9
|
-
gem.
|
|
6
|
+
gem.name = 'omniauth-multipassword'
|
|
7
|
+
gem.version = Omniauth::Multipassword::VERSION
|
|
8
|
+
gem.authors = ['Jan Graichen']
|
|
9
|
+
gem.email = ['jgraichen@altimos.de']
|
|
10
|
+
gem.description = 'A OmniAuth strategy to authenticate using different passwort strategies.'
|
|
11
|
+
gem.summary = 'A OmniAuth strategy to authenticate using different passwort strategies.'
|
|
12
|
+
gem.homepage = 'https://github.com/jgraichen/omniauth-multipassword'
|
|
10
13
|
gem.license = 'MIT'
|
|
11
14
|
|
|
12
|
-
gem.
|
|
15
|
+
gem.required_ruby_version = '>= 2.7'
|
|
16
|
+
gem.metadata = {
|
|
17
|
+
'rubygems_mfa_required' => 'true',
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map {|f| File.basename(f) }
|
|
13
21
|
gem.files = `git ls-files`.split("\n")
|
|
14
|
-
gem.
|
|
15
|
-
gem.name = "omniauth-multipassword"
|
|
16
|
-
gem.require_paths = ["lib"]
|
|
17
|
-
gem.version = Omniauth::Multipassword::VERSION
|
|
22
|
+
gem.require_paths = ['lib']
|
|
18
23
|
|
|
19
|
-
gem.add_dependency 'omniauth', '~>
|
|
24
|
+
gem.add_dependency 'omniauth', '~> 2.0'
|
|
20
25
|
end
|
data/renovate.json
ADDED
|
@@ -1,48 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
require 'rack/test'
|
|
3
5
|
|
|
4
|
-
describe OmniAuth::MultiPassword::Base do
|
|
5
|
-
let(:app) {
|
|
6
|
-
let(:args) { [] }
|
|
7
|
-
let(:block) { nil }
|
|
8
|
-
|
|
9
|
-
class OmniAuth::Strategy::OneTest
|
|
10
|
-
include OmniAuth::Strategy
|
|
11
|
-
include OmniAuth::MultiPassword::Base
|
|
12
|
-
|
|
13
|
-
def authenticate(username, password)
|
|
14
|
-
username == 'john' && password == 'secret'
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
6
|
+
describe OmniAuth::MultiPassword::Base do # rubocop:disable RSpec/SpecFilePathFormat subject { strategy }
|
|
7
|
+
let(:app) { instance_double(Proc) }
|
|
18
8
|
let(:strategy) do
|
|
19
|
-
OmniAuth::
|
|
9
|
+
OmniAuth::Strategies::OneTest.new(app, *args, &block)
|
|
20
10
|
end
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
let(:args) { [] }
|
|
12
|
+
let(:block) { nil }
|
|
23
13
|
|
|
24
14
|
describe '#username_id' do
|
|
25
|
-
subject { strategy.username_id }
|
|
15
|
+
subject(:username_id) { strategy.username_id }
|
|
26
16
|
|
|
27
17
|
it 'defaults to :username' do
|
|
28
|
-
|
|
18
|
+
expect(username_id).to eq :username
|
|
29
19
|
end
|
|
30
20
|
|
|
31
21
|
context 'when configured' do
|
|
32
|
-
let(:args) { [{fields: [
|
|
22
|
+
let(:args) { [{fields: %i[user pass]}] }
|
|
23
|
+
|
|
33
24
|
it { is_expected.to eq :user }
|
|
34
25
|
end
|
|
35
26
|
end
|
|
36
27
|
|
|
37
28
|
describe '#password_id' do
|
|
38
|
-
subject { strategy.password_id }
|
|
29
|
+
subject(:password_id) { strategy.password_id }
|
|
39
30
|
|
|
40
31
|
it 'defaults to :password' do
|
|
41
|
-
|
|
32
|
+
expect(password_id).to eq :password
|
|
42
33
|
end
|
|
43
34
|
|
|
44
35
|
context 'when configured' do
|
|
45
|
-
let(:args) { [{fields: [
|
|
36
|
+
let(:args) { [{fields: %i[user pass]}] }
|
|
37
|
+
|
|
46
38
|
it { is_expected.to eq :pass }
|
|
47
39
|
end
|
|
48
40
|
end
|
|
@@ -51,11 +43,11 @@ describe OmniAuth::MultiPassword::Base do
|
|
|
51
43
|
include Rack::Test::Methods
|
|
52
44
|
|
|
53
45
|
let(:app) do
|
|
54
|
-
Rack::Builder.new
|
|
46
|
+
Rack::Builder.new do
|
|
55
47
|
use OmniAuth::Test::PhonySession
|
|
56
48
|
use OmniAuth::Strategies::OneTest
|
|
57
49
|
run ->(env) { [404, {'Content-Type' => 'text/plain'}, [env.key?('omniauth.auth').to_s]] }
|
|
58
|
-
|
|
50
|
+
end.to_app
|
|
59
51
|
end
|
|
60
52
|
|
|
61
53
|
it 'shows login FORM' do
|
|
@@ -1,36 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
require 'rack/test'
|
|
3
5
|
|
|
4
|
-
describe OmniAuth::Strategies::MultiPassword do
|
|
6
|
+
describe OmniAuth::Strategies::MultiPassword do # rubocop:disable RSpec/SpecFilePathFormat
|
|
5
7
|
include Rack::Test::Methods
|
|
6
8
|
|
|
7
|
-
class OmniAuth::Strategies::OneTest
|
|
8
|
-
include OmniAuth::Strategy
|
|
9
|
-
include OmniAuth::MultiPassword::Base
|
|
10
|
-
|
|
11
|
-
def authenticate(username, password)
|
|
12
|
-
username == 'john' && password == 'secret'
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
class OmniAuth::Strategies::TwoTest
|
|
17
|
-
include OmniAuth::Strategy
|
|
18
|
-
include OmniAuth::MultiPassword::Base
|
|
19
|
-
|
|
20
|
-
def authenticate(username, password)
|
|
21
|
-
username == 'jane' && password == '1234'
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
9
|
let(:app) do
|
|
26
|
-
Rack::Builder.new
|
|
10
|
+
Rack::Builder.new do
|
|
27
11
|
use OmniAuth::Test::PhonySession
|
|
28
12
|
use OmniAuth::Strategies::MultiPassword do
|
|
29
13
|
authenticator :one_test
|
|
30
14
|
authenticator :two_test
|
|
31
15
|
end
|
|
32
16
|
run ->(env) { [404, {'Content-Type' => 'text/plain'}, [env['omniauth.auth']['uid'].to_s]] }
|
|
33
|
-
|
|
17
|
+
end.to_app
|
|
34
18
|
end
|
|
35
19
|
|
|
36
20
|
it 'shows login FORM' do
|
|
@@ -41,17 +25,20 @@ describe OmniAuth::Strategies::MultiPassword do
|
|
|
41
25
|
|
|
42
26
|
it 'redirect on all failed strategies' do
|
|
43
27
|
post '/auth/multipassword/callback', username: 'paul', password: 'wrong'
|
|
28
|
+
|
|
44
29
|
expect(last_response).to be_redirect
|
|
45
30
|
expect(last_response.headers['Location']).to eq '/auth/failure?message=invalid_credentials&strategy=multipassword'
|
|
46
31
|
end
|
|
47
32
|
|
|
48
33
|
it 'authenticates john' do
|
|
49
34
|
post '/auth/multipassword/callback', username: 'john', password: 'secret'
|
|
35
|
+
|
|
50
36
|
expect(last_response.body).to eq 'john'
|
|
51
37
|
end
|
|
52
38
|
|
|
53
39
|
it 'authenticates jane' do
|
|
54
40
|
post '/auth/multipassword/callback', username: 'jane', password: '1234'
|
|
41
|
+
|
|
55
42
|
expect(last_response.body).to eq 'jane'
|
|
56
43
|
end
|
|
57
44
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,30 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'rspec'
|
|
4
|
+
|
|
2
5
|
require 'simplecov'
|
|
6
|
+
require 'simplecov-cobertura'
|
|
3
7
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
require 'codeclimate-test-reporter'
|
|
7
|
-
CodeClimate::TestReporter.start
|
|
8
|
-
rescue LoadError
|
|
9
|
-
end
|
|
10
|
-
SimpleCov.start
|
|
8
|
+
SimpleCov.start do
|
|
9
|
+
add_filter 'spec'
|
|
11
10
|
end
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
# Disable omniauth logger
|
|
18
|
-
class NullLogger < Logger
|
|
19
|
-
def initialize(*args)
|
|
20
|
-
end
|
|
12
|
+
SimpleCov.formatters = [
|
|
13
|
+
SimpleCov::Formatter::HTMLFormatter,
|
|
14
|
+
SimpleCov::Formatter::CoberturaFormatter,
|
|
15
|
+
]
|
|
21
16
|
|
|
22
|
-
|
|
23
|
-
end
|
|
24
|
-
end
|
|
17
|
+
require 'omniauth-multipassword'
|
|
25
18
|
|
|
26
|
-
|
|
19
|
+
Dir[File.expand_path('spec/support/**/*.rb')].sort.each {|f| require f }
|
|
27
20
|
|
|
28
21
|
RSpec.configure do |config|
|
|
29
22
|
config.order = 'random'
|
|
23
|
+
|
|
24
|
+
config.before do
|
|
25
|
+
OmniAuth.config.logger = Logger.new(IO::NULL)
|
|
26
|
+
end
|
|
30
27
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OmniAuth
|
|
4
|
+
module Strategies
|
|
5
|
+
class OneTest
|
|
6
|
+
include OmniAuth::Strategy
|
|
7
|
+
include OmniAuth::MultiPassword::Base
|
|
8
|
+
|
|
9
|
+
def authenticate(username, password)
|
|
10
|
+
username == 'john' && password == 'secret'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
module OmniAuth
|
|
17
|
+
module Strategies
|
|
18
|
+
class TwoTest
|
|
19
|
+
include OmniAuth::Strategy
|
|
20
|
+
include OmniAuth::MultiPassword::Base
|
|
21
|
+
|
|
22
|
+
def authenticate(username, password)
|
|
23
|
+
username == 'jane' && password == '1234'
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: omniauth-multipassword
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 2.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jan Graichen
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2024-07-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: omniauth
|
|
@@ -16,40 +16,52 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
19
|
+
version: '2.0'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
26
|
+
version: '2.0'
|
|
27
27
|
description: A OmniAuth strategy to authenticate using different passwort strategies.
|
|
28
28
|
email:
|
|
29
|
-
-
|
|
29
|
+
- jgraichen@altimos.de
|
|
30
30
|
executables: []
|
|
31
31
|
extensions: []
|
|
32
32
|
extra_rdoc_files: []
|
|
33
33
|
files:
|
|
34
|
+
- ".editorconfig"
|
|
35
|
+
- ".github/workflows/maintenance-cache-wipe.yml"
|
|
36
|
+
- ".github/workflows/maintenance-workflow-cleanup.yml"
|
|
37
|
+
- ".github/workflows/test.yml"
|
|
34
38
|
- ".gitignore"
|
|
35
|
-
- ".
|
|
39
|
+
- ".rspec"
|
|
40
|
+
- ".rubocop.yml"
|
|
41
|
+
- Appraisals
|
|
42
|
+
- CHANGELOG.md
|
|
36
43
|
- Gemfile
|
|
37
44
|
- LICENSE
|
|
38
45
|
- README.md
|
|
39
46
|
- Rakefile
|
|
47
|
+
- gemfiles/omniauth_2.0.gemfile
|
|
48
|
+
- gemfiles/omniauth_2.1.gemfile
|
|
40
49
|
- lib/omniauth-multipassword.rb
|
|
41
50
|
- lib/omniauth/multipassword/base.rb
|
|
42
51
|
- lib/omniauth/multipassword/version.rb
|
|
43
52
|
- lib/omniauth/strategies/multi_password.rb
|
|
44
53
|
- omniauth-multipassword.gemspec
|
|
54
|
+
- renovate.json
|
|
45
55
|
- spec/omniauth/multipassword/base_spec.rb
|
|
46
56
|
- spec/omniauth/strategy/multi_password_spec.rb
|
|
47
57
|
- spec/spec_helper.rb
|
|
58
|
+
- spec/support/strategies.rb
|
|
48
59
|
homepage: https://github.com/jgraichen/omniauth-multipassword
|
|
49
60
|
licenses:
|
|
50
61
|
- MIT
|
|
51
|
-
metadata:
|
|
52
|
-
|
|
62
|
+
metadata:
|
|
63
|
+
rubygems_mfa_required: 'true'
|
|
64
|
+
post_install_message:
|
|
53
65
|
rdoc_options: []
|
|
54
66
|
require_paths:
|
|
55
67
|
- lib
|
|
@@ -57,16 +69,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
57
69
|
requirements:
|
|
58
70
|
- - ">="
|
|
59
71
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '
|
|
72
|
+
version: '2.7'
|
|
61
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
62
74
|
requirements:
|
|
63
75
|
- - ">="
|
|
64
76
|
- !ruby/object:Gem::Version
|
|
65
77
|
version: '0'
|
|
66
78
|
requirements: []
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
signing_key:
|
|
79
|
+
rubygems_version: 3.5.11
|
|
80
|
+
signing_key:
|
|
70
81
|
specification_version: 4
|
|
71
82
|
summary: A OmniAuth strategy to authenticate using different passwort strategies.
|
|
72
83
|
test_files: []
|