paypal-permissions 0.1.1 → 0.1.2

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.
data/README.md CHANGED
@@ -9,7 +9,7 @@ Please visit PayPal's [Permissions Service API developer forums](https://www.x.c
9
9
  ### Step 1: Direct the user to the "Grant Permissions" on PayPal
10
10
 
11
11
  ~~~~~ ruby
12
- paypal = PaypalPermissions::Paypal.new( userid, password, signature, application_id, :production )
12
+ paypal = PayPal::Permissions::Paypal.new( userid, password, signature, application_id, :production )
13
13
  request_data = paypal.request_permissions(
14
14
  [:express_checkout, :direct_payment, :auth_capture, :refund, :transaction_details],
15
15
  'http://localhost/callback_url'
@@ -22,7 +22,7 @@ redirect_to request_data[:permissions_url]
22
22
  ### Step 2: Lookup result to get the final permission token
23
23
 
24
24
  ~~~~~ ruby
25
- paypal = PaypalPermissions::Paypal.new( userid, password, signature, application_id, :production )
25
+ paypal = PayPal::Permissions::Paypal.new( userid, password, signature, application_id, :production )
26
26
  token_data = paypal.get_access_token( params['token'], params['verifier'] )
27
27
 
28
28
  # Save token_data[:token] and token_data[:token_secret]
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.2
@@ -0,0 +1,9 @@
1
+ require 'paypal/permissions/version'
2
+ require 'paypal/permissions/fault_message'
3
+ require 'paypal/permissions/oauth'
4
+ require 'paypal/permissions/paypal'
5
+
6
+ # configuration
7
+ module Paypal::Permissions
8
+
9
+ end
@@ -1,12 +1,12 @@
1
- module PaypalPermissions
1
+ module Paypal::Permissions
2
2
  # Base error class
3
3
  class Error < Exception; end
4
4
 
5
5
  # PayPal returned a 500 Internal Server Error. Retry?
6
- class InternalServerError < PaypalPermissions::Error; end
6
+ class InternalServerError < ::Paypal::Permissions::Error; end
7
7
 
8
8
  # PayPal returned an unexpected error message
9
- class UnknownResponse < PaypalPermissions::Error
9
+ class UnknownResponse < ::Paypal::Permissions::Error
10
10
  attr_accessor :response_code
11
11
 
12
12
  def initialize(response_code, message)
@@ -39,7 +39,7 @@ module PaypalPermissions
39
39
  @correlation_id = options['correlationId']
40
40
  @build = options['build']
41
41
  @errors = collect_errors(options)
42
-
42
+
43
43
  @message = @ack
44
44
  end
45
45
 
@@ -47,9 +47,9 @@ module PaypalPermissions
47
47
  def collect_errors(options={})
48
48
  errors = []
49
49
  error_number = 0
50
-
50
+
51
51
  while options["error(#{error_number}).errorId"]
52
- errors << PaypalPermissions::FaultMessage::ErrorInformation.new(options, error_number)
52
+ errors << ::Paypal::Permissions::FaultMessage::ErrorInformation.new(options, error_number)
53
53
  error_number = error_number + 1
54
54
  end
55
55
  errors
@@ -0,0 +1,42 @@
1
+ require 'base64'
2
+ require 'openssl'
3
+ require 'uri'
4
+
5
+ module Paypal::Permissions
6
+ module Oauth
7
+
8
+ # Note: OAuth does not encode '.', but PayPal does.
9
+ OAUTH_RESERVED_CHARACTERS = /[^a-zA-Z0-9\_]/
10
+ OAUTH_SIGNATURE_METHOD = 'HMAC-SHA1'
11
+
12
+ # Create the X-PP-AUTHORIZATION header
13
+ def generate_signature(token, token_secret, http_method, endpoint)
14
+ raise "Invalid HTTP Method. Valid values: GET, POST, DELETE, UPDATE." unless ['GET','POST','DELETE','UPDATE'].include? http_method
15
+
16
+ timestamp = Time.now.to_i.to_s
17
+ signature_key = "#{@password}&#{oauth_escape(token_secret)}"
18
+
19
+ oauth_params = {
20
+ 'oauth_consumer_key' => @userid,
21
+ 'oauth_signature_method' => OAUTH_SIGNATURE_METHOD,
22
+ 'oauth_timestamp' => timestamp,
23
+ 'oauth_token' => token,
24
+ 'oauth_version' => '1.0',
25
+ }
26
+
27
+ input_string = "#{http_method}&#{oauth_escape(endpoint)}&"
28
+ input_string += oauth_params.map{ |k,v| "#{k}=#{v}" }.join('&')
29
+
30
+ # HMAC SHA1
31
+ digest_key = ::Digest::SHA1.digest(signature_key)
32
+ sha1_hash = ::OpenSSL::Digest::Digest.new('sha1')
33
+ signature = ::OpenSSL::HMAC.hexdigest(sha1_hash, digest_key, input_string)
34
+
35
+ "timestamp=#{timestamp},token=#{token},signature=#{signature}"
36
+ end
37
+
38
+ def oauth_escape(value)
39
+ URI::escape(value.to_s, OAUTH_RESERVED_CHARACTERS)
40
+ end
41
+ end
42
+ end
@@ -3,7 +3,7 @@ require 'net/https'
3
3
  require 'uri'
4
4
  require 'cgi'
5
5
 
6
- module PaypalPermissions
6
+ module Paypal::Permissions
7
7
  class Paypal
8
8
  include Oauth
9
9
 
@@ -61,7 +61,7 @@ module PaypalPermissions
61
61
  permissions_scopes.each_with_index { |ps,index| request_data["scope(#{index})"] = PERMISSIONS[ps] }
62
62
  data = call(url, request_data)
63
63
 
64
- raise PaypalPermissions::FaultMessage.new(data) unless data['token']
64
+ raise ::Paypal::Permissions::FaultMessage.new(data) unless data['token']
65
65
 
66
66
  # Redirect URL:
67
67
  # https://www.paypal.com/cgi-bin/webscr?cmd=_grant-permission&request_token= + token
@@ -77,7 +77,7 @@ module PaypalPermissions
77
77
  url = create_url('GetAccessToken')
78
78
  data = call(url, { 'token' => token, 'verifier' => verifier })
79
79
 
80
- raise PaypalPermissions::FaultMessage.new(data) unless (data['token'] && data['tokenSecret'])
80
+ raise ::Paypal::Permissions::FaultMessage.new(data) unless (data['token'] && data['tokenSecret'])
81
81
 
82
82
  {
83
83
  token: data['token'],
@@ -92,7 +92,7 @@ module PaypalPermissions
92
92
  data = call(url, { 'token' => token })
93
93
 
94
94
  paypal_scopes = parse_scopes(data)
95
- raise PaypalPermissions::FaultMessage.new(data) if paypal_scopes.empty?
95
+ raise ::Paypal::Permissions::FaultMessage.new(data) if paypal_scopes.empty?
96
96
 
97
97
  { scopes: paypal_scopes }
98
98
  end
@@ -135,12 +135,12 @@ module PaypalPermissions
135
135
  case code.to_i
136
136
  when 200
137
137
  data = get_hash(response.body)
138
- raise PaypalPermissions::FaultMessage.new(data) if data['responseEnvelope.ack'] == 'Failure'
138
+ raise ::Paypal::Permissions::FaultMessage.new(data) if data['responseEnvelope.ack'] == 'Failure'
139
139
  return data
140
140
  when 500
141
- raise PaypalPermissions::InternalServerError.new(response.body)
141
+ raise ::Paypal::Permissions::InternalServerError.new(response.body)
142
142
  else
143
- raise PaypalPermissions::UnknownResponse.new(code.to_i, response.body)
143
+ raise ::Paypal::Permissions::UnknownResponse.new(code.to_i, response.body)
144
144
  end
145
145
  end
146
146
  end
@@ -0,0 +1,5 @@
1
+ module Paypal; end
2
+
3
+ module Paypal::Permissions #:nodoc
4
+ VERSION = "0.1.2"
5
+ end
@@ -0,0 +1,69 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{paypal-permissions}
8
+ s.version = "0.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Isaac Hall"]
12
+ s.date = %q{2011-07-30}
13
+ s.description = %q{Ruby implementation of the PayPal Permissions API.}
14
+ s.email = %q{isaac@isaachall.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE.txt",
24
+ "README.md",
25
+ "Rakefile",
26
+ "lib/paypal-permissions/fault_message.rb",
27
+ "lib/paypal-permissions/paypal.rb",
28
+ "lib/paypal-permissions/version.rb",
29
+ "lib/paypal-permissions.rb",
30
+ "spec/paypal_spec.rb",
31
+ "spec/spec_helper.rb",
32
+ "spec/vcr/cancel_permission.yml",
33
+ "spec/vcr/cancel_permission_invalid.yml",
34
+ "spec/vcr/get_access_token_valid.yml",
35
+ "spec/vcr/lookup_permissions_multiple.yml",
36
+ "spec/vcr/request_permissions_multiple.yml",
37
+ "spec/vcr/request_permissions_single.yml"
38
+ ]
39
+ s.homepage = %q{http://github.com/isaachall/paypal-permissions}
40
+ s.licenses = ["MIT"]
41
+ s.require_paths = ["lib"]
42
+ s.rubygems_version = %q{1.6.2}
43
+ s.summary = %q{Ruby implementation of the PayPal Permissions API.}
44
+
45
+ if s.respond_to? :specification_version then
46
+ s.specification_version = 3
47
+
48
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
49
+ s.add_runtime_dependency(%q<httpclient>, [">= 0"])
50
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
51
+ s.add_development_dependency(%q<rspec>, ["> 2.0.0"])
52
+ s.add_development_dependency(%q<vcr>, [">= 0"])
53
+ s.add_development_dependency(%q<webmock>, [">= 0"])
54
+ else
55
+ s.add_dependency(%q<httpclient>, [">= 0"])
56
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
57
+ s.add_dependency(%q<rspec>, ["> 2.0.0"])
58
+ s.add_dependency(%q<vcr>, [">= 0"])
59
+ s.add_dependency(%q<webmock>, [">= 0"])
60
+ end
61
+ else
62
+ s.add_dependency(%q<httpclient>, [">= 0"])
63
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
64
+ s.add_dependency(%q<rspec>, ["> 2.0.0"])
65
+ s.add_dependency(%q<vcr>, [">= 0"])
66
+ s.add_dependency(%q<webmock>, [">= 0"])
67
+ end
68
+ end
69
+
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ module Paypal::Permissions
4
+ describe Oauth do
5
+ before(:each) do
6
+ @api_key = 'user.test.com'
7
+ @secret = '1234567890'
8
+ @token = '1234567890123456789012345678901234567890'
9
+ @token_secret = '1234567890'
10
+ @http_method = 'POST'
11
+ @endpoint = 'https://api.paypal.com/nvp'
12
+ end
13
+
14
+ it "should calculate a X-PP-AUTHORIZATION signature" do
15
+ Time.stub!(:now).and_return '1311832612'
16
+ sig = @paypal.generate_signature(@token, @token_secret, @http_method, @endpoint)
17
+ sig.should == 'timestamp=1311832612,token=1234567890123456789012345678901234567890,signature=d6da5d66e0f33ca7415b420cedf6b7286f05cba3'
18
+ end
19
+ end
20
+ end
@@ -1,29 +1,29 @@
1
1
  require 'spec_helper'
2
2
 
3
- module PaypalPermissions
3
+ module Paypal::Permissions
4
4
  describe Paypal do
5
5
  it "should request permissions with multiple scopes" do
6
6
  VCR.use_cassette("request_permissions_multiple") do
7
7
  permission_data = @paypal.request_permissions(
8
- [:express_checkout, :direct_payment, :auth_capture, :refund, :transaction_details],
8
+ [:express_checkout, :direct_payment, :auth_capture, :refund, :transaction_details],
9
9
  'http://localhost/')
10
10
 
11
11
  permission_data[:token].should == 'AAAAAAATmjdbA3ADelJ6'
12
12
  permission_data[:permissions_url].should == 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_grant-permission&request_token=' + permission_data[:token]
13
13
  end
14
14
  end
15
-
15
+
16
16
  it "should request permissions with a single scopes" do
17
17
  VCR.use_cassette("request_permissions_single") do
18
18
  permission_data = @paypal.request_permissions(
19
- [:express_checkout],
19
+ [:express_checkout],
20
20
  'http://localhost/')
21
-
21
+
22
22
  permission_data[:token].should == 'AAAAAAATmnP2wcRCp7Mc'
23
23
  permission_data[:permissions_url].should == 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_grant-permission&request_token=' + permission_data[:token]
24
24
  end
25
25
  end
26
-
26
+
27
27
  it "should get an access token" do
28
28
  VCR.use_cassette("get_access_token_valid") do
29
29
  access_data = @paypal.get_access_token('AAAAAAATmjdbA3ADelJ6','KVTI4zbTe.QW07vOqPpqYg')
@@ -55,7 +55,7 @@ module PaypalPermissions
55
55
  VCR.use_cassette("cancel_permission_invalid") do
56
56
  @paypal.cancel_permissions('M-RTGNyaZP5OMNIUxkH29I53eFvQhTJk3UfByH4pWfjSQHlj5csUVA')
57
57
  end
58
- }.should raise_error(PaypalPermissions::FaultMessage)
58
+ }.should raise_error(::Paypal::Permissions::FaultMessage)
59
59
  end
