campact_user_service 2.0.1 → 3.1.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 +4 -4
- data/.rubocop.yml +26 -0
- data/.ruby-version +1 -1
- data/.travis.yml +9 -0
- data/Gemfile +3 -4
- data/README.md +2 -0
- data/VERSION +1 -1
- data/campact_user_service.gemspec +15 -16
- data/example.rb +24 -20
- data/lib/campact_user_service/account.rb +2 -6
- data/lib/campact_user_service/client.rb +30 -10
- data/lib/campact_user_service/session.rb +0 -4
- data/spec/account_spec.rb +15 -15
- data/spec/client_spec.rb +23 -7
- data/spec/session_spec.rb +0 -18
- data/spec/spec_helper.rb +1 -1
- metadata +26 -56
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6e9cb5aee16e6996f096b2a784d87d425fca96e5bcb04af1c6bb226bc7f6e3a6
|
|
4
|
+
data.tar.gz: 9a245ab3f8ba1f0ba86f3b7c630f1f4df86714bb58f553bc045685edec6e3081
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4e1b4f9916af9c8142811589bd3683de92d4189b32de5968f3df42bd85930bb1d6d857e392d1c669c8cda0cdceb280676f162c0d20f69db33961d50249a6e1af
|
|
7
|
+
data.tar.gz: bdb5d97db34b872a4d50e8dee355a53f5e2700766c524dc280c26e9b1ed6d5a322654207ae38f0a9e7cb940ffa8dcec97d7bd466423c4c58ac5a61760d8525a0
|
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
AllCops:
|
|
2
|
+
DisabledByDefault: true
|
|
3
|
+
|
|
4
|
+
Security:
|
|
5
|
+
Enabled: true
|
|
6
|
+
|
|
7
|
+
Bundler/DuplicatedGem:
|
|
8
|
+
Enabled: true
|
|
9
|
+
Bundler/InsecureProtocolSource:
|
|
10
|
+
Enabled: true
|
|
11
|
+
Layout/IndentationStyle:
|
|
12
|
+
Enabled: true
|
|
13
|
+
Layout/SpaceInsideRangeLiteral:
|
|
14
|
+
Enabled: true
|
|
15
|
+
Lint:
|
|
16
|
+
Enabled: true
|
|
17
|
+
Lint/RaiseException:
|
|
18
|
+
Enabled: true
|
|
19
|
+
Naming/AsciiIdentifiers:
|
|
20
|
+
Enabled: true
|
|
21
|
+
Naming/ClassAndModuleCamelCase:
|
|
22
|
+
Enabled: true
|
|
23
|
+
Naming/ConstantName:
|
|
24
|
+
Enabled: true
|
|
25
|
+
Naming/FileName:
|
|
26
|
+
Enabled: true
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.
|
|
1
|
+
2.6.6
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
source "https://rubygems.org"
|
|
2
2
|
|
|
3
|
-
gem '
|
|
4
|
-
gem 'rotp', '~> 3.3', '>= 3.3.1'
|
|
3
|
+
gem 'rotp', '~> 6'
|
|
5
4
|
gem 'faraday', '>= 0.12.2', '< 1.0'
|
|
6
5
|
gem 'json', '~> 2.1'
|
|
7
6
|
|
|
@@ -11,9 +10,9 @@ group :development do
|
|
|
11
10
|
gem 'shoulda', '>= 0'
|
|
12
11
|
gem 'webmock', '>= 0'
|
|
13
12
|
gem 'rdoc', '~> 6.0', '>= 6.0.4'
|
|
14
|
-
gem '
|
|
15
|
-
gem 'juwelier', '~> 2.4', '>= 2.4.9'
|
|
13
|
+
gem 'juwelier', git: 'https://github.com/flajann2/juwelier.git'
|
|
16
14
|
gem 'simplecov', '= 0.16.1'
|
|
17
15
|
gem 'pry-byebug', '~> 3.6'
|
|
18
16
|
gem 'faraday-detailed_logger', '~> 2.1', '>= 2.1.2'
|
|
17
|
+
gem 'rubocop'
|
|
19
18
|
end
|
data/README.md
CHANGED
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
3.1.1
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
|
5
|
-
# stub: campact_user_service
|
|
5
|
+
# stub: campact_user_service 3.1.1 ruby lib
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |s|
|
|
8
8
|
s.name = "campact_user_service".freeze
|
|
9
|
-
s.version = "
|
|
9
|
+
s.version = "3.1.1"
|
|
10
10
|
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
12
12
|
s.require_paths = ["lib".freeze]
|
|
13
13
|
s.authors = ["ControlShift".freeze]
|
|
14
|
-
s.date = "
|
|
14
|
+
s.date = "2020-10-14"
|
|
15
15
|
s.description = "Ruby wrapper for Campact User Service".freeze
|
|
16
16
|
s.email = "hello@controlshiftlabs.com".freeze
|
|
17
17
|
s.extra_rdoc_files = [
|
|
@@ -19,8 +19,10 @@ Gem::Specification.new do |s|
|
|
|
19
19
|
"README.md"
|
|
20
20
|
]
|
|
21
21
|
s.files = [
|
|
22
|
+
".rubocop.yml",
|
|
22
23
|
".ruby-gemset",
|
|
23
24
|
".ruby-version",
|
|
25
|
+
".travis.yml",
|
|
24
26
|
"Gemfile",
|
|
25
27
|
"LICENSE",
|
|
26
28
|
"README.md",
|
|
@@ -41,15 +43,14 @@ Gem::Specification.new do |s|
|
|
|
41
43
|
]
|
|
42
44
|
s.homepage = "http://github.com/controlshift/campact_user_service".freeze
|
|
43
45
|
s.licenses = ["MIT".freeze]
|
|
44
|
-
s.rubygems_version = "3.0.
|
|
46
|
+
s.rubygems_version = "3.0.8".freeze
|
|
45
47
|
s.summary = "Ruby wrapper for Campact User Service".freeze
|
|
46
48
|
|
|
47
49
|
if s.respond_to? :specification_version then
|
|
48
50
|
s.specification_version = 4
|
|
49
51
|
|
|
50
52
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
51
|
-
s.add_runtime_dependency(%q<
|
|
52
|
-
s.add_runtime_dependency(%q<rotp>.freeze, ["~> 3.3", ">= 3.3.1"])
|
|
53
|
+
s.add_runtime_dependency(%q<rotp>.freeze, ["~> 6"])
|
|
53
54
|
s.add_runtime_dependency(%q<faraday>.freeze, [">= 0.12.2", "< 1.0"])
|
|
54
55
|
s.add_runtime_dependency(%q<json>.freeze, ["~> 2.1"])
|
|
55
56
|
s.add_development_dependency(%q<byebug>.freeze, [">= 0"])
|
|
@@ -57,14 +58,13 @@ Gem::Specification.new do |s|
|
|
|
57
58
|
s.add_development_dependency(%q<shoulda>.freeze, [">= 0"])
|
|
58
59
|
s.add_development_dependency(%q<webmock>.freeze, [">= 0"])
|
|
59
60
|
s.add_development_dependency(%q<rdoc>.freeze, ["~> 6.0", ">= 6.0.4"])
|
|
60
|
-
s.add_development_dependency(%q<
|
|
61
|
-
s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.9"])
|
|
61
|
+
s.add_development_dependency(%q<juwelier>.freeze, [">= 0"])
|
|
62
62
|
s.add_development_dependency(%q<simplecov>.freeze, ["= 0.16.1"])
|
|
63
63
|
s.add_development_dependency(%q<pry-byebug>.freeze, ["~> 3.6"])
|
|
64
64
|
s.add_development_dependency(%q<faraday-detailed_logger>.freeze, ["~> 2.1", ">= 2.1.2"])
|
|
65
|
+
s.add_development_dependency(%q<rubocop>.freeze, [">= 0"])
|
|
65
66
|
else
|
|
66
|
-
s.add_dependency(%q<
|
|
67
|
-
s.add_dependency(%q<rotp>.freeze, ["~> 3.3", ">= 3.3.1"])
|
|
67
|
+
s.add_dependency(%q<rotp>.freeze, ["~> 6"])
|
|
68
68
|
s.add_dependency(%q<faraday>.freeze, [">= 0.12.2", "< 1.0"])
|
|
69
69
|
s.add_dependency(%q<json>.freeze, ["~> 2.1"])
|
|
70
70
|
s.add_dependency(%q<byebug>.freeze, [">= 0"])
|
|
@@ -72,15 +72,14 @@ Gem::Specification.new do |s|
|
|
|
72
72
|
s.add_dependency(%q<shoulda>.freeze, [">= 0"])
|
|
73
73
|
s.add_dependency(%q<webmock>.freeze, [">= 0"])
|
|
74
74
|
s.add_dependency(%q<rdoc>.freeze, ["~> 6.0", ">= 6.0.4"])
|
|
75
|
-
s.add_dependency(%q<
|
|
76
|
-
s.add_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.9"])
|
|
75
|
+
s.add_dependency(%q<juwelier>.freeze, [">= 0"])
|
|
77
76
|
s.add_dependency(%q<simplecov>.freeze, ["= 0.16.1"])
|
|
78
77
|
s.add_dependency(%q<pry-byebug>.freeze, ["~> 3.6"])
|
|
79
78
|
s.add_dependency(%q<faraday-detailed_logger>.freeze, ["~> 2.1", ">= 2.1.2"])
|
|
79
|
+
s.add_dependency(%q<rubocop>.freeze, [">= 0"])
|
|
80
80
|
end
|
|
81
81
|
else
|
|
82
|
-
s.add_dependency(%q<
|
|
83
|
-
s.add_dependency(%q<rotp>.freeze, ["~> 3.3", ">= 3.3.1"])
|
|
82
|
+
s.add_dependency(%q<rotp>.freeze, ["~> 6"])
|
|
84
83
|
s.add_dependency(%q<faraday>.freeze, [">= 0.12.2", "< 1.0"])
|
|
85
84
|
s.add_dependency(%q<json>.freeze, ["~> 2.1"])
|
|
86
85
|
s.add_dependency(%q<byebug>.freeze, [">= 0"])
|
|
@@ -88,11 +87,11 @@ Gem::Specification.new do |s|
|
|
|
88
87
|
s.add_dependency(%q<shoulda>.freeze, [">= 0"])
|
|
89
88
|
s.add_dependency(%q<webmock>.freeze, [">= 0"])
|
|
90
89
|
s.add_dependency(%q<rdoc>.freeze, ["~> 6.0", ">= 6.0.4"])
|
|
91
|
-
s.add_dependency(%q<
|
|
92
|
-
s.add_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.9"])
|
|
90
|
+
s.add_dependency(%q<juwelier>.freeze, [">= 0"])
|
|
93
91
|
s.add_dependency(%q<simplecov>.freeze, ["= 0.16.1"])
|
|
94
92
|
s.add_dependency(%q<pry-byebug>.freeze, ["~> 3.6"])
|
|
95
93
|
s.add_dependency(%q<faraday-detailed_logger>.freeze, ["~> 2.1", ">= 2.1.2"])
|
|
94
|
+
s.add_dependency(%q<rubocop>.freeze, [">= 0"])
|
|
96
95
|
end
|
|
97
96
|
end
|
|
98
97
|
|
data/example.rb
CHANGED
|
@@ -3,7 +3,7 @@ $LOAD_PATH << File.join(File.dirname(__FILE__), 'lib')
|
|
|
3
3
|
require 'campact_user_service'
|
|
4
4
|
require 'faraday/detailed_logger'
|
|
5
5
|
|
|
6
|
-
def instrument_connection_with_extended_logging(client
|
|
6
|
+
def instrument_connection_with_extended_logging(client)
|
|
7
7
|
default_options = {
|
|
8
8
|
ssl: { verify: true },
|
|
9
9
|
headers: {
|
|
@@ -15,12 +15,11 @@ def instrument_connection_with_extended_logging(client, username, password)
|
|
|
15
15
|
|
|
16
16
|
faraday_builder = ->(faraday) do
|
|
17
17
|
faraday.response :detailed_logger
|
|
18
|
-
faraday.basic_auth username, password
|
|
19
18
|
faraday.adapter Faraday.default_adapter
|
|
20
19
|
end
|
|
21
20
|
|
|
22
21
|
instrumented_connection = Faraday.new(
|
|
23
|
-
"
|
|
22
|
+
"https://#{client.host}",
|
|
24
23
|
default_options,
|
|
25
24
|
&faraday_builder
|
|
26
25
|
)
|
|
@@ -33,14 +32,21 @@ end
|
|
|
33
32
|
puts "Which user service are you going to use?\n\t1) session\n\t2) user"
|
|
34
33
|
option = gets.chomp
|
|
35
34
|
|
|
36
|
-
# Get
|
|
37
|
-
|
|
38
|
-
puts "
|
|
39
|
-
|
|
35
|
+
# Get TOTP credentials
|
|
36
|
+
username = if ENV['TOTP_USER'].nil?
|
|
37
|
+
puts "I'll need your API credentials"
|
|
38
|
+
puts "Enter your TOTP user"
|
|
39
|
+
gets.chomp
|
|
40
|
+
else
|
|
41
|
+
ENV['TOTP_USER']
|
|
42
|
+
end
|
|
40
43
|
|
|
41
|
-
|
|
42
|
-
puts "
|
|
43
|
-
|
|
44
|
+
secret = if ENV['TOTP_SECRET'].nil?
|
|
45
|
+
puts "Enter your TOTP secret"
|
|
46
|
+
gets.chomp
|
|
47
|
+
else
|
|
48
|
+
ENV['TOTP_SECRET']
|
|
49
|
+
end
|
|
44
50
|
|
|
45
51
|
# Now connect to the right API
|
|
46
52
|
user_service = case option
|
|
@@ -49,11 +55,10 @@ when '1'
|
|
|
49
55
|
token = gets.chomp
|
|
50
56
|
session = CampactUserService.session(
|
|
51
57
|
token,
|
|
52
|
-
'campact-
|
|
58
|
+
'campact-staging-session',
|
|
53
59
|
{
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
port: '10004'
|
|
60
|
+
host: 'weact-adapter.staging.campact.de',
|
|
61
|
+
topt_authorization: {user: username, secret: secret}
|
|
57
62
|
}
|
|
58
63
|
)
|
|
59
64
|
when '2'
|
|
@@ -62,19 +67,18 @@ when '2'
|
|
|
62
67
|
account = CampactUserService.account(
|
|
63
68
|
user_id,
|
|
64
69
|
{
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
port: '10003'
|
|
70
|
+
host: 'weact-adapter.staging.campact.de',
|
|
71
|
+
topt_authorization: {user: username, secret: secret}
|
|
68
72
|
}
|
|
69
73
|
)
|
|
70
74
|
else
|
|
71
75
|
raise 'Invalid option'
|
|
72
76
|
end
|
|
73
77
|
|
|
74
|
-
instrument_connection_with_extended_logging(user_service.client
|
|
78
|
+
instrument_connection_with_extended_logging(user_service.client)
|
|
75
79
|
|
|
76
80
|
puts "Waiting for your command..."
|
|
77
81
|
require 'pry-byebug'
|
|
78
|
-
binding.pry
|
|
82
|
+
binding.pry # rubocop:disable Lint/Debugger
|
|
79
83
|
|
|
80
|
-
puts 'Goodbye!'
|
|
84
|
+
puts 'Goodbye!'
|
|
@@ -8,7 +8,7 @@ module CampactUserService
|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def exists?
|
|
11
|
-
account && account[
|
|
11
|
+
account && !account['external_id'].nil?
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def subscribed_to_newsletter?
|
|
@@ -37,15 +37,11 @@ module CampactUserService
|
|
|
37
37
|
account['preferences']
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
def donor_info
|
|
41
|
-
account['donorclass']
|
|
42
|
-
end
|
|
43
|
-
|
|
44
40
|
private
|
|
45
41
|
|
|
46
42
|
def account
|
|
47
43
|
escaped_user_id = CGI.escape(user_id)
|
|
48
|
-
@account_info ||= (client.get_request("
|
|
44
|
+
@account_info ||= (client.get_request("v1/accounts/#{escaped_user_id}") || {})
|
|
49
45
|
end
|
|
50
46
|
end
|
|
51
47
|
end
|
|
@@ -1,26 +1,23 @@
|
|
|
1
1
|
require 'faraday'
|
|
2
2
|
require 'json'
|
|
3
|
-
require 'base32'
|
|
4
3
|
require 'rotp'
|
|
5
4
|
require 'campact_user_service/response_error'
|
|
6
5
|
|
|
7
6
|
module CampactUserService
|
|
8
7
|
class Client
|
|
9
|
-
TIMEOUT =
|
|
8
|
+
TIMEOUT = 60.freeze
|
|
9
|
+
OPEN_TIMEOUT = 20.freeze
|
|
10
10
|
|
|
11
|
-
attr_reader :connection, :
|
|
11
|
+
attr_reader :connection, :host, :port, :topt_authorization
|
|
12
12
|
|
|
13
13
|
def initialize(options)
|
|
14
|
-
@scheme = options.fetch(:scheme, 'https')
|
|
15
14
|
@host = options.fetch(:host)
|
|
16
15
|
@port = options[:port]
|
|
16
|
+
@topt_authorization = options[:topt_authorization]
|
|
17
17
|
faraday_options = default_faraday_options.merge(options.delete(:faraday) || {})
|
|
18
18
|
adapter = faraday_options.delete(:adapter) || Faraday.default_adapter
|
|
19
19
|
|
|
20
20
|
@connection = Faraday.new(endpoint, faraday_options) do |faraday|
|
|
21
|
-
if options.has_key?(:enable_auth)
|
|
22
|
-
faraday.basic_auth options[:username], options[:password]
|
|
23
|
-
end
|
|
24
21
|
faraday.adapter adapter
|
|
25
22
|
end
|
|
26
23
|
end
|
|
@@ -37,10 +34,14 @@ module CampactUserService
|
|
|
37
34
|
response = connection.send(verb.to_sym) do |req|
|
|
38
35
|
req.url path
|
|
39
36
|
req.options.timeout = TIMEOUT
|
|
40
|
-
req.options.open_timeout =
|
|
41
|
-
if options.
|
|
37
|
+
req.options.open_timeout = OPEN_TIMEOUT
|
|
38
|
+
if options.key?(:cookies)
|
|
42
39
|
req.headers['Cookie'] = format_cookies(options[:cookies])
|
|
43
40
|
end
|
|
41
|
+
|
|
42
|
+
if topt_authorization
|
|
43
|
+
req.headers['authorization'] = authorization(topt_authorization)
|
|
44
|
+
end
|
|
44
45
|
end
|
|
45
46
|
|
|
46
47
|
case response.status
|
|
@@ -70,7 +71,7 @@ module CampactUserService
|
|
|
70
71
|
end
|
|
71
72
|
|
|
72
73
|
def endpoint
|
|
73
|
-
endpoint = "
|
|
74
|
+
endpoint = "https://#{host}"
|
|
74
75
|
if !port.nil?
|
|
75
76
|
endpoint << ":#{port}"
|
|
76
77
|
end
|
|
@@ -86,5 +87,24 @@ module CampactUserService
|
|
|
86
87
|
cookies.map {|k,v| "#{k}=#{v};" }.join
|
|
87
88
|
end
|
|
88
89
|
end
|
|
90
|
+
|
|
91
|
+
def authorization(totp_options)
|
|
92
|
+
user = totp_options.fetch(:user)
|
|
93
|
+
secret = totp_options.fetch(:secret)
|
|
94
|
+
|
|
95
|
+
token = [user, auth_pass(secret)].join(':')
|
|
96
|
+
|
|
97
|
+
"Token #{token}"
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def auth_pass(secret)
|
|
101
|
+
totp_secret = ROTP::Base32.encode(secret)
|
|
102
|
+
|
|
103
|
+
ROTP::TOTP.new(totp_secret, {
|
|
104
|
+
digest: 'sha256',
|
|
105
|
+
digits: 8,
|
|
106
|
+
interval: 30
|
|
107
|
+
}).now
|
|
108
|
+
end
|
|
89
109
|
end
|
|
90
110
|
end
|
data/spec/account_spec.rb
CHANGED
|
@@ -16,16 +16,16 @@ describe CampactUserService::Account do
|
|
|
16
16
|
|
|
17
17
|
describe '#exists?' do
|
|
18
18
|
it 'should return true where a valid user object is returned' do
|
|
19
|
-
stub_request(:get, "https://test.com/
|
|
19
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
20
20
|
.to_return(body: {
|
|
21
|
-
"
|
|
21
|
+
"external_id": "id-123"
|
|
22
22
|
}.to_json)
|
|
23
23
|
|
|
24
24
|
expect(subject.exists?).to be_truthy
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
it 'should not return true where an invalid user object is returned' do
|
|
28
|
-
stub_request(:get, "https://test.com/
|
|
28
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
29
29
|
.to_return(body: {
|
|
30
30
|
"error": true
|
|
31
31
|
}.to_json)
|
|
@@ -41,7 +41,7 @@ describe CampactUserService::Account do
|
|
|
41
41
|
client,
|
|
42
42
|
malicious_user_id
|
|
43
43
|
)
|
|
44
|
-
stub_request(:get, "https://test.com/
|
|
44
|
+
stub_request(:get, "https://test.com/v1/accounts/%09%0D")
|
|
45
45
|
.to_return(body: '', status: 404)
|
|
46
46
|
|
|
47
47
|
expect(malicious_subject.exists?).to be_falsey
|
|
@@ -53,7 +53,7 @@ describe CampactUserService::Account do
|
|
|
53
53
|
client,
|
|
54
54
|
malicious_user_id
|
|
55
55
|
)
|
|
56
|
-
stub_request(:get, "https://test.com/
|
|
56
|
+
stub_request(:get, "https://test.com/v1/accounts/foo@example.com%2Fsecrets")
|
|
57
57
|
.to_return(body: '', status: 404)
|
|
58
58
|
|
|
59
59
|
expect(malicious_subject.exists?).to be_falsey
|
|
@@ -62,7 +62,7 @@ describe CampactUserService::Account do
|
|
|
62
62
|
|
|
63
63
|
describe '#name' do
|
|
64
64
|
it 'should retrieve all of the names and gender of the user' do
|
|
65
|
-
stub_request(:get, "https://test.com/
|
|
65
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
66
66
|
.to_return(body: {
|
|
67
67
|
"name": {
|
|
68
68
|
"firstname": "Alice",
|
|
@@ -84,7 +84,7 @@ describe CampactUserService::Account do
|
|
|
84
84
|
|
|
85
85
|
describe '#email' do
|
|
86
86
|
it 'should retrieve the email address of the user' do
|
|
87
|
-
stub_request(:get, "https://test.com/
|
|
87
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
88
88
|
.to_return(body: {
|
|
89
89
|
"emailaddress": {
|
|
90
90
|
"emailaddress": "foobar@example.com"
|
|
@@ -96,7 +96,7 @@ describe CampactUserService::Account do
|
|
|
96
96
|
end
|
|
97
97
|
|
|
98
98
|
it 'should return nil where no email address is set' do
|
|
99
|
-
stub_request(:get, "https://test.com/
|
|
99
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
100
100
|
.to_return(body: {
|
|
101
101
|
"emailaddress": {}
|
|
102
102
|
}.to_json)
|
|
@@ -108,7 +108,7 @@ describe CampactUserService::Account do
|
|
|
108
108
|
|
|
109
109
|
describe '#address' do
|
|
110
110
|
it 'should retrieve the address of the user' do
|
|
111
|
-
stub_request(:get, "https://test.com/
|
|
111
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
112
112
|
.to_return(body: {
|
|
113
113
|
"postaladdress": {
|
|
114
114
|
"street": "123 Fake Street",
|
|
@@ -125,7 +125,7 @@ describe CampactUserService::Account do
|
|
|
125
125
|
|
|
126
126
|
describe '#subscribed_to_newsletter?' do
|
|
127
127
|
it 'should be true where the user is subscribed' do
|
|
128
|
-
stub_request(:get, "https://test.com/
|
|
128
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
129
129
|
.to_return(body: {
|
|
130
130
|
"emailaddress": {
|
|
131
131
|
"emailaddress": "foobar@example.com",
|
|
@@ -137,7 +137,7 @@ describe CampactUserService::Account do
|
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
it 'should be false where the user is not subscribed' do
|
|
140
|
-
stub_request(:get, "https://test.com/
|
|
140
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
141
141
|
.to_return(body: {
|
|
142
142
|
"emailaddress": {
|
|
143
143
|
"emailaddress": "foobar@example.com",
|
|
@@ -149,7 +149,7 @@ describe CampactUserService::Account do
|
|
|
149
149
|
end
|
|
150
150
|
|
|
151
151
|
it 'should be false where user subscription is different than newsletter' do
|
|
152
|
-
stub_request(:get, "https://test.com/
|
|
152
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
153
153
|
.to_return(body: {
|
|
154
154
|
"emailaddress": {
|
|
155
155
|
"emailaddress": "foobar@example.com",
|
|
@@ -163,7 +163,7 @@ describe CampactUserService::Account do
|
|
|
163
163
|
|
|
164
164
|
describe '#allow_prefill?' do
|
|
165
165
|
it 'should allow prefilling where the user has opted-in' do
|
|
166
|
-
stub_request(:get, "https://test.com/
|
|
166
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
167
167
|
.to_return(body: {
|
|
168
168
|
"preferences": {
|
|
169
169
|
"prefill_forms": "allowed"
|
|
@@ -174,7 +174,7 @@ describe CampactUserService::Account do
|
|
|
174
174
|
end
|
|
175
175
|
|
|
176
176
|
it 'should not allow prefilling where the user has not decided' do
|
|
177
|
-
stub_request(:get, "https://test.com/
|
|
177
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
178
178
|
.to_return(body: {
|
|
179
179
|
"preferences": {
|
|
180
180
|
"prefill_forms": "undecided"
|
|
@@ -185,7 +185,7 @@ describe CampactUserService::Account do
|
|
|
185
185
|
end
|
|
186
186
|
|
|
187
187
|
it 'should not allow prefilling where the user has opted out' do
|
|
188
|
-
stub_request(:get, "https://test.com/
|
|
188
|
+
stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
|
|
189
189
|
.to_return(body: {
|
|
190
190
|
"preferences": {
|
|
191
191
|
"prefill_forms": "disallowed"
|
data/spec/client_spec.rb
CHANGED
|
@@ -4,7 +4,6 @@ describe CampactUserService::Client do
|
|
|
4
4
|
describe 'initialization' do
|
|
5
5
|
let(:options) {
|
|
6
6
|
{
|
|
7
|
-
scheme: 'https',
|
|
8
7
|
host: 'demo.campact.de',
|
|
9
8
|
port: '10003',
|
|
10
9
|
faraday: { a_custom_option: 'foo', adapter: :an_adapter }
|
|
@@ -24,7 +23,7 @@ describe CampactUserService::Client do
|
|
|
24
23
|
end
|
|
25
24
|
|
|
26
25
|
it 'should use default faraday options for connection' do
|
|
27
|
-
expect(Faraday).to receive(:new) do |
|
|
26
|
+
expect(Faraday).to receive(:new) do |_endpoint, initialization_options|
|
|
28
27
|
expect(initialization_options[:ssl][:verify]).to be_truthy
|
|
29
28
|
expect(initialization_options[:headers]['Accept']).to eq "application/json;q=0.1"
|
|
30
29
|
expect(initialization_options[:headers]['Accept-Charset']).to eq "utf-8"
|
|
@@ -38,7 +37,7 @@ describe CampactUserService::Client do
|
|
|
38
37
|
options[:faraday][:ssl] = {verify: false}
|
|
39
38
|
options[:faraday][:headers] = {'Accept'=>'custom-accept-header', 'Accept-Charset'=>'custom-accept-charset-header', 'User-Agent'=>'custom-user-agent-header'}
|
|
40
39
|
|
|
41
|
-
expect(Faraday).to receive(:new) do |
|
|
40
|
+
expect(Faraday).to receive(:new) do |_endpoint, initialization_options|
|
|
42
41
|
expect(initialization_options[:ssl][:verify]).to be_falsey
|
|
43
42
|
expect(initialization_options[:headers]['Accept']).to eq 'custom-accept-header'
|
|
44
43
|
expect(initialization_options[:headers]['Accept-Charset']).to eq 'custom-accept-charset-header'
|
|
@@ -54,7 +53,7 @@ describe CampactUserService::Client do
|
|
|
54
53
|
it 'should raise error if status code is 3xx, 4xx or 5xx' do
|
|
55
54
|
expect(request_builder).to receive(:url).with('/foo/bar')
|
|
56
55
|
expect(request_builder_options).to receive(:timeout=).with(CampactUserService::Client::TIMEOUT)
|
|
57
|
-
expect(request_builder_options).to receive(:open_timeout=).with(CampactUserService::Client::
|
|
56
|
+
expect(request_builder_options).to receive(:open_timeout=).with(CampactUserService::Client::OPEN_TIMEOUT)
|
|
58
57
|
allow(response).to receive(:status).and_return(unexpected_status_code)
|
|
59
58
|
allow(response).to receive(:body).and_return('An error occurred')
|
|
60
59
|
|
|
@@ -69,7 +68,7 @@ describe CampactUserService::Client do
|
|
|
69
68
|
it 'should return nil if status code is 404' do
|
|
70
69
|
expect(request_builder).to receive(:url).with('/foo/bar')
|
|
71
70
|
expect(request_builder_options).to receive(:timeout=).with(CampactUserService::Client::TIMEOUT)
|
|
72
|
-
expect(request_builder_options).to receive(:open_timeout=).with(CampactUserService::Client::
|
|
71
|
+
expect(request_builder_options).to receive(:open_timeout=).with(CampactUserService::Client::OPEN_TIMEOUT)
|
|
73
72
|
allow(response).to receive(:status).and_return(404)
|
|
74
73
|
|
|
75
74
|
response = subject.send(method_under_test, '/foo/bar')
|
|
@@ -98,7 +97,7 @@ describe CampactUserService::Client do
|
|
|
98
97
|
it 'should perform get request on provided path and return true if response is 204' do
|
|
99
98
|
expect(request_builder).to receive(:url).with('/foo/bar')
|
|
100
99
|
expect(request_builder_options).to receive(:timeout=).with(CampactUserService::Client::TIMEOUT)
|
|
101
|
-
expect(request_builder_options).to receive(:open_timeout=).with(CampactUserService::Client::
|
|
100
|
+
expect(request_builder_options).to receive(:open_timeout=).with(CampactUserService::Client::OPEN_TIMEOUT)
|
|
102
101
|
allow(response).to receive(:status).and_return(204)
|
|
103
102
|
|
|
104
103
|
expect(subject.get_request('/foo/bar')).to be_truthy
|
|
@@ -110,7 +109,7 @@ describe CampactUserService::Client do
|
|
|
110
109
|
before :each do
|
|
111
110
|
allow(request_builder).to receive(:url).with('/foo/bar')
|
|
112
111
|
allow(request_builder_options).to receive(:timeout=).with(CampactUserService::Client::TIMEOUT)
|
|
113
|
-
allow(request_builder_options).to receive(:open_timeout=).with(CampactUserService::Client::
|
|
112
|
+
allow(request_builder_options).to receive(:open_timeout=).with(CampactUserService::Client::OPEN_TIMEOUT)
|
|
114
113
|
allow(request_builder).to receive(:headers).and_return(headers_builder)
|
|
115
114
|
end
|
|
116
115
|
|
|
@@ -128,6 +127,23 @@ describe CampactUserService::Client do
|
|
|
128
127
|
subject.get_request('/foo/bar', cookies: {'foo' => 'bar', 'xyz' => 'abc'})
|
|
129
128
|
end
|
|
130
129
|
|
|
130
|
+
it 'should set TOTP authorization header' do
|
|
131
|
+
allow(response).to receive(:status).and_return(200)
|
|
132
|
+
allow(response).to receive(:body).and_return(nil)
|
|
133
|
+
|
|
134
|
+
totp_secret = ROTP::Base32.encode('shh! a secret!')
|
|
135
|
+
|
|
136
|
+
totp = double
|
|
137
|
+
expect(totp).to receive(:now).and_return('totp_token')
|
|
138
|
+
expect(ROTP::TOTP).to receive(:new).with(totp_secret, hash_including(digest: 'sha256', digits: 8, interval: 30)).and_return(totp)
|
|
139
|
+
|
|
140
|
+
expect(headers_builder).to receive(:[]=).with('authorization', 'Token api_user:totp_token')
|
|
141
|
+
|
|
142
|
+
subject = CampactUserService::Client.new(host: 'demo.campact.de', topt_authorization: {user: 'api_user', secret: 'shh! a secret!'})
|
|
143
|
+
|
|
144
|
+
subject.get_request('/foo/bar')
|
|
145
|
+
end
|
|
146
|
+
|
|
131
147
|
it 'should parse JSON response on successful response' do
|
|
132
148
|
allow(response).to receive(:status).and_return(200)
|
|
133
149
|
allow(response).to receive(:body).and_return({a_field: 'foo', another_field: 'bar'}.to_json)
|
data/spec/session_spec.rb
CHANGED
|
@@ -7,24 +7,6 @@ describe CampactUserService::Session do
|
|
|
7
7
|
|
|
8
8
|
subject { CampactUserService::Session.new(client, session_id, session_cookie_name) }
|
|
9
9
|
|
|
10
|
-
describe '#exists?' do
|
|
11
|
-
it 'should be truthy when the session exists' do
|
|
12
|
-
stub_request(:get, 'https://test.com/v1/sessions')
|
|
13
|
-
.with(headers: {'Cookie' => "cus-session=#{session_id};"})
|
|
14
|
-
.to_return(body: {id: 'session-id'}.to_json)
|
|
15
|
-
|
|
16
|
-
expect(subject.exists?).to be_truthy
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it "should be falsey when the session doesn't exist" do
|
|
20
|
-
stub_request(:get, 'https://test.com/v1/sessions')
|
|
21
|
-
.with(headers: {'Cookie' => "cus-session=#{session_id};"})
|
|
22
|
-
.to_return(body: '', status: 404)
|
|
23
|
-
|
|
24
|
-
expect(subject.exists?).to be_falsey
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
10
|
describe '#user_id' do
|
|
29
11
|
it 'should be present' do
|
|
30
12
|
stub_request(:get, 'https://test.com/v1/sessions')
|
data/spec/spec_helper.rb
CHANGED
|
@@ -4,7 +4,7 @@ require 'rspec'
|
|
|
4
4
|
require 'webmock/rspec'
|
|
5
5
|
require 'campact_user_service'
|
|
6
6
|
|
|
7
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
|
7
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each {|f| require f}
|
|
8
8
|
|
|
9
9
|
RSpec.configure do |config|
|
|
10
10
|
config.include WebMock::API
|
metadata
CHANGED
|
@@ -1,49 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: campact_user_service
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 3.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- ControlShift
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-10-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: base32
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - "~>"
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: 0.3.2
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - "~>"
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: 0.3.2
|
|
27
13
|
- !ruby/object:Gem::Dependency
|
|
28
14
|
name: rotp
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
|
30
16
|
requirements:
|
|
31
17
|
- - "~>"
|
|
32
18
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
34
|
-
- - ">="
|
|
35
|
-
- !ruby/object:Gem::Version
|
|
36
|
-
version: 3.3.1
|
|
19
|
+
version: '6'
|
|
37
20
|
type: :runtime
|
|
38
21
|
prerelease: false
|
|
39
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
40
23
|
requirements:
|
|
41
24
|
- - "~>"
|
|
42
25
|
- !ruby/object:Gem::Version
|
|
43
|
-
version: '
|
|
44
|
-
- - ">="
|
|
45
|
-
- !ruby/object:Gem::Version
|
|
46
|
-
version: 3.3.1
|
|
26
|
+
version: '6'
|
|
47
27
|
- !ruby/object:Gem::Dependency
|
|
48
28
|
name: faraday
|
|
49
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -154,46 +134,20 @@ dependencies:
|
|
|
154
134
|
- - ">="
|
|
155
135
|
- !ruby/object:Gem::Version
|
|
156
136
|
version: 6.0.4
|
|
157
|
-
- !ruby/object:Gem::Dependency
|
|
158
|
-
name: bundler
|
|
159
|
-
requirement: !ruby/object:Gem::Requirement
|
|
160
|
-
requirements:
|
|
161
|
-
- - "~>"
|
|
162
|
-
- !ruby/object:Gem::Version
|
|
163
|
-
version: '1.16'
|
|
164
|
-
- - ">="
|
|
165
|
-
- !ruby/object:Gem::Version
|
|
166
|
-
version: 1.16.2
|
|
167
|
-
type: :development
|
|
168
|
-
prerelease: false
|
|
169
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
170
|
-
requirements:
|
|
171
|
-
- - "~>"
|
|
172
|
-
- !ruby/object:Gem::Version
|
|
173
|
-
version: '1.16'
|
|
174
|
-
- - ">="
|
|
175
|
-
- !ruby/object:Gem::Version
|
|
176
|
-
version: 1.16.2
|
|
177
137
|
- !ruby/object:Gem::Dependency
|
|
178
138
|
name: juwelier
|
|
179
139
|
requirement: !ruby/object:Gem::Requirement
|
|
180
140
|
requirements:
|
|
181
|
-
- - "~>"
|
|
182
|
-
- !ruby/object:Gem::Version
|
|
183
|
-
version: '2.4'
|
|
184
141
|
- - ">="
|
|
185
142
|
- !ruby/object:Gem::Version
|
|
186
|
-
version:
|
|
143
|
+
version: '0'
|
|
187
144
|
type: :development
|
|
188
145
|
prerelease: false
|
|
189
146
|
version_requirements: !ruby/object:Gem::Requirement
|
|
190
147
|
requirements:
|
|
191
|
-
- - "~>"
|
|
192
|
-
- !ruby/object:Gem::Version
|
|
193
|
-
version: '2.4'
|
|
194
148
|
- - ">="
|
|
195
149
|
- !ruby/object:Gem::Version
|
|
196
|
-
version:
|
|
150
|
+
version: '0'
|
|
197
151
|
- !ruby/object:Gem::Dependency
|
|
198
152
|
name: simplecov
|
|
199
153
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -242,6 +196,20 @@ dependencies:
|
|
|
242
196
|
- - ">="
|
|
243
197
|
- !ruby/object:Gem::Version
|
|
244
198
|
version: 2.1.2
|
|
199
|
+
- !ruby/object:Gem::Dependency
|
|
200
|
+
name: rubocop
|
|
201
|
+
requirement: !ruby/object:Gem::Requirement
|
|
202
|
+
requirements:
|
|
203
|
+
- - ">="
|
|
204
|
+
- !ruby/object:Gem::Version
|
|
205
|
+
version: '0'
|
|
206
|
+
type: :development
|
|
207
|
+
prerelease: false
|
|
208
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
209
|
+
requirements:
|
|
210
|
+
- - ">="
|
|
211
|
+
- !ruby/object:Gem::Version
|
|
212
|
+
version: '0'
|
|
245
213
|
description: Ruby wrapper for Campact User Service
|
|
246
214
|
email: hello@controlshiftlabs.com
|
|
247
215
|
executables: []
|
|
@@ -250,8 +218,10 @@ extra_rdoc_files:
|
|
|
250
218
|
- LICENSE
|
|
251
219
|
- README.md
|
|
252
220
|
files:
|
|
221
|
+
- ".rubocop.yml"
|
|
253
222
|
- ".ruby-gemset"
|
|
254
223
|
- ".ruby-version"
|
|
224
|
+
- ".travis.yml"
|
|
255
225
|
- Gemfile
|
|
256
226
|
- LICENSE
|
|
257
227
|
- README.md
|
|
@@ -273,7 +243,7 @@ homepage: http://github.com/controlshift/campact_user_service
|
|
|
273
243
|
licenses:
|
|
274
244
|
- MIT
|
|
275
245
|
metadata: {}
|
|
276
|
-
post_install_message:
|
|
246
|
+
post_install_message:
|
|
277
247
|
rdoc_options: []
|
|
278
248
|
require_paths:
|
|
279
249
|
- lib
|
|
@@ -288,8 +258,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
288
258
|
- !ruby/object:Gem::Version
|
|
289
259
|
version: '0'
|
|
290
260
|
requirements: []
|
|
291
|
-
rubygems_version: 3.0.
|
|
292
|
-
signing_key:
|
|
261
|
+
rubygems_version: 3.0.8
|
|
262
|
+
signing_key:
|
|
293
263
|
specification_version: 4
|
|
294
264
|
summary: Ruby wrapper for Campact User Service
|
|
295
265
|
test_files: []
|