exact4r 1.6 → 1.7

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/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ == v1.7
2
+ Added support for setting a client certificate/key pair for use w/ SSL connections.
3
+
1
4
  == v1.6
2
5
  Added support for use w/ ActiveSupport v3.
3
6
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.6
1
+ 1.7
@@ -4,12 +4,17 @@ module EWS # :nodoc:
4
4
  EXACT_ISSUER_CERT_FILE = File.dirname(__FILE__)+"/../../certs/valicert_class2_root.crt" unless defined?(EXACT_ISSUER_CERT_FILE)
5
5
  EXACT_SERVER_CERT_FILE = File.dirname(__FILE__)+"/../../certs/e-xact.com.crt" unless defined?(EXACT_SERVER_CERT_FILE)
6
6
 
7
- attr_accessor :issuer_cert_file, :server_cert
7
+ attr_accessor :issuer_cert_file, :server_cert, :client_cert, :client_key
8
8
 
9
9
  def configure_certificates(options)
10
10
  self.issuer_cert_file = (options[:issuer_cert] || EXACT_ISSUER_CERT_FILE)
11
11
  server_cert_file = (options[:server_cert] || EXACT_SERVER_CERT_FILE)
12
12
  self.server_cert = File.new(server_cert_file).read
13
+ if options[:client_cert]
14
+ raise ArgumentError.new "Key file not supplied" if options[:client_key].blank?
15
+ self.client_cert = OpenSSL::X509::Certificate.new(File.new(options[:client_cert]).read)
16
+ self.client_key = client_cert.public_key.class.send(:new, File.new(options[:client_key]).read)
17
+ end
13
18
  end
14
19
  private :configure_certificates
15
20
 
@@ -28,6 +28,8 @@ module EWS # :nodoc:
28
28
  # :transport_type the transport_type for this transporter (defaults to :rest)
29
29
  # :server_cert the path to the server's certificate file (defaults to E-xact's Server Cert)
30
30
  # :issuer_cert the path to the issuer's certificate file (defaults to E-xact's Issuer's Cert)
31
+ # :client_cert the path to the client's X.509 certificate file (optional)
32
+ # :client_key the path to the client's key file (optional)
31
33
  #
32
34
  # The default certificates are those required to connect to https://api.e-xact.com and the
33
35
  # default <tt>transport_type</tt> is <tt>:rest</tt>. The default <tt>transport_type</tt> can be overridden on a per-transaction
@@ -56,7 +58,7 @@ module EWS # :nodoc:
56
58
  request = build_http_request(transaction, transport_type, transport_details[:suffix])
57
59
  request.basic_auth(transaction.gateway_id, transaction.password)
58
60
  request.add_field "Accept", transport_details[:content_type]
59
- request.add_field "User-Agent", "exact4r v1.6"
61
+ request.add_field "User-Agent", "exact4r v1.7"
60
62
  request.add_field "Content-type", "#{transport_details[:content_type]}; charset=UTF-8"
61
63
 
62
64
  response = get_connection.request(request)
@@ -118,6 +120,10 @@ private
118
120
  @connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
119
121
  @connection.verify_callback = method(:validate_certificate)
120
122
  @connection.ca_file = self.issuer_cert_file
123
+ unless self.client_cert.nil?
124
+ @connection.cert = self.client_cert
125
+ @connection.key = self.client_key
126
+ end
121
127
  end
122
128
  @connection
123
129
  end