60
60
  end
61
61
  end
@@ -6,7 +6,7 @@ require 'vcr'
6
6
  Bundler.setup
7
7
 
8
8
  $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
9
- require 'paypal-permissions'
9
+ require 'paypal/permissions'
10
10
 
11
11
  module SpecHelper
12
12
  # add helper methods here
@@ -19,7 +19,7 @@ RSpec.configure do |config|
19
19
 
20
20
  config.before(:all) do
21
21
  credentials = YAML.load(File.read(File.join(File.dirname(__FILE__), 'sandbox_credentials.yml')))
22
- @paypal = PaypalPermissions::Paypal.new(
22
+ @paypal = Paypal::Permissions::Paypal.new(
23
23
  credentials['userid'], credentials['password'],credentials['signature'],credentials['application_id'],credentials['mode']
24
24
  )
25
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paypal-permissions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-07-30 00:00:00.000000000Z
12
+ date: 2012-06-30 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httpclient
16
- requirement: &70277951499040 !ruby/object:Gem::Requirement
16
+ requirement: &70223949740140 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70277951499040
24
+ version_requirements: *70223949740140
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: jeweler
27
- requirement: &70277951498140 !ruby/object:Gem::Requirement
27
+ requirement: &70223949739440 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,21 @@ dependencies:
32
32
  version: 1.6.4
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70277951498140
35
+ version_requirements: *70223949739440
36
+ - !ruby/object:Gem::Dependency
37
+ name: httpclient
38
+ requirement: &70223949738780 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70223949738780
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: rspec
38
- requirement: &70277951497300 !ruby/object:Gem::Requirement
49
+ requirement: &70223949738260 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>'
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: 2.0.0
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *70277951497300
57
+ version_requirements: *70223949738260
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: vcr
49
- requirement: &70277951496300 !ruby/object:Gem::Requirement
60
+ requirement: &70223949737500 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: '0'
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *70277951496300
68
+ version_requirements: *70223949737500
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: webmock
60
- requirement: &70277951495480 !ruby/object:Gem::Requirement
71
+ requirement: &70223949736780 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,7 +76,7 @@ dependencies:
65
76
  version: '0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *70277951495480
79
+ version_requirements: *70223949736780
69
80
  description: Ruby implementation of the PayPal Permissions API.
70
81
  email: isaac@isaachall.com
71
82
  executables: []
@@ -80,10 +91,14 @@ files:
80
91
  - LICENSE.txt
81
92
  - README.md
82
93
  - Rakefile
83
- - lib/paypal-permissions/fault_message.rb
84
- - lib/paypal-permissions/paypal.rb
85
- - lib/paypal-permissions/version.rb
86
- - lib/paypal-permissions.rb
94
+ - VERSION
95
+ - lib/paypal/permissions.rb
96
+ - lib/paypal/permissions/fault_message.rb
97
+ - lib/paypal/permissions/oauth.rb
98
+ - lib/paypal/permissions/paypal.rb
99
+ - lib/paypal/permissions/version.rb
100
+ - paypal-permissions.gemspec
101
+ - spec/oauth_spec.rb
87
102
  - spec/paypal_spec.rb
88
103
  - spec/spec_helper.rb
89
104
  - spec/vcr/cancel_permission.yml
@@ -105,6 +120,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
120
  - - ! '>='
106
121
  - !ruby/object:Gem::Version
107
122
  version: '0'
123
+ segments:
124
+ - 0
125
+ hash: -952150860121832261
108
126
  required_rubygems_version: !ruby/object:Gem::Requirement
109
127
  none: false
110
128
  requirements:
@@ -118,4 +136,3 @@ signing_key:
118
136
  specification_version: 3
119
137
  summary: Ruby implementation of the PayPal Permissions API.
120
138
  test_files: []
121
- has_rdoc:
@@ -1,9 +0,0 @@
1
- require 'paypal-permissions/version'
2
- require 'paypal-permissions/fault_message'
3
- require 'paypal-permissions/oauth'
4
- require 'paypal-permissions/paypal'
5
-
6
- # configuration
7
- module PaypalPermissions
8
-
9
- end
@@ -1,3 +0,0 @@
1
- module PaypalPermissions #:nodoc
2
- VERSION = "0.1.1"
3
- end