campact_user_service 2.0.1 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
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: []