@@ -0,0 +1,49 @@
1
+ (in /Users/donch/Development/Exact/WebService/exact4r)
2
+
3
+
4
+
5
+ #-----------------------
6
+ # Testing: chase
7
+ #-----------------------
8
+ Loaded suite /usr/local/rvm/gems/ruby-1.8.7-p302@global/gems/rake-0.8.7/lib/rake/rake_test_loader
9
+ Started
10
+ ........................................................................................................................................................................
11
+ Finished in 752.738656 seconds.
12
+
13
+ 168 tests, 2879 assertions, 0 failures, 0 errors
14
+
15
+
16
+
17
+ #-----------------------
18
+ # Testing: tsys
19
+ #-----------------------
20
+ Loaded suite /usr/local/rvm/gems/ruby-1.8.7-p302@global/gems/rake-0.8.7/lib/rake/rake_test_loader
21
+ Started
22
+ ........................................................................................................................................................................
23
+ Finished in 557.41933 seconds.
24
+
25
+ 168 tests, 2535 assertions, 0 failures, 0 errors
26
+
27
+
28
+
29
+ #-----------------------
30
+ # Testing: emergis
31
+ #-----------------------
32
+ Loaded suite /usr/local/rvm/gems/ruby-1.8.7-p302@global/gems/rake-0.8.7/lib/rake/rake_test_loader
33
+ Started
34
+ ........................................................................................................................................................................
35
+ Finished in 713.15915 seconds.
36
+
37
+ 168 tests, 2608 assertions, 0 failures, 0 errors
38
+
39
+
40
+
41
+ #-----------------------
42
+ # Testing: moneris
43
+ #-----------------------
44
+ Loaded suite /usr/local/rvm/gems/ruby-1.8.7-p302@global/gems/rake-0.8.7/lib/rake/rake_test_loader
45
+ Started
46
+ ........................................................................................................................................................................
47
+ Finished in 623.618679 seconds.
48
+
49
+ 168 tests, 2452 assertions, 0 failures, 0 errors
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ class ClientCertificateTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ # skip the tests if we're not sending to a HTTPS location (i.e PROD)
7
+ return true if @@credentials.config['location'].match(/https/i).nil?
8
+ end
9
+
10
+ def test_cert_raises_without_key
11
+ assert_raises(ArgumentError) {
12
+ transporter = ::EWS::Transporter.new(@@credentials.config['location'], {
13
+ :client_cert => File.dirname(__FILE__)+"/../samples/rsa_cert.pem",
14
+ })
15
+ }
16
+ end
17
+
18
+ def test_rsa_raises_with_non_matching_key
19
+ assert_raises(OpenSSL::PKey::RSAError) {
20
+ transporter = ::EWS::Transporter.new(@@credentials.config['location'], {
21
+ :client_cert => File.dirname(__FILE__)+"/../samples/rsa_cert.pem",
22
+ :client_key => File.dirname(__FILE__)+"/../samples/dsa_key.pem"
23
+ })
24
+ }
25
+ end
26
+
27
+ def test_dsa_raises_with_non_matching_key
28
+ assert_raises(OpenSSL::PKey::DSAError) {
29
+ transporter = ::EWS::Transporter.new(@@credentials.config['location'], {
30
+ :client_cert => File.dirname(__FILE__)+"/../samples/dsa_cert.pem",
31
+ :client_key => File.dirname(__FILE__)+"/../samples/rsa_key.pem"
32
+ })
33
+ }
34
+ end
35
+
36
+ def test_rsa_certificate
37
+ transporter = nil
38
+ assert_nothing_raised {
39
+ transporter = ::EWS::Transporter.new(@@credentials.config['location'], {
40
+ :client_cert => File.dirname(__FILE__)+"/../samples/rsa_cert.pem",
41
+ :client_key => File.dirname(__FILE__)+"/../samples/rsa_key.pem"
42
+ })
43
+ }
44
+
45
+ request = EWS::Transaction::Request.new(basic_params)
46
+ response = transporter.submit(request)
47
+ assert response.approved?
48
+ end
49
+
50
+ def test_dsa_certificate
51
+ transporter = nil
52
+ assert_nothing_raised {
53
+ transporter = ::EWS::Transporter.new(@@credentials.config['location'], {
54
+ :client_cert => File.dirname(__FILE__)+"/../samples/dsa_cert.pem",
55
+ :client_key => File.dirname(__FILE__)+"/../samples/dsa_key.pem"
56
+ })
57
+ }
58
+
59
+ request = EWS::Transaction::Request.new(basic_params)
60
+ response = transporter.submit(request)
61
+ assert response.approved?
62
+ end
63
+
64
+ end
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDtTCCAx4CCQCN5PcdH8ZKnDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC
3
+ QVUxDDAKBgNVBAgMA05TVzEcMBoGA1UECgwTRS14YWN0IFRyYW5zYWN0aW9uczEU
4
+ MBIGA1UECwwLRGV2ZWxvcG1lbnQxFTATBgNVBAMMDERvbm5jaGEncyBDQTEiMCAG
5
+ CSqGSIb3DQEJARYTZHJlZG1vbmRAZS14YWN0LmNvbTAeFw0xMTAxMjYyMzE3MTFa
6
+ Fw0xMTAyMjUyMzE3MTFaMIGaMQswCQYDVQQGEwJBVTEMMAoGA1UECAwDTlNXMQ8w
7
+ DQYDVQQHDAZTeWRuZXkxHDAaBgNVBAoME0UteGFjdCBUcmFuc2FjdGlvbnMxFDAS
8
+ BgNVBAsMC0RldmVsb3BtZW50MRQwEgYDVQQDDAtEb25uY2hhIERTQTEiMCAGCSqG
9
+ SIb3DQEJARYTZHJlZG1vbmRAZS14YWN0LmNvbTCCAbYwggErBgcqhkjOOAQBMIIB
10
+ HgKBgQDVZ3X+TJSgurQFGmr+rZsO94z5b8sZlQ4PVjqpdndxlaUOHv5RgYY92TPD
11
+ Rm7j2LGbBwaMSIsfySqVsX7S3BTMhVo1MO2lEDwTgtTieEosYImrBdhYXLjWlllq
12
+ bmom6J/HBxZblJYYdVSeCNbVgjBrs2yR/BrRLHDJpT81JB3s2wIVALUnrTdHQ4XP
13
+ 8BwCjWGQAnttud6BAoGAAxMDMYIxUc7R1RmEX7dLmQrXrcOtMW6VVqGqo1f+SVbv
14
+ XT0R3LANCX7WOyDYRePxWj3HEKnYRrwMmOTDLB7pdfcgzw2xkAWt4iuNYENDRrS4
15
+ DuDPBBZDIJc9oRpR+8X7yFaoXttvqx4GOrz/0FpWdp30SnSoO+ksuyq4dFimGUED
16
+ gYQAAoGAXjmul+axaJP6W7EYJl9tedoZW+GBarA4M18biqXxnsyVce2VjYIpSxux
17
+ FQZjgMgR0d27iQVwzamzoF2x4Khm00vgZRXiPJlgQ7FSfK6WeM1n0l0hrxfvPpvD
18
+ BgEhP9geXQ+1sbnn6Sa+FDlrtK7oFhFDge3Iaw2UZ2aUOeUYHB4wDQYJKoZIhvcN
19
+ AQEFBQADgYEA08u9dKckW8Q7+nTj49jWic1PfiuXW1OWlH71nEIXq13R05CuaZKH
20
+ Y0LN1Yqd1Nd74MZSFL3xfwwlycpDOzo/mJgVghJx3DZu9171BJ+knOrojgvZ3A13
21
+ wTYC6gWK/d0TPhORKnwSqwrB/c+Qgyfe783AS15EW7juEUYElpKbEPQ=
22
+ -----END CERTIFICATE-----
@@ -0,0 +1,12 @@
1
+ -----BEGIN DSA PRIVATE KEY-----
2
+ MIIBugIBAAKBgQDVZ3X+TJSgurQFGmr+rZsO94z5b8sZlQ4PVjqpdndxlaUOHv5R
3
+ gYY92TPDRm7j2LGbBwaMSIsfySqVsX7S3BTMhVo1MO2lEDwTgtTieEosYImrBdhY
4
+ XLjWlllqbmom6J/HBxZblJYYdVSeCNbVgjBrs2yR/BrRLHDJpT81JB3s2wIVALUn
5
+ rTdHQ4XP8BwCjWGQAnttud6BAoGAAxMDMYIxUc7R1RmEX7dLmQrXrcOtMW6VVqGq
6
+ o1f+SVbvXT0R3LANCX7WOyDYRePxWj3HEKnYRrwMmOTDLB7pdfcgzw2xkAWt4iuN
7
+ YENDRrS4DuDPBBZDIJc9oRpR+8X7yFaoXttvqx4GOrz/0FpWdp30SnSoO+ksuyq4
8
+ dFimGUECgYBeOa6X5rFok/pbsRgmX2152hlb4YFqsDgzXxuKpfGezJVx7ZWNgilL
9
+ G7EVBmOAyBHR3buJBXDNqbOgXbHgqGbTS+BlFeI8mWBDsVJ8rpZ4zWfSXSGvF+8+
10
+ m8MGASE/2B5dD7WxuefpJr4UOWu0rugWEUOB7chrDZRnZpQ55RgcHgIUMvlYodvs
11
+ EGrvWVqYN3JiZsYxLaU=
12
+ -----END DSA PRIVATE KEY-----
@@ -0,0 +1,63 @@
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number:
5
+ 8d:e4:f7:1d:1f:c6:4a:99
6
+ Signature Algorithm: sha1WithRSAEncryption
7
+ Issuer: C=AU, ST=NSW, O=E-xact Transactions, OU=Development, CN=Donncha's CA/emailAddress=dredmond@e-xact.com
8
+ Validity
9
+ Not Before: Jan 26 20:37:07 2011 GMT
10
+ Not After : Jan 26 20:37:07 2012 GMT
11
+ Subject: C=AU, ST=NSW, L=Sydney, O=E-xact Transactions, OU=Development, CN=Donncha Redmond/emailAddress=dredmond@e-xact.com
12
+ Subject Public Key Info:
13
+ Public Key Algorithm: rsaEncryption
14
+ Public-Key: (1024 bit)
15
+ Modulus:
16
+ 00:be:f3:80:e6:54:59:b8:a9:7f:22:e6:a1:80:b2:
17
+ 27:88:aa:bf:54:8c:aa:02:cf:81:c3:ac:27:65:4e:
18
+ 07:b2:5b:9c:c7:77:a8:95:55:d4:cb:3c:82:4b:63:
19
+ b4:96:79:d6:2b:e0:df:bf:e0:57:fa:e0:ce:68:06:
20
+ c4:86:b6:c4:09:4d:b0:81:fc:73:a9:a1:4d:29:6b:
21
+ 7a:46:be:7f:6b:17:76:d7:45:58:42:48:63:32:5c:
22
+ 63:58:e8:fa:81:2b:1b:11:60:c2:86:72:ce:19:19:
23
+ fe:8b:39:c5:7d:08:b8:e7:cf:32:0f:af:87:c1:a7:
24
+ 6a:c6:c7:06:1c:1c:ea:e6:6f
25
+ Exponent: 65537 (0x10001)
26
+ X509v3 extensions:
27
+ X509v3 Basic Constraints:
28
+ CA:FALSE
29
+ Netscape Comment:
30
+ OpenSSL Generated Certificate
31
+ X509v3 Subject Key Identifier:
32
+ 32:4D:C0:F7:5F:6A:48:62:F6:24:DB:90:B4:7C:02:40:C9:FE:AE:C2
33
+ X509v3 Authority Key Identifier:
34
+ keyid:DF:4D:FD:27:6A:8C:3B:4F:A8:8C:27:F7:C1:7B:44:0D:C7:50:BA:77
35
+
36
+ Signature Algorithm: sha1WithRSAEncryption
37
+ 5c:bd:be:99:fa:b6:7a:2e:ce:59:b7:7a:d5:01:bf:98:dd:0e:
38
+ 72:dd:10:58:cf:53:e1:2c:62:66:83:9e:83:1b:08:6d:10:86:
39
+ 9d:a4:2a:4e:29:5d:ae:0b:94:25:84:43:bf:aa:de:52:b7:e4:
40
+ f4:c3:76:93:e4:ea:05:13:61:c6:fc:e0:f0:69:44:e6:cd:76:
41
+ 7f:71:cc:a8:a4:84:ab:a6:17:3d:20:1e:d5:94:9b:8b:ae:8d:
42
+ 1a:8d:30:59:59:8f:50:3a:c5:d6:0f:ab:bd:0c:3b:61:c7:d9:
43
+ a6:c9:e8:97:c9:65:23:a3:bf:13:8a:ff:53:b1:32:36:50:6d:
44
+ 4a:f3
45
+ -----BEGIN CERTIFICATE-----
46
+ MIIDIzCCAoygAwIBAgIJAI3k9x0fxkqZMA0GCSqGSIb3DQEBBQUAMIGKMQswCQYD
47
+ VQQGEwJBVTEMMAoGA1UECAwDTlNXMRwwGgYDVQQKDBNFLXhhY3QgVHJhbnNhY3Rp
48
+ b25zMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEVMBMGA1UEAwwMRG9ubmNoYSdzIENB
49
+ MSIwIAYJKoZIhvcNAQkBFhNkcmVkbW9uZEBlLXhhY3QuY29tMB4XDTExMDEyNjIw
50
+ MzcwN1oXDTEyMDEyNjIwMzcwN1owgZ4xCzAJBgNVBAYTAkFVMQwwCgYDVQQIDANO
51
+ U1cxDzANBgNVBAcMBlN5ZG5leTEcMBoGA1UECgwTRS14YWN0IFRyYW5zYWN0aW9u
52
+ czEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxGDAWBgNVBAMMD0Rvbm5jaGEgUmVkbW9u
53
+ ZDEiMCAGCSqGSIb3DQEJARYTZHJlZG1vbmRAZS14YWN0LmNvbTCBnzANBgkqhkiG
54
+ 9w0BAQEFAAOBjQAwgYkCgYEAvvOA5lRZuKl/IuahgLIniKq/VIyqAs+Bw6wnZU4H
55
+ slucx3eolVXUyzyCS2O0lnnWK+Dfv+BX+uDOaAbEhrbECU2wgfxzqaFNKWt6Rr5/
56
+ axd210VYQkhjMlxjWOj6gSsbEWDChnLOGRn+iznFfQi4588yD6+HwadqxscGHBzq
57
+ 5m8CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH
58
+ ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFDJNwPdfakhi9iTbkLR8AkDJ
59
+ /q7CMB8GA1UdIwQYMBaAFN9N/SdqjDtPqIwn98F7RA3HULp3MA0GCSqGSIb3DQEB
60
+ BQUAA4GBAFy9vpn6tnouzlm3etUBv5jdDnLdEFjPU+EsYmaDnoMbCG0Qhp2kKk4p
61
+ Xa4LlCWEQ7+q3lK35PTDdpPk6gUTYcb84PBpRObNdn9xzKikhKumFz0gHtWUm4uu
62
+ jRqNMFlZj1A6xdYPq70MO2HH2abJ6JfJZSOjvxOK/1OxMjZQbUrz
63
+ -----END CERTIFICATE-----
@@ -0,0 +1,15 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIICXAIBAAKBgQC+84DmVFm4qX8i5qGAsieIqr9UjKoCz4HDrCdlTgeyW5zHd6iV
3
+ VdTLPIJLY7SWedYr4N+/4Ff64M5oBsSGtsQJTbCB/HOpoU0pa3pGvn9rF3bXRVhC
4
+ SGMyXGNY6PqBKxsRYMKGcs4ZGf6LOcV9CLjnzzIPr4fBp2rGxwYcHOrmbwIDAQAB
5
+ AoGAc7EfCO5USfDP6bpoYYwPLdud/sEXBIrq6T31xIgpW6Pr8mKKTqhpPBXWL40i
6
+ TgVVgNJHXn6zb3ojNJ3dFm3HiXuLdhnB+qu7zLh7dXB/f8GYnaFHnWjYIVsoavfZ
7
+ 8rIQ/r1BmtoncFV7ghWI5WgWOipOLsY5L5bKTJZka6m0UzkCQQDf9aoCMYnlXAZT
8
+ VjWN7To2Vd7dsM+ivF9acV0cZWv+9lNz29zoA8xvAYNVtnbs2vfsMTjAZoQ8iNPW
9
+ jsV3ZqV1AkEA2kTuwRPMQd+i6kl8wxC4+Slh675Hi16JYoaxyipJjlmDgWXTn+9t
10
+ CJPNT6MhQhuYwWeQDp/yzc2ZXrhaGFKL0wJAIuMg7aCL65evQJIgW5CFzesIgZ5G
11
+ agJQFEWujHrcHOaAT38DZX0Z/nzM2bBHzFO75SYxwf72QHvMDBNHfXcW9QJATEVs
12
+ PNHjPV2de0skqrFMQd0BF7TNIVlunpw8wk1WmMSU3IGtmqS6sBWd1+dENuqXzXWX
13
+ 9FRWLy5aGqxG51ro+wJBALzmX/dPSxETIA2sN97iNkhDa1Pzg6NyaoajL381rwgg
14
+ 4MzykW7e6TKbTtDlou4ZerzJ+UfcUeipn1cZuz1uxUk=
15
+ -----END RSA PRIVATE KEY-----
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exact4r
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 1
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 6
9
- version: "1.6"
8
+ - 7
9
+ version: "1.7"
10
10
  platform: ruby
