redis 3.2.2 → 3.3.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.
@@ -51,6 +51,33 @@ class TestConnectionHandling < Test::Unit::TestCase
51
51
  assert !r.client.connected?
52
52
  end
53
53
 
54
+ def test_close
55
+ quit = 0
56
+
57
+ commands = {
58
+ :quit => lambda do
59
+ quit += 1
60
+ "+OK"
61
+ end
62
+ }
63
+
64
+ redis_mock(commands) do |redis|
65
+ assert_equal 0, quit
66
+
67
+ redis.quit
68
+
69
+ assert_equal 1, quit
70
+
71
+ redis.ping
72
+
73
+ redis.close
74
+
75
+ assert_equal 1, quit
76
+
77
+ assert !redis.connected?
78
+ end
79
+ end
80
+
54
81
  def test_disconnect
55
82
  quit = 0
56
83
 
@@ -72,7 +72,7 @@ class TestDistributedInternals < Test::Unit::TestCase
72
72
  nodes = ["redis://localhost:#{PORT}/15", "redis://localhost:#{PORT}/15", *NODES]
73
73
 
74
74
  assert_raise(RuntimeError) do
75
- redis = Redis::Distributed.new nodes
75
+ Redis::Distributed.new nodes
76
76
  end
77
77
  end
78
78
 
@@ -5,6 +5,7 @@ require File.expand_path("helper", File.dirname(__FILE__))
5
5
  class TestInternals < Test::Unit::TestCase
6
6
 
7
7
  include Helper::Client
8
+ include Helper::Skipable
8
9
 
9
10
  def test_logger
10
11
  r.ping
@@ -160,6 +161,25 @@ class TestInternals < Test::Unit::TestCase
160
161
  assert (Time.now - start_time) <= opts[:timeout]
161
162
  end
162
163
 
164
+ driver(:ruby) do
165
+ def test_write_timeout
166
+ return skip("Relies on buffer sizes, might be unreliable")
167
+
168
+ server = TCPServer.new("127.0.0.1", 0)
169
+ port = server.addr[1]
170
+
171
+ # Hacky, but we need the buffer size
172
+ val = TCPSocket.new("127.0.0.1", port).getsockopt(Socket::SOL_SOCKET, Socket::SO_SNDBUF).unpack("i")[0]
173
+
174
+ assert_raise(Redis::TimeoutError) do
175
+ Timeout.timeout(1) do
176
+ redis = Redis.new(:port => port, :timeout => 5, :write_timeout => 0.1)
177
+ redis.set("foo", "1" * val*2)
178
+ end
179
+ end
180
+ end
181
+ end
182
+
163
183
  def close_on_ping(seq, options = {})
164
184
  $request = 0
165
185
 
@@ -35,7 +35,7 @@ module Lint
35
35
  :brpoplpush => lambda do |*args|
36
36
  sleep options[:delay] if options.has_key?(:delay)
37
37
  to_protocol(args.last)
38
- end,
38
+ end
39
39
  }
40
40
 
41
41
  redis_mock(commands, &blk)
@@ -39,8 +39,8 @@ module Lint
39
39
  # INCR option
40
40
  assert_equal 1.0, r.zadd("foo", 1, "s1", :incr => true)
41
41
  assert_equal 11.0, r.zadd("foo", 10, "s1", :incr => true)
42
- assert_equal -Infinity, r.zadd("bar", "-inf", "s1", :incr => true)
43
- assert_equal +Infinity, r.zadd("bar", "+inf", "s2", :incr => true)
42
+ assert_equal(-Infinity, r.zadd("bar", "-inf", "s1", :incr => true))
43
+ assert_equal(+Infinity, r.zadd("bar", "+inf", "s2", :incr => true))
44
44
  r.del "foo", "bar"
45
45
 
46
46
  # Incompatible options combination
@@ -101,8 +101,8 @@ module Lint
101
101
  # INCR option
