adyen-cse-ruby 0.1.5 → 1.1.3

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
- SHA1:
3
- metadata.gz: 5c7ca95081976ea2f8c31a6ba33249d213534ec9
4
- data.tar.gz: 36c7dbb961da7aeb6a7b37d8e1709c8af7767047
2
+ SHA256:
3
+ metadata.gz: 1dc6b42606f020de53d9548fe9018476fb4292c5c4ef71cf158dc2d1c1b02c84
4
+ data.tar.gz: 6ea9ce274d8837186e3db4190541c3a6ab1310743e29794e1dfbeaf353507a15
5
5
  SHA512:
6
- metadata.gz: 6f8bca433565116733632974672df8cf832d4732be8db4c72ecdec91c086cb5fa87bf70b05ab58290e3b9f5827f5f35d67c58da051e02a60743748d20d1238f5
7
- data.tar.gz: 101ec3c369d1889579c9a86f8f820a249103d80379f3bc3d9443b047f7c277e28c96db2d859322000b19b75d79751c8ea1b21d493d57161ec69285e50eb2842b
6
+ metadata.gz: 65c0720f6cd58a0be9949f2c545f4857feb106af6fe8c52779c5f651ab2d270dce2cf1fddec64371e4cc1f3de209c5478531ceca9a649356efdd820a27f00ca3
7
+ data.tar.gz: 2f6197596e8a06eba8508fbfb8d006b7169777cb636c8c9d37eb2030a47960053dafe35487ec9be4545d64814f6dc3baba25b2774f63074e059f224a23d9e606
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
4
3
  /_yardoc/
5
4
  /coverage/
6
5
  /doc/
