atpay_tokens 2.0.2 → 2.1.0

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
  SHA1:
3
- metadata.gz: 65be535209e1614aa04a9fe3ac66eff35db1d6f0
4
- data.tar.gz: 4b447781504822cb77f38ebfac727e646dcce417
3
+ metadata.gz: 8b287a2d69504b635b56368a27f7c2c9c2b6d6d4
4
+ data.tar.gz: 294d9c0723c657eb277d246aa2a79f238ec7a4b4
5
5
  SHA512:
6
- metadata.gz: 696b8f3084deadfe089dd1aa33e0ebaad1703019a078619427bd9e70cbd830031ae7e04df46f84a5f032e4e6483c66413a2b2951c960869a81c86489777cb304
7
- data.tar.gz: 5dc52cd6a323856d4f985cdbfe293787477870390e1115d33bff226300f6faba67abffa9f718534aa2d8bbcad196bc59d49fadcaaa3fe34e8b1f8942f648b2a4
6
+ metadata.gz: 257ed967ee374de94b602d2d598d72bac190eb64c2d7612a0bf5b1eb8627ad8c1e5d0cd0229a21252d9e714cfb6e7c12aa01d4bc29efbb82748a5b8bbebcd3a8
7
+ data.tar.gz: 633db21ac4d51830a0d10019fcb74937104b4151beb60a98e4f4d58268b500d66d6098073cfad2cbbb42b1e2e0fdcb64802f36bbc7b731a51a782fad11642af5
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @Pay API Client
2
2
 