11
11
  authors:
12
12
  - E-xact Transactions Ltd.
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-01-05 00:00:00 +11:00
17
+ date: 2011-02-03 00:00:00 +11:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -76,6 +76,7 @@ files:
76
76
  - ./lib/ews/transporter.rb
77
77
  - ./lib/exact4r.rb
78
78
  - ./LICENCE
79
+ - ./prod.log
79
80
  - ./Rakefile
80
81
  - ./README
81
82
  - ./test/credentials.rb
@@ -105,15 +106,20 @@ files:
105
106
  - ./test/exhaustive/transaction_details_test.rb
106
107
  - ./test/exhaustive/void_test.rb
107
108
  - ./test/general/avs_test.rb
109
+ - ./test/general/client_certificate_test.rb
108
110
  - ./test/general/json_encoding_test.rb
109
111
  - ./test/general/request_test.rb
110
112
  - ./test/general/rest_encoding_test.rb
111
113
  - ./test/general/soap_encoding_test.rb
112
114
  - ./test/general/transporter_test.rb
113
115
  - ./test/general/validator_test.rb
116
+ - ./test/samples/dsa_cert.pem
117
+ - ./test/samples/dsa_key.pem
114
118
  - ./test/samples/rest.dodgy.response.xml
115
119
  - ./test/samples/rest.everything.response.xml
116
120
  - ./test/samples/rest.response.xml
121
+ - ./test/samples/rsa_cert.pem
122
+ - ./test/samples/rsa_key.pem
117
123
  - ./test/samples/soap.deserialization.fault.xml
118
124
  - ./test/samples/soap.dodgy.response.xml
119
125
  - ./test/samples/soap.everything.response.xml