102
102
  assert_equal 1.0, r.zadd("foo", [1, "s1"], :incr => true)
103
103
  assert_equal 11.0, r.zadd("foo", [10, "s1"], :incr => true)
104
- assert_equal -Infinity, r.zadd("bar", ["-inf", "s1"], :incr => true)
105
- assert_equal +Infinity, r.zadd("bar", ["+inf", "s2"], :incr => true)
104
+ assert_equal(-Infinity, r.zadd("bar", ["-inf", "s1"], :incr => true))
105
+ assert_equal(+Infinity, r.zadd("bar", ["+inf", "s2"], :incr => true))
106
106
  assert_raise(Redis::CommandError) { r.zadd("foo", [1, "s1", 2, "s2"], :incr => true) }
107
107
  r.del "foo", "bar"
108
108
 
@@ -251,4 +251,32 @@ class TestPublishSubscribe < Test::Unit::TestCase
251
251
  assert received
252
252
  end
253
253
  end
254
+
255
+ def test_subscribe_with_timeout
256
+ received = false
257
+
258
+ assert_raise Redis::TimeoutError do
259
+ r.subscribe_with_timeout(1, "foo") do |on|
260
+ on.message do |channel, message|
261
+ received = true
262
+ end
263
+ end
264
+ end
265
+
266
+ assert !received
267
+ end
268
+
269
+ def test_psubscribe_with_timeout
270
+ received = false
271
+
272
+ assert_raise Redis::TimeoutError do
273
+ r.psubscribe_with_timeout(1, "f*") do |on|
274
+ on.message do |channel, message|
275
+ received = true
276
+ end
277
+ end
278
+ end
279
+
280
+ assert !received
281
+ end
254
282
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require File.expand_path("helper", File.dirname(__FILE__))
4
4
 
5
- class SentinalCommandsTest < Test::Unit::TestCase
5
+ class SentinelCommandsTest < Test::Unit::TestCase
6
6
 
7
7
  include Helper::Client
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  require File.expand_path("helper", File.dirname(__FILE__))
4
4
 
5
- class SentinalTest < Test::Unit::TestCase
5
+ class SentinelTest < Test::Unit::TestCase
6
6
 
7
7
  include Helper::Client
8
8
 
data/test/ssl_test.rb ADDED
@@ -0,0 +1,66 @@
1
+ # encoding: UTF-8
2
+
3
+ if RUBY_VERSION >= "1.9.3"
4
+ require File.expand_path("helper", File.dirname(__FILE__))
5
+
6
+ class SslTest < Test::Unit::TestCase
7
+
8
+ include Helper::Client
9
+
10
+ driver(:ruby) do
11
+
12
+ def test_verified_ssl_connection
13
+ RedisMock.start({ :ping => proc { "+PONG" } }, ssl_server_opts("trusted")) do |port|
14
+ redis = Redis.new(:port => port, :ssl => true, :ssl_params => { :ca_file => ssl_ca_file })
15
+ assert_equal redis.ping, "PONG"
16
+ end
17
+ end
18
+
19
+ def test_unverified_ssl_connection
20
+ assert_raise(OpenSSL::SSL::SSLError) do
21
+ RedisMock.start({ :ping => proc { "+PONG" } }, ssl_server_opts("untrusted")) do |port|
22
+ redis = Redis.new(:port => port, :ssl => true, :ssl_params => { :ca_file => ssl_ca_file })
23
+ redis.ping
24
+ end
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ driver(:hiredis, :synchrony) do
31
+
32
+ def test_ssl_not_implemented_exception
33
+ assert_raise(NotImplementedError) do
34
+ RedisMock.start({ :ping => proc { "+PONG" } }, ssl_server_opts("trusted")) do |port|
35
+ redis = Redis.new(:port => port, :ssl => true, :ssl_params => { :ca_file => ssl_ca_file })
36
+ redis.ping
37
+ end
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ private
44
+
45
+ def ssl_server_opts(prefix)
46
+ ssl_cert = File.join(cert_path, "#{prefix}-cert.crt")
47
+ ssl_key = File.join(cert_path, "#{prefix}-cert.key")
48
+
49
+ {
50
+ :ssl => true,
51
+ :ssl_params => {
52
+ :cert => OpenSSL::X509::Certificate.new(File.read(ssl_cert)),
53
+ :key => OpenSSL::PKey::RSA.new(File.read(ssl_key))
54
+ }
55
+ }
56
+ end
57
+
58
+ def ssl_ca_file
59
+ File.join(cert_path, "trusted-ca.crt")
60
+ end
61
+
62
+ def cert_path
63
+ File.expand_path("../support/ssl/", __FILE__)
64
+ end
65
+ end
66
+ end
@@ -3,8 +3,19 @@ require "socket"
3
3
  module RedisMock