3
- [![Build Status](https://travis-ci.org/atpay/atpay-client.png)](https://travis-ci.org/atpay/atpay-client)
3
+ [![Build Status](https://travis-ci.org/atpay/atpay-client.png)](https://travis-ci.org/atpay/atpay-client) [![Coverage Status](https://coveralls.io/repos/atpay/atpay-client/badge.png?branch=master)](https://coveralls.io/repos/atpay/atpay-client/badge.png?branch=master)
4
4
 
5
5
 
6
6
  Client interface for the @Pay API and key generation for
@@ -47,34 +47,36 @@ session = AtPay::Session.new({
47
47
 
48
48
  ## Command Line Usage
49
49
 
50
- $ atpay-client --help
50
+ $ atpay_tokens --help
51
51
 
52
52
 
53
53
  ### Parameters
54
54
 
55
- atpay-token-generator v2.0
55
+ atpay_tokens v2.1
56
56
  Options:
57
- --private-key, -p <s>: [global] The private key given to you by @Pay
58
- --public-key, -u <s>: [global] @Pay's public key, given to you by @Pay
59
- --partner-id, -a <i>: [global] The partner ID given to you by @Pay
60
- --environment, -e <s>: [global] The environment you want to generate buttons for. Currently sandbox or production (default: production)
61
- --config, -c <s>: [global] The path to a configuration file in yml format
62
- --type, -t <s>: [global] The type of token to generate (site,email)
63
- --card, -r <s>: [site-token, email-token] The card token associated with the recipient of this token. If `type` is site, this must be present
64
- --email, -m <s>: [email-token] The email associated with the receipt of this token. Incomptible when `type` is 'site'
65
- --amount, -o <f>: [token] The amount a user should be charged for the transaction you're generating a token for (default: 5.0)
66
- --user-data, -s <s>: [token] Data to pass back as a reference
67
- --expires, -x <i>: [token] Expiration date for token, integer value of seconds since epoch
68
- --header-user-agent, -h <s>: [site-token] The HTTP_USER_AGENT from the client's request header (if `type` is 'site')
57
+ --private-key, -p <s>: [global] The private key given to you by @Pay
58
+ --public-key, -u <s>: [global] @Pay's public key, given to you by @Pay
59
+ --partner-id, -a <i>: [global] The partner ID given to you by @Pay
60
+ --environment, -e <s>: [global] The environment you want to generate buttons for. Currently sandbox or production (default: production)
61
+ --config, -c <s>: [global] The path to a configuration file in yml format
62
+ --type, -t <s>: [global] The type of token to generate (site,email,universal)
63
+ --card, -r <s>: [site-token, email-token] The card token associated with the recipient of this token. If `type` is site, this must be present
64
+ --email, -m <s>: [email-token] The email associated with the receipt of this token. Incompatible when `type` is 'site'
65
+ --url, -l <s>: [universal-token] The Signup url the recipient should go to if they don't have payment informaiton. Incompatible when `type` is 'site' or 'email'
66
+ --amount, -o <f>: [token] The amount a user should be charged for the transaction you're generating a token for (default: 5.0)
67
+ --user-data, -s <s>: [token] Data to pass back as a reference
68
+ --expires, -x <i>: [token] Expiration date for token, integer value of seconds since epoch
69
+ --header-user-agent, -h <s>: [site-token] The HTTP_USER_AGENT from the client's request header (if `type` is 'site')
69
70
  --header-accept-language, -d <s>: [site-token] The HTTP_ACCEPT_LANGUAGE from the client's request header (if `type` is 'site')
70
- --header-accept-charset <s>: [site-token] The HTTP_ACCEPT_CHARSET from the client's request header (if `type` is 'site')
71
- --ip-address, -i <s>: [site-token] The IP address of the token recipient (if `type` is 'site')
72
- --version, -v: Print version and exit
73
- --help, -l: Show this message
71
+ --header-accept-charset <s>: [site-token] The HTTP_ACCEPT_CHARSET from the client's request header (if `type` is 'site')
72
+ --ip-address, -i <s>: [site-token] The IP address of the token recipient (if `type` is 'site')
73
+ --version, -v: Print version and exit
74
+ --help: Show this message
74
75
 
75
76
  * Parameters marked as [global] must be passed on the command line
76
77
  * Parameters marked with [site-token] are required for site tokens
77
78
  * Parameters marked with [email-token] are required for email tokens
79
+ * Parameters marked with [universal-token] are required for universal tokens
78
80
  * Parameters marked with [token] are accepted for both site and email tokens
79
81
 
80
82
  ### CSV via STDIN
data/atpay_tokens.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'atpay_tokens'
3
- s.version = '2.0.2'
4
- s.date = '2013-07-25'
3
+ s.version = '2.1.0'
4
+ s.date = '2013-08-12'
5
5
  s.summary = "@Pay Token Generator"
6
6
  s.description = "Client interface for the @Pay API, key generation for performance optimization"
7
7
  s.authors = ["James Kassemi", "Glen Holcomb"]
data/bin/atpay_tokens CHANGED
@@ -8,7 +8,7 @@ require 'csv'
8
8
  require 'trollop'
9
9
 
10
10
  $opts = Trollop::options do
11
- version "atpay-token-generator v2.0"
11
+ version "atpay_tokens v2.1"
12
12
 
13
13
  # Global
14
14
  opt :private_key, "[global] The private key given to you by @Pay", :type => :string
@@ -16,11 +16,12 @@ $opts = Trollop::options do
16
16
  opt :partner_id, "[global] The partner ID given to you by @Pay", :type => :integer
17
17
  opt :environment, "[global] The environment you want to generate buttons for. Currently sandbox or production", :default => 'production', :type => :string
18
18
  opt :config, "[global] The path to a configuration file in yml format", :type => :string
19
- opt :type, "[global] The type of token to generate (site,email)", :type => :string
19
+ opt :type, "[global] The type of token to generate (site,email,universal)", :type => :string
20
20
 
21
21
  # Per Token
22
22
  opt :card, "[site-token, email-token] The card token associated with the recipient of this token. If `type` is site, this must be present", :type => :string
23
- opt :email, "[email-token] The email associated with the receipt of this token. Incomptible when `type` is 'site'", :type => :string
23
+ opt :email, "[email-token] The email associated with the receipt of this token. Incompatible when `type` is 'site'", :type => :string
24
+ opt :url, "[universal-token] The Signup url the recipient should go to if they don't have payment informaiton. Incompatible when `type` is 'site' or 'email'", :type => :string
24
25
 
25
26
  opt :amount, "[token] The amount a user should be charged for the transaction you're generating a token for", :default => 5.0
26
27
  opt :user_data, "[token] Data to pass back as a reference", :type => :string
@@ -64,16 +65,12 @@ module Args
64
65
 
65
66
  class TokenSet
66
67
  def next_token
67
- if cli?
68
- cli
69
- else
70
- stdin
71
- end
68
+ cli? ? cli : stdin
72
69
  end
73
70
 
74
71
  private
75
72
  def cli?
76
- ($opts[:card] or $opts[:email]) and $opts[:type]
73
+ ($opts[:card] or $opts[:email] or $opts[:url]) and $opts[:type]
77
74
  end
78
75
 
79
76
  def cli
@@ -119,17 +116,20 @@ class Generator
119
116
  Trollop::die :ip_address, "must be present for site_tokens" if site? and options[:ip_address].nil?
120
117
  Trollop::die :email, "or card must be present for all rows" if email? and (options[:card].nil? and options[:email].nil?)
121
118
  Trollop::die :amount, "must be present" if options[:amount].nil?
119
+ Trollop::die :url, "must be present" if universal? and options[:url].nil?
120
+ Trollop::die :email, "incompatible with universal tokens" if universal? and options[:email]
121
+ Trollop::die :card, "incompatible with universal tokens" if universal? and options[:card]
122
122
  end
123
123
 
124
124
  def next
125
- return unless options=next_config
125
+ return unless options = next_config
126
126
  options[:amount] = options[:amount].to_f
127
127
 
128
128
  row_option_check(options)
129
129
 
130
130
  security_key = session.security_key(options)
131
131
 
132
- if email?
132
+ if email? or universal?
133
133
  security_key.email_token
134
134
  elsif site?
135
135
  headers = {
@@ -158,11 +158,15 @@ class Generator
158
158
  def site?
159
159
  $opts[:type] == "site"
160
160
  end
161
+
162
+ def universal?
163
+ $opts[:type] == 'universal'
164
+ end
161
165
  end
162
166
 
163
167
  config = Args::Main.new
164
168
  generator = Generator.new(config)
165
169
 
166
- while token=generator.next
170
+ while token = generator.next
167
171
  puts token
168
172
  end
@@ -8,7 +8,7 @@ module AtPay
8
8
  raise ArgumentError.new("User Data can't exceed 2500 characters.") if options[:user_data] and options[:user_data].length > 2500
9
9
  raise ArgumentError.new("email") unless options[:email].nil? or options[:email] =~ /.+@.+/
10
10
  raise ArgumentError.new("amount") unless options[:amount].is_a? Float
11
- raise ArgumentError.new("card or email or member required") if options[:email].nil? and options[:card].nil? and options[:member].nil?
11
+ raise ArgumentError.new("card or email or member or url required") if options[:email].nil? and options[:card].nil? and options[:member].nil? and options[:url].nil?
12
12
 
13
13
  @session = session
14
14
  @options = options
@@ -78,19 +78,11 @@ module AtPay
78
78
  end
79
79
 
80
80
  def target
81
- card_format || member_format || email_format
81
+ format_target [:card, :member, :email, :url].detect { |key| @options[key] }
82
82
  end
83
83
 
84
- def card_format
85
- "card<#{@options[:card]}>" if @options[:card]
86
- end
87
-
88
- def member_format
89
- "member<#{@options[:member]}>" if @options[:member]
90
- end
91
-
92
- def email_format
93
- "email<#{@options[:email]}>" if @options[:email]
84
+ def format_target(key)
85
+ "#{key.to_s}<#{@options[key]}>"
94
86
  end
95
87
 
96
88
  def expires
@@ -11,6 +11,13 @@ module AtPay
11
11
  :ip,
12
12
  :user_data
13
13
 
14
+ TARGETS = {
15
+ /url<(.*?)>/ => [:@url, 6],
16
+ /card<(.*?)>/ => [:@card, 7],
17
+ /email<(.*?)>/ => [:@email, 8],
18
+ /member<(.*?)>/ => [:@member, 9]
19
+ }
20
+
14
21
  # A bit clunky but useful for testing token decomposition.
15
22
  # If you provide a test session then the config values there
16
23
  # will be used so that decryption will function without @Pay's
@@ -74,7 +81,7 @@ module AtPay
74
81
  end
75
82
 
76
83
  def source
77
- {email: @email, card: @card, member: @member}
84
+ { email: @email, card: @card, member: @member, url: @url }
78
85
  end
79
86
 
80
87
  # Return parts in a hash structure, handy for ActiveRecord.
@@ -165,22 +172,15 @@ module AtPay
165
172
  return @user_data
166
173
  end
167
174
 
168
- # Find the target of the token. This could be a Credit Card
169
- # Email Address or Member UUID.
175
+ # Find the target of the token. This could be a Credit Card,
176
+ # Email Address, URL or Member UUID.
170
177
  def target(target)
171
- case target
172
- when /card<(.*?)>/
173
- @card = $1
174
- @payload.slice!(0, ($1.length + 7))
175
- when /email<(.*?)>/
176
- @email = $1
177
- @payload.slice!(0, ($1.length + 8))
178
- when /member<(.*?)>/
179
- @member = $1
180
- @payload.slice!(0, ($1.length + 9))
181
- else
182
- raise "No target found"
183
- end
178
+ match = TARGETS.keys.detect { |key| target.match key }
179
+
180
+ raise "No target found" if match.nil?
181
+
182
+ instance_variable_set TARGETS[match][0], $1.dup
183
+ @payload.slice!(0, ($1.length + TARGETS[match][1]))
184
184
  end
185
185
  end
186
186
  end
@@ -42,6 +42,40 @@ describe AtPay::SecurityKey do
42
42
  })
43
43
  }.to raise_error
44
44
  end
45
+
46
+ it "fails when not given an email or card or member or url" do
47
+ expect {
48
+ AtPay::SecurityKey.new(session, {
49
+ amount: 25.00
50
+ })
51
+ }.to raise_error
52
+ end
53
+ end
54
+
55
+ describe "#target" do
56
+ it "builds a card string if card option given" do
57
+ for_card = AtPay::SecurityKey.new(session, amount: 25.0, card: 'fakecardtoken')
58
+
59
+ expect(for_card.send(:target)).to eq("card<fakecardtoken>")
60
+ end
61
+
62
+ it "builds an email string if email option given" do
63
+ for_email = AtPay::SecurityKey.new(session, amount: 25.0, email: 'bob@bob')
64
+
65
+ expect(for_email.send(:target)).to eq("email<bob@bob>")
66
+ end
67
+
68
+ it "builds a member string if member option given" do
69
+ for_member = AtPay::SecurityKey.new(session, amount: 25.0, member: 'fakemember')
70
+
71
+ expect(for_member.send(:target)).to eq("member<fakemember>")
72
+ end
73
+
74
+ it "builds a url string if url option given" do
75
+ for_url = AtPay::SecurityKey.new(session, amount: 25.0, url: 'http://fake.url.com')
76
+
77
+ expect(for_url.send(:target)).to eq("url<http://fake.url.com>")
78
+ end
45
79
  end
46
80
 
47
81
  describe "#to_s" do
@@ -13,6 +13,7 @@ describe AtPay::Tokenator do
13
13
  let(:version) { AtPay::Tokenator.new token(50.00, [:email_token], {email: 'email@address', version: 2}), build_session }
14
14
  let(:member) { AtPay::Tokenator.new token(50.00, [:email_token], {member: '4DF08A79-C16C-4842-AA1B-AE878C9C6C2C'}), build_session }
15
15
  let(:group) { AtPay::Tokenator.new token(50.00, [:email_token], {member: '4DF08A79-C16C-4842-AA1B-AE878C9C6C2C', group: '18', user_data: 'hello from data'}), build_session }
16
+ let(:url) { AtPay::Tokenator.new token(50.00, [:email_token], {url: 'http://fake.url' }), build_session }
16
17
 
17
18
  describe "Parsing" do
18
19
  it "Uses the key specified in ENCRYPTION if not given a session" do
@@ -58,6 +59,13 @@ describe AtPay::Tokenator do
58
59
  group.group.should eq('18')
59
60
  group.user_data.should eq('hello from data')
60
61
  end
62
+
63
+ it "processes a url token" do
64
+ url.header
65
+ url.body Base64.decode64(public_key)
66
+
67
+ url.source[:url].should eq('http://fake.url')
68
+ end
61
69
  end
62
70
 
63
71
  describe "Exceptions" do
@@ -0,0 +1,57 @@
1
+ require 'helper'
2
+ require 'atpay_tokens'
3
+
4
+ describe "atpay_tokens" do
5
+ let(:key_pattern) { /@((([A-Za-z0-9+=*]{4})*-)?([A-Za-z0-9+=\/]{4}){5,})/ }
6
+ let(:base_args) { "--environment test --private-key \"#{private_key}\" --public-key \"#{public_key}\" --partner-id 1 --amount 24.0"}
7
+ let(:universal_token_args) { "#{base_args} --type universal --url http://bob.com" }
8
+ let(:site_token_args) { "#{base_args} --type site --card cardtoken --header-user-agent bob --header-accept-language en --header-accept-charset us --ip-address 127.0.0.1" }
9
+ let(:email_token_args) { "#{base_args} --type email --email bob@bob.com" }
10
+ let(:command) { File.dirname(__FILE__) + '/../bin/atpay_tokens' }
11
+
12
+ describe "Universal Tokens" do
13
+ it "returns an @Pay Token" do
14
+ expect(`#{command} #{universal_token_args}`).to match(key_pattern)
15
+ end
16
+
17
+ it "returns a universal token" do
18
+ tokenator = AtPay::Tokenator.new(`#{command} #{universal_token_args}`, build_session)
19
+
20
+ tokenator.header
21
+ tokenator.body Base64.decode64(public_key)
22
+
23
+ expect(tokenator.source[:url]).to eq('http://bob.com')
24
+ end
25
+ end
26
+
27
+ describe "Site Tokens" do
28
+ it "returns an @Pay Token" do
29
+ expect(`#{command} #{site_token_args}`).to match(key_pattern)
30
+ end
31
+
32
+ it "returns a site token" do
33
+ tokenator = AtPay::Tokenator.new(`#{command} #{site_token_args}`, build_session)
34
+
35
+ tokenator.header
36
+ tokenator.browser_data Base64.decode64(public_key)
37
+ tokenator.body Base64.decode64(public_key)
38
+
39
+ expect(tokenator.source[:card]).to eq('cardtoken')
40
+ end
41
+ end
42
+
43
+ describe "Email Tokens" do
44
+ it "returns an @Pay Token" do
45
+ expect(`#{command} #{email_token_args}`).to match(key_pattern)
46
+ end
47
+
48
+ it "returns an email token" do
49
+ tokenator = AtPay::Tokenator.new(`#{command} #{email_token_args}`, build_session)
50
+
51
+ tokenator.header
52
+ tokenator.body Base64.decode64(public_key)
53
+
54
+ expect(tokenator.source[:email]).to eq('bob@bob.com')
55
+ end
56
+ end
57
+ end
data/spec/helper.rb CHANGED
@@ -8,8 +8,6 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
8
8
 
9
9
  SimpleCov.start
10
10
 
11
- require 'rubygems'
12
- require 'bundler/setup'
13
11
  require 'atpay_tokens'
14
12
  require 'rspec/core/shared_context'
15
13
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atpay_tokens
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Kassemi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-25 00:00:00.000000000 Z
12
+ date: 2013-08-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -78,6 +78,7 @@ files:
78
78
  - spec/atpay/security_key_spec.rb
79
79
  - spec/atpay/session_spec.rb
80
80
  - spec/atpay/tokenator_spec.rb
81
+ - spec/atpay_tokens_spec.rb
81
82
  - spec/helper.rb
82
83
  homepage: https://atpay.com
83
84
  licenses: []
@@ -107,4 +108,5 @@ test_files:
107
108
  - spec/atpay/security_key_spec.rb
108
109
  - spec/atpay/session_spec.rb
109
110
  - spec/atpay/tokenator_spec.rb
111
+ - spec/atpay_tokens_spec.rb
110
112
  - spec/helper.rb