mastercard_api 0.0.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 +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/data/Certs/EnTrust/cacert.pem +3554 -0
- data/data/Certs/MCcert.crt +85 -0
- data/data/StageMCOpenAPI.p12 +0 -0
- data/data/privateKey.p12 +0 -0
- data/lib/mastercard_api.rb +8 -0
- data/lib/mastercard_api/common/connector.rb +235 -0
- data/lib/mastercard_api/common/environment.rb +8 -0
- data/lib/mastercard_api/common/oauth_constants.rb +11 -0
- data/lib/mastercard_api/common/oauth_parameters.rb +22 -0
- data/lib/mastercard_api/common/url_util.rb +17 -0
- data/lib/mastercard_api/version.rb +3 -0
- metadata +85 -0
@@ -0,0 +1,85 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIFPDCCBCSgAwIBAgIETB3oLDANBgkqhkiG9w0BAQUFADCBsTELMAkGA1UEBhMC
|
3
|
+
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
|
4
|
+
Lm5ldC9ycGEgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
|
5
|
+
KGMpIDIwMDkgRW50cnVzdCwgSW5jLjEuMCwGA1UEAxMlRW50cnVzdCBDZXJ0aWZp
|
6
|
+
Y2F0aW9uIEF1dGhvcml0eSAtIEwxQzAeFw0xMjA5MjUxMzM4MDhaFw0xNjA5MjUx
|
7
|
+
ODEyMjFaMIGKMQswCQYDVQQGEwJCRTERMA8GA1UEBxMIV2F0ZXJsb28xLjAsBgNV
|
8
|
+
BAoTJU1hc3RlcmNhcmQgSW50ZXJuYXRpb25hbCBJbmNvcnBvcmF0ZWQxEzARBgNV
|
9
|
+
BAsTCk5TMTAxIFNQUkQxIzAhBgNVBAMTGnNhbmRib3guYXBpLm1hc3RlcmNhcmQu
|
10
|
+
Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtWf2lp+QTPGcAiOB
|
11
|
+
dpFutfLYS7I1iqM7E3BdUfwTR4YItq6rdbHn4Nm8N2yd4yzLc/Qid9eQw9HmnVu5
|
12
|
+
9aHKRjPppsuNjr5e4v3FWiD+KmYmSBUWyu5aE4YobHHDhV311zmKDF3o91hwgcGH
|
13
|
+
GotNtP/QYrJiWYvFJeXpyzz2g5D6/zoJiPHLr089C+7Y8doRLkJylmVtiKC0W9ez
|
14
|
+
1xp8YrscEGkcZMaLxZbtfaFTEh4yqqM5q0yOiU1HAgidiVVxgzHlREoKSwCqcyTe
|
15
|
+
V3YjJPyuYcb1cACNm79RWOIWJyQt6L1E4k8T5+f5M+5Gxc6U97JuVjKkjYZC4Doe
|
16
|
+
DxjpcwIDAQABo4IBfzCCAXswCwYDVR0PBAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUF
|
17
|
+
BwMBMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvbGV2
|
18
|
+
ZWwxYy5jcmwwZAYIKwYBBQUHAQEEWDBWMCMGCCsGAQUFBzABhhdodHRwOi8vb2Nz
|
19
|
+
cC5lbnRydXN0Lm5ldDAvBggrBgEFBQcwAoYjaHR0cDovL2FpYS5lbnRydXN0Lm5l
|
20
|
+
dC8yMDQ4LWwxYy5jZXIwSgYDVR0gBEMwQTA1BgkqhkiG9n0HSwIwKDAmBggrBgEF
|
21
|
+
BQcCARYaaHR0cDovL3d3dy5lbnRydXN0Lm5ldC9ycGEwCAYGZ4EMAQICMCUGA1Ud
|
22
|
+
EQQeMByCGnNhbmRib3guYXBpLm1hc3RlcmNhcmQuY29tMB8GA1UdIwQYMBaAFB7x
|
23
|
+
q4kG+EkPATN37hR67hl8kyhNMB0GA1UdDgQWBBQ2XTNQbp2hAr2fpgq5IStFxr4W
|
24
|
+
eTAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBBQUAA4IBAQAEZTfuQL8lnq176nlWWjag
|
25
|
+
kf+2Tr6V6hStnhJCT1DKtx0/b491ceuKje3lGr1rKoPV34JWxEneZdw315DhVNm6
|
26
|
+
TogwI5Fos0rH03IbYtEd8DHKXp4x5wdarLmGZ4hL/FJnA2X1QxrL0xufocISIxyN
|
27
|
+
Qf+PYeUspWhOK6hDX4wgD1/Mg1P6r24ve26un7chKS+BaMXOhAVhqGLCaKjFcPyJ
|
28
|
+
CNj7AF/51oVC1YcD0c241iS8FlueBVOCkgsQQirMRSmIYid0vlhYQ+J1TG4s7Xwg
|
29
|
+
zkVQx4udcXFE/aWsSsX0XUERXi69RBoRHOETfCWp6uzjyvq9KIjMdKw4hg++j2Jl
|
30
|
+
-----END CERTIFICATE-----
|
31
|
+
-----BEGIN CERTIFICATE-----
|
32
|
+
MIIE9TCCA92gAwIBAgIETA6MOTANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
|
33
|
+
RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
|
34
|
+
bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
|
35
|
+
IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
|
36
|
+
ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0xMTExMTExNTQwNDBaFw0yMTEx
|
37
|
+
MTIwMjUxMTdaMIGxMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNRW50cnVzdCwgSW5j
|
38
|
+
LjE5MDcGA1UECxMwd3d3LmVudHJ1c3QubmV0L3JwYSBpcyBpbmNvcnBvcmF0ZWQg
|
39
|
+
YnkgcmVmZXJlbmNlMR8wHQYDVQQLExYoYykgMjAwOSBFbnRydXN0LCBJbmMuMS4w
|
40
|
+
LAYDVQQDEyVFbnRydXN0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gTDFDMIIB
|
41
|
+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl6MtPJ7eBdoTwhGNnY7jf8dL
|
42
|
+
flqfs/9iq3PIKGu6EGSChxPNVxj/KM7A5g4GkVApg9Hywyrb2NtOBMwA64u2lty8
|
43
|
+
qvpSdwTB2xnkrpz9PIsD7028GgNl+cGxP3KG8jiqGa4QiHgo2nXDPQKCApy5wWV3
|
44
|
+
diRMmPdtMTj72/7bNwJ2oRiXpszeIAlJNiRpQvbkN2LxWW2pPO00nKOO29w61/cK
|
45
|
+
b+8u2NWTWnrtCElo4kHjWpDBhlX8UUOd4LLEZ7TLMjEl8FSfS9Fv29Td/K9ebHiQ
|
46
|
+
ld7KOki5eTybGdZ1BaD5iNfB6KUJ5BoV3IcjqrJ1jGMlh9j4PabCzGb/pWZoVQID
|
47
|
+
AQABo4IBDjCCAQowDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAw
|
48
|
+
MwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5lbnRydXN0
|
49
|
+
Lm5ldDAyBgNVHR8EKzApMCegJaAjhiFodHRwOi8vY3JsLmVudHJ1c3QubmV0LzIw
|
50
|
+
NDhjYS5jcmwwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHA6
|
51
|
+
Ly93d3cuZW50cnVzdC5uZXQvcnBhMB0GA1UdDgQWBBQe8auJBvhJDwEzd+4Ueu4Z
|
52
|
+
fJMoTTAfBgNVHSMEGDAWgBRV5IHREYC+2Im5CKMx+aEkCRa5cDANBgkqhkiG9w0B
|
53
|
+
AQUFAAOCAQEAQJqHfojUzCanS/p4SiDV+aI2IbvuW6BPRI3PqvmXF5aEqchnm7vm
|
54
|
+
EN551lZqpHgUSdl87TBeaeptJEZaiDQ9JifPaUGEHATaGTgu24lBOX5lH51aOszh
|
55
|
+
DEw3oc5gk6i1jMo/uitdTBuBiXrKNjCc/4Tj/jrx93lxybXTMwPKd86wuinSNF1z
|
56
|
+
/6T98iW4NUV5eh+Xrsm+CmiEmXQ5qE56JvXN3iXiN4VlB6fKxQW3EzgNLfBtGc7e
|
57
|
+
mWEn7kVuxzn/9sWL4Mt8ih7VegcxKlJcOlAZOKlE+jyoz+95nWrZ5S6hjyko1+yq
|
58
|
+
wfsm5p9GJKaxB825DOgNghYAHZaS/KYIoA==
|
59
|
+
-----END CERTIFICATE-----
|
60
|
+
-----BEGIN CERTIFICATE-----
|
61
|
+
MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
|
62
|
+
RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
|
63
|
+
bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
|
64
|
+
IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
|
65
|
+
ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy
|
66
|
+
MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
|
67
|
+
LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
|
68
|
+
YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
|
69
|
+
A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
|
70
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
|
71
|
+
K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
|
72
|
+
sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
|
73
|
+
MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
|
74
|
+
XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
|
75
|
+
HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
|
76
|
+
4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA
|
77
|
+
vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G
|
78
|
+
CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA
|
79
|
+
WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
|
80
|
+
oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ
|
81
|
+
h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18
|
82
|
+
f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN
|
83
|
+
B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy
|
84
|
+
vUxFnmG6v4SBkgPR0ml8xQ==
|
85
|
+
-----END CERTIFICATE-----
|
Binary file
|
data/data/privateKey.p12
ADDED
Binary file
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require_relative "mastercard_api/version"
|
2
|
+
|
3
|
+
# require the common library
|
4
|
+
require_relative "mastercard_api/common/connector"
|
5
|
+
require_relative "mastercard_api/common/environment"
|
6
|
+
require_relative "mastercard_api/common/oauth_constants"
|
7
|
+
require_relative "mastercard_api/common/oauth_parameters"
|
8
|
+
require_relative "mastercard_api/common/url_util"
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'cgi'
|
3
|
+
require 'net/http'
|
4
|
+
require 'net/https'
|
5
|
+
require 'openssl'
|
6
|
+
require 'digest/sha1'
|
7
|
+
require 'securerandom'
|
8
|
+
require_relative '../common/oauth_parameters'
|
9
|
+
require_relative '../common/oauth_constants'
|
10
|
+
|
11
|
+
module Mastercard
|
12
|
+
module Common
|
13
|
+
|
14
|
+
class Connector
|
15
|
+
|
16
|
+
attr_accessor :signature_base_string
|
17
|
+
attr_accessor :auth_header
|
18
|
+
attr_accessor :signed_signature_base_string
|
19
|
+
|
20
|
+
NONCE_LENGTH = 8
|
21
|
+
VALID_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
|
22
|
+
|
23
|
+
OAUTH_START_STRING = 'OAuth '
|
24
|
+
ERROR_STATUS_BOUNDARY = 300
|
25
|
+
EMPTY_STRING = ""
|
26
|
+
|
27
|
+
POST = "POST"
|
28
|
+
GET = "GET"
|
29
|
+
DELETE = "DELETE"
|
30
|
+
PUT = "PUT"
|
31
|
+
UTF_8 = "UTF-8"
|
32
|
+
EQUALS = "="
|
33
|
+
AMP = '&'
|
34
|
+
COLON_2X_BACKSLASH = "://"
|
35
|
+
MESSAGE = "Message"
|
36
|
+
HTTP_CODE = "HttpCode"
|
37
|
+
|
38
|
+
SSL_CA_CER_PATH_LOCATION = 'data/Certs/EnTrust/cacert.pem'
|
39
|
+
USER_AGENT = 'MC Open API OAuth Framework v1.0-Ruby'
|
40
|
+
|
41
|
+
=begin
|
42
|
+
consumer_key = Key provided by MasterCard upon registering
|
43
|
+
private_key = private key object
|
44
|
+
=end
|
45
|
+
def initialize(consumer_key, private_key)
|
46
|
+
@consumer_key = consumer_key
|
47
|
+
@private_key = private_key
|
48
|
+
@signature_base_string = ''
|
49
|
+
@auth_header = ''
|
50
|
+
@signed_signature_base_string = ''
|
51
|
+
end
|
52
|
+
=begin
|
53
|
+
Method to generate base OAuth params
|
54
|
+
=end
|
55
|
+
def oauth_parameters_factory
|
56
|
+
oparams = Mastercard::Common::OAuthParameters.new
|
57
|
+
oparams.add_parameter(OAUTH_CONSUMER_KEY, @consumer_key)
|
58
|
+
oparams.add_parameter(OAUTH_NONCE, generate_nonce)
|
59
|
+
oparams.add_parameter(OAUTH_TIMESTAMP, generate_timestamp)
|
60
|
+
oparams.add_parameter(OAUTH_SIGNATURE_METHOD, "RSA-SHA1")
|
61
|
+
oparams.add_parameter(OAUTH_VERSION, "1.0")
|
62
|
+
oparams
|
63
|
+
end
|
64
|
+
|
65
|
+
=begin
|
66
|
+
Method to perform a request. Only Connector subclasses should access this method.
|
67
|
+
url - URL to connect to, includes query string parameters
|
68
|
+
body - XML body to send to MasterCard for PUT/POST/DELETE
|
69
|
+
oauth_params - often nil, may be populated for testing
|
70
|
+
=end
|
71
|
+
def do_request(url, request_method, body = nil, oauth_params = nil)
|
72
|
+
if @consumer_key == nil
|
73
|
+
raise 'Consumer Key may not be nil.'
|
74
|
+
end
|
75
|
+
|
76
|
+
if @private_key == nil
|
77
|
+
raise 'Private Key may not be nil.'
|
78
|
+
end
|
79
|
+
if oauth_params == nil
|
80
|
+
oauth_params = oauth_parameters_factory
|
81
|
+
end
|
82
|
+
if body != nil && body.length > 0
|
83
|
+
oauth_params = generate_body_hash(body, oauth_params)
|
84
|
+
end
|
85
|
+
response = connect(url, request_method, oauth_params, body)
|
86
|
+
check_response(response)
|
87
|
+
response.body
|
88
|
+
end
|
89
|
+
=begin
|
90
|
+
Method to connect via HTTP. This method subsequesntly builds and signs the Oauth
|
91
|
+
Header
|
92
|
+
=end
|
93
|
+
def connect(url, request_method, oauth_params, body=nil)
|
94
|
+
uri = URI.parse(url)
|
95
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
96
|
+
http.use_ssl = true
|
97
|
+
http.ca_path = SSL_CA_CER_PATH_LOCATION
|
98
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE #todo VERIFY_PEER
|
99
|
+
|
100
|
+
if request_method.upcase == 'GET'
|
101
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
102
|
+
elsif request_method.upcase == 'PUT'
|
103
|
+
request = Net::HTTP::Put.new(uri.request_uri)
|
104
|
+
elsif request_method.upcase == 'POST'
|
105
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
106
|
+
elsif request_method.upcase == 'DELETE'
|
107
|
+
request = Net::HTTP::Delete.new(uri.request_uri)
|
108
|
+
else
|
109
|
+
raise 'Unsupported HTTP Action.'
|
110
|
+
end
|
111
|
+
|
112
|
+
if body != nil
|
113
|
+
add_headers(url, request, request_method, oauth_params, body)
|
114
|
+
request.body = body
|
115
|
+
else
|
116
|
+
add_headers(url, request, request_method, oauth_params)
|
117
|
+
end
|
118
|
+
http.request(request)
|
119
|
+
end
|
120
|
+
=begin
|
121
|
+
Method to build the OAuth headers.
|
122
|
+
=end
|
123
|
+
def add_headers(url, request, request_method, oauth_params, body=nil)
|
124
|
+
@auth_header = build_auth_header_string(url, request_method, oauth_params)
|
125
|
+
request['Authorization'] = auth_header
|
126
|
+
request['User-Agent'] = USER_AGENT
|
127
|
+
if body != nil
|
128
|
+
request['content-type'] = 'application/xml;charset=UTF-8'
|
129
|
+
body_length = body.length
|
130
|
+
request['content-length'] = body_length.to_s
|
131
|
+
end
|
132
|
+
request
|
133
|
+
end
|
134
|
+
=begin
|
135
|
+
Method to build the auth header for the HTTP request.
|
136
|
+
oauth_params - full populated oauth parameters
|
137
|
+
=end
|
138
|
+
def build_auth_header_string(url, request_method, oauth_params)
|
139
|
+
temp_params = Mastercard::Common::OAuthParameters.new
|
140
|
+
oauth_params_key_arr = oauth_params.params.keys.sort
|
141
|
+
oauth_params_key_arr.each do |p|
|
142
|
+
temp_params.add_parameter(p, oauth_params.send(p)) if p != :realm
|
143
|
+
end
|
144
|
+
generate_signature_base_string(url, request_method, temp_params)
|
145
|
+
sign(oauth_params)
|
146
|
+
header = ''
|
147
|
+
oauth_params_key_arr = oauth_params.params.keys.sort
|
148
|
+
oauth_params_key_arr.each do |p|
|
149
|
+
header << p.to_s << '="' << oauth_params.send(p) << '",' if oauth_params.send(p)
|
150
|
+
end
|
151
|
+
header = '' << OAUTH_START_STRING << header
|
152
|
+
#remove trailing comma
|
153
|
+
header = header[0...header.length-1]
|
154
|
+
end
|
155
|
+
=begin
|
156
|
+
Method to sign the signature base string using the private key.
|
157
|
+
=end
|
158
|
+
def sign(oauth_params)
|
159
|
+
if @signature_base_string == nil || @signature_base_string.length == 0
|
160
|
+
raise 'Signature Base String May Not Be Null.'
|
161
|
+
end
|
162
|
+
digest = OpenSSL::Digest::SHA1.new
|
163
|
+
@signed_signature_base_string = CGI.escape(Base64.encode64(@private_key.sign(digest,@signature_base_string)))
|
164
|
+
@signed_signature_base_string.gsub!('+','%20')
|
165
|
+
@signed_signature_base_string.gsub!('*','%2A')
|
166
|
+
@signed_signature_base_string.gsub!('~','%7E')
|
167
|
+
oauth_params.add_parameter("oauth_signature" , @signed_signature_base_string)
|
168
|
+
end
|
169
|
+
=begin
|
170
|
+
Method to generate the signature base string from the url, HTTP request method, and oauth_params
|
171
|
+
url - URL, including query string parameters, to access
|
172
|
+
request_method - case-insensitive HTTP request method, e.g. GET, POST, PUT, DELETE
|
173
|
+
oauth_params - populated oauth parameters object
|
174
|
+
=end
|
175
|
+
def generate_signature_base_string(url, request_method, oauth_params)
|
176
|
+
@signature_base_string = CGI.escape(request_method.upcase) << AMP << CGI.escape(normalize_url(url)) << AMP << CGI.escape(normalize_parameters(url, oauth_params))
|
177
|
+
end
|
178
|
+
=begin
|
179
|
+
Method to return "core" URL for signature base string generation. http://somesite.com:8080?blah becomes http://somesite.com, for example
|
180
|
+
url - URL to normalize
|
181
|
+
=end
|
182
|
+
def normalize_url(url)
|
183
|
+
tmp = url.clone
|
184
|
+
# strip query string section
|
185
|
+
idx = tmp.index('?')
|
186
|
+
if idx != nil
|
187
|
+
tmp = tmp[0..idx-1]
|
188
|
+
end
|
189
|
+
# strip port
|
190
|
+
if tmp.rindex(':') != nil && tmp.rindex(':') > 5 # implies port is given
|
191
|
+
tmp = tmp[0..tmp.rindex(':')-1]
|
192
|
+
end
|
193
|
+
tmp
|
194
|
+
end
|
195
|
+
=begin
|
196
|
+
The signature base string must be in lexical order prior to signing. This method does that required work.
|
197
|
+
url - url to access
|
198
|
+
oauth_params - OAuthParameters object used for building Signature Base String
|
199
|
+
=end
|
200
|
+
def normalize_parameters(url, oauth_params)
|
201
|
+
oauth_params_hash = oauth_params.params
|
202
|
+
CGI.parse(URI.parse(url).query).map{|k,v| oauth_params_hash[k.to_sym] = v[0]} if url.include? "?"
|
203
|
+
URI.encode(oauth_params_hash.keys.sort.map{|k| "#{k.to_s}=#{oauth_params_hash[k]}"}.join("&"))
|
204
|
+
end
|
205
|
+
|
206
|
+
def check_response(response)
|
207
|
+
if response.code.to_i >= ERROR_STATUS_BOUNDARY
|
208
|
+
raise 'Response Code: ' << response.code.to_s << "\n" << response.body
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# if a body is present for sending to server, needs hashed as part of OAuth spec
|
213
|
+
def generate_body_hash(body, oauth_params)
|
214
|
+
if body != nil
|
215
|
+
oauth_body_hash = Digest::SHA1.base64digest(body)
|
216
|
+
oauth_params.add_parameter(:oauth_body_hash, oauth_body_hash)
|
217
|
+
end
|
218
|
+
oauth_params
|
219
|
+
end
|
220
|
+
|
221
|
+
# unique identifier for given timestamp (in seconds)
|
222
|
+
def generate_nonce
|
223
|
+
str = ''
|
224
|
+
for i in 1..NONCE_LENGTH
|
225
|
+
str << VALID_CHARS[SecureRandom.random_number(VALID_CHARS.length)]
|
226
|
+
end
|
227
|
+
@oauth_nonce = str
|
228
|
+
end
|
229
|
+
# number of seconds since epoch
|
230
|
+
def generate_timestamp
|
231
|
+
@oauth_timestamp = Time.now.to_i.to_s
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Mastercard
|
2
|
+
module Common
|
3
|
+
OAUTH_BODY_HASH = 'oauth_body_hash'
|
4
|
+
OAUTH_CONSUMER_KEY = 'oauth_consumer_key'
|
5
|
+
OAUTH_NONCE = 'oauth_nonce'
|
6
|
+
OAUTH_SIGNATURE = 'oauth_signature'
|
7
|
+
OAUTH_SIGNATURE_METHOD = 'oauth_signature_method'
|
8
|
+
OAUTH_TIMESTAMP = 'oauth_timestamp'
|
9
|
+
OAUTH_VERSION = 'oauth_version'
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Mastercard
|
2
|
+
module Common
|
3
|
+
|
4
|
+
class OAuthParameters
|
5
|
+
|
6
|
+
attr_accessor :params
|
7
|
+
|
8
|
+
def initialize()
|
9
|
+
self.params = Hash.new
|
10
|
+
end
|
11
|
+
|
12
|
+
# add a parameter to the hash and as an instance variable to the class
|
13
|
+
def add_parameter(key, value)
|
14
|
+
self.params[key.to_sym] = value
|
15
|
+
self.class.send(:define_method, key) do
|
16
|
+
value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module Mastercard
|
4
|
+
module Common
|
5
|
+
|
6
|
+
class URLUtil
|
7
|
+
|
8
|
+
def add_query_parameter(url, descriptor, value)
|
9
|
+
if value != nil && value != ''
|
10
|
+
url = url << '&' << descriptor << '=' << value.to_s
|
11
|
+
end
|
12
|
+
url
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mastercard_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brady Georgen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-02-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: The Common OpenAuth Connector classes for the Mastercard API
|
42
|
+
email:
|
43
|
+
- pbradygeorgen@me.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- LICENSE.txt
|
49
|
+
- README.md
|
50
|
+
- data/Certs/EnTrust/cacert.pem
|
51
|
+
- data/Certs/MCcert.crt
|
52
|
+
- data/StageMCOpenAPI.p12
|
53
|
+
- data/privateKey.p12
|
54
|
+
- lib/mastercard_api.rb
|
55
|
+
- lib/mastercard_api/common/connector.rb
|
56
|
+
- lib/mastercard_api/common/environment.rb
|
57
|
+
- lib/mastercard_api/common/oauth_constants.rb
|
58
|
+
- lib/mastercard_api/common/oauth_parameters.rb
|
59
|
+
- lib/mastercard_api/common/url_util.rb
|
60
|
+
- lib/mastercard_api/version.rb
|
61
|
+
homepage: ''
|
62
|
+
licenses:
|
63
|
+
- MIT
|
64
|
+
metadata: {}
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options: []
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
requirements: []
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 2.4.3
|
82
|
+
signing_key:
|
83
|
+
specification_version: 4
|
84
|
+
summary: The Common OpenAuth Connector classes for the Mastercard API
|
85
|
+
test_files: []
|