4
4
  class Server
5
5
  def initialize(options = {}, &block)
6
- @server = TCPServer.new(options[:host] || "127.0.0.1", 0)
7
- @server.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
6
+ tcp_server = TCPServer.new(options[:host] || "127.0.0.1", 0)
7
+ tcp_server.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
8
+
9
+ if options[:ssl]
10
+ ctx = OpenSSL::SSL::SSLContext.new
11
+
12
+ ssl_params = options.fetch(:ssl_params, {})
13
+ ctx.set_params(ssl_params) unless ssl_params.empty?
14
+
15
+ @server = OpenSSL::SSL::SSLServer.new(tcp_server, ctx)
16
+ else
17
+ @server = tcp_server
18
+ end
8
19
  end
9
20
 
10
21
  def port
@@ -0,0 +1,31 @@
1
+ #!/bin/sh
2
+
3
+ get_subject() {
4
+ if [ "$1" = "trusted" ]
5
+ then
6
+ echo "/C=IT/ST=Sicily/L=Catania/O=Redis/OU=Security/CN=127.0.0.1"
7
+ else
8
+ echo "/C=XX/ST=Untrusted/L=Evilville/O=Evil Hacker/OU=Attack Department/CN=127.0.0.1"
9
+ fi
10
+ }
11
+
12
+ # Generate two CAs: one to be considered trusted, and one that's untrusted
13
+ for type in trusted untrusted; do
14
+ rm -rf ./demoCA
15
+ mkdir -p ./demoCA
16
+ mkdir -p ./demoCA/certs
17
+ mkdir -p ./demoCA/crl
18
+ mkdir -p ./demoCA/newcerts
19
+ mkdir -p ./demoCA/private
20
+ touch ./demoCA/index.txt
21
+
22
+ openssl genrsa -out ${type}-ca.key 2048
23
+ openssl req -new -x509 -days 12500 -key ${type}-ca.key -out ${type}-ca.crt -subj "$(get_subject $type)"
24
+ openssl x509 -in ${type}-ca.crt -noout -next_serial -out ./demoCA/serial
25
+
26
+ openssl req -newkey rsa:2048 -keyout ${type}-cert.key -nodes -out ${type}-cert.req -subj "$(get_subject $type)"
27
+ openssl ca -days 12500 -cert ${type}-ca.crt -keyfile ${type}-ca.key -out ${type}-cert.crt -infiles ${type}-cert.req
28
+ rm ${type}-cert.req
29
+ done
30
+
31
+ rm -rf ./demoCA
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEIDCCAwigAwIBAgIJAM7kyjC89Qj/MA0GCSqGSIb3DQEBCwUAMGcxCzAJBgNV
3
+ BAYTAklUMQ8wDQYDVQQIEwZTaWNpbHkxEDAOBgNVBAcTB0NhdGFuaWExDjAMBgNV
4
+ BAoTBVJlZGlzMREwDwYDVQQLEwhTZWN1cml0eTESMBAGA1UEAxMJMTI3LjAuMC4x
5
+ MCAXDTE2MDQwMjAzMzQ0MVoYDzIwNTAwNjIzMDMzNDQxWjBnMQswCQYDVQQGEwJJ
6
+ VDEPMA0GA1UECBMGU2ljaWx5MRAwDgYDVQQHEwdDYXRhbmlhMQ4wDAYDVQQKEwVS
7
+ ZWRpczERMA8GA1UECxMIU2VjdXJpdHkxEjAQBgNVBAMTCTEyNy4wLjAuMTCCASIw
8
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMeibFqEG38mtN9DSXy6NZdd7AjH
9
+ 4/D+VdDzlbJlI5IBACCV9p6P2j5PFlFvkHFE6vr6biMaLXNAmUHYfDzeT95LODHH
10
+ t+8HlR51cNYrnt9B3eiVwEnJ7+axuDHg6nUgLXeKeog+vEqreZwLnFibxt2qpFze
11
+ xzyKJ37Pm+iAey5glCc/v7ECYQ4sWVVV+ciC+sAwmZDfZXCBQtRRokJ6ikqQDwWV
12
+ DugGcV46feTpu79OmkLLM8PI3E7ow2F/3iv67gmdlO5m9wX1ahWzJKUapBTxgf4X
13
+ QG0s60WbC9iJIvgXRGW7wWSsqSVJkfLYllDTPgfpLyl1+FR3A4awrsPiMVUCAwEA
14
+ AaOBzDCByTAdBgNVHQ4EFgQU+YG9kJR3Vy31d7QVyxRAYyKTK18wgZkGA1UdIwSB
15
+ kTCBjoAU+YG9kJR3Vy31d7QVyxRAYyKTK1+ha6RpMGcxCzAJBgNVBAYTAklUMQ8w
16
+ DQYDVQQIEwZTaWNpbHkxEDAOBgNVBAcTB0NhdGFuaWExDjAMBgNVBAoTBVJlZGlz
17
+ MREwDwYDVQQLEwhTZWN1cml0eTESMBAGA1UEAxMJMTI3LjAuMC4xggkAzuTKMLz1
18
+ CP8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAeFKB7DUixmxbdvNw
19
+ n/mNoHK+OOZXmfxZDCo0v2gcQ4WXUiCqL6MagrImCvkEz5RL6Fk2ZflEV2iGQ5Ds
20
+ CmF2n47ISpqG29bfI5R1rcbfqK/5tazUIhQu12ThNmkEh7hCuW/0LqJrnmxpuRLy
21
+ le9e3svCC96lwjFczzU/utWurKt7S7Di3C4P+AXAJJuszDMLMCBLaB/3j24cNpOx
22
+ zzeZo02x4rpsD2+MMfRDWMWezVEyk63KnI0kt3JGnepsKCFc48ZOk09LwFk3Rfaq
23
+ zuKSgEJJw1mfsdBfysM0HQw20yyjSdoTEfQq3bXctTNi+pEOgW6x7TMsnngYYLXV
24
+ 9XTrpg==
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpQIBAAKCAQEAx6JsWoQbfya030NJfLo1l13sCMfj8P5V0POVsmUjkgEAIJX2
3
+ no/aPk8WUW+QcUTq+vpuIxotc0CZQdh8PN5P3ks4Mce37weVHnVw1iue30Hd6JXA
4
+ Scnv5rG4MeDqdSAtd4p6iD68Sqt5nAucWJvG3aqkXN7HPIonfs+b6IB7LmCUJz+/
5
+ sQJhDixZVVX5yIL6wDCZkN9lcIFC1FGiQnqKSpAPBZUO6AZxXjp95Om7v06aQssz
6
+ w8jcTujDYX/eK/ruCZ2U7mb3BfVqFbMkpRqkFPGB/hdAbSzrRZsL2Iki+BdEZbvB
7
+ ZKypJUmR8tiWUNM+B+kvKXX4VHcDhrCuw+IxVQIDAQABAoIBAQCzbGHiQJXOA+XQ
8
+ O9OSjHGaJ8n6Yl2VvaE3eZXzjj8X/Fo271GGVVgbZE10x8aUZxKim+3dEqwCx+52
9
+ ZbHTqyMxcX2CEDRaWwBFLdxKQU467iIZ5m26ZAp/1v7rpXBT8KWsqQNT7L6ihdd4
10
+ zl6orOlhVPsAlSGQYcL5kHJZ1w/fL0phEbwdISd3PYhGHXMNmqfXorzJYHDQA4R+
11
+ yR7WpP1dmnUeEKrHc9FFcBZ75BGlWjdCPZMFKc7IndZumarhBpWH9yZMUxrUIo4V
12
+ SCweRUFdD5H1lMZ0YiIAE25wKNEQ2iGd3Jfr8Vj1KFSHC9I2FJA3aFRRUgTwxx/W
13
+ h0mJy1ZJAoGBAPYsSSlwQdxZjnyZiVkNSD4MoLdof//nRxeKGejq6AiXDvcsLyJy
14
+ 0MKk4YBFw2249TWm/KBbMAFiBE7d8uPtP5pPfjNVPX6VltH3AhSZ7Ugbpo6C3NFA
15
+ GpzFVtNaWgCVDloDVdmsY7ssDFuAIih0paklPAqnLY+Ua9m1BiEPrB+bAoGBAM+a
16
+ i+0NMR4AyKpuo1exdd+7BIHw5HNPwGmR1ggdGWduH0zsOhEawQKKFv1X9xKAcXxW
17
+ PyeD56/Tmn7fkWvuE8dOu9E6em0vgmxhYyn4nyLAFYF5uKXYo78MpIEThdpl1ldT
18
+ iHwG/25vunaBUHhwbHPUD+F989tmRuCjoFkuA5nPAoGAaqPIlcDhZvkMtoE0dHVC
19
+ hE6oGIuWV17y9wmGK9YG6iG2A/EKAhxGvur6HL0b6Z4j6zgJW9Xkt9SkFR4kqAQQ
20
+ d2JUQxx75SgcC5y7M/1yQrhnsHiT+7mPTbZW5HvRXUs0yl2DhSYeleiA+epJ4ciW
21
+ Mu3EUsEVBYvAJLE8lHnbkF0CgYEAhyxpz3+3a4G3JsHDOWYjCfoLhVAEb9CNyC9c
22
+ 3QuVbvMVDlEBvgFdivm+3lZYWYOoYP0HQgNw59svzUxks5Hg7vUk9abN8CnvEgKX
23
+ PszTUR0g450NzW6xr8PbmO/NR9bnKRUK2Tb1OkMldePdMY6CDykU7g3EqiZ+H+Zq
24
+ kaaUUaECgYEAmk5W+S94q5jLemnfAChC5lva/0/aHdhtaoH4Lo+j0haMsdiy8/ZE
25
+ sh+3gQ8pqwaCAwnKxAcppt/FNZ7tHRsH3oyY6biypn3WppQj+BA41nuzbspOKJhR
26
+ ZDXKFCItbzUjyi23Dx4P4DgMivkpV+e88RMIuBnv4yjl5iOLq+vf4Rg=
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,81 @@
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number: 14908262977180600576 (0xcee4ca30bcf50900)
5
+ Signature Algorithm: sha1WithRSAEncryption
6
+ Issuer: C=IT, ST=Sicily, L=Catania, O=Redis, OU=Security, CN=127.0.0.1
7
+ Validity
8
+ Not Before: Apr 2 03:34:42 2016 GMT
9
+ Not After : Jun 23 03:34:42 2050 GMT
10
+ Subject: C=IT, ST=Sicily, O=Redis, OU=Security, CN=127.0.0.1
11
+ Subject Public Key Info:
12
+ Public Key Algorithm: rsaEncryption
13
+ Public-Key: (2048 bit)
14
+ Modulus:
15
+ 00:ab:bf:ac:ef:dc:99:35:fa:07:3f:d5:33:86:f1:
16
+ 7d:9e:57:8b:d5:c1:10:04:0c:35:95:7c:61:ff:05:
17
+ a6:f9:ef:71:5c:c5:83:68:a2:ad:5d:0f:a5:2b:b4:
18
+ 76:9f:36:8f:df:75:fb:d6:48:00:c0:f0:68:56:f6:
19
+ 49:84:4d:4e:e1:ca:dd:24:9f:2f:5e:7c:35:26:57:
20
+ d6:d5:95:d1:3f:40:32:22:43:2c:8c:b7:8c:89:56:
21
+ 7c:d0:94:e5:f7:cf:4a:51:3f:60:b2:fe:1f:3b:38:
22
+ d6:47:5d:2e:4f:38:75:d9:9b:c8:0f:d1:fd:91:5a:
23
+ 07:c3:94:95:1f:7b:f1:ae:dc:a1:83:e2:6b:78:05:
24
+ 34:b3:8b:87:86:31:9f:cc:8b:15:cd:18:2e:06:36:
25
+ ca:f8:29:f8:6e:93:60:78:ec:8a:e8:a6:94:ad:24:
26
+ a8:e3:d4:ac:42:da:52:0f:34:e8:d0:10:e5:53:db:
27
+ f8:3a:56:48:10:33:df:80:70:1c:72:5e:1f:c3:11:
28
+ bb:3b:b9:6b:0a:e0:82:eb:67:d4:8f:5c:30:d3:cf:
29
+ 17:6d:86:01:0e:ae:43:c1:d8:c0:5e:99:ef:fa:60:
30
+ 0a:f2:62:68:62:8b:05:f3:8b:b1:34:d8:70:78:35:
31
+ 74:76:c2:46:13:a3:1f:5d:7b:3b:49:20:1e:98:54:
32
+ 63:77
33
+ Exponent: 65537 (0x10001)
34
+ X509v3 extensions:
35
+ X509v3 Basic Constraints:
36
+ CA:FALSE
37
+ Netscape Comment:
38
+ OpenSSL Generated Certificate
39
+ X509v3 Subject Key Identifier:
40
+ 81:DE:C0:39:F9:8A:57:50:DB:B1:6A:B3:D0:5F:E9:2C:87:5A:1E:3D
41
+ X509v3 Authority Key Identifier:
42
+ keyid:F9:81:BD:90:94:77:57:2D:F5:77:B4:15:CB:14:40:63:22:93:2B:5F
43
+
44
+ Signature Algorithm: sha1WithRSAEncryption
45
+ a3:0a:d7:22:5a:bc:cc:f6:ed:2f:f2:9f:dd:e0:46:02:73:14:
46
+ dd:a7:f5:39:b9:16:19:16:36:b6:22:5c:66:14:c0:d3:ac:55:
47
+ fc:52:2d:c3:b2:70:5f:cf:3d:23:71:78:e9:31:88:65:2c:2e:
48
+ 4a:09:6e:4b:97:bb:4d:38:87:d8:25:ed:bb:ed:62:19:08:50:
49
+ f2:40:cc:39:ee:f9:a8:3a:5d:2b:e7:34:eb:8a:74:c7:c9:bc:
50
+ 88:9b:9b:ca:5b:11:20:ca:53:b2:0b:20:49:fc:b9:f7:ec:03:
51
+ c9:5d:c1:24:75:27:f8:7c:70:dc:6a:2c:98:48:93:5f:7f:7e:
52
+ 94:a1:cf:79:b3:24:e3:de:9e:f0:0f:d8:d6:3e:c9:52:30:31:
53
+ 87:90:c2:d2:23:be:d8:7a:e9:e6:bb:4b:00:75:30:49:4b:98:
54
+ d5:f6:7d:b5:83:b5:57:85:20:98:00:51:55:c3:a2:81:ec:6c:
55
+ 11:91:33:60:14:7b:d2:01:ee:5b:bf:5b:68:f5:e0:4e:45:0a:
56
+ 68:cd:33:4f:29:72:fa:fe:6a:19:b6:84:70:90:a4:d5:7a:04:
57
+ 2e:da:5b:98:4f:e4:aa:a6:c4:68:aa:5c:8c:a5:5e:df:20:94:
58
+ 22:f7:37:45:71:a4:bc:72:34:ee:42:cf:9d:0f:fb:4a:39:d1:
59
+ 8e:41:f3:3f
60
+ -----BEGIN CERTIFICATE-----
61
+ MIIDvDCCAqSgAwIBAgIJAM7kyjC89QkAMA0GCSqGSIb3DQEBBQUAMGcxCzAJBgNV
62
+ BAYTAklUMQ8wDQYDVQQIEwZTaWNpbHkxEDAOBgNVBAcTB0NhdGFuaWExDjAMBgNV
63
+ BAoTBVJlZGlzMREwDwYDVQQLEwhTZWN1cml0eTESMBAGA1UEAxMJMTI3LjAuMC4x
64
+ MCAXDTE2MDQwMjAzMzQ0MloYDzIwNTAwNjIzMDMzNDQyWjBVMQswCQYDVQQGEwJJ
65
+ VDEPMA0GA1UECBMGU2ljaWx5MQ4wDAYDVQQKEwVSZWRpczERMA8GA1UECxMIU2Vj
66
+ dXJpdHkxEjAQBgNVBAMTCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
67
+ ADCCAQoCggEBAKu/rO/cmTX6Bz/VM4bxfZ5Xi9XBEAQMNZV8Yf8FpvnvcVzFg2ii
68
+ rV0PpSu0dp82j991+9ZIAMDwaFb2SYRNTuHK3SSfL158NSZX1tWV0T9AMiJDLIy3
69
+ jIlWfNCU5ffPSlE/YLL+Hzs41kddLk84ddmbyA/R/ZFaB8OUlR978a7coYPia3gF
70
+ NLOLh4Yxn8yLFc0YLgY2yvgp+G6TYHjsiuimlK0kqOPUrELaUg806NAQ5VPb+DpW
71
+ SBAz34BwHHJeH8MRuzu5awrggutn1I9cMNPPF22GAQ6uQ8HYwF6Z7/pgCvJiaGKL
72
+ BfOLsTTYcHg1dHbCRhOjH117O0kgHphUY3cCAwEAAaN7MHkwCQYDVR0TBAIwADAs
73
+ BglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYD
74
+ VR0OBBYEFIHewDn5ildQ27Fqs9Bf6SyHWh49MB8GA1UdIwQYMBaAFPmBvZCUd1ct
75
+ 9Xe0FcsUQGMikytfMA0GCSqGSIb3DQEBBQUAA4IBAQCjCtciWrzM9u0v8p/d4EYC
76
+ cxTdp/U5uRYZFja2IlxmFMDTrFX8Ui3DsnBfzz0jcXjpMYhlLC5KCW5Ll7tNOIfY
77
+ Je277WIZCFDyQMw57vmoOl0r5zTrinTHybyIm5vKWxEgylOyCyBJ/Ln37APJXcEk
78
+ dSf4fHDcaiyYSJNff36Uoc95syTj3p7wD9jWPslSMDGHkMLSI77Yeunmu0sAdTBJ
79
+ S5jV9n21g7VXhSCYAFFVw6KB7GwRkTNgFHvSAe5bv1to9eBORQpozTNPKXL6/moZ
80
+ toRwkKTVegQu2luYT+SqpsRoqlyMpV7fIJQi9zdFcaS8cjTuQs+dD/tKOdGOQfM/
81
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCrv6zv3Jk1+gc/
3
+ 1TOG8X2eV4vVwRAEDDWVfGH/Bab573FcxYNooq1dD6UrtHafNo/fdfvWSADA8GhW
4
+ 9kmETU7hyt0kny9efDUmV9bVldE/QDIiQyyMt4yJVnzQlOX3z0pRP2Cy/h87ONZH
5
+ XS5POHXZm8gP0f2RWgfDlJUfe/Gu3KGD4mt4BTSzi4eGMZ/MixXNGC4GNsr4Kfhu
6
+ k2B47IroppStJKjj1KxC2lIPNOjQEOVT2/g6VkgQM9+AcBxyXh/DEbs7uWsK4ILr
7
+ Z9SPXDDTzxdthgEOrkPB2MBeme/6YAryYmhiiwXzi7E02HB4NXR2wkYTox9deztJ
8
+ IB6YVGN3AgMBAAECggEASmOxIgtoiQqMzUcpFE/Q2x6MQL9okng/VUoUoALwudzO
9
+ OyKJsm6TrHU0U2PM5VUap+1QcRWqzebTKqduXFGn0wCtHEmemMwvsTXmpYhIo57I
10
+ mDKEP0bZJjtBwI5dtSIhzGMpHR4YpOwPU8W2YzXPRbvFwaRwsd5O8pWOqZ5jphrQ
11
+ DtkLNz4hIFsMihPeYFpuAjsZ2cMIGPtlY2qbfjyno7hd7LxNzL/2vMlDw5MHHtw4
12
+ snxLN92KomC6rSUUydNDyemyMpg8iRwm7gmYzVoZf6aTbI2RdFcv2KZfpUWYdB+I
13
+ yU8ZV1Sch7VQ+xLVy74SuY8AZ2Rq4S3M+EmEa5ghoQKBgQDfgOIyStulfYn6UC1A
14
+ OYwcGoSOaVNfPE/m9BZN58xK0+XnEqQECMsyg/GYS65Zri4+KJYPxqv6f9ljLTGE
15
+ 0PxiA7wq+QWnv4EM+3aGShxwyVlmgJZyyBfJtAMr1iDm4JsidTT5GMdfxRICPGZY
16
+ WVggcz/cVu39OxRrumREuTWAzwKBgQDEuGheZv68cYt5EkzOWxeFQyt1bzXn1CJg
17
+ IXnIFZIekJhVGpBG+zMAYri9+hSheiDrwfIcSfTq9LxF6JNUvaU4qMrkwvW21jKs
18
+ n7ofcA+VYq2mggoIuuvKVqXemLHorC0U/zCMnM6rycaa9sB5tsF+Js93uvf1TEJt
19
+ veV0yCeM2QKBgF1M0iAoe7SDyXuCyMEMxN5ee4NvmGwjIz/IGR+Aahm6hziE4Y8F
20
+ lL2LsujefvPU8FzmWG5Rgy1Y/YiXLxrAmvrXkE9oEOJL4TVoK7w3Z9P1Waqedy+H
21
+ M9bxnHlKNAXtMRWbU/fATko+XBwu1pJ/CXjSY5A5gbO6W/X0ozLFFf6lAoGABRZ7
22
+ 5I0nY3pQUCZQBDpI5nJxSk1BCKjs5q2W97zPFalJt1HDj4JptEXZX1h7dh2xgkd2
23
+ 2pJzGiyQPgKg5N0uy8NZ1AbS0hLCJsLOzodYb9Wohhjw537mIEqTaalrWIgzdkqP
24
+ V+OqWLkUQOfG3J8EbB3W2dLlHNwHD82MhLO0iikCgYEAvdK5LmpUdZXMVtiOMZO5
25
+ t3M0vwi6vPhW7DV1QET51x/U+SyH4rvZGeqRl+gcKrZ8SreOlyICvsPgVmvLCrHE
26
+ gJLPWJIzI8Mg6u91/KpiVmRahnJjOn3oHNuLSqFjn9lIhmA5dN7zQDXzPdYrWPNR
27
+ u1QX+JLhlP33ejgdkdLsNiM=
28
+ -----END PRIVATE KEY-----