@@ -1,5 +1,9 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.3.1
5
- before_install: gem install bundler -v 1.14.6
4
+ - 2.3
5
+ - 2.4
6
+ - 2.5
7
+ - 2.6
8
+ - 2.7
9
+ before_install: gem install bundler -v 2.1.2 # should match version in Gemfile.lock
@@ -0,0 +1,15 @@
1
+ Note to self.
2
+
3
+ ## Developing
4
+
5
+ 1. Run `bin/setup` to install dependencies
6
+ 2. Run `bundle exec rake test` to run the tests
7
+ 3. Run `bin/console` for an interactive prompt (optional, for debugging)
8
+
9
+ ## Releasing New Version
10
+
11
+ 1. Update version number in `version.rb`
12
+ 2. Run `bundle exec rake release`. This will:
13
+ 1. Create a git tag with the version number
14
+ 2. Push git commits and tags to remote
15
+ 3. Push the `.gem` file to [rubygems.org](https://rubygems.org)
@@ -0,0 +1,31 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ adyen-cse-ruby (1.1.3)
5
+ openssl-ccm
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ coderay (1.1.3)
11
+ method_source (1.0.0)
12
+ minitest (5.14.1)
13
+ openssl-ccm (1.2.2)
14
+ pry (0.13.1)
15
+ coderay (~> 1.1)
16
+ method_source (~> 1.0)
17
+ rake (13.0.1)
18
+
19
+ PLATFORMS
20
+ ruby
21
+
22
+ DEPENDENCIES
23
+ adyen-cse-ruby!
24
+ bundler
25
+ minitest
26
+ openssl-ccm
27
+ pry
28
+ rake
29
+
30
+ BUNDLED WITH
31
+ 2.1.2
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
+ [![Gem Version](https://badge.fury.io/rb/adyen-cse-ruby.svg)](https://badge.fury.io/rb/adyen-cse-ruby)
1
2
  [![Build Status](https://travis-ci.org/jooeycheng/adyen-cse-ruby.svg?branch=master)](https://travis-ci.org/jooeycheng/adyen-cse-ruby)
3
+ [![](https://api.codeclimate.com/v1/badges/ac46c6f16792ed094d7f/maintainability)](https://codeclimate.com/github/jooeycheng/adyen-cse-ruby/maintainability)
2
4
 
3
5
  # Adyen CSE for Ruby
4
6
 
@@ -29,13 +31,90 @@ Or install it yourself as:
29
31
  ```ruby
30
32
  require 'adyen_cse'
31
33
 
32
- cse = AdyenCse::Encrypter.new(public_key) do |card|
33
- card.holder_name = "Adyen Shopper"
34
- card.number = "4111111111111111"
35
- card.expiry_month = "08"
36
- card.expiry_year = "2018"
37
- card.cvc = "737"
34
+ cse = AdyenCse::Encrypter.new(public_key)
35
+
36
+ encrypted_card = cse.encrypt!(
37
+ holder_name: "Adyen Shopper",
38
+ number: 4111_1111_1111_1111.to_s,
39
+ expiry_month: "08",
40
+ expiry_year: "2018",
41
+ cvc: "737"
42
+ )
43
+ ```
44
+
45
+ Optionally, you may pass a custom `generation_time` to mock expired data.
46
+
47
+ ```ruby
48
+ encrypted_card = cse.encrypt!(
49
+ ...,
50
+ generation_time: Time.new(2015, 10, 21)
51
+ )
52
+ ```
53
+
54
+ ## factory_bot integration
55
+ Example of an `:adyen_test_card` factory with [factory_bot](https://github.com/thoughtbot/factory_bot).
56
+
57
+ ```ruby
58
+ # ./spec/factories/adyen_test_card.rb
59
+
60
+ require 'adyen_cse'
61
+
62
+ class AdyenTestCard
63
+ attr_reader :holder_name, :number, :expiry_month, :expiry_year, :cvc
64
+
65
+ PUBLIC_KEY = "your_public_key_here"
66
+
67
+ def initialize(params = {})
68
+ @holder_name = params[:holder_name]
69
+ @number = params[:number]
70
+ @expiry_month = params[:expiry_month]
71
+ @expiry_year = params[:expiry_year]
72
+ @cvc = params[:cvc]
73
+ end
74
+
75
+ def nonce
76
+ AdyenCse::Encrypter.new(PUBLIC_KEY).encrypt!(
77
+ holder_name: holder_name,
78
+ number: number,
79
+ expiry_month: expiry_month,
80
+ expiry_year: expiry_year,
81
+ cvc: cvc
82
+ )
83
+ end
84
+ end
85
+
86
+ FactoryBot.define do
87
+ factory :adyen_test_card do
88
+ sequence(:holder_name) { |n| "Shopper #{n}" }
89
+ expiry_month { '08' }
90
+ expiry_year { '2018' }
91
+ cvc { '737' }
92
+
93
+ visa
94
+
95
+ trait :visa do
96
+ number { 4111_1111_1111_1111.to_s }
97
+ end
98
+
99
+ trait :mastercard do
100
+ number { 5555_5555_5555_4444.to_s }
101
+ end
102
+
103
+ trait :amex do
104
+ number { 3451_779254_88348.to_s }
105
+ cvc { '7373' }
106
+ end
107
+
108
+ skip_create
109
+ initialize_with { new(attributes) }
110
+ end
38
111
  end
112
+ ```
39
113
 
40
- encrypted_card = cse.encrypt!
114
+ Example usage:
115
+ ```ruby
116
+ RSpec.describe ExamplePaymentService do
117
+ let(:credit_card) { FactoryBot.build(:adyen_test_card) }
118
+ ...
119
+ end
41
120
  ```
@@ -21,9 +21,9 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_runtime_dependency "openssl-ccm", "~> 1.2.1"
24
+ spec.add_runtime_dependency "openssl-ccm"
25
25
 
26
- spec.add_development_dependency "bundler", "~> 1.14"
27
- spec.add_development_dependency "rake", "~> 10.0"
28
- spec.add_development_dependency "minitest", "~> 5.0"
26
+ spec.add_development_dependency "bundler"
27
+ spec.add_development_dependency "rake"
28
+ spec.add_development_dependency "minitest"
29
29
  end
@@ -5,27 +5,34 @@ require "json"
5
5
 
6
6
  module AdyenCse
7
7
  class Encrypter
8
- PREFIX = "adyenrb"
9
- VERSION = "0_1_1"
8
+ PREFIX = "adyenrb"
9
+ VERSION = "0_1_1"
10
10
 
11
- attr_reader :public_key
12
- attr_accessor :holder_name, :number, :expiry_month, :expiry_year, :cvc, :generation_time
11
+ attr_reader :public_key
13
12
 
14
13
  def initialize(public_key)
15
14
  @public_key = public_key
16
- yield self rescue nil
17
- self.generation_time ||= Time.now
18
15
  end
19
16
 
20
- def encrypt!
21
- validate!
17
+ def encrypt!(params = {})
18
+ validate!(params.keys)
22
19
 
23
20
  key = SecureRandom.random_bytes(32)
24
21
  nonce = SecureRandom.random_bytes(12)
25
- data = card_data.to_json
22
+ generation_time = params.fetch(:generation_time, Time.now)
23
+
24
+ # keys sorted alphabetically
25
+ json_data = {
26
+ "cvc" => params[:cvc],
27
+ "expiryMonth" => params[:expiry_month],
28
+ "expiryYear" => params[:expiry_year],
29
+ "generationtime" => generation_time.utc.strftime("%FT%T.%LZ"),
30
+ "holderName" => params[:holder_name],
31
+ "number" => params[:number],
32
+ }.to_json
26
33
 
27
34
  ccm = OpenSSL::CCM.new("AES", key, 8)
28
- encrypted_card = ccm.encrypt(data, nonce)
35
+ encrypted_card = ccm.encrypt(json_data, nonce)
29
36
 
30
37
  rsa = self.class.parse_public_key(public_key)
31
38
  encrypted_aes_key = rsa.public_encrypt(key)
@@ -35,32 +42,25 @@ module AdyenCse
35
42
  [PREFIX, VERSION, "$", Base64.strict_encode64(encrypted_aes_key), "$", Base64.strict_encode64(encrypted_card_component)].join
36
43
  end
37
44
 
38
- def card_data
39
- # keys sorted alphabetically
40
- {
41
- "cvc" => cvc,
42
- "expiryMonth" => expiry_month,
43
- "expiryYear" => expiry_year,
44
- "generationtime" => generation_time.utc.strftime("%FT%T.%LZ"),
45
- "holderName" => holder_name,
46
- "number" => number,
47
- }
48
- end
49
-
50
45
  def self.parse_public_key(public_key)
51
46
  exponent, modulus = public_key.split("|").map { |n| n.to_i(16) }
52
47
 
53
- OpenSSL::PKey::RSA.new.tap do |rsa|
54
- rsa.e = OpenSSL::BN.new(exponent)
55
- rsa.n = OpenSSL::BN.new(modulus)
48
+ if RUBY_VERSION < '2.4.0'
49
+ OpenSSL::PKey::RSA.new.tap do |rsa|
50
+ rsa.e = OpenSSL::BN.new(exponent)
51
+ rsa.n = OpenSSL::BN.new(modulus)
52
+ end
53
+ else
54
+ rsa = OpenSSL::PKey::RSA.new
55
+ rsa.set_key(OpenSSL::BN.new(modulus), OpenSSL::BN.new(exponent), nil)
56
56
  end
57
57
  end
58
58
 
59
59
  private
60
60
 
61
- def validate!
62
- %w(holder_name number expiry_month expiry_year cvc generation_time).each do |param|
63
- raise ArgumentError, "param `#{param}' is required" if instance_variable_get("@#{param}").nil?
61
+ def validate!(params)
62
+ %i(holder_name number expiry_month expiry_year cvc).each do |param|
63
+ raise ArgumentError, "param `#{param}' is required" unless params.include?(param)
64
64
  end
65
65
  end
66
66
  end
@@ -1,3 +1,3 @@
1
1
  module AdyenCse
2
- VERSION = "0.1.5"
2
+ VERSION = "1.1.3"
3
3
  end
metadata CHANGED
@@ -1,71 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adyen-cse-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joey Cheng
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-29 00:00:00.000000000 Z
11
+ date: 2020-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: openssl-ccm
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.2.1
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 1.2.1
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.14'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.14'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '5.0'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '5.0'
68
+ version: '0'
69
69
  description: Adyen's Client Side Encryption (CSE) library for Ruby.
70
70
  email:
71
71
  - jooeycheng@gmail.com
@@ -75,14 +75,15 @@ extra_rdoc_files: []
75
75
  files:
76
76
  - ".gitignore"
77
77
  - ".travis.yml"
78
+ - DEVELOPMENT.md
78
79
  - Gemfile
80
+ - Gemfile.lock
79
81
  - LICENSE
80
82
  - README.md
81
83
  - Rakefile
82
84
  - adyen-cse-ruby.gemspec
83
85
  - bin/console
84
86
  - bin/setup
85
- - development.md
86
87
  - lib/adyen_cse.rb
87
88
  - lib/adyen_cse/encrypter.rb
88
89
  - lib/adyen_cse/version.rb
@@ -105,8 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
106
  - !ruby/object:Gem::Version
106
107
  version: '0'
107
108
  requirements: []
108
- rubyforge_project:
109
- rubygems_version: 2.5.1
109
+ rubygems_version: 3.1.2
110
110
  signing_key:
111
111
  specification_version: 4
112
112
  summary: Adyen Client-side encryption library for Ruby
@@ -1,8 +0,0 @@
1
- ## Development
2
-
3
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
4
-
5
- To install this gem onto your local machine, run `bundle exec rake install`.
6
-
7
- To release a new version, update the version number in `version.rb`,
8
- and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).