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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 214a865845390e44559c068f95a74ad8a85a46ff83eb5192edcc8e0b4f39440d
4
- data.tar.gz: 7b2664936fec33426d6807f114a7820cb34455d5d9e2278fd017f14b13c720f9
3
+ metadata.gz: 6e9cb5aee16e6996f096b2a784d87d425fca96e5bcb04af1c6bb226bc7f6e3a6
4
+ data.tar.gz: 9a245ab3f8ba1f0ba86f3b7c630f1f4df86714bb58f553bc045685edec6e3081
5
5
  SHA512:
6
- metadata.gz: 362b5d1d2735112327bb6b1f4c4d3137a719c565af5e37ef81bbf58958ea57400f9753c69b6132513a56bcd6639a1c0a565b84d28eda48833602cd2265bd6490
7
- data.tar.gz: 8ea75a760589072fb567c3548f0b147f5420477ebbfae0009cf31614af365d3982c485b77857ead0af601df814c182d75a105056a65f8e0fa38d160f8e8a6493
6
+ metadata.gz: 4e1b4f9916af9c8142811589bd3683de92d4189b32de5968f3df42bd85930bb1d6d857e392d1c669c8cda0cdceb280676f162c0d20f69db33961d50249a6e1af
7
+ data.tar.gz: bdb5d97db34b872a4d50e8dee355a53f5e2700766c524dc280c26e9b1ed6d5a322654207ae38f0a9e7cb940ffa8dcec97d7bd466423c4c58ac5a61760d8525a0
@@ -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
@@ -1 +1 @@
1
- 2.5.3
1
+ 2.6.6
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.6
4
+ cache: bundler
5
+ before_install:
6
+ - gem install bundler
7
+ script:
8
+ - bundle exec rspec
9
+ - bundle exec rubocop
data/Gemfile CHANGED
@@ -1,7 +1,6 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem 'base32', '~> 0.3.2'
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 'bundler', '~> 1.16', '>= 1.16.2'
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
@@ -1,4 +1,6 @@
1
1
  # campact-user-service
2
+ [![Build Status](https://travis-ci.org/controlshift/campact-user-service.svg?branch=master)](https://travis-ci.org/controlshift/campact-user-service)
3
+
2
4
  a ruby gem that wraps the Campact user service API
3
5
 
4
6
  ## License
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.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 2.0.1 ruby lib
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 = "2.0.1"
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 = "2019-08-12"
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.3".freeze
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<base32>.freeze, ["~> 0.3.2"])
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<bundler>.freeze, ["~> 1.16", ">= 1.16.2"])
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<base32>.freeze, ["~> 0.3.2"])
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<bundler>.freeze, ["~> 1.16", ">= 1.16.2"])
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<base32>.freeze, ["~> 0.3.2"])
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<bundler>.freeze, ["~> 1.16", ">= 1.16.2"])
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, username, password)
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
- "#{client.scheme}://#{client.host}:#{client.port}",
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 username
37
- puts "I'll need your API credentials"
38
- puts "Enter your API username"
39
- username = gets.chomp
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
- # Get password
42
- puts "I'll need your password now"
43
- password = gets.chomp
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-demo-session',
58
+ 'campact-staging-session',
53
59
  {
54
- scheme: 'http',
55
- host: 'demo.campact.de',
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
- scheme: 'http',
66
- host: 'demo.campact.de',
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, username, password)
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["id"]
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("api/v1/accounts/#{escaped_user_id}") || {})
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 = 5.freeze
8
+ TIMEOUT = 60.freeze
9
+ OPEN_TIMEOUT = 20.freeze
10
10
 
11
- attr_reader :connection, :scheme, :host, :port
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 = TIMEOUT
41
- if options.has_key?(:cookies)
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 = "#{scheme}://#{host}"
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
@@ -8,10 +8,6 @@ module CampactUserService
8
8
  @session_cookie_name = session_cookie_name
9
9
  end
10
10
 
11
- def exists?
12
- session && session['id']
13
- end
14
-
15
11
  def user_id
16
12
  session["user_id"]
17
13
  end
@@ -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/api/v1/accounts/#{user_id}")
19
+ stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
20
20
  .to_return(body: {
21
- "id": "id-123"
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/api/v1/accounts/#{user_id}")
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/api/v1/accounts/%09%0D")
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/api/v1/accounts/foo@example.com%2Fsecrets")
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/api/v1/accounts/#{user_id}")
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/api/v1/accounts/#{user_id}")
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/api/v1/accounts/#{user_id}")
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/api/v1/accounts/#{user_id}")
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/api/v1/accounts/#{user_id}")
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/api/v1/accounts/#{user_id}")
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/api/v1/accounts/#{user_id}")
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/api/v1/accounts/#{user_id}")
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/api/v1/accounts/#{user_id}")
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/api/v1/accounts/#{user_id}")
188
+ stub_request(:get, "https://test.com/v1/accounts/#{user_id}")
189
189
  .to_return(body: {
190
190
  "preferences": {
191
191
  "prefill_forms": "disallowed"
@@ -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 |endpoint, initialization_options|
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 |endpoint, initialization_options|
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::TIMEOUT)
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::TIMEOUT)
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::TIMEOUT)
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::TIMEOUT)
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)
@@ -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')
@@ -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: 2.0.1
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: 2019-08-12 00:00:00.000000000 Z
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: '3.3'
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: '3.3'
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: 2.4.9
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: 2.4.9
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.3
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: []