omniauth-polaris 1.0.5 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +2 -2
- data/.rubocop.yml +25 -1
- data/.rubocop_todo.yml +300 -0
- data/Gemfile +6 -5
- data/Rakefile +19 -6
- data/bin/console +9 -0
- data/lib/omniauth/polaris/adaptor.rb +108 -0
- data/lib/omniauth/polaris/version.rb +7 -0
- data/lib/omniauth/polaris.rb +24 -0
- data/lib/omniauth/strategies/polaris.rb +56 -88
- data/lib/omniauth-polaris.rb +3 -3
- data/omniauth-polaris.gemspec +19 -18
- data/spec/omniauth/polaris/adaptor_spec.rb +17 -0
- data/spec/omniauth/strategies/polaris_spec.rb +63 -40
- data/spec/spec_helper.rb +23 -5
- metadata +59 -31
- data/lib/omniauth-polaris/adaptor.rb +0 -96
- data/lib/omniauth-polaris/version.rb +0 -5
- data/spec/omniauth-ldap/adaptor_spec.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cdc6774680ba017d52076ea0e48f91c64c639398d68a6efc378e15f176cf7c41
|
4
|
+
data.tar.gz: ac1c47675fb06db77a9e889aaa905fe8dbc5b8ff493b95e7a2ce58fbe3c2b471
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90668f491c693ed44cba53bb920e36f05b394d96e103b1f54dd1a55ef1dff87d090af930c01910a78d705083777613190e64542800c1f4a942290b4933b3d1e7
|
7
|
+
data.tar.gz: 02a9cf3dc5b6ab29db564ed28c63ac616b93572ea2ba4df72c388b5b9937bf535d1aebfe6d169154d563ac917121efb8cae87594bd89a7ed04a285a1e69b5540
|
data/.gitignore
CHANGED
@@ -50,14 +50,14 @@ Icon?
|
|
50
50
|
ehthumbs.db
|
51
51
|
.idea # Rubymine config files
|
52
52
|
/.idea/*
|
53
|
-
|
53
|
+
.ruby-version
|
54
54
|
# Directories to ignore #
|
55
55
|
#########################
|
56
56
|
/public/data/*
|
57
57
|
/jetty/*
|
58
58
|
/solr_conf/*
|
59
59
|
/fedora_conf/*
|
60
|
-
|
60
|
+
scratch.rb
|
61
61
|
# Ignore edited Linux files #
|
62
62
|
#############################
|
63
63
|
|
data/.rubocop.yml
CHANGED
@@ -1 +1,25 @@
|
|
1
|
-
|
1
|
+
inherit_from: .rubocop_todo.yml
|
2
|
+
|
3
|
+
# The behavior of RuboCop can be controlled via the .rubocop.yml
|
4
|
+
# configuration file. It makes it possible to enable/disable
|
5
|
+
# certain cops (checks) and to alter their behavior if they accept
|
6
|
+
# any parameters. The file can be placed either in your home
|
7
|
+
# directory or in some project directory.
|
8
|
+
#
|
9
|
+
# RuboCop will start looking for the configuration file in the directory
|
10
|
+
# where the inspected file is and continue its way up to the root directory.
|
11
|
+
#
|
12
|
+
# See https://docs.rubocop.org/rubocop/configuration
|
13
|
+
|
14
|
+
AllCops:
|
15
|
+
TargetRubyVersion: 2.7
|
16
|
+
NewCops: enable
|
17
|
+
Exclude:
|
18
|
+
- 'scratch.rb'
|
19
|
+
|
20
|
+
Gemspec/RequireMFA:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
RSpec/MultipleExpectations:
|
24
|
+
Enabled: true
|
25
|
+
Max: 5
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,300 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2023-01-11 17:46:34 UTC using RuboCop version 1.32.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 2
|
10
|
+
# This cop supports safe autocorrection (--autocorrect).
|
11
|
+
# Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation, Include.
|
12
|
+
# Include: **/*.gemfile, **/Gemfile, **/gems.rb
|
13
|
+
Bundler/OrderedGems:
|
14
|
+
Enabled: true
|
15
|
+
|
16
|
+
# Offense count: 2
|
17
|
+
# This cop supports safe autocorrection (--autocorrect).
|
18
|
+
# Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation, Include.
|
19
|
+
# Include: **/*.gemspec
|
20
|
+
Gemspec/OrderedDependencies:
|
21
|
+
Enabled: true
|
22
|
+
|
23
|
+
# Offense count: 1
|
24
|
+
# Configuration parameters: Include.
|
25
|
+
# Include: **/*.gemspec
|
26
|
+
Gemspec/RequiredRubyVersion:
|
27
|
+
Exclude:
|
28
|
+
- 'omniauth-polaris.gemspec'
|
29
|
+
|
30
|
+
# Offense count: 2
|
31
|
+
# This cop supports safe autocorrection (--autocorrect).
|
32
|
+
Layout/EmptyLines:
|
33
|
+
Enabled: true
|
34
|
+
# Offense count: 1
|
35
|
+
# This cop supports safe autocorrection (--autocorrect).
|
36
|
+
# Configuration parameters: AllowForAlignment, AllowBeforeTrailingComments, ForceEqualSignAlignment.
|
37
|
+
Layout/ExtraSpacing:
|
38
|
+
Enabled: true
|
39
|
+
# Offense count: 2
|
40
|
+
# This cop supports safe autocorrection (--autocorrect).
|
41
|
+
# Configuration parameters: EnforcedStyle, IndentationWidth.
|
42
|
+
# SupportedStyles: special_inside_parentheses, consistent, align_braces
|
43
|
+
Layout/FirstHashElementIndentation:
|
44
|
+
Enabled: true
|
45
|
+
|
46
|
+
# Offense count: 1
|
47
|
+
# This cop supports safe autocorrection (--autocorrect).
|
48
|
+
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
|
49
|
+
# SupportedHashRocketStyles: key, separator, table
|
50
|
+
# SupportedColonStyles: key, separator, table
|
51
|
+
# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
|
52
|
+
Layout/HashAlignment:
|
53
|
+
Enabled: true
|
54
|
+
|
55
|
+
# Offense count: 3
|
56
|
+
# This cop supports safe autocorrection (--autocorrect).
|
57
|
+
# Configuration parameters: AllowDoxygenCommentStyle, AllowGemfileRubyComment.
|
58
|
+
Layout/LeadingCommentSpace:
|
59
|
+
Enabled: true
|
60
|
+
|
61
|
+
# Offense count: 1
|
62
|
+
# This cop supports safe autocorrection (--autocorrect).
|
63
|
+
Layout/LeadingEmptyLines:
|
64
|
+
Enabled: true
|
65
|
+
|
66
|
+
# Offense count: 1
|
67
|
+
# This cop supports safe autocorrection (--autocorrect).
|
68
|
+
Layout/SpaceAfterComma:
|
69
|
+
Enabled: true
|
70
|
+
|
71
|
+
# Offense count: 2
|
72
|
+
# This cop supports safe autocorrection (--autocorrect).
|
73
|
+
# Configuration parameters: AllowForAlignment, EnforcedStyleForExponentOperator.
|
74
|
+
# SupportedStylesForExponentOperator: space, no_space
|
75
|
+
Layout/SpaceAroundOperators:
|
76
|
+
Enabled: true
|
77
|
+
|
78
|
+
# Offense count: 3
|
79
|
+
# This cop supports safe autocorrection (--autocorrect).
|
80
|
+
# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces.
|
81
|
+
# SupportedStyles: space, no_space
|
82
|
+
# SupportedStylesForEmptyBraces: space, no_space
|
83
|
+
Layout/SpaceBeforeBlockBraces:
|
84
|
+
Enabled: true
|
85
|
+
|
86
|
+
# Offense count: 1
|
87
|
+
# This cop supports safe autocorrection (--autocorrect).
|
88
|
+
Layout/SpaceBeforeComma:
|
89
|
+
Enabled: true
|
90
|
+
|
91
|
+
# Offense count: 4
|
92
|
+
# This cop supports safe autocorrection (--autocorrect).
|
93
|
+
# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
|
94
|
+
# SupportedStyles: space, no_space
|
95
|
+
# SupportedStylesForEmptyBraces: space, no_space
|
96
|
+
Layout/SpaceInsideBlockBraces:
|
97
|
+
Enabled: true
|
98
|
+
|
99
|
+
# Offense count: 6
|
100
|
+
# This cop supports safe autocorrection (--autocorrect).
|
101
|
+
# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces.
|
102
|
+
# SupportedStyles: space, no_space, compact
|
103
|
+
# SupportedStylesForEmptyBraces: space, no_space
|
104
|
+
Layout/SpaceInsideHashLiteralBraces:
|
105
|
+
Enabled: true
|
106
|
+
|
107
|
+
# Offense count: 1
|
108
|
+
# This cop supports safe autocorrection (--autocorrect).
|
109
|
+
# Configuration parameters: EnforcedStyle.
|
110
|
+
# SupportedStyles: space, compact, no_space
|
111
|
+
Layout/SpaceInsideParens:
|
112
|
+
Enabled: true
|
113
|
+
|
114
|
+
# Offense count: 1
|
115
|
+
Lint/RescueException:
|
116
|
+
Enabled: true
|
117
|
+
|
118
|
+
# Offense count: 1
|
119
|
+
# This cop supports safe autocorrection (--autocorrect).
|
120
|
+
Lint/ScriptPermission:
|
121
|
+
Enabled: true
|
122
|
+
|
123
|
+
# Offense count: 1
|
124
|
+
# This cop supports safe autocorrection (--autocorrect).
|
125
|
+
# Configuration parameters: ContextCreatingMethods, MethodCreatingMethods.
|
126
|
+
Lint/UselessAccessModifier:
|
127
|
+
Enabled: true
|
128
|
+
|
129
|
+
# Offense count: 2
|
130
|
+
Lint/UselessAssignment:
|
131
|
+
Enabled: true
|
132
|
+
|
133
|
+
# Offense count: 3
|
134
|
+
# Configuration parameters: IgnoredMethods, CountRepeatedAttributes.
|
135
|
+
Metrics/AbcSize:
|
136
|
+
Max: 39
|
137
|
+
|
138
|
+
# Offense count: 2
|
139
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
140
|
+
# IgnoredMethods: refine
|
141
|
+
Metrics/BlockLength:
|
142
|
+
Max: 63
|
143
|
+
|
144
|
+
# Offense count: 1
|
145
|
+
# Configuration parameters: IgnoredMethods.
|
146
|
+
Metrics/CyclomaticComplexity:
|
147
|
+
Max: 15
|
148
|
+
|
149
|
+
# Offense count: 3
|
150
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
151
|
+
Metrics/MethodLength:
|
152
|
+
Max: 20
|
153
|
+
|
154
|
+
# Offense count: 1
|
155
|
+
# Configuration parameters: IgnoredMethods.
|
156
|
+
Metrics/PerceivedComplexity:
|
157
|
+
Max: 13
|
158
|
+
|
159
|
+
# Offense count: 1
|
160
|
+
# Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, CheckDefinitionPathHierarchyRoots, Regex, IgnoreExecutableScripts, AllowedAcronyms.
|
161
|
+
# CheckDefinitionPathHierarchyRoots: lib, spec, test, src
|
162
|
+
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
|
163
|
+
Naming/FileName:
|
164
|
+
Exclude:
|
165
|
+
- 'lib/omniauth-polaris.rb'
|
166
|
+
|
167
|
+
# Offense count: 2
|
168
|
+
# Configuration parameters: AllowedConstants.
|
169
|
+
Style/Documentation:
|
170
|
+
Exclude:
|
171
|
+
- 'spec/**/*'
|
172
|
+
- 'test/**/*'
|
173
|
+
- 'lib/omniauth/polaris/adaptor.rb'
|
174
|
+
- 'lib/omniauth/strategies/polaris.rb'
|
175
|
+
|
176
|
+
# Offense count: 2
|
177
|
+
# This cop supports safe autocorrection (--autocorrect).
|
178
|
+
# Configuration parameters: EnforcedStyle.
|
179
|
+
# SupportedStyles: compact, expanded
|
180
|
+
Style/EmptyMethod:
|
181
|
+
Enabled: true
|
182
|
+
# Offense count: 1
|
183
|
+
# This cop supports safe autocorrection (--autocorrect).
|
184
|
+
Style/Encoding:
|
185
|
+
Enabled: true
|
186
|
+
|
187
|
+
# Offense count: 3
|
188
|
+
# This cop supports safe autocorrection (--autocorrect).
|
189
|
+
Style/ExpandPathArguments:
|
190
|
+
Enabled: true
|
191
|
+
|
192
|
+
# Offense count: 1
|
193
|
+
# This cop supports safe autocorrection (--autocorrect).
|
194
|
+
# Configuration parameters: EnforcedStyle.
|
195
|
+
# SupportedStyles: format, sprintf, percent
|
196
|
+
Style/FormatString:
|
197
|
+
Enabled: true
|
198
|
+
|
199
|
+
# Offense count: 1
|
200
|
+
# This cop supports unsafe autocorrection (--autocorrect-all).
|
201
|
+
# Configuration parameters: EnforcedStyle.
|
202
|
+
# SupportedStyles: always, always_true, never
|
203
|
+
Style/FrozenStringLiteralComment:
|
204
|
+
Enabled: true
|
205
|
+
|
206
|
+
# Offense count: 23
|
207
|
+
# This cop supports safe autocorrection (--autocorrect).
|
208
|
+
# Configuration parameters: EnforcedStyle, EnforcedShorthandSyntax, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols.
|
209
|
+
# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys
|
210
|
+
# SupportedShorthandSyntax: always, never, either
|
211
|
+
Style/HashSyntax:
|
212
|
+
Enabled: true
|
213
|
+
|
214
|
+
# Offense count: 1
|
215
|
+
# This cop supports safe autocorrection (--autocorrect).
|
216
|
+
# Configuration parameters: EnforcedStyle.
|
217
|
+
# SupportedStyles: both, prefix, postfix
|
218
|
+
Style/NegatedIf:
|
219
|
+
Enabled: true
|
220
|
+
|
221
|
+
# Offense count: 3
|
222
|
+
# This cop supports safe autocorrection (--autocorrect).
|
223
|
+
# Configuration parameters: PreferredDelimiters.
|
224
|
+
Style/PercentLiteralDelimiters:
|
225
|
+
Enabled: true
|
226
|
+
|
227
|
+
# Offense count: 2
|
228
|
+
# This cop supports safe autocorrection (--autocorrect).
|
229
|
+
# Configuration parameters: EnforcedStyle, AllowedCompactTypes.
|
230
|
+
# SupportedStyles: compact, exploded
|
231
|
+
Style/RaiseArgs:
|
232
|
+
Enabled: true
|
233
|
+
|
234
|
+
# Offense count: 2
|
235
|
+
# This cop supports unsafe autocorrection (--autocorrect-all).
|
236
|
+
Style/RedundantInterpolation:
|
237
|
+
Enabled: true
|
238
|
+
|
239
|
+
# Offense count: 2
|
240
|
+
# This cop supports safe autocorrection (--autocorrect).
|
241
|
+
Style/RedundantPercentQ:
|
242
|
+
Enabled: true
|
243
|
+
|
244
|
+
# Offense count: 1
|
245
|
+
# This cop supports safe autocorrection (--autocorrect).
|
246
|
+
# Configuration parameters: EnforcedStyle, AllowInnerSlashes.
|
247
|
+
# SupportedStyles: slashes, percent_r, mixed
|
248
|
+
Style/RegexpLiteral:
|
249
|
+
Enabled: true
|
250
|
+
# Offense count: 5
|
251
|
+
# This cop supports safe autocorrection (--autocorrect).
|
252
|
+
# Configuration parameters: AllowAsExpressionSeparator.
|
253
|
+
Style/Semicolon:
|
254
|
+
Enabled: true
|
255
|
+
|
256
|
+
# Offense count: 3
|
257
|
+
# This cop supports unsafe autocorrection (--autocorrect-all).
|
258
|
+
# Configuration parameters: RequireEnglish.
|
259
|
+
# SupportedStyles: use_perl_names, use_english_names, use_builtin_english_names
|
260
|
+
Style/SpecialGlobalVars:
|
261
|
+
EnforcedStyle: use_perl_names
|
262
|
+
|
263
|
+
# Offense count: 1
|
264
|
+
# This cop supports safe autocorrection (--autocorrect).
|
265
|
+
Style/StderrPuts:
|
266
|
+
Enabled: true
|
267
|
+
|
268
|
+
# Offense count: 1
|
269
|
+
# This cop supports unsafe autocorrection (--autocorrect-all).
|
270
|
+
# Configuration parameters: Mode.
|
271
|
+
Style/StringConcatenation:
|
272
|
+
Enabled: true
|
273
|
+
|
274
|
+
# Offense count: 7
|
275
|
+
# This cop supports safe autocorrection (--autocorrect).
|
276
|
+
# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
|
277
|
+
# SupportedStyles: single_quotes, double_quotes
|
278
|
+
Style/StringLiterals:
|
279
|
+
Enabled: true
|
280
|
+
# Offense count: 1
|
281
|
+
# This cop supports safe autocorrection (--autocorrect).
|
282
|
+
# Configuration parameters: .
|
283
|
+
# SupportedStyles: percent, brackets
|
284
|
+
Style/SymbolArray:
|
285
|
+
EnforcedStyle: percent
|
286
|
+
MinSize: 3
|
287
|
+
|
288
|
+
# Offense count: 1
|
289
|
+
# This cop supports unsafe autocorrection (--autocorrect-all).
|
290
|
+
# Configuration parameters: AllowMethodsWithArguments, IgnoredMethods, AllowComments.
|
291
|
+
# IgnoredMethods: respond_to, define_method
|
292
|
+
Style/SymbolProc:
|
293
|
+
Enabled: true
|
294
|
+
|
295
|
+
# Offense count: 16
|
296
|
+
# This cop supports safe autocorrection (--autocorrect).
|
297
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, IgnoredPatterns.
|
298
|
+
# URISchemes: http, https
|
299
|
+
Layout/LineLength:
|
300
|
+
Max: 256
|
data/Gemfile
CHANGED
@@ -1,13 +1,14 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
source 'https://rubygems.org'
|
3
4
|
|
4
|
-
gem
|
5
|
+
gem 'rubocop', '~> 1.31', require: false
|
6
|
+
gem 'rubocop-performance', '~> 1.15', require: false
|
7
|
+
gem 'rubocop-rspec', '~> 2.12', require: false
|
5
8
|
|
6
|
-
#TODO create a coveralls repo token for this
|
7
9
|
gemspec
|
8
10
|
|
9
11
|
group :test do
|
12
|
+
gem 'rack-test'
|
10
13
|
gem 'simplecov', require: false
|
11
|
-
gem 'rubocop-rspec', require: false
|
12
|
-
gem 'rack-test', '~> 1.1.0'
|
13
14
|
end
|
data/Rakefile
CHANGED
@@ -1,8 +1,21 @@
|
|
1
|
-
|
2
|
-
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
3
|
-
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
|
8
|
+
begin
|
9
|
+
require 'rubocop/rake_task'
|
10
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
11
|
+
task.requires << 'rubocop-rspec'
|
12
|
+
task.requires << 'rubocop-performance'
|
13
|
+
task.fail_on_error = true
|
14
|
+
end
|
15
|
+
rescue LoadError
|
16
|
+
task :rubocop do
|
17
|
+
warn 'Rubocop is disabled'
|
18
|
+
end
|
8
19
|
end
|
20
|
+
|
21
|
+
task default: [:rubocop, :spec]
|
data/bin/console
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OmniAuth
|
4
|
+
module Polaris
|
5
|
+
class Adaptor
|
6
|
+
REQUIRED_ADAPTER_CONFIG_KEYS = %i[access_id access_key method http_uri].freeze
|
7
|
+
BASIC_USER_DATA_KEYS = %w[NameFirst NameLast NameMiddle PhoneNumber EmailAddress].freeze
|
8
|
+
METHOD = { POST: :GET }.freeze
|
9
|
+
|
10
|
+
attr_reader :config
|
11
|
+
|
12
|
+
def self.validate!(configuration = {})
|
13
|
+
message = REQUIRED_ADAPTER_CONFIG_KEYS.each_with_object([]) do |name, msg|
|
14
|
+
next msg if configuration[name].present?
|
15
|
+
|
16
|
+
msg << name
|
17
|
+
end
|
18
|
+
|
19
|
+
raise Polaris::ConfigurationError, "#{message.join(' ,')} MUST be provided" unless message.blank?
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(configuration = {})
|
23
|
+
self.class.validate!(configuration)
|
24
|
+
|
25
|
+
@configuration = configuration.dup
|
26
|
+
|
27
|
+
@logger = @configuration.delete(:logger)
|
28
|
+
|
29
|
+
REQUIRED_ADAPTER_CONFIG_KEYS.each do |name|
|
30
|
+
instance_variable_set("@#{name}", @configuration[name])
|
31
|
+
end
|
32
|
+
|
33
|
+
@config = {
|
34
|
+
http_uri: @http_uri,
|
35
|
+
method: @method,
|
36
|
+
access_key: @access_key,
|
37
|
+
access_id: @access_id
|
38
|
+
}
|
39
|
+
|
40
|
+
ensure_method!(@method)
|
41
|
+
@polaris_method = METHOD[@method]
|
42
|
+
end
|
43
|
+
|
44
|
+
def authenticate_patron(pin:, barcode:)
|
45
|
+
# According to the polaris api docs "Date must be within +/- 30 minutes of current time or request will fail"
|
46
|
+
http_date = 15.minutes.from_now.in_time_zone('GMT').strftime('%a, %d %b %Y %H:%M:%S %Z')
|
47
|
+
|
48
|
+
# Authorization hash component
|
49
|
+
authorization_hash = authorization_response(pin, barcode, http_date)
|
50
|
+
|
51
|
+
return if authorization_hash.blank?
|
52
|
+
|
53
|
+
# Details hash component
|
54
|
+
details_hash = details_response(pin, barcode, http_date)
|
55
|
+
|
56
|
+
return if details_hash.blank? || details_hash.dig('PatronBasicDataGetResult', 'PatronBasicData').blank?
|
57
|
+
|
58
|
+
patron_user_hash = authorization_hash['PatronValidateResult'].dup
|
59
|
+
|
60
|
+
patron_user_hash.merge(details_hash.dig('PatronBasicDataGetResult', 'PatronBasicData').slice(*BASIC_USER_DATA_KEYS))
|
61
|
+
end
|
62
|
+
|
63
|
+
protected
|
64
|
+
|
65
|
+
def authorization_response(pin, barcode, request_date)
|
66
|
+
patron_validate_uri = "#{@http_uri}/patron/#{barcode}"
|
67
|
+
validation_concated_string = "#{@polaris_method}#{patron_validate_uri}#{request_date}#{pin}"
|
68
|
+
polaris_get_xml_response(patron_validate_uri, request_date, validation_concated_string)
|
69
|
+
end
|
70
|
+
|
71
|
+
def details_response(pin, barcode, request_date)
|
72
|
+
patron_basic_data_uri = "#{@http_uri}#{barcode}/basicdata"
|
73
|
+
details_concated_string = "#{@polaris_method}#{http_basic_data_uri}#{request_date}#{pin}"
|
74
|
+
polaris_get_xml_response(patron_basic_data_uri, request_date, details_concated_string)
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def polaris_request_headers(request_date, concated_string)
|
80
|
+
{ 'Date' => request_date, 'Authorization' => "PWS #{@access_id}:#{sha1_sig(concated_string)}" }
|
81
|
+
end
|
82
|
+
|
83
|
+
def polaris_get_xml_response(uri, request_date, concated_string)
|
84
|
+
xml_response = HTTP.get(uri, headers: polaris_request_headers(request_date, concated_string))
|
85
|
+
|
86
|
+
return {} unless xml_response.status.success?
|
87
|
+
|
88
|
+
Hash.from_xml(xml_response.body.to_s)
|
89
|
+
rescue HTTP::Error, OpenSSL::SSL::SSLError => e
|
90
|
+
raise Polaris::ConnectionError, "Could not connect to polaris due to the following error\n #{e.class.name}: #{e.message}"
|
91
|
+
end
|
92
|
+
|
93
|
+
def sha1_sig(concated_string)
|
94
|
+
Base64.strict_encode64(OpenSSL::HMAC.digest('sha1', @access_key, concated_string).to_s)
|
95
|
+
end
|
96
|
+
|
97
|
+
def ensure_method!(method = 'post')
|
98
|
+
normalized_method = method.to_s.upcase.to_sym
|
99
|
+
|
100
|
+
return normalized_method if METHOD.key?(normalized_method)
|
101
|
+
|
102
|
+
available_methods = METHOD.keys.collect(&:inspect).join(', ')
|
103
|
+
|
104
|
+
raise Polaris::ConfigurationError, "#{method} is not one of the available connect methods: #{available_methods}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support'
|
4
|
+
require 'active_support/core_ext/object/blank'
|
5
|
+
require 'active_support/core_ext/time'
|
6
|
+
require 'active_support/core_ext/integer/time'
|
7
|
+
require 'active_support/core_ext/hash/conversions'
|
8
|
+
require 'base64'
|
9
|
+
require 'cgi'
|
10
|
+
require 'openssl'
|
11
|
+
require 'http'
|
12
|
+
require 'omniauth'
|
13
|
+
require 'omniauth/strategies/polaris'
|
14
|
+
|
15
|
+
module OmniAuth
|
16
|
+
module Polaris
|
17
|
+
class PolarisError < StandardError; end
|
18
|
+
class ConfigurationError < StandardError; end
|
19
|
+
class AuthenticationError < StandardError; end
|
20
|
+
class ConnectionError < StandardError; end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
require 'omniauth/polaris/adaptor'
|
@@ -1,108 +1,76 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module OmniAuth
|
4
4
|
module Strategies
|
5
5
|
class Polaris
|
6
6
|
class MissingCredentialsError < StandardError; end
|
7
|
+
class InvalidCredentialsError < StandardError; end
|
8
|
+
|
7
9
|
include OmniAuth::Strategy
|
8
|
-
@@config = {
|
9
|
-
'barcode' => 'barcode',
|
10
|
-
'valid_patron' => 'ValidPatron',
|
11
|
-
'patron_id' => 'PatronID',
|
12
|
-
'assigned_branch_id' => 'AssignedBranchID',
|
13
|
-
'assigned_branch_name' => 'AssignedBranchName',
|
14
|
-
'first_name' => 'NameFirst',
|
15
|
-
'last_name' => 'NameLast',
|
16
|
-
'middle_name' => 'NameMiddle',
|
17
|
-
'phone_number' => 'PhoneNumber',
|
18
|
-
'email' => 'EmailAddress'
|
19
|
-
}
|
20
|
-
option :title, "Polaris Authentication" #default title for authentication form
|
21
10
|
|
11
|
+
USER_MAP = {
|
12
|
+
'barcode' => 'Barcode',
|
13
|
+
'valid_patron' => 'ValidPatron',
|
14
|
+
'patron_id' => 'PatronID',
|
15
|
+
'assigned_branch_id' => 'AssignedBranchID',
|
16
|
+
'assigned_branch_name' => 'AssignedBranchName',
|
17
|
+
'first_name' => 'NameFirst',
|
18
|
+
'last_name' => 'NameLast',
|
19
|
+
'middle_name' => 'NameMiddle',
|
20
|
+
'phone_number' => 'PhoneNumber',
|
21
|
+
'email' => 'EmailAddress'
|
22
|
+
}.freeze
|
23
|
+
|
24
|
+
def self.map_user(polaris_user_info)
|
25
|
+
USER_MAP.each_with_object({}) do |(user_key, polaris_user_key), user_hash|
|
26
|
+
user_hash[user_key.to_sym] = polaris_user_info[polaris_user_key] if polaris_user_info[polaris_user_key].present?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
option :title, 'Polaris Authentication' # default title for authentication form
|
22
31
|
|
23
32
|
def request_phase
|
24
|
-
OmniAuth::Polaris::Adaptor.validate
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
33
|
+
OmniAuth::Polaris::Adaptor.validate!(@options)
|
34
|
+
|
35
|
+
OmniAuth::Form.build(title: options.fetch(:title, 'Polaris Authentication'), url: callback_path) do |f|
|
36
|
+
f.text_field 'Barcode', 'barcode'
|
37
|
+
f.password_field 'PIN', 'pin'
|
38
|
+
f.button 'Sign In'
|
39
|
+
end.to_response
|
30
40
|
end
|
31
41
|
|
42
|
+
# rubocop:disable Style/SignalException
|
32
43
|
def callback_phase
|
33
|
-
@adaptor = OmniAuth::Polaris::Adaptor.new
|
44
|
+
@adaptor = OmniAuth::Polaris::Adaptor.new(@options)
|
34
45
|
|
35
|
-
|
36
|
-
begin
|
37
|
-
@polaris_user_info = @adaptor.bind_as(:barcode => request['barcode'], :pin => request['pin'])
|
38
|
-
return fail!(:invalid_credentials) if !@polaris_user_info
|
46
|
+
fail(MissingCredentialsError, 'Missing login credentials') if %w[barcode pin].any? { |request_key| request.params[request_key].blank? }
|
39
47
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
48
|
+
@polaris_user_info = @adaptor.authenticate_patron(pin: request.params['pin'], barcode: request.params['barcode'])
|
49
|
+
|
50
|
+
fail(InvalidCredentialsError, 'Invalid User Credentials!') if @polaris_user_info.blank?
|
51
|
+
|
52
|
+
@user_info = self.class.map_user(@polaris_user_info)
|
53
|
+
|
54
|
+
super
|
55
|
+
rescue MissingCredentialsError => e
|
56
|
+
fail!(:missing_credentials, e)
|
57
|
+
rescue InvalidCredentialsError => e
|
58
|
+
fail!(:invalid_credentials, e)
|
59
|
+
rescue StandardError => e
|
60
|
+
fail!(:polaris_error, e)
|
61
|
+
end
|
62
|
+
# rubocop:enable Style/SignalException
|
63
|
+
|
64
|
+
uid do
|
65
|
+
@user_info[:barcode]
|
45
66
|
end
|
46
67
|
|
47
|
-
|
48
|
-
request['barcode']
|
49
|
-
}
|
50
|
-
info {
|
68
|
+
info do
|
51
69
|
@user_info
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
# def map_user(mapper, object)
|
58
|
-
# Ben 12/24/2018 Doesnt appear this method is in use
|
59
|
-
# user = {}
|
60
|
-
# mapper.each do |key, value|
|
61
|
-
# case value
|
62
|
-
# when String
|
63
|
-
# #user[key] = object[value.downcase.to_sym].first if object[value.downcase.to_sym]
|
64
|
-
# user[key.to_sym] = object[value] if object[value]
|
65
|
-
# when Array
|
66
|
-
# #value.each {|v| (user[key] = object[v.downcase.to_sym].first; break;) if object[v.downcase.to_sym]}
|
67
|
-
# value.each {|v| (user[key] = object[v.downcase.to_sym]; break;) if object[v.downcase.to_sym]}
|
68
|
-
# when Hash
|
69
|
-
# value.map do |key1, value1|
|
70
|
-
# pattern = key1.dup
|
71
|
-
# value1.each_with_index do |v,i|
|
72
|
-
# #part = ''; v.collect(&:downcase).collect(&:to_sym).each {|v1| (part = object[v1].first; break;) if object[v1]}
|
73
|
-
# part = ''; v.collect(&:downcase).collect(&:to_sym).each {|v1| (part = object[v1]; break;) if object[v1]}
|
74
|
-
# pattern.gsub!("%#{i}", part || '')
|
75
|
-
# end
|
76
|
-
# user[key] = pattern
|
77
|
-
# end
|
78
|
-
# end
|
79
|
-
# end
|
80
|
-
# user
|
81
|
-
# end
|
82
|
-
|
83
|
-
|
84
|
-
def self.map_user(mapper, object)
|
85
|
-
user = {}
|
86
|
-
mapper.each do |key, value|
|
87
|
-
case value.class.to_s
|
88
|
-
when String
|
89
|
-
user[key.to_sym] = object[value.to_sym] if object[value.to_sym]
|
90
|
-
when Array
|
91
|
-
#value.each {|v| (user[key] = object[v.downcase.to_sym].first; break;) if object[v.downcase.to_sym]}
|
92
|
-
value.each {|v| (user[key] = object[v.downcase.to_sym]; break;) if object[v.downcase.to_sym]}
|
93
|
-
when Hash
|
94
|
-
value.map do |key1, value1|
|
95
|
-
pattern = key1.dup
|
96
|
-
value1.each_with_index do |v,i|
|
97
|
-
#part = ''; v.collect(&:downcase).collect(&:to_sym).each {|v1| (part = object[v1].first; break;) if object[v1]}
|
98
|
-
part = ''; v.collect(&:downcase).collect(&:to_sym).each {|v1| (part = object[v1]; break;) if object[v1]}
|
99
|
-
pattern.gsub!("%#{i}", part || '')
|
100
|
-
end
|
101
|
-
user[key] = pattern
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
user
|
70
|
+
end
|
71
|
+
|
72
|
+
extra do
|
73
|
+
{ raw_info: @polaris_user_info }
|
106
74
|
end
|
107
75
|
end
|
108
76
|
end
|
data/lib/omniauth-polaris.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'omniauth/
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'omniauth/polaris'
|
data/omniauth-polaris.gemspec
CHANGED
@@ -1,29 +1,30 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
require 'omniauth
|
5
|
-
Gem::Specification.new do |gem|
|
6
|
-
gem.name = "omniauth-polaris"
|
7
|
-
gem.version = OmniAuth::Polaris::VERSION
|
8
|
-
gem.authors = ["Steven Anderson", "Ben Barber"]
|
9
|
-
gem.email = ["sanderson@bpl.org", "bbarber@bpl.org"]
|
10
|
-
gem.description = %q{A Polaris API strategy for OmniAuth.}
|
11
|
-
gem.summary = %q{A Polaris API strategy for OmniAuth.}
|
12
|
-
gem.homepage = "https://github.com/boston-library/omniauth-polaris"
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$:.push File.expand_path('lib', __dir__)
|
4
|
+
require 'omniauth/polaris/version'
|
13
5
|
|
14
|
-
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = 'omniauth-polaris'
|
8
|
+
gem.version = OmniAuth::Polaris::VERSION.dup
|
9
|
+
gem.authors = ['Steven Anderson', 'Ben Barber']
|
10
|
+
gem.email = ['digital@bpl.org', 'bbarber@bpl.org']
|
11
|
+
gem.description = 'A Polaris API strategy for OmniAuth.'
|
12
|
+
gem.summary = 'A Polaris API strategy for OmniAuth.'
|
13
|
+
gem.homepage = 'https://github.com/boston-library/omniauth-polaris'
|
15
14
|
|
15
|
+
gem.required_ruby_version = '>= 2.6.10'
|
16
16
|
|
17
|
-
gem.add_dependency '
|
17
|
+
gem.add_dependency 'activesupport', '< 7'
|
18
|
+
gem.add_dependency 'http', '~> 5.1'
|
19
|
+
gem.add_dependency 'omniauth', '~> 2.1.0'
|
18
20
|
|
19
|
-
gem.add_development_dependency '
|
21
|
+
gem.add_development_dependency 'awesome_print', '~> 1.9.2'
|
20
22
|
gem.add_development_dependency 'bundler', '>= 1.3.0'
|
21
|
-
gem.add_development_dependency 'awesome_print'
|
22
|
-
gem.add_development_dependency 'rspec', '~> 3.8'
|
23
23
|
gem.add_development_dependency 'libnotify', '~> 0.9.3'
|
24
|
+
gem.add_development_dependency 'pry', '~> 0.14'
|
25
|
+
gem.add_development_dependency 'rspec', '~> 3.12'
|
24
26
|
|
25
27
|
gem.files = `git ls-files -z`.split("\x0")
|
26
28
|
gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
27
|
-
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
28
29
|
gem.require_paths = ['lib']
|
29
30
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe 'OmniAuth::Polaris::Adaptor' do
|
6
|
+
describe 'initialize' do
|
7
|
+
let!(:patron_url) { 'http://blah.org/PAPIService/REST/public/v1/1000/100/1/patron/' }
|
8
|
+
|
9
|
+
it 'is expected to throw exception when must have field is not set' do
|
10
|
+
expect { OmniAuth::Polaris::Adaptor.new({ http_uri: patron_url, method: 'POST' }) }.to raise_error(OmniAuth::Polaris::ConfigurationError)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'is expected to throw exception when method is not supported' do
|
14
|
+
expect { OmniAuth::Polaris::Adaptor.new({ http_uri: patron_url, method: 'GET', access_key: 'F9998888-A000-1111-C22C-CC3333BB4444', access_id: 'API' }) }.to raise_error(OmniAuth::Polaris::ConfigurationError)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,77 +1,100 @@
|
|
1
|
-
|
2
|
-
describe "OmniAuth::Strategies::Polaris" do
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
3
|
+
require 'spec_helper'
|
4
4
|
|
5
|
-
|
5
|
+
describe 'OmniAuth::Strategies::Polaris' do
|
6
6
|
def app
|
7
|
-
Rack::Builder.new
|
7
|
+
Rack::Builder.new do
|
8
8
|
use OmniAuth::Test::PhonySession
|
9
|
-
use
|
10
|
-
|
11
|
-
|
9
|
+
use OmniAuth::Builder do
|
10
|
+
provider OmniAuth::Strategies::Polaris, name: 'polaris', title: 'MyPolaris Form', http_uri: 'https://blah.org/PAPIService/REST/public/v1/1000/100/1/patron/', access_key: 'F9998888-A000-1111-C22C-CC3333BB4444', access_id: 'API', method: 'POST'
|
11
|
+
end
|
12
|
+
run ->(env) { [404, { 'Content-Type' => 'text/plain' }, [env.key?('omniauth.auth').to_s]] }
|
13
|
+
end.to_app
|
12
14
|
end
|
13
15
|
|
14
16
|
def session
|
15
17
|
last_request.env['rack.session']
|
16
18
|
end
|
17
19
|
|
18
|
-
it '
|
19
|
-
expect(
|
20
|
+
it 'is expected to add a camelization for itself' do
|
21
|
+
expect(OmniAuth::Utils.camelize('polaris')).to eq('Polaris')
|
20
22
|
end
|
21
23
|
|
22
24
|
describe '/auth/polaris' do
|
23
|
-
before
|
25
|
+
before { post '/auth/polaris' }
|
24
26
|
|
25
|
-
it '
|
26
|
-
expect(last_response.status).to
|
27
|
-
expect(last_response.body).to include(
|
27
|
+
it 'is expected to display a form' do
|
28
|
+
expect(last_response.status).to be(200)
|
29
|
+
expect(last_response.body).to include('<form')
|
28
30
|
end
|
29
31
|
|
30
|
-
it '
|
31
|
-
expect(last_response.body).to include(
|
32
|
+
it 'is expected to have the callback as the action for the form' do
|
33
|
+
expect(last_response.body).to include('/auth/polaris/callback')
|
32
34
|
end
|
33
35
|
|
34
|
-
it '
|
36
|
+
it 'is expected to have a text field for each of the fields' do
|
35
37
|
expect(last_response.body.scan('<input').size).to eq(2)
|
36
38
|
end
|
37
|
-
|
39
|
+
|
40
|
+
it 'is expected to have a label of the form title' do
|
38
41
|
expect(last_response.body.scan('MyPolaris Form').size).to be > 1
|
39
42
|
end
|
40
|
-
|
41
43
|
end
|
42
44
|
|
43
45
|
describe 'post /auth/polaris/callback' do
|
44
|
-
before
|
45
|
-
|
46
|
-
allow(OmniAuth::Polaris::Adaptor).to receive(:new).and_return(@adaptor)
|
46
|
+
before do
|
47
|
+
allow(OmniAuth::Polaris::Adaptor).to receive(:new).and_return(adaptor)
|
47
48
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
49
|
+
|
50
|
+
let!(:adaptor) { instance_double(OmniAuth::Polaris::Adaptor) }
|
51
|
+
|
52
|
+
context 'when failure' do
|
53
|
+
before do
|
54
|
+
allow(adaptor).to receive(:authenticate_patron).and_return(nil)
|
51
55
|
end
|
52
|
-
|
53
|
-
|
56
|
+
|
57
|
+
it 'is expected to fail! with :missing_credentials' do
|
58
|
+
post('/auth/polaris/callback', {})
|
59
|
+
expect(last_request.env['omniauth.error']).to be_a_kind_of(OmniAuth::Strategies::Polaris::MissingCredentialsError)
|
60
|
+
expect(last_request.env['omniauth.error.type']).to be(:missing_credentials)
|
54
61
|
end
|
55
|
-
|
56
|
-
|
62
|
+
|
63
|
+
it 'is expected to redirect to error page' do
|
64
|
+
post('/auth/polaris/callback', { barcode: 'ping', pin: 'password' })
|
57
65
|
expect(last_response).to be_redirect
|
58
|
-
expect(last_response.headers['Location']).to match(
|
66
|
+
expect(last_response.headers['Location']).to match(/invalid_credentials/)
|
59
67
|
end
|
60
68
|
end
|
61
69
|
|
62
|
-
context '
|
63
|
-
let(:auth_hash){ last_request.env['omniauth.auth'] }
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
70
|
+
context 'when successful' do
|
71
|
+
let(:auth_hash) { last_request.env['omniauth.auth'] }
|
72
|
+
let(:patron_user_hash) do
|
73
|
+
{
|
74
|
+
'PAPIErrorCode' => '0',
|
75
|
+
'Barcode' => '29999999999999',
|
76
|
+
'ValidPatron' => 'true',
|
77
|
+
'PatronID' => '111111',
|
78
|
+
'PatronCodeID' => '27',
|
79
|
+
'AssignedBranchID' => '3',
|
80
|
+
'PatronBarcode' => '29999999999999',
|
81
|
+
'AssignedBranchName' => 'BPL - Central',
|
82
|
+
'ExpirationDate' => '2026-02-19T00:00:00',
|
83
|
+
'OverridePasswordUsed' => 'false',
|
84
|
+
'NameFirst' => 'Test',
|
85
|
+
'NameLast' => 'Patron',
|
86
|
+
'NameMiddle' => '',
|
87
|
+
'EmailAddress' => 'test.patron@example.com',
|
88
|
+
'PhoneNumber' => '555-555-5555'
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
before do
|
93
|
+
allow(adaptor).to receive(:authenticate_patron).and_return(patron_user_hash)
|
94
|
+
post('/auth/polaris/callback', { barcode: '29999999999999', pin: '12345678' })
|
69
95
|
end
|
70
96
|
|
71
|
-
|
72
|
-
# should_not raise_error OmniAuth::Strategies::Polaris::MissingCredentialsError
|
73
|
-
# end
|
74
|
-
it 'should map user info' do
|
97
|
+
it 'is expected to map user info' do
|
75
98
|
expect(auth_hash.info.barcode).to eq('29999999999999')
|
76
99
|
expect(auth_hash.info.valid_patron).to eq('true')
|
77
100
|
expect(auth_hash.info.patron_id).to eq('111111')
|
data/spec/spec_helper.rb
CHANGED
@@ -1,14 +1,32 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$:.unshift File.expand_path(__dir__)
|
4
|
+
$:.unshift File.expand_path('../lib', __dir__)
|
5
|
+
|
6
|
+
ENV['RACK_ENV'] ||= 'test'
|
7
|
+
|
3
8
|
require 'simplecov'
|
4
9
|
SimpleCov.start
|
10
|
+
|
11
|
+
require 'pry'
|
12
|
+
require 'awesome_print'
|
5
13
|
require 'rspec'
|
6
14
|
require 'rack/test'
|
7
|
-
require 'omniauth'
|
8
15
|
require 'omniauth-polaris'
|
9
|
-
|
16
|
+
|
17
|
+
OmniAuth.config.request_validation_phase = nil
|
10
18
|
|
11
19
|
RSpec.configure do |config|
|
12
20
|
config.include Rack::Test::Methods
|
13
|
-
config.extend OmniAuth::Test::StrategyMacros, :
|
21
|
+
config.extend OmniAuth::Test::StrategyMacros, type: :strategy
|
22
|
+
config.mock_with :rspec do |mocks|
|
23
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
24
|
+
# a real object. This is generally recommended, and will default to
|
25
|
+
# `true` in RSpec 4.
|
26
|
+
mocks.verify_partial_doubles = true
|
27
|
+
end
|
28
|
+
|
29
|
+
config.expect_with :rspec do |c|
|
30
|
+
c.syntax = :expect
|
31
|
+
end
|
14
32
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniauth-polaris
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Anderson
|
@@ -9,36 +9,64 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-01-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "<"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '7'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "<"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '7'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: http
|
16
30
|
requirement: !ruby/object:Gem::Requirement
|
17
31
|
requirements:
|
18
32
|
- - "~>"
|
19
33
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
34
|
+
version: '5.1'
|
21
35
|
type: :runtime
|
22
36
|
prerelease: false
|
23
37
|
version_requirements: !ruby/object:Gem::Requirement
|
24
38
|
requirements:
|
25
39
|
- - "~>"
|
26
40
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
41
|
+
version: '5.1'
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: omniauth
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|
31
45
|
requirements:
|
32
46
|
- - "~>"
|
33
47
|
- !ruby/object:Gem::Version
|
34
|
-
version: 1.
|
48
|
+
version: 2.1.0
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 2.1.0
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: awesome_print
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 1.9.2
|
35
63
|
type: :development
|
36
64
|
prerelease: false
|
37
65
|
version_requirements: !ruby/object:Gem::Requirement
|
38
66
|
requirements:
|
39
67
|
- - "~>"
|
40
68
|
- !ruby/object:Gem::Version
|
41
|
-
version: 1.
|
69
|
+
version: 1.9.2
|
42
70
|
- !ruby/object:Gem::Dependency
|
43
71
|
name: bundler
|
44
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -54,66 +82,70 @@ dependencies:
|
|
54
82
|
- !ruby/object:Gem::Version
|
55
83
|
version: 1.3.0
|
56
84
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
85
|
+
name: libnotify
|
58
86
|
requirement: !ruby/object:Gem::Requirement
|
59
87
|
requirements:
|
60
|
-
- - "
|
88
|
+
- - "~>"
|
61
89
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
90
|
+
version: 0.9.3
|
63
91
|
type: :development
|
64
92
|
prerelease: false
|
65
93
|
version_requirements: !ruby/object:Gem::Requirement
|
66
94
|
requirements:
|
67
|
-
- - "
|
95
|
+
- - "~>"
|
68
96
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
97
|
+
version: 0.9.3
|
70
98
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
99
|
+
name: pry
|
72
100
|
requirement: !ruby/object:Gem::Requirement
|
73
101
|
requirements:
|
74
102
|
- - "~>"
|
75
103
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
104
|
+
version: '0.14'
|
77
105
|
type: :development
|
78
106
|
prerelease: false
|
79
107
|
version_requirements: !ruby/object:Gem::Requirement
|
80
108
|
requirements:
|
81
109
|
- - "~>"
|
82
110
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
111
|
+
version: '0.14'
|
84
112
|
- !ruby/object:Gem::Dependency
|
85
|
-
name:
|
113
|
+
name: rspec
|
86
114
|
requirement: !ruby/object:Gem::Requirement
|
87
115
|
requirements:
|
88
116
|
- - "~>"
|
89
117
|
- !ruby/object:Gem::Version
|
90
|
-
version:
|
118
|
+
version: '3.12'
|
91
119
|
type: :development
|
92
120
|
prerelease: false
|
93
121
|
version_requirements: !ruby/object:Gem::Requirement
|
94
122
|
requirements:
|
95
123
|
- - "~>"
|
96
124
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
125
|
+
version: '3.12'
|
98
126
|
description: A Polaris API strategy for OmniAuth.
|
99
127
|
email:
|
100
|
-
-
|
128
|
+
- digital@bpl.org
|
101
129
|
- bbarber@bpl.org
|
102
|
-
executables:
|
130
|
+
executables:
|
131
|
+
- console
|
103
132
|
extensions: []
|
104
133
|
extra_rdoc_files: []
|
105
134
|
files:
|
106
135
|
- ".gitignore"
|
107
136
|
- ".rubocop.yml"
|
137
|
+
- ".rubocop_todo.yml"
|
108
138
|
- Gemfile
|
109
139
|
- README.rdoc
|
110
140
|
- Rakefile
|
141
|
+
- bin/console
|
111
142
|
- lib/omniauth-polaris.rb
|
112
|
-
- lib/omniauth
|
113
|
-
- lib/omniauth
|
143
|
+
- lib/omniauth/polaris.rb
|
144
|
+
- lib/omniauth/polaris/adaptor.rb
|
145
|
+
- lib/omniauth/polaris/version.rb
|
114
146
|
- lib/omniauth/strategies/polaris.rb
|
115
147
|
- omniauth-polaris.gemspec
|
116
|
-
- spec/omniauth
|
148
|
+
- spec/omniauth/polaris/adaptor_spec.rb
|
117
149
|
- spec/omniauth/strategies/polaris_spec.rb
|
118
150
|
- spec/spec_helper.rb
|
119
151
|
homepage: https://github.com/boston-library/omniauth-polaris
|
@@ -125,21 +157,17 @@ require_paths:
|
|
125
157
|
- lib
|
126
158
|
required_ruby_version: !ruby/object:Gem::Requirement
|
127
159
|
requirements:
|
128
|
-
- - "
|
160
|
+
- - ">="
|
129
161
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
162
|
+
version: 2.6.10
|
131
163
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
164
|
requirements:
|
133
165
|
- - ">="
|
134
166
|
- !ruby/object:Gem::Version
|
135
167
|
version: '0'
|
136
168
|
requirements: []
|
137
|
-
|
138
|
-
rubygems_version: 2.6.14.3
|
169
|
+
rubygems_version: 3.3.26
|
139
170
|
signing_key:
|
140
171
|
specification_version: 4
|
141
172
|
summary: A Polaris API strategy for OmniAuth.
|
142
|
-
test_files:
|
143
|
-
- spec/omniauth-ldap/adaptor_spec.rb
|
144
|
-
- spec/omniauth/strategies/polaris_spec.rb
|
145
|
-
- spec/spec_helper.rb
|
173
|
+
test_files: []
|
@@ -1,96 +0,0 @@
|
|
1
|
-
require 'base64'
|
2
|
-
require 'cgi'
|
3
|
-
require 'openssl'
|
4
|
-
require 'rest_client'
|
5
|
-
|
6
|
-
module OmniAuth
|
7
|
-
module Polaris
|
8
|
-
class Adaptor
|
9
|
-
class PolarisError < StandardError; end
|
10
|
-
class ConfigurationError < StandardError; end
|
11
|
-
class AuthenticationError < StandardError; end
|
12
|
-
class ConnectionError < StandardError; end
|
13
|
-
|
14
|
-
VALID_ADAPTER_CONFIGURATION_KEYS = [:access_id, :access_key, :method, :http_uri]
|
15
|
-
|
16
|
-
MUST_HAVE_KEYS = [:access_id, :access_key, :method, :http_uri]
|
17
|
-
|
18
|
-
METHOD = {
|
19
|
-
:GET => :GET
|
20
|
-
}
|
21
|
-
|
22
|
-
attr_reader :config
|
23
|
-
|
24
|
-
def self.validate(configuration={})
|
25
|
-
message = []
|
26
|
-
MUST_HAVE_KEYS.each do |name|
|
27
|
-
message << name if configuration[name].nil?
|
28
|
-
end
|
29
|
-
raise ArgumentError.new(message.join(",") +" MUST be provided") unless message.empty?
|
30
|
-
end
|
31
|
-
|
32
|
-
def initialize(configuration={})
|
33
|
-
Adaptor.validate(configuration)
|
34
|
-
@configuration = configuration.dup
|
35
|
-
@logger = @configuration.delete(:logger)
|
36
|
-
VALID_ADAPTER_CONFIGURATION_KEYS.each do |name|
|
37
|
-
instance_variable_set("@#{name}", @configuration[name])
|
38
|
-
end
|
39
|
-
|
40
|
-
@config = {
|
41
|
-
:http_uri => @http_uri,
|
42
|
-
:method => @method,
|
43
|
-
:access_key => @access_key,
|
44
|
-
:access_id => @access_id
|
45
|
-
}
|
46
|
-
|
47
|
-
method = ensure_method(@method)
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
public
|
52
|
-
def bind_as(args = {})
|
53
|
-
response = false
|
54
|
-
|
55
|
-
#Basic shared input variables
|
56
|
-
pin = args[:pin]
|
57
|
-
barcode = args[:barcode]
|
58
|
-
http_date = Time.now.in_time_zone("GMT").strftime("%a, %d %b %Y %H:%M:%S %Z")
|
59
|
-
|
60
|
-
#Authorization hash component
|
61
|
-
http_uri_with_barcode = @http_uri + barcode
|
62
|
-
concated_string = @method + @http_uri + barcode + http_date + pin
|
63
|
-
sha1_sig = Base64.strict_encode64("#{OpenSSL::HMAC.digest('sha1',@access_key, concated_string)}")
|
64
|
-
xml_response = RestClient.get http_uri_with_barcode, {'PolarisDate' => http_date, 'Authorization' => "PWS " + @access_id + ":" + sha1_sig}
|
65
|
-
authorization_response = Hash.from_xml xml_response
|
66
|
-
|
67
|
-
#Details hash component
|
68
|
-
http_basic_data_get = @http_uri + barcode + '/basicdata'
|
69
|
-
concated_string = @method + http_basic_data_get + http_date + pin
|
70
|
-
sha1_sig = Base64.strict_encode64("#{OpenSSL::HMAC.digest('sha1',@access_key, concated_string)}")
|
71
|
-
xml_response = RestClient.get http_basic_data_get, {'PolarisDate' => http_date, 'Authorization' => "PWS " + @access_id + ":" + sha1_sig}
|
72
|
-
details_response = Hash.from_xml xml_response
|
73
|
-
|
74
|
-
#Add some of the basic details to a single hash, using the authorization as the base.
|
75
|
-
authorization_response["PatronValidateResult"]["NameFirst"] = details_response["PatronBasicDataGetResult"]["PatronBasicData"]["NameFirst"]
|
76
|
-
authorization_response["PatronValidateResult"]["NameLast"] = details_response["PatronBasicDataGetResult"]["PatronBasicData"]["NameLast"]
|
77
|
-
authorization_response["PatronValidateResult"]["NameMiddle"] = details_response["PatronBasicDataGetResult"]["PatronBasicData"]["NameMiddle"]
|
78
|
-
authorization_response["PatronValidateResult"]["PhoneNumber"] = details_response["PatronBasicDataGetResult"]["PatronBasicData"]["PhoneNumber"]
|
79
|
-
authorization_response["PatronValidateResult"]["EmailAddress"] = details_response["PatronBasicDataGetResult"]["PatronBasicData"]["EmailAddress"]
|
80
|
-
|
81
|
-
authorization_response["PatronValidateResult"]
|
82
|
-
end
|
83
|
-
|
84
|
-
private
|
85
|
-
|
86
|
-
def ensure_method(method="get")
|
87
|
-
normalized_method = method.to_s.upcase.to_sym
|
88
|
-
return METHOD[normalized_method] if METHOD.key?(normalized_method)
|
89
|
-
|
90
|
-
available_methods = METHOD.keys.collect {|m| m.inspect}.join(", ")
|
91
|
-
format = "%s is not one of the available connect methods: %s"
|
92
|
-
raise ConfigurationError, format % [method.inspect, available_methods]
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
describe "OmniAuth::Polaris::Adaptor" do
|
3
|
-
|
4
|
-
describe 'initialize' do
|
5
|
-
it 'should throw exception when must have field is not set' do
|
6
|
-
#[:host, :port, :method, :bind_dn]
|
7
|
-
expect{ OmniAuth::Polaris::Adaptor.new({http_uri: "http://blah.org/PAPIService/REST/public/v1/1000/100/1/patron/", method: 'GET'})}.to raise_error(ArgumentError)
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'should throw exception when method is not supported' do
|
11
|
-
expect { OmniAuth::Polaris::Adaptor.new({http_uri: "http://blah.org/PAPIService/REST/public/v1/1000/100/1/patron/", method: 'POST', access_key: 'F9998888-A000-1111-C22C-CC3333BB4444', access_id: 'API'})}.to raise_error(OmniAuth::Polaris::Adaptor::ConfigurationError)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|