exact4r 1.6 → 1.7

Sign up to get free protection for your applications and to get access to all the features.
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