[svn-upgrade] new version libpoe-component-sslify-perl (1.008)
Ansgar Burchardt
12 years ago
23 | 23 | 'Apocalypse <APOCAL@cpan.org>' |
24 | 24 | ], |
25 | 25 | 'dist_name' => 'POE-Component-SSLify', |
26 | 'dist_version' => '1.005', | |
26 | 'dist_version' => '1.008', | |
27 | 27 | 'license' => 'perl', |
28 | 28 | 'module_name' => 'POE::Component::SSLify', |
29 | 29 | 'recommends' => {}, |
32 | 32 | 'Exporter' => '0', |
33 | 33 | 'IO::Handle' => '1.28', |
34 | 34 | 'Net::SSLeay' => '1.36', |
35 | 'POE' => '0', | |
35 | 36 | 'Scalar::Util' => '0', |
36 | 37 | 'Symbol' => '0', |
37 | 38 | 'Task::Weaken' => '1.03', |
0 | 0 | Revision history for Perl extension POE::Component::SSLify. |
1 | ||
2 | 1.008 | |
3 | Released: 2011-05-04 21:55:27 UTC | |
4 | ||
5 | Bazerka@irc noticed that POE wasn't even listed as a runtime prereq, d0h! | |
6 | ||
7 | 1.007 | |
8 | Released: 2011-05-04 21:36:32 UTC | |
9 | ||
10 | Revert the ENGINE load logic added in 1.004 because it was causing coredumps on netbsd ( thanks BINGOS! ) | |
11 | Add the constant LOAD_SSL_ENGINES sub if you need to load the ssl engines | |
12 | Tweak the renegotiate tests to be more tolerant of failures, thanks RCAPUTO - RT#66741 | |
13 | ||
14 | 1.006 | |
15 | Released: 2011-04-22 00:21:51 UTC | |
16 | ||
17 | Fix a heinous bug where openssl will randomly+reliably close a connection ( thanks MIRE ) | |
18 | Tweak the hook tests so they test the case where no data is sent over the connection | |
19 | Tweak the connfail tests so they work better | |
1 | 20 | |
2 | 21 | 1.005 |
3 | 22 | Released: 2011-03-10 07:55:30 UTC |
1 | 1 | 9999-99-99 99:99:99 +0000 HEAD |
2 | 2 | ============================== |
3 | 3 | |
4 | commit 4fa0a44b7f0a9b37ef5fcbcb07ad6e45dd50b265 | |
5 | Author: Apocalypse <perl@0ne.us> | |
6 | Date: Wed May 4 14:53:14 2011 -0700 | |
7 | ||
8 | actually require POE as a runtime prereq, thanks Bazerka@irc | |
9 | ||
10 | ======================================= | |
11 | 2011-05-04 14:37:11 -0700 release-1.007 | |
12 | ======================================= | |
13 | ||
14 | commit 5ada288a8ab2b24c6472e5a8fb3f43958fa22445 | |
15 | Author: Apocalypse <perl@0ne.us> | |
16 | Date: Wed May 4 14:37:11 2011 -0700 | |
17 | ||
18 | New CPAN release of POE-Component-SSLify - v1.007 | |
19 | ||
20 | Released: 2011-05-04 21:36:32 UTC | |
21 | ||
22 | Revert the ENGINE load logic added in 1.004 because it was causing | |
23 | coredumps on netbsd ( thanks BINGOS! ) | |
24 | ||
25 | Add the constant LOAD_SSL_ENGINES sub if you need to load the ssl | |
26 | engines | |
27 | ||
28 | Tweak the renegotiate tests to be more tolerant of failures, thanks | |
29 | RCAPUTO - RT#66741 | |
30 | ||
31 | commit 958b153b6d09773230336793b1a3f2f2848a55dc | |
32 | Author: Apocalypse <perl@0ne.us> | |
33 | Date: Wed May 4 14:34:15 2011 -0700 | |
34 | ||
35 | rename some POD for pod::coverage tests | |
36 | ||
37 | commit 125745d00aa051e13a18ac207a618c50913bbd57 | |
38 | Author: Apocalypse <perl@0ne.us> | |
39 | Date: Wed May 4 14:21:22 2011 -0700 | |
40 | ||
41 | rewrite the renegotiate tests in hope of fixing RT#66741 | |
42 | ||
43 | commit 393337624aef50602f4f2e9ff4ec412e1cbe7d76 | |
44 | Author: Apocalypse <perl@0ne.us> | |
45 | Date: Wed May 4 14:02:59 2011 -0700 | |
46 | ||
47 | fix netbsd coredumps by not loading ENGINEs, reported by BINGOS | |
48 | ||
49 | ======================================= | |
50 | 2011-04-21 17:22:30 -0700 release-1.006 | |
51 | ======================================= | |
52 | ||
53 | commit 0096f51336380c31d99e87cf93a63ed650e60aff | |
54 | Author: Apocalypse <perl@0ne.us> | |
55 | Date: Thu Apr 21 17:22:30 2011 -0700 | |
56 | ||
57 | New CPAN release of POE-Component-SSLify - v1.006 | |
58 | ||
59 | Released: 2011-04-22 00:21:51 UTC | |
60 | ||
61 | Fix a heinous bug where openssl will randomly+reliably close a | |
62 | connection ( thanks MIRE ) | |
63 | ||
64 | Tweak the hook tests so they test the case where no data is sent over | |
65 | the connection | |
66 | ||
67 | Tweak the connfail tests so they work better | |
68 | ||
69 | commit df65edee2621f55f347db2c70d779e44d93b87d2 | |
70 | Author: Apocalypse <perl@0ne.us> | |
71 | Date: Thu Apr 21 17:16:15 2011 -0700 | |
72 | ||
73 | mire@irc is now MIRE, congrats | |
74 | ||
75 | commit 853522b575570c997d3c8ff70c530cd45cde1e40 | |
76 | Author: Apocalypse <perl@0ne.us> | |
77 | Date: Thu Apr 21 14:54:08 2011 -0700 | |
78 | ||
79 | tweak mires test a bit | |
80 | ||
81 | commit e745765e01f9c07e0b195b2c49be40bea2e916f4 | |
82 | Author: Apocalypse <perl@0ne.us> | |
83 | Date: Thu Apr 21 08:28:42 2011 -0700 | |
84 | ||
85 | start of work on mire's testcase | |
86 | ||
87 | commit 15e3d473b68e6e0ac36673bbc71b7125fd49ed2f | |
88 | Author: Apocalypse <perl@0ne.us> | |
89 | Date: Thu Apr 21 00:03:23 2011 -0700 | |
90 | ||
91 | add mire test to be worked into a proper AUTHOR test | |
92 | ||
93 | commit ad5c8c95dce50c051d8c54ade4c90b45f49103c3 | |
94 | Author: Apocalypse <perl@0ne.us> | |
95 | Date: Wed Apr 20 20:44:15 2011 -0700 | |
96 | ||
97 | update changelog for the fixes | |
98 | ||
99 | commit ed9e2b33c10572df76e790ffad68d3d7ecb820f9 | |
100 | Author: Apocalypse <perl@0ne.us> | |
101 | Date: Wed Apr 20 20:11:17 2011 -0700 | |
102 | ||
103 | fix random SSL failures, spotted by mire | |
104 | ||
105 | commit 5a9b28e587a3dace6ed71bd93691215b47cbc348 | |
106 | Author: Apocalypse <perl@0ne.us> | |
107 | Date: Wed Apr 20 20:09:00 2011 -0700 | |
108 | ||
109 | tweak the connfail tests and make the server test work | |
110 | ||
111 | commit 806d4c4df5ca108c8cfacbb19babcfebc8b05cdc | |
112 | Author: Apocalypse <perl@0ne.us> | |
113 | Date: Wed Apr 20 20:08:18 2011 -0700 | |
114 | ||
115 | tweak the hook tests to cover the case where there is no data sent | |
116 | over the wire | |
117 | ||
118 | ======================================= | |
119 | 2011-03-10 00:56:13 -0700 release-1.005 | |
120 | ======================================= | |
121 | ||
122 | commit bc1a271e1f6e597f42cf03723ef6525a21281bea | |
123 | Author: Apocalypse <perl@0ne.us> | |
124 | Date: Thu Mar 10 00:56:13 2011 -0700 | |
125 | ||
126 | New CPAN release of POE-Component-SSLify - v1.005 | |
127 | ||
128 | Released: 2011-03-10 07:55:30 UTC | |
129 | ||
130 | Fix the connfail tests due to an incorrect assumption regards socket | |
131 | close value, thanks CPANTesters! | |
132 | ||
4 | 133 | commit d8b4c0e354acf683f17fd63186810226e101b54e |
5 | 134 | Author: Apocalypse <perl@0ne.us> |
6 | 135 | Date: Thu Mar 10 00:54:05 2011 -0700 |
21 | 21 | t/00-compile.t |
22 | 22 | t/000-report-versions-tiny.t |
23 | 23 | t/1_simple.t |
24 | t/2_renegotiate.t | |
24 | t/2_renegotiate_client.t | |
25 | 25 | t/3_upgrade.t |
26 | 26 | t/4_connect_hook.t |
27 | 27 | t/5_connfail_client.t |
28 | 28 | t/6_connfail_server.t |
29 | t/7_connect_hook_nodata.t | |
30 | t/8_renegotiate_server.t | |
31 | t/98_renegotiate.t | |
32 | t/99_mire_test.t | |
29 | 33 | t/apocalypse.t |
35 | 35 | "Exporter" : 0, |
36 | 36 | "IO::Handle" : "1.28", |
37 | 37 | "Net::SSLeay" : "1.36", |
38 | "POE" : 0, | |
38 | 39 | "Scalar::Util" : 0, |
39 | 40 | "Symbol" : 0, |
40 | 41 | "Task::Weaken" : "1.03", |
57 | 58 | "provides" : { |
58 | 59 | "POE::Component::SSLify" : { |
59 | 60 | "file" : "lib/POE/Component/SSLify.pm", |
60 | "version" : "1.005" | |
61 | "version" : "1.008" | |
61 | 62 | }, |
62 | 63 | "POE::Component::SSLify::ClientHandle" : { |
63 | 64 | "file" : "lib/POE/Component/SSLify/ClientHandle.pm", |
64 | "version" : "1.005" | |
65 | "version" : "1.008" | |
65 | 66 | }, |
66 | 67 | "POE::Component::SSLify::ServerHandle" : { |
67 | 68 | "file" : "lib/POE/Component/SSLify/ServerHandle.pm", |
68 | "version" : "1.005" | |
69 | "version" : "1.008" | |
69 | 70 | } |
70 | 71 | }, |
71 | 72 | "release_status" : "stable", |
84 | 85 | "web" : "http://github.com/apocalypse/perl-poe-sslify" |
85 | 86 | } |
86 | 87 | }, |
87 | "version" : "1.005", | |
88 | "version" : "1.008", | |
88 | 89 | "x_BuiltWith" : { |
89 | 90 | "modules" : { |
90 | 91 | "Exporter" : "5.63", |
93 | 94 | "IO::Handle" : "1.28", |
94 | 95 | "Module::Build" : "0.3607", |
95 | 96 | "Net::SSLeay" : "1.36", |
96 | "POE" : "1.299", | |
97 | "POE" : "1.310", | |
97 | 98 | "POE::Component::Client::TCP" : "1.299", |
98 | 99 | "POE::Component::Server::TCP" : "1.299", |
99 | 100 | "Scalar::Util" : "1.23", |
161 | 162 | { |
162 | 163 | "class" : "Dist::Zilla::Plugin::ReportVersions::Tiny", |
163 | 164 | "name" : "@Apocalyptic/ReportVersions::Tiny", |
164 | "version" : "1.02" | |
165 | "version" : "1.03" | |
165 | 166 | }, |
166 | 167 | { |
167 | 168 | "class" : "Dist::Zilla::Plugin::Prepender", |
171 | 172 | { |
172 | 173 | "class" : "Dist::Zilla::Plugin::Authority", |
173 | 174 | "name" : "@Apocalyptic/Authority", |
174 | "version" : "1.003" | |
175 | "version" : "1.005" | |
175 | 176 | }, |
176 | 177 | { |
177 | 178 | "class" : "Dist::Zilla::Plugin::PkgVersion", |
196 | 197 | { |
197 | 198 | "class" : "Dist::Zilla::Plugin::MinimumPerl", |
198 | 199 | "name" : "@Apocalyptic/MinimumPerl", |
199 | "version" : "1.001" | |
200 | "version" : "1.003" | |
200 | 201 | }, |
201 | 202 | { |
202 | 203 | "class" : "Dist::Zilla::Plugin::Bugtracker", |
27 | 27 | provides: |
28 | 28 | POE::Component::SSLify: |
29 | 29 | file: lib/POE/Component/SSLify.pm |
30 | version: 1.005 | |
30 | version: 1.008 | |
31 | 31 | POE::Component::SSLify::ClientHandle: |
32 | 32 | file: lib/POE/Component/SSLify/ClientHandle.pm |
33 | version: 1.005 | |
33 | version: 1.008 | |
34 | 34 | POE::Component::SSLify::ServerHandle: |
35 | 35 | file: lib/POE/Component/SSLify/ServerHandle.pm |
36 | version: 1.005 | |
36 | version: 1.008 | |
37 | 37 | requires: |
38 | 38 | Exporter: 0 |
39 | 39 | IO::Handle: 1.28 |
40 | 40 | Net::SSLeay: 1.36 |
41 | POE: 0 | |
41 | 42 | Scalar::Util: 0 |
42 | 43 | Symbol: 0 |
43 | 44 | Task::Weaken: 1.03 |
48 | 49 | homepage: http://search.cpan.org/dist/POE-Component-SSLify/ |
49 | 50 | license: http://dev.perl.org/licenses/ |
50 | 51 | repository: git://github.com/apocalypse/perl-poe-sslify.git |
51 | version: 1.005 | |
52 | version: 1.008 | |
52 | 53 | x_BuiltWith: |
53 | 54 | modules: |
54 | 55 | Exporter: 5.63 |
57 | 58 | IO::Handle: 1.28 |
58 | 59 | Module::Build: 0.3607 |
59 | 60 | Net::SSLeay: 1.36 |
60 | POE: 1.299 | |
61 | POE: 1.310 | |
61 | 62 | POE::Component::Client::TCP: 1.299 |
62 | 63 | POE::Component::Server::TCP: 1.299 |
63 | 64 | Scalar::Util: 1.23 |
113 | 114 | - |
114 | 115 | class: Dist::Zilla::Plugin::ReportVersions::Tiny |
115 | 116 | name: '@Apocalyptic/ReportVersions::Tiny' |
116 | version: 1.02 | |
117 | version: 1.03 | |
117 | 118 | - |
118 | 119 | class: Dist::Zilla::Plugin::Prepender |
119 | 120 | name: '@Apocalyptic/Prepender' |
121 | 122 | - |
122 | 123 | class: Dist::Zilla::Plugin::Authority |
123 | 124 | name: '@Apocalyptic/Authority' |
124 | version: 1.003 | |
125 | version: 1.005 | |
125 | 126 | - |
126 | 127 | class: Dist::Zilla::Plugin::PkgVersion |
127 | 128 | name: '@Apocalyptic/PkgVersion' |
141 | 142 | - |
142 | 143 | class: Dist::Zilla::Plugin::MinimumPerl |
143 | 144 | name: '@Apocalyptic/MinimumPerl' |
144 | version: 1.001 | |
145 | version: 1.003 | |
145 | 146 | - |
146 | 147 | class: Dist::Zilla::Plugin::Bugtracker |
147 | 148 | name: '@Apocalyptic/Bugtracker' |
31 | 31 | 'Exporter' => '0', |
32 | 32 | 'IO::Handle' => '1.28', |
33 | 33 | 'Net::SSLeay' => '1.36', |
34 | 'POE' => '0', | |
34 | 35 | 'Scalar::Util' => '0', |
35 | 36 | 'Symbol' => '0', |
36 | 37 | 'Task::Weaken' => '1.03', |
37 | 38 | 'parent' => '0' |
38 | 39 | }, |
39 | 'VERSION' => '1.005', | |
40 | 'VERSION' => '1.008', | |
40 | 41 | 'test' => { |
41 | 42 | 'TESTS' => 't/*.t' |
42 | 43 | } |
1 | 1 | POE::Component::SSLify - Makes using SSL in the world of POE easy! |
2 | 2 | |
3 | 3 | VERSION |
4 | This document describes v1.005 of POE::Component::SSLify - released March 10, 2011 as part of POE-Component-SSLify. | |
4 | This document describes v1.008 of POE::Component::SSLify - released May 04, 2011 as part of POE-Component-SSLify. | |
5 | 5 | |
6 | 6 | SYNOPSIS |
7 | 7 | # CLIENT-side usage |
298 | 298 | function against SSLify, so use them carefully! |
299 | 299 | |
300 | 300 | Net::SSLeay::renegotiate |
301 | This function has been tested ( it's in "t/2_renegotiate.t" ) but it | |
302 | doesn't work on FreeBSD! I tracked it down to this security advisory: | |
301 | This function has been tested ( it's in "t/2_renegotiate_client.t" ) but | |
302 | it doesn't work on FreeBSD! I tracked it down to this security advisory: | |
303 | 303 | <http://security.freebsd.org/advisories/FreeBSD-SA-09:15.ssl.asc> which |
304 | 304 | explains it in detail. The test will skip this function if it detects |
305 | 305 | that you're on a broken system. However, if you have the updated OpenSSL |
325 | 325 | developer, I'm unable to fix this. However, it seems like Cygwin on |
326 | 326 | MSWin32 works just fine! Please help me fix this if you can, thanks! |
327 | 327 | |
328 | LOAD_SSL_ENGINES | |
329 | OpenSSL supports loading ENGINEs to accelerate the crypto algorithms. | |
330 | SSLify v1.004 automatically loaded the engines, but there was some | |
331 | problems on certain platforms that caused coredumps. A big shout-out to | |
332 | BinGOs and CPANTesters for catching this! It's now disabled in v1.007 | |
333 | and you would need to explicitly enable it. | |
334 | ||
335 | sub POE::Component::SSLify::LOAD_SSL_ENGINES () { 1 } | |
336 | use POE::Component::SSLify qw( Client::SSLify ); | |
337 | ||
328 | 338 | EXPORT |
329 | 339 | Stuffs all of the functions in @EXPORT_OK so you have to request them |
330 | 340 | directly. |
350 | 360 | |
351 | 361 | * Search CPAN |
352 | 362 | |
363 | The default CPAN search engine, useful to view POD in HTML format. | |
364 | ||
353 | 365 | <http://search.cpan.org/dist/POE-Component-SSLify> |
354 | 366 | |
355 | 367 | * RT: CPAN's Bug Tracker |
356 | 368 | |
369 | The RT ( Request Tracker ) website is the default bug/issue tracking | |
370 | system for CPAN. | |
371 | ||
357 | 372 | <http://rt.cpan.org/NoAuth/Bugs.html?Dist=POE-Component-SSLify> |
358 | 373 | |
359 | * AnnoCPAN: Annotated CPAN documentation | |
374 | * AnnoCPAN | |
375 | ||
376 | The AnnoCPAN is a website that allows community annonations of Perl | |
377 | module documentation. | |
360 | 378 | |
361 | 379 | <http://annocpan.org/dist/POE-Component-SSLify> |
362 | 380 | |
363 | 381 | * CPAN Ratings |
364 | 382 | |
383 | The CPAN Ratings is a website that allows community ratings and | |
384 | reviews of Perl modules. | |
385 | ||
365 | 386 | <http://cpanratings.perl.org/d/POE-Component-SSLify> |
366 | 387 | |
367 | 388 | * CPAN Forum |
368 | 389 | |
390 | The CPAN Forum is a web forum for discussing Perl modules. | |
391 | ||
369 | 392 | <http://cpanforum.com/dist/POE-Component-SSLify> |
370 | 393 | |
371 | * CPANTS Kwalitee | |
394 | * CPANTS | |
395 | ||
396 | The CPANTS is a website that analyzes the Kwalitee ( code metrics ) | |
397 | of a distribution. | |
372 | 398 | |
373 | 399 | <http://cpants.perl.org/dist/overview/POE-Component-SSLify> |
374 | 400 | |
375 | * CPAN Testers Results | |
376 | ||
377 | <http://cpantesters.org/distro/P/POE-Component-SSLify.html> | |
401 | * CPAN Testers | |
402 | ||
403 | The CPAN Testers is a network of smokers who run automated tests on | |
404 | uploaded CPAN distributions. | |
405 | ||
406 | <http://www.cpantesters.org/distro/P/POE-Component-SSLify> | |
378 | 407 | |
379 | 408 | * CPAN Testers Matrix |
380 | 409 | |
410 | The CPAN Testers Matrix is a website that provides a visual way to | |
411 | determine what Perls/platforms PASSed for a distribution. | |
412 | ||
381 | 413 | <http://matrix.cpantesters.org/?dist=POE-Component-SSLify> |
414 | ||
415 | * CPAN Testers Dependencies | |
416 | ||
417 | The CPAN Testers Dependencies is a website that shows a chart of the | |
418 | test results of all dependencies for a distribution. | |
419 | ||
420 | <http://deps.cpantesters.org/?module=POE::Component::SSLify> | |
382 | 421 | |
383 | 422 | |
384 | 423 | You can email the author of this module at "APOCAL at cpan.org" asking |
13 | 13 | -----BEGIN PGP SIGNED MESSAGE----- |
14 | 14 | Hash: SHA1 |
15 | 15 | |
16 | SHA1 74d0a53111acfd4b4b7f9c269175a06e77309d86 Build.PL | |
17 | SHA1 0e7543ad72ae31c532a8298fae8a3c98cdc87e86 Changes | |
18 | SHA1 375fe756ad481b99709cf16d1a5378a7dee530ef CommitLog | |
16 | SHA1 db814b600c64a9dbf43916f952d61724c9cb5629 Build.PL | |
17 | SHA1 6f3f477a7be6adda1715f4f6232d1c23f1b0c73a Changes | |
18 | SHA1 6a0020176172c6097eb86b34ef42014654df64f3 CommitLog | |
19 | 19 | SHA1 e3edc44697d1770c65fec99f6ebdb6ea55fb3050 INSTALL |
20 | 20 | SHA1 263360e99a0de4d587fedefe1a919dcf61af1d10 LICENSE |
21 | SHA1 1baae2c8b4d91da92fdf35c5542137380f00c9e4 MANIFEST | |
21 | SHA1 3117aae7a178cf1a5ef1c6fbbd9af19a36462dbc MANIFEST | |
22 | 22 | SHA1 9dfc07c5655b958e800189837f3ddd37ca050bfe MANIFEST.SKIP |
23 | SHA1 bfa76e8e9cf9ce09d4b4fd98883f6d1b0639a4f6 META.json | |
24 | SHA1 5a4ea0cc9966848930db2129a75c3cf6bea77a45 META.yml | |
25 | SHA1 842e80effc5a192dd7d9ca2176d58985abb70a4c Makefile.PL | |
26 | SHA1 781198b6246cacc4b4c336bbacb47320a658f024 README | |
23 | SHA1 e248fce45784dc1e74a6632ae73dab4408806755 META.json | |
24 | SHA1 b7979650243be1fb48f457c7f3ad7ec6ee9fd424 META.yml | |
25 | SHA1 88399f5f9ea5f4cff1f2899fde9b6434fa6525fb Makefile.PL | |
26 | SHA1 013286bba5f5a9bdbefd457b13cb150f53c87711 README | |
27 | 27 | SHA1 41a5da1356107d097f6bbf72c62ee4da83e4119f dist.ini |
28 | 28 | SHA1 96decb1c51052f9b024b6d069e428b4ccc19e909 examples/client.pl |
29 | 29 | SHA1 d8f9b44df461cdcf6cbd7cffd79a9d49aade3947 examples/server.pl |
30 | 30 | SHA1 c4a936c75d1d566e936dfb1776c9a01ea244c618 examples/serverclient.pl |
31 | SHA1 21353f9c92b51a2a27604af460d08f6993da9a28 lib/POE/Component/SSLify.pm | |
32 | SHA1 620bcbd8febf6eb4d4f066479c895b90302dedfd lib/POE/Component/SSLify/ClientHandle.pm | |
33 | SHA1 444dbb2e912dc3d94494ddb316b1950612d38288 lib/POE/Component/SSLify/ServerHandle.pm | |
31 | SHA1 7c470b55e86d0fc80ca4b60ba3dfb0ab1781591d lib/POE/Component/SSLify.pm | |
32 | SHA1 ee5c6b2eb8109cc96d9f60c2eb993da305f959cf lib/POE/Component/SSLify/ClientHandle.pm | |
33 | SHA1 9ee769ea86ff4ad984bfba8c643e74cc0bcfaaba lib/POE/Component/SSLify/ServerHandle.pm | |
34 | 34 | SHA1 59afa28f138a14b956443f915d60a891d5b306b8 mylib/example.crt |
35 | 35 | SHA1 f2ba02d28cfb207e0a86be7cb4f3c570f257bf93 mylib/example.key |
36 | 36 | SHA1 fd48b12e3df15fb55695e7d1b4ee95dc3c0cd766 t/00-compile.t |
37 | SHA1 9df6d0a549121f4e7db1cabbdb703d59aa821f85 t/000-report-versions-tiny.t | |
37 | SHA1 4788d9aa069d03cc4c94ef15e11e8a0e0527561c t/000-report-versions-tiny.t | |
38 | 38 | SHA1 9ade9d7296a3511f42ce3010dd7d215630d51c80 t/1_simple.t |
39 | SHA1 0d6e08c744e377933f75c6d9fa25c37e3506d1a5 t/2_renegotiate.t | |
39 | SHA1 949de479ef156e3845bf64adb21a9556af0420a6 t/2_renegotiate_client.t | |
40 | 40 | SHA1 73790060e55b0189540d898a97c485e187f05ae9 t/3_upgrade.t |
41 | SHA1 f8ba954e2a5bf546c3932eb9cc1ba9bf89a57385 t/4_connect_hook.t | |
42 | SHA1 4c7ecc5d6221a593b5961f53205eb016a1eee3bd t/5_connfail_client.t | |
43 | SHA1 89fa487c62b3e6aadc33bd1025bec93f2aabdc1d t/6_connfail_server.t | |
41 | SHA1 3c6e64d27262d54d7b31c2d4f2e65f5d6cab87cf t/4_connect_hook.t | |
42 | SHA1 520cb166745d10fa749372ce686240dafd0da543 t/5_connfail_client.t | |
43 | SHA1 295f221b5001822ac23244030fb1b8be1bd838e8 t/6_connfail_server.t | |
44 | SHA1 156f6b65482911b3be5c8f3ce8c07071c5308d1b t/7_connect_hook_nodata.t | |
45 | SHA1 377a10c6d96cd1a23922526c44c43cd723dafcfd t/8_renegotiate_server.t | |
46 | SHA1 5bb02868a0a8d995272800bc945f6db2669d291e t/98_renegotiate.t | |
47 | SHA1 8f73eec992bcb37639f49945d986ff5a59a1ca36 t/99_mire_test.t | |
44 | 48 | SHA1 e3b390873d4de642e25fcfb4b7d16c00b096d24a t/apocalypse.t |
45 | 49 | -----BEGIN PGP SIGNATURE----- |
46 | 50 | Version: GnuPG v1.4.9 (GNU/Linux) |
47 | 51 | |
48 | iEYEARECAAYFAk14g/0ACgkQGfr7vsGKgxzbqQCfVAAlTNCFi81uhNCljGXLGqOp | |
49 | BC4AoIytDbvdcMRaIj3mHDJP7ugIZyd9 | |
50 | =rNNR | |
52 | iEYEARECAAYFAk3By1oACgkQGfr7vsGKgxx47ACfTzDqglDL4xb266x3RMOBG3AJ | |
53 | xj0AoNyF1h2KqHOYNVVImQmGy6UIw8D5 | |
54 | =qxVp | |
51 | 55 | -----END PGP SIGNATURE----- |
8 | 8 | use strict; use warnings; |
9 | 9 | package POE::Component::SSLify::ClientHandle; |
10 | 10 | BEGIN { |
11 | $POE::Component::SSLify::ClientHandle::VERSION = '1.005'; | |
11 | $POE::Component::SSLify::ClientHandle::VERSION = '1.008'; | |
12 | 12 | } |
13 | 13 | BEGIN { |
14 | 14 | $POE::Component::SSLify::ClientHandle::AUTHORITY = 'cpan:APOCAL'; |
72 | 72 | |
73 | 73 | =head1 VERSION |
74 | 74 | |
75 | This document describes v1.005 of POE::Component::SSLify::ClientHandle - released March 10, 2011 as part of POE-Component-SSLify. | |
75 | This document describes v1.008 of POE::Component::SSLify::ClientHandle - released May 04, 2011 as part of POE-Component-SSLify. | |
76 | 76 | |
77 | 77 | =head1 DESCRIPTION |
78 | 78 |
8 | 8 | use strict; use warnings; |
9 | 9 | package POE::Component::SSLify::ServerHandle; |
10 | 10 | BEGIN { |
11 | $POE::Component::SSLify::ServerHandle::VERSION = '1.005'; | |
11 | $POE::Component::SSLify::ServerHandle::VERSION = '1.008'; | |
12 | 12 | } |
13 | 13 | BEGIN { |
14 | 14 | $POE::Component::SSLify::ServerHandle::AUTHORITY = 'cpan:APOCAL'; |
42 | 42 | 'fileno' => $fileno, |
43 | 43 | 'status' => $res, |
44 | 44 | 'on_connect' => $connref, |
45 | 'ssl_started' => 0, | |
45 | 46 | }, $class; |
46 | 47 | |
47 | 48 | return $self; |
48 | 49 | } |
50 | ||
51 | # TODO should we make a convenience function to convert retval to string equivalents for easier debugging? | |
52 | # From OpenSSL 1.0.0d | |
53 | #define SSL_ERROR_NONE 0 | |
54 | #define SSL_ERROR_SSL 1 | |
55 | #define SSL_ERROR_WANT_READ 2 | |
56 | #define SSL_ERROR_WANT_WRITE 3 | |
57 | #define SSL_ERROR_WANT_X509_LOOKUP 4 | |
58 | #define SSL_ERROR_SYSCALL 5 /* look at error stack/return value/errno */ | |
59 | #define SSL_ERROR_ZERO_RETURN 6 | |
60 | #define SSL_ERROR_WANT_CONNECT 7 | |
61 | #define SSL_ERROR_WANT_ACCEPT 8 | |
49 | 62 | |
50 | 63 | sub _check_status { |
51 | 64 | my $self = shift; |
58 | 71 | $self->{'status'} = Net::SSLeay::accept( $self->{'ssl'} ); |
59 | 72 | } |
60 | 73 | |
61 | # Only process the stuff if we actually have a callback! | |
62 | return unless defined $self->{'on_connect'}; | |
63 | ||
64 | 74 | if ( $self->{'status'} <= 0 ) { |
65 | 75 | # http://www.openssl.org/docs/ssl/SSL_get_error.html |
66 | 76 | my $errval = Net::SSLeay::get_error( $self->{'ssl'}, $self->{'status'} ); |
67 | 77 | |
78 | # Handle the case of ERROR_WANT_READ and ERROR_WANT_WRITE | |
68 | 79 | # TODO should we skip ERROR_WANT_ACCEPT and ERROR_WANT_CONNECT ? |
69 | 80 | # also, ERROR_WANT_ACCEPT isn't exported by Net::SSLeay, huh? |
70 | if ( $errval != ERROR_WANT_READ and $errval != ERROR_WANT_WRITE ) { | |
81 | if ( $errval == ERROR_WANT_READ or $errval == ERROR_WANT_WRITE ) { | |
82 | # continue reading/writing from the socket until we connect or not... | |
83 | return 1; | |
84 | } else { | |
71 | 85 | # call the hook function for error connect |
72 | $self->{'on_connect'}->( $self->{'orig_socket'}, 0, $errval ); | |
86 | if ( defined $self->{'on_connect'} ) { | |
87 | $self->{'on_connect'}->( $self->{'orig_socket'}, 0, $errval ); | |
88 | } | |
89 | ||
90 | # don't try to read/write from the socket anymore! | |
91 | return 0; | |
73 | 92 | } |
74 | 93 | } elsif ( $self->{'status'} == 1 ) { |
94 | # SSL handshake is done! | |
95 | $self->{'ssl_started'} = 1; | |
96 | ||
75 | 97 | # call the hook function for successful connect |
76 | $self->{'on_connect'}->( $self->{'orig_socket'}, 1 ); | |
98 | if ( defined $self->{'on_connect'} ) { | |
99 | $self->{'on_connect'}->( $self->{'orig_socket'}, 1 ); | |
100 | } | |
101 | ||
102 | # we can now read/write from the socket! | |
103 | return 1; | |
77 | 104 | } |
78 | 105 | } |
79 | 106 | |
85 | 112 | # Get the pointers to buffer, length, and the offset |
86 | 113 | my( $buf, $len, $offset ) = \( @_ ); |
87 | 114 | |
88 | # Check connection status | |
89 | $self->_check_status if $self->{'status'} <= 0; | |
115 | # Check the status of the SSL handshake | |
116 | if ( ! $self->{'ssl_started'} ) { | |
117 | return if $self->_check_status == 0; | |
118 | } | |
90 | 119 | |
91 | 120 | # If we have no offset, replace the buffer with some input |
92 | 121 | if ( ! defined $$offset ) { |
94 | 123 | |
95 | 124 | # Are we done? |
96 | 125 | if ( defined $$buf ) { |
126 | # TODO do we need the same "flush is success" logic in WRITE? | |
127 | ||
97 | 128 | return length( $$buf ); |
98 | 129 | } else { |
99 | 130 | # Nah, clear the buffer too... |
105 | 136 | # Now, actually read the data |
106 | 137 | defined( my $read = Net::SSLeay::read( $self->{'ssl'}, $$len ) ) or return; |
107 | 138 | |
139 | # TODO do we need the same "flush is success" logic in WRITE? | |
140 | ||
108 | 141 | # Figure out the buffer and offset |
109 | 142 | my $buf_len = length( $$buf ); |
110 | 143 | |
125 | 158 | # Get ourself + buffer + length + offset to write |
126 | 159 | my( $self, $buf, $len, $offset ) = @_; |
127 | 160 | |
128 | # Check connection status | |
129 | $self->_check_status if $self->{'status'} <= 0; | |
161 | # Check the status of the SSL handshake | |
162 | if ( ! $self->{'ssl_started'} ) { | |
163 | # The normal syswrite() POE uses expects 0 here. | |
164 | return 0 if $self->_check_status == 0; | |
165 | } | |
130 | 166 | |
131 | 167 | # If we have nothing to offset, then start from the beginning |
132 | 168 | if ( ! defined $offset ) { |
143 | 179 | # The normal syswrite() POE uses expects 0 here. |
144 | 180 | return 0; |
145 | 181 | } else { |
182 | # We flushed some data, which means we finished the handshake! | |
183 | # This is IMPORTANT, as MIRE found out! | |
184 | # Otherwise openssl will zonk out and give us SSL_ERROR_SSL and things randomly break :( | |
185 | # this is because we tried to connect() or accept() and the handshake was done... or something like that hah | |
186 | if ( ! $self->{'ssl_started'} ) { | |
187 | $self->{'ssl_started'} = 1; | |
188 | $self->{'status'} = 1; | |
189 | ||
190 | # call the hook function for successful connect | |
191 | if ( defined $self->{'on_connect'} ) { | |
192 | $self->{'on_connect'}->( $self->{'orig_socket'}, 1 ); | |
193 | } | |
194 | } | |
195 | ||
146 | 196 | # All done! |
147 | 197 | return $wrote_len; |
148 | 198 | } |
224 | 274 | |
225 | 275 | =head1 VERSION |
226 | 276 | |
227 | This document describes v1.005 of POE::Component::SSLify::ServerHandle - released March 10, 2011 as part of POE-Component-SSLify. | |
277 | This document describes v1.008 of POE::Component::SSLify::ServerHandle - released May 04, 2011 as part of POE-Component-SSLify. | |
228 | 278 | |
229 | 279 | =head1 DESCRIPTION |
230 | 280 |
8 | 8 | use strict; use warnings; |
9 | 9 | package POE::Component::SSLify; |
10 | 10 | BEGIN { |
11 | $POE::Component::SSLify::VERSION = '1.005'; | |
11 | $POE::Component::SSLify::VERSION = '1.008'; | |
12 | 12 | } |
13 | 13 | BEGIN { |
14 | 14 | $POE::Component::SSLify::AUTHORITY = 'cpan:APOCAL'; |
15 | 15 | } |
16 | 16 | |
17 | 17 | # ABSTRACT: Makes using SSL in the world of POE easy! |
18 | ||
19 | BEGIN { | |
20 | # should fix netbsd smoke failures, thanks BinGOs! | |
21 | # <BinGOs> Apocal: okay cores with a 0.9.7d I've built myself from source. Doesn't if I comment out engine lines. | |
22 | # BinGOs did an awesome job building various versions of openssl to try and track down the problem, it seems like | |
23 | # newer versions of openssl worked fine on netbsd, but I don't want to do crazy stuff like probing openssl versions | |
24 | # as it's fragile - best to let the user figure it out :) | |
25 | # | |
26 | # see http://www.cpantesters.org/cpan/report/1a660280-6eb1-11e0-a462-e9956c33433b | |
27 | # http://www.cpantesters.org/cpan/report/49a9f2aa-6df2-11e0-a462-e9956c33433b | |
28 | # http://www.cpantesters.org/cpan/report/78d9a234-6df5-11e0-a462-e9956c33433b | |
29 | # and many other reports :( | |
30 | # | |
31 | #(gdb) bt | |
32 | ##0 0xbd9d3e7e in engine_table_select () from /usr/lib/libcrypto.so.2 | |
33 | ##1 0xbd9b3bed in ENGINE_get_default_RSA () from /usr/lib/libcrypto.so.2 | |
34 | ##2 0xbd9b1f6d in RSA_new_method () from /usr/lib/libcrypto.so.2 | |
35 | ##3 0xbd9b1cf6 in RSA_new () from /usr/lib/libcrypto.so.2 | |
36 | ##4 0xbd9cf8a1 in RSAPrivateKey_asn1_meth () from /usr/lib/libcrypto.so.2 | |
37 | ##5 0xbd9da64b in ASN1_item_ex_new () from /usr/lib/libcrypto.so.2 | |
38 | ##6 0xbd9da567 in ASN1_item_ex_new () from /usr/lib/libcrypto.so.2 | |
39 | ##7 0xbd9d88cc in ASN1_item_ex_d2i () from /usr/lib/libcrypto.so.2 | |
40 | ##8 0xbd9d8437 in ASN1_item_d2i () from /usr/lib/libcrypto.so.2 | |
41 | ##9 0xbd9cf8d5 in d2i_RSAPrivateKey () from /usr/lib/libcrypto.so.2 | |
42 | ##10 0xbd9ad546 in d2i_PrivateKey () from /usr/lib/libcrypto.so.2 | |
43 | ##11 0xbd995e63 in PEM_read_bio_PrivateKey () from /usr/lib/libcrypto.so.2 | |
44 | ##12 0xbd980430 in PEM_read_bio_RSAPrivateKey () from /usr/lib/libcrypto.so.2 | |
45 | ##13 0xbda2e9dc in SSL_CTX_use_RSAPrivateKey_file () from /usr/lib/libssl.so.3 | |
46 | ##14 0xbda5aabe in XS_Net__SSLeay_CTX_use_RSAPrivateKey_file (cv=0x8682c80) | |
47 | # at SSLeay.c:1716 | |
48 | ##15 0x08115401 in Perl_pp_entersub () at pp_hot.c:2885 | |
49 | ##16 0x080e0ab7 in Perl_runops_debug () at dump.c:2049 | |
50 | ##17 0x08078624 in S_run_body (oldscope=1) at perl.c:2308 | |
51 | ##18 0x08077ef2 in perl_run (my_perl=0x823f030) at perl.c:2233 | |
52 | ##19 0x0805e321 in main (argc=3, argv=0xbfbfe6a0, env=0xbfbfe6b0) | |
53 | # at perlmain.c:117 | |
54 | ##20 0x0805e0c6 in ___start () | |
55 | #(gdb) | |
56 | if ( ! defined &LOAD_SSL_ENGINES ) { *LOAD_SSL_ENGINES = sub () { 0 } } | |
57 | } | |
18 | 58 | |
19 | 59 | # We need Net::SSLeay or all's a failure! |
20 | 60 | BEGIN { |
34 | 74 | # Taken from http://search.cpan.org/~flora/Net-SSLeay-1.36/lib/Net/SSLeay.pm#Low_level_API |
35 | 75 | Net::SSLeay::load_error_strings(); |
36 | 76 | Net::SSLeay::SSLeay_add_ssl_algorithms(); |
37 | Net::SSLeay::ENGINE_load_builtin_engines(); | |
38 | Net::SSLeay::ENGINE_register_all_complete(); | |
77 | if ( LOAD_SSL_ENGINES ) { | |
78 | Net::SSLeay::ENGINE_load_builtin_engines(); | |
79 | Net::SSLeay::ENGINE_register_all_complete(); | |
80 | } | |
39 | 81 | Net::SSLeay::randomize(); |
40 | 82 | } |
41 | 83 | } |
57 | 99 | # Use Scalar::Util's weaken() for the connref stuff |
58 | 100 | use Scalar::Util qw( weaken ); |
59 | 101 | use Task::Weaken 1.03; # to make sure it actually works! |
102 | ||
103 | # load POE ( just to fool dzil AutoPrereqs :) | |
104 | require POE; | |
60 | 105 | |
61 | 106 | # The server-side CTX stuff |
62 | 107 | my $ctx; |
281 | 326 | |
282 | 327 | =head1 VERSION |
283 | 328 | |
284 | This document describes v1.005 of POE::Component::SSLify - released March 10, 2011 as part of POE-Component-SSLify. | |
329 | This document describes v1.008 of POE::Component::SSLify - released May 04, 2011 as part of POE-Component-SSLify. | |
285 | 330 | |
286 | 331 | =head1 SYNOPSIS |
287 | 332 | |
572 | 617 | |
573 | 618 | =head3 Net::SSLeay::renegotiate |
574 | 619 | |
575 | This function has been tested ( it's in C<t/2_renegotiate.t> ) but it doesn't work on FreeBSD! I tracked it down to this security advisory: | |
576 | L<http://security.freebsd.org/advisories/FreeBSD-SA-09:15.ssl.asc> which explains it in detail. The test will skip this function | |
620 | This function has been tested ( it's in C<t/2_renegotiate_client.t> ) but it doesn't work on FreeBSD! I tracked it down to this security | |
621 | advisory: L<http://security.freebsd.org/advisories/FreeBSD-SA-09:15.ssl.asc> which explains it in detail. The test will skip this function | |
577 | 622 | if it detects that you're on a broken system. However, if you have the updated OpenSSL library that fixes this you can use it. |
578 | 623 | |
579 | 624 | NOTE: Calling this means the callback function you passed in L</Client_SSLify> or L</Server_SSLify> will not fire! If you need this |
593 | 638 | This module doesn't work on MSWin32 platforms at all ( XP, Vista, 7, etc ) because of some weird underlying fd issues. Since I'm not a windows |
594 | 639 | developer, I'm unable to fix this. However, it seems like Cygwin on MSWin32 works just fine! Please help me fix this if you can, thanks! |
595 | 640 | |
641 | =head2 LOAD_SSL_ENGINES | |
642 | ||
643 | OpenSSL supports loading ENGINEs to accelerate the crypto algorithms. SSLify v1.004 automatically loaded the engines, but there was some | |
644 | problems on certain platforms that caused coredumps. A big shout-out to BinGOs and CPANTesters for catching this! It's now disabled in v1.007 | |
645 | and you would need to explicitly enable it. | |
646 | ||
647 | sub POE::Component::SSLify::LOAD_SSL_ENGINES () { 1 } | |
648 | use POE::Component::SSLify qw( Client::SSLify ); | |
649 | ||
596 | 650 | =head1 EXPORT |
597 | 651 | |
598 | 652 | Stuffs all of the functions in @EXPORT_OK so you have to request them directly. |
632 | 686 | |
633 | 687 | Search CPAN |
634 | 688 | |
689 | The default CPAN search engine, useful to view POD in HTML format. | |
690 | ||
635 | 691 | L<http://search.cpan.org/dist/POE-Component-SSLify> |
636 | 692 | |
637 | 693 | =item * |
638 | 694 | |
639 | 695 | RT: CPAN's Bug Tracker |
640 | 696 | |
697 | The RT ( Request Tracker ) website is the default bug/issue tracking system for CPAN. | |
698 | ||
641 | 699 | L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=POE-Component-SSLify> |
642 | 700 | |
643 | 701 | =item * |
644 | 702 | |
645 | AnnoCPAN: Annotated CPAN documentation | |
703 | AnnoCPAN | |
704 | ||
705 | The AnnoCPAN is a website that allows community annonations of Perl module documentation. | |
646 | 706 | |
647 | 707 | L<http://annocpan.org/dist/POE-Component-SSLify> |
648 | 708 | |
650 | 710 | |
651 | 711 | CPAN Ratings |
652 | 712 | |
713 | The CPAN Ratings is a website that allows community ratings and reviews of Perl modules. | |
714 | ||
653 | 715 | L<http://cpanratings.perl.org/d/POE-Component-SSLify> |
654 | 716 | |
655 | 717 | =item * |
656 | 718 | |
657 | 719 | CPAN Forum |
658 | 720 | |
721 | The CPAN Forum is a web forum for discussing Perl modules. | |
722 | ||
659 | 723 | L<http://cpanforum.com/dist/POE-Component-SSLify> |
660 | 724 | |
661 | 725 | =item * |
662 | 726 | |
663 | CPANTS Kwalitee | |
727 | CPANTS | |
728 | ||
729 | The CPANTS is a website that analyzes the Kwalitee ( code metrics ) of a distribution. | |
664 | 730 | |
665 | 731 | L<http://cpants.perl.org/dist/overview/POE-Component-SSLify> |
666 | 732 | |
667 | 733 | =item * |
668 | 734 | |
669 | CPAN Testers Results | |
670 | ||
671 | L<http://cpantesters.org/distro/P/POE-Component-SSLify.html> | |
735 | CPAN Testers | |
736 | ||
737 | The CPAN Testers is a network of smokers who run automated tests on uploaded CPAN distributions. | |
738 | ||
739 | L<http://www.cpantesters.org/distro/P/POE-Component-SSLify> | |
672 | 740 | |
673 | 741 | =item * |
674 | 742 | |
675 | 743 | CPAN Testers Matrix |
676 | 744 | |
745 | The CPAN Testers Matrix is a website that provides a visual way to determine what Perls/platforms PASSed for a distribution. | |
746 | ||
677 | 747 | L<http://matrix.cpantesters.org/?dist=POE-Component-SSLify> |
748 | ||
749 | =item * | |
750 | ||
751 | CPAN Testers Dependencies | |
752 | ||
753 | The CPAN Testers Dependencies is a website that shows a chart of the test results of all dependencies for a distribution. | |
754 | ||
755 | L<http://deps.cpantesters.org/?module=POE::Component::SSLify> | |
678 | 756 | |
679 | 757 | =back |
680 | 758 |
8 | 8 | END { $success && done_testing; } |
9 | 9 | |
10 | 10 | my $v = "\n"; |
11 | ||
12 | # List our own version used to generate this | |
13 | $v .= "Generated by Dist::Zilla::Plugin::ReportVersions::Tiny v1.03\n"; | |
11 | 14 | |
12 | 15 | eval { # no excuses! |
13 | 16 | # report our Perl details |
70 | 73 | |
71 | 74 | Thanks for using my code. I hope it works for you. |
72 | 75 | If not, please try and include this output in the bug report. |
73 | That will help me reproduce the issue and solve you problem. | |
76 | That will help me reproduce the issue and solve your problem. | |
74 | 77 | |
75 | 78 | EOT |
76 | 79 |
0 | #!/usr/bin/perl | |
1 | # | |
2 | # This file is part of POE-Component-SSLify | |
3 | # | |
4 | # This software is copyright (c) 2011 by Apocalypse. | |
5 | # | |
6 | # This is free software; you can redistribute it and/or modify it under | |
7 | # the same terms as the Perl 5 programming language system itself. | |
8 | # | |
9 | use strict; use warnings; | |
10 | use strict; use warnings; | |
11 | ||
12 | # Thanks to ASCENT for this test! | |
13 | # This test adds renegotiation to the connection from client-side | |
14 | # Since this is not supported on all platforms, it's marked TODO and adds custom logic | |
15 | # to make sure it doesn't FAIL if it's not supported. | |
16 | ||
17 | my $numtests; | |
18 | BEGIN { | |
19 | $numtests = 23; | |
20 | ||
21 | eval "use Test::NoWarnings"; | |
22 | if ( ! $@ ) { | |
23 | # increment by one | |
24 | $numtests++; | |
25 | } | |
26 | } | |
27 | ||
28 | use Test::More tests => $numtests; | |
29 | ||
30 | use POE 1.267; | |
31 | use POE::Component::Client::TCP; | |
32 | use POE::Component::Server::TCP; | |
33 | use POE::Component::SSLify qw/Client_SSLify Server_SSLify SSLify_Options SSLify_GetCipher SSLify_ContextCreate SSLify_GetSocket SSLify_GetSSL/; | |
34 | use Net::SSLeay qw/ERROR_WANT_READ ERROR_WANT_WRITE/; | |
35 | ||
36 | # TODO rewrite this to use Test::POE::Server::TCP and stuff :) | |
37 | ||
38 | my $port; | |
39 | my $server_ping2; | |
40 | my $client_ping2; | |
41 | ||
42 | POE::Component::Server::TCP->new | |
43 | ( | |
44 | Alias => 'myserver', | |
45 | Address => '127.0.0.1', | |
46 | Port => 0, | |
47 | ||
48 | Started => sub | |
49 | { | |
50 | use Socket qw/sockaddr_in/; | |
51 | $port = (sockaddr_in($_[HEAP]->{listener}->getsockname))[0]; | |
52 | }, | |
53 | ClientConnected => sub | |
54 | { | |
55 | ok(1, 'SERVER: accepted'); | |
56 | }, | |
57 | ClientDisconnected => sub | |
58 | { | |
59 | ok(1, 'SERVER: client disconnected'); | |
60 | $_[KERNEL]->post(myserver => 'shutdown'); | |
61 | }, | |
62 | ClientPreConnect => sub | |
63 | { | |
64 | eval { SSLify_Options('mylib/example.key', 'mylib/example.crt', 'sslv3') }; | |
65 | eval { SSLify_Options('../mylib/example.key', '../mylib/example.crt', 'sslv3') } if ($@); | |
66 | ok(!$@, "SERVER: SSLify_Options $@"); | |
67 | ||
68 | my $socket = eval { Server_SSLify($_[ARG0]) }; | |
69 | ok(!$@, "SERVER: Server_SSLify $@"); | |
70 | ok(1, 'SERVER: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
71 | ||
72 | # We pray that IO::Handle is sane... | |
73 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'SERVER: SSLified socket is non-blocking?'); | |
74 | ||
75 | return ($socket); | |
76 | }, | |
77 | ClientInput => sub | |
78 | { | |
79 | my ($kernel, $heap, $request) = @_[KERNEL, HEAP, ARG0]; | |
80 | ||
81 | ## At this point, connection MUST be encrypted. | |
82 | my $cipher = SSLify_GetCipher($heap->{client}->get_output_handle); | |
83 | ok($cipher ne '(NONE)', "SERVER: SSLify_GetCipher: $cipher"); | |
84 | ||
85 | if ($request eq 'ping') | |
86 | { | |
87 | ok(1, "SERVER: recv: $request"); | |
88 | $heap->{client}->put("pong"); | |
89 | } | |
90 | elsif ($request eq 'ping2') | |
91 | { | |
92 | ok(1, "SERVER: recv: $request"); | |
93 | $server_ping2++; | |
94 | $heap->{client}->put("pong2"); | |
95 | } | |
96 | }, | |
97 | ClientError => sub | |
98 | { | |
99 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
100 | # The default PoCo::Server::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
101 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
102 | ||
103 | # TODO are there other "errors" that is harmless? | |
104 | $error = "Normal disconnection" unless $error; | |
105 | my $msg = "Got SERVER $syscall error $errno: $error"; | |
106 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
107 | fail( $msg ); | |
108 | } else { | |
109 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
110 | } | |
111 | }, | |
112 | ); | |
113 | ||
114 | POE::Component::Client::TCP->new | |
115 | ( | |
116 | Alias => 'myclient', | |
117 | RemoteAddress => '127.0.0.1', | |
118 | RemotePort => $port, | |
119 | ||
120 | Connected => sub | |
121 | { | |
122 | ok(1, 'CLIENT: connected'); | |
123 | ||
124 | $_[HEAP]->{server}->put("ping"); | |
125 | }, | |
126 | PreConnect => sub | |
127 | { | |
128 | my $ctx = eval { SSLify_ContextCreate(undef, undef, 'sslv3') }; | |
129 | ok(!$@, "CLIENT: SSLify_ContextCreate $@"); | |
130 | my $socket = eval { Client_SSLify($_[ARG0], undef, undef, $ctx) }; | |
131 | ok(!$@, "CLIENT: Client_SSLify $@"); | |
132 | ok(1, 'CLIENT: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
133 | ||
134 | # We pray that IO::Handle is sane... | |
135 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'CLIENT: SSLified socket is non-blocking?'); | |
136 | ||
137 | return ($socket); | |
138 | }, | |
139 | ServerInput => sub | |
140 | { | |
141 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
142 | ||
143 | ## At this point, connection MUST be encrypted. | |
144 | my $cipher = SSLify_GetCipher($heap->{server}->get_output_handle); | |
145 | ok($cipher ne '(NONE)', "CLIENT: SSLify_GetCipher: $cipher"); | |
146 | ||
147 | if ($line eq 'pong') | |
148 | { | |
149 | ok(1, "CLIENT: recv: $line"); | |
150 | ||
151 | # Skip 2 Net::SSLeay::renegotiate() tests on FreeBSD because of | |
152 | # http://security.freebsd.org/advisories/FreeBSD-SA-09:15.ssl.asc | |
153 | TODO: { | |
154 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
155 | ||
156 | ## Force SSL renegotiation | |
157 | my $ssl = SSLify_GetSSL( $heap->{server}->get_output_handle ); | |
158 | my $reneg_num = Net::SSLeay::num_renegotiations($ssl); | |
159 | ||
160 | ok(1 == Net::SSLeay::renegotiate($ssl), 'CLIENT: SSL renegotiation'); | |
161 | my $handshake = Net::SSLeay::do_handshake($ssl); | |
162 | my $err = Net::SSLeay::get_error($ssl, $handshake); | |
163 | ||
164 | ## 1 == Successful handshake, ERROR_WANT_(READ|WRITE) == non-blocking. | |
165 | ok($handshake == 1 || $err == ERROR_WANT_READ || $err == ERROR_WANT_WRITE, 'CLIENT: SSL handshake'); | |
166 | ok($reneg_num < Net::SSLeay::num_renegotiations($ssl), 'CLIENT: Increased number of negotiations'); | |
167 | } | |
168 | ||
169 | $heap->{server}->put('ping2'); | |
170 | } | |
171 | ||
172 | elsif ($line eq 'pong2') | |
173 | { | |
174 | ok(1, "CLIENT: recv: $line"); | |
175 | $client_ping2++; | |
176 | $kernel->yield('shutdown'); | |
177 | } | |
178 | }, | |
179 | ServerError => sub | |
180 | { | |
181 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
182 | # The default PoCo::Client::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
183 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
184 | ||
185 | # TODO are there other "errors" that is harmless? | |
186 | $error = "Normal disconnection" unless $error; | |
187 | my $msg = "Got CLIENT $syscall error $errno: $error"; | |
188 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
189 | fail( $msg ); | |
190 | } else { | |
191 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
192 | } | |
193 | }, | |
194 | ); | |
195 | ||
196 | $poe_kernel->run(); | |
197 | ||
198 | # Add extra pass() to make the test harness happy if renegotiate did not work | |
199 | if ( ! $server_ping2 ) { | |
200 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
201 | fail( "SERVER: Failed SSL renegotiation" ); | |
202 | } | |
203 | if ( ! $client_ping2 ) { | |
204 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
205 | fail( "CLIENT: Failed SSL renegotiation" ); | |
206 | } | |
207 | if ( ! $server_ping2 or ! $client_ping2 ) { | |
208 | diag( "WARNING: Your platform/SSL library does not support renegotiation of the SSL socket." ); | |
209 | diag( "This test harness detected that trying to renegotiate resulted in a disconnected socket." ); | |
210 | diag( "POE::Component::SSLify will work on your system, but please do not attempt a SSL renegotiate." ); | |
211 | diag( "Please talk with the author to figure out if this issue can be worked around, thank you!" ); | |
212 | } | |
213 | ||
214 | pass( 'shut down sanely' ); | |
215 | ||
216 | exit 0; |
0 | #!/usr/bin/perl | |
1 | # | |
2 | # This file is part of POE-Component-SSLify | |
3 | # | |
4 | # This software is copyright (c) 2011 by Apocalypse. | |
5 | # | |
6 | # This is free software; you can redistribute it and/or modify it under | |
7 | # the same terms as the Perl 5 programming language system itself. | |
8 | # | |
9 | use strict; use warnings; | |
10 | use strict; use warnings; | |
11 | ||
12 | # Thanks to ASCENT for this test! | |
13 | # This test adds renegotiation to the connection from client-side | |
14 | ||
15 | # In an older version of this test, there was ok() littered everywhere | |
16 | # but dngor replied in http://rt.cpan.org/Public/Bug/Display.html?id=66741 | |
17 | # that it's not going to work... how do I predict which ok() will fail and "simulate" them? | |
18 | # the solution was to... only run a few tests and print the diag | |
19 | # because the rest of the tests just redo what we already have in 1_simple.t and stuff... | |
20 | ||
21 | my $numtests; | |
22 | BEGIN { | |
23 | $numtests = 16; | |
24 | ||
25 | eval "use Test::NoWarnings"; | |
26 | if ( ! $@ ) { | |
27 | # increment by one | |
28 | $numtests++; | |
29 | } | |
30 | } | |
31 | ||
32 | use Test::More tests => $numtests; | |
33 | ||
34 | use POE 1.267; | |
35 | use POE::Component::Client::TCP; | |
36 | use POE::Component::Server::TCP; | |
37 | use POE::Component::SSLify qw/Client_SSLify Server_SSLify SSLify_Options SSLify_GetCipher SSLify_ContextCreate SSLify_GetSocket SSLify_GetSSL/; | |
38 | use Net::SSLeay qw/ERROR_WANT_READ ERROR_WANT_WRITE/; | |
39 | ||
40 | # TODO rewrite this to use Test::POE::Server::TCP and stuff :) | |
41 | ||
42 | my $port; | |
43 | my $server_ping2; | |
44 | my $client_ping2; | |
45 | ||
46 | POE::Component::Server::TCP->new | |
47 | ( | |
48 | Alias => 'myserver', | |
49 | Address => '127.0.0.1', | |
50 | Port => 0, | |
51 | ||
52 | Started => sub | |
53 | { | |
54 | use Socket qw/sockaddr_in/; | |
55 | $port = (sockaddr_in($_[HEAP]->{listener}->getsockname))[0]; | |
56 | }, | |
57 | ClientConnected => sub | |
58 | { | |
59 | ok(1, 'SERVER: accepted'); | |
60 | }, | |
61 | ClientDisconnected => sub | |
62 | { | |
63 | ok(1, 'SERVER: client disconnected'); | |
64 | $_[KERNEL]->post(myserver => 'shutdown'); | |
65 | }, | |
66 | ClientPreConnect => sub | |
67 | { | |
68 | eval { SSLify_Options('mylib/example.key', 'mylib/example.crt', 'sslv3') }; | |
69 | eval { SSLify_Options('../mylib/example.key', '../mylib/example.crt', 'sslv3') } if ($@); | |
70 | ok(!$@, "SERVER: SSLify_Options $@"); | |
71 | ||
72 | my $socket = eval { Server_SSLify($_[ARG0]) }; | |
73 | ok(!$@, "SERVER: Server_SSLify $@"); | |
74 | ok(1, 'SERVER: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
75 | ||
76 | # We pray that IO::Handle is sane... | |
77 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'SERVER: SSLified socket is non-blocking?'); | |
78 | ||
79 | return ($socket); | |
80 | }, | |
81 | ClientInput => sub | |
82 | { | |
83 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
84 | ||
85 | if ($line eq 'ping') { | |
86 | ok(1, "SERVER: recv: $line"); | |
87 | ||
88 | ## At this point, connection MUST be encrypted. | |
89 | my $cipher = SSLify_GetCipher($heap->{client}->get_output_handle); | |
90 | ok($cipher ne '(NONE)', "SERVER: SSLify_GetCipher: $cipher"); | |
91 | ||
92 | $heap->{client}->put("pong"); | |
93 | } elsif ($line eq 'ping2') { | |
94 | $server_ping2++; | |
95 | $heap->{client}->put("pong2"); | |
96 | } else { | |
97 | die "Unknown line from CLIENT: $line"; | |
98 | } | |
99 | }, | |
100 | ClientError => sub | |
101 | { | |
102 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
103 | # The default PoCo::Server::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
104 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
105 | ||
106 | # TODO are there other "errors" that is harmless? | |
107 | $error = "Normal disconnection" unless $error; | |
108 | my $msg = "Got SERVER $syscall error $errno: $error"; | |
109 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
110 | # fail( $msg ); | |
111 | } else { | |
112 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
113 | } | |
114 | }, | |
115 | ); | |
116 | ||
117 | POE::Component::Client::TCP->new | |
118 | ( | |
119 | Alias => 'myclient', | |
120 | RemoteAddress => '127.0.0.1', | |
121 | RemotePort => $port, | |
122 | ||
123 | Connected => sub | |
124 | { | |
125 | ok(1, 'CLIENT: connected'); | |
126 | ||
127 | $_[HEAP]->{server}->put("ping"); | |
128 | }, | |
129 | PreConnect => sub | |
130 | { | |
131 | my $ctx = eval { SSLify_ContextCreate(undef, undef, 'sslv3') }; | |
132 | ok(!$@, "CLIENT: SSLify_ContextCreate $@"); | |
133 | my $socket = eval { Client_SSLify($_[ARG0], undef, undef, $ctx) }; | |
134 | ok(!$@, "CLIENT: Client_SSLify $@"); | |
135 | ok(1, 'CLIENT: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
136 | ||
137 | # We pray that IO::Handle is sane... | |
138 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'CLIENT: SSLified socket is non-blocking?'); | |
139 | ||
140 | return ($socket); | |
141 | }, | |
142 | ServerInput => sub | |
143 | { | |
144 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
145 | ||
146 | if ($line eq 'pong') { | |
147 | ok(1, "CLIENT: recv: $line"); | |
148 | ||
149 | ## At this point, connection MUST be encrypted. | |
150 | my $cipher = SSLify_GetCipher($heap->{server}->get_output_handle); | |
151 | ok($cipher ne '(NONE)', "CLIENT: SSLify_GetCipher: $cipher"); | |
152 | ||
153 | # do the actual renegotiate | |
154 | Net::SSLeay::renegotiate( SSLify_GetSSL( $heap->{server}->get_output_handle ) ); | |
155 | ||
156 | $heap->{server}->put('ping2'); | |
157 | } elsif ($line eq 'pong2') { | |
158 | $client_ping2++; | |
159 | $kernel->yield('shutdown'); | |
160 | } else { | |
161 | die "Unknown line from SERVER: $line"; | |
162 | } | |
163 | }, | |
164 | ServerError => sub | |
165 | { | |
166 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
167 | # The default PoCo::Client::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
168 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
169 | ||
170 | $error = "Normal disconnection" unless $error; | |
171 | my $msg = "Got CLIENT $syscall error $errno: $error"; | |
172 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
173 | }, | |
174 | ); | |
175 | ||
176 | $poe_kernel->run(); | |
177 | ||
178 | if ( ! $server_ping2 or ! $client_ping2 ) { | |
179 | diag( "WARNING: Your platform/SSL library does not support renegotiation of the SSL socket." ); | |
180 | diag( "This test harness detected that trying to renegotiate resulted in a disconnected socket." ); | |
181 | diag( "POE::Component::SSLify will work on your system, but please do not attempt a SSL renegotiate." ); | |
182 | diag( "Please talk with the author to figure out if this issue can be worked around, thank you!" ); | |
183 | } | |
184 | ||
185 | pass( 'shut down sanely' ); | |
186 | ||
187 | exit 0; |
13 | 13 | |
14 | 14 | my $numtests; |
15 | 15 | BEGIN { |
16 | $numtests = 17; | |
16 | $numtests = 19; | |
17 | 17 | |
18 | 18 | eval "use Test::NoWarnings"; |
19 | 19 | if ( ! $@ ) { |
79 | 79 | { |
80 | 80 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; |
81 | 81 | |
82 | die "Unknown line from CLIENT: $line"; | |
82 | if ( $line ne 'ping' ) { | |
83 | die "Unknown line from CLIENT: $line"; | |
84 | } else { | |
85 | ok(1, "SERVER: recv: $line"); | |
86 | $_[HEAP]->{client}->put("pong"); | |
87 | } | |
83 | 88 | }, |
84 | 89 | ClientError => sub |
85 | 90 | { |
107 | 112 | Connected => sub |
108 | 113 | { |
109 | 114 | ok(1, 'CLIENT: connected'); |
115 | $_[HEAP]->{server}->put("ping"); | |
110 | 116 | }, |
111 | 117 | PreConnect => sub |
112 | 118 | { |
113 | 119 | my $socket = eval { Client_SSLify($_[ARG0], sub { |
114 | 120 | my( $socket, $status, $errval ) = @_; |
115 | 121 | |
116 | pass( "CLIENT: Got callback hook" ); | |
122 | pass( "CLIENT: Got callback hook status" ); | |
117 | 123 | is( $status, 1, "CLIENT: Status received from callback is OK" ); |
118 | 124 | |
119 | 125 | ## At this point, connection MUST be encrypted. |
120 | 126 | my $cipher = SSLify_GetCipher($socket); |
121 | 127 | ok($cipher ne '(NONE)', "CLIENT: SSLify_GetCipher: $cipher"); |
122 | 128 | ok( SSLify_GetStatus($socket) == 1, "CLIENT: SSLify_GetStatus is done" ); |
123 | ||
124 | $poe_kernel->post( 'myclient' => 'shutdown' ); | |
125 | 129 | }) }; |
126 | 130 | ok(!$@, "CLIENT: Client_SSLify $@"); |
127 | 131 | ok( SSLify_GetStatus($socket) == -1, "CLIENT: SSLify_GetStatus is pending" ); |
132 | 136 | { |
133 | 137 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; |
134 | 138 | |
135 | die "Should have never got any input from the server!"; | |
139 | if ( $line ne 'pong' ) { | |
140 | die "Unknown line from CLIENT: $line"; | |
141 | } else { | |
142 | ok(1, "CLIENT: recv: $line"); | |
143 | $kernel->yield('shutdown'); | |
144 | } | |
136 | 145 | }, |
137 | 146 | ServerError => sub |
138 | 147 | { |
47 | 47 | ClientConnected => sub |
48 | 48 | { |
49 | 49 | ok(1, 'SERVER: accepted'); |
50 | ||
51 | # purposefully send garbage so we screw up the ssl connect on the client-side | |
52 | $_[HEAP]->{client}->put( 'garbage in, garbage out' ); | |
50 | 53 | }, |
51 | 54 | ClientDisconnected => sub |
52 | 55 | { |
13 | 13 | |
14 | 14 | my $numtests; |
15 | 15 | BEGIN { |
16 | $numtests = 8; | |
16 | $numtests = 9; | |
17 | 17 | |
18 | # eval "use Test::NoWarnings"; | |
19 | # if ( ! $@ ) { | |
20 | # # increment by one | |
21 | # $numtests++; | |
22 | # } | |
18 | eval "use Test::NoWarnings"; | |
19 | if ( ! $@ ) { | |
20 | # increment by one | |
21 | $numtests++; | |
22 | } | |
23 | 23 | } |
24 | 24 | |
25 | # For some reason I can't get this to replicate 5_connfail_client.t - wonder why?!#? | |
26 | # I tried to use POE::Filter::Stream to see if it made a difference, nope... | |
27 | #use Test::More tests => $numtests; | |
28 | use Test::More; | |
29 | plan skip_all => "This test hangs for some reason"; | |
25 | use Test::More tests => $numtests; | |
30 | 26 | |
31 | 27 | use POE 1.267; |
32 | 28 | use POE::Component::Client::TCP; |
100 | 96 | Connected => sub |
101 | 97 | { |
102 | 98 | ok(1, 'CLIENT: connected'); |
99 | ||
100 | # purposefully send garbage so we screw up the ssl connect on the client-side | |
101 | $_[HEAP]->{server}->put( 'garbage in, garbage out' ); | |
103 | 102 | }, |
104 | 103 | ServerInput => sub |
105 | 104 | { |
0 | #!/usr/bin/perl | |
1 | # | |
2 | # This file is part of POE-Component-SSLify | |
3 | # | |
4 | # This software is copyright (c) 2011 by Apocalypse. | |
5 | # | |
6 | # This is free software; you can redistribute it and/or modify it under | |
7 | # the same terms as the Perl 5 programming language system itself. | |
8 | # | |
9 | use strict; use warnings; | |
10 | use strict; use warnings; | |
11 | ||
12 | # This tests the connection OK hook on both server/client | |
13 | ||
14 | my $numtests; | |
15 | BEGIN { | |
16 | $numtests = 17; | |
17 | ||
18 | eval "use Test::NoWarnings"; | |
19 | if ( ! $@ ) { | |
20 | # increment by one | |
21 | $numtests++; | |
22 | } | |
23 | } | |
24 | ||
25 | use Test::More tests => $numtests; | |
26 | ||
27 | use POE 1.267; | |
28 | use POE::Component::Client::TCP; | |
29 | use POE::Component::Server::TCP; | |
30 | use POE::Component::SSLify qw/Client_SSLify Server_SSLify SSLify_Options SSLify_GetCipher SSLify_GetSocket SSLify_GetStatus/; | |
31 | ||
32 | # TODO rewrite this to use Test::POE::Server::TCP and stuff :) | |
33 | ||
34 | my $port; | |
35 | ||
36 | POE::Component::Server::TCP->new | |
37 | ( | |
38 | Alias => 'myserver', | |
39 | Address => '127.0.0.1', | |
40 | Port => 0, | |
41 | ||
42 | Started => sub | |
43 | { | |
44 | use Socket qw/sockaddr_in/; | |
45 | $port = (sockaddr_in($_[HEAP]->{listener}->getsockname))[0]; | |
46 | }, | |
47 | ClientConnected => sub | |
48 | { | |
49 | ok(1, 'SERVER: accepted'); | |
50 | }, | |
51 | ClientDisconnected => sub | |
52 | { | |
53 | ok(1, 'SERVER: client disconnected'); | |
54 | $_[KERNEL]->post( 'myserver' => 'shutdown'); | |
55 | }, | |
56 | ClientPreConnect => sub | |
57 | { | |
58 | eval { SSLify_Options('mylib/example.key', 'mylib/example.crt') }; | |
59 | eval { SSLify_Options('../mylib/example.key', '../mylib/example.crt') } if ($@); | |
60 | ok(!$@, "SERVER: SSLify_Options $@"); | |
61 | ||
62 | my $socket = eval { Server_SSLify( $_[ARG0], sub { | |
63 | my( $socket, $status, $errval ) = @_; | |
64 | ||
65 | pass( "SERVER: Got callback hook" ); | |
66 | is( $status, 1, "SERVER: Status received from callback is OK" ); | |
67 | ||
68 | ## At this point, connection MUST be encrypted. | |
69 | my $cipher = SSLify_GetCipher($socket); | |
70 | ok($cipher ne '(NONE)', "SERVER: SSLify_GetCipher: $cipher"); | |
71 | ok( SSLify_GetStatus($socket) == 1, "SERVER: SSLify_GetStatus is done" ); | |
72 | } ) }; | |
73 | ok(!$@, "SERVER: Server_SSLify $@"); | |
74 | ok( SSLify_GetStatus($socket) == -1, "SERVER: SSLify_GetStatus is pending" ); | |
75 | ||
76 | return ($socket); | |
77 | }, | |
78 | ClientInput => sub | |
79 | { | |
80 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
81 | ||
82 | die "Should have never got any input from the client!"; | |
83 | }, | |
84 | ClientError => sub | |
85 | { | |
86 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
87 | # The default PoCo::Server::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
88 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
89 | ||
90 | # TODO are there other "errors" that is harmless? | |
91 | $error = "Normal disconnection" unless $error; | |
92 | my $msg = "Got SERVER $syscall error $errno: $error"; | |
93 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
94 | fail( $msg ); | |
95 | } else { | |
96 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
97 | } | |
98 | }, | |
99 | ); | |
100 | ||
101 | POE::Component::Client::TCP->new | |
102 | ( | |
103 | Alias => 'myclient', | |
104 | RemoteAddress => '127.0.0.1', | |
105 | RemotePort => $port, | |
106 | ||
107 | Connected => sub | |
108 | { | |
109 | ok(1, 'CLIENT: connected'); | |
110 | }, | |
111 | PreConnect => sub | |
112 | { | |
113 | my $socket = eval { Client_SSLify($_[ARG0], sub { | |
114 | my( $socket, $status, $errval ) = @_; | |
115 | ||
116 | pass( "CLIENT: Got callback hook" ); | |
117 | is( $status, 1, "CLIENT: Status received from callback is OK" ); | |
118 | ||
119 | ## At this point, connection MUST be encrypted. | |
120 | my $cipher = SSLify_GetCipher($socket); | |
121 | ok($cipher ne '(NONE)', "CLIENT: SSLify_GetCipher: $cipher"); | |
122 | ok( SSLify_GetStatus($socket) == 1, "CLIENT: SSLify_GetStatus is done" ); | |
123 | ||
124 | $poe_kernel->post( 'myclient' => 'shutdown' ); | |
125 | }) }; | |
126 | ok(!$@, "CLIENT: Client_SSLify $@"); | |
127 | ok( SSLify_GetStatus($socket) == -1, "CLIENT: SSLify_GetStatus is pending" ); | |
128 | ||
129 | return ($socket); | |
130 | }, | |
131 | ServerInput => sub | |
132 | { | |
133 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
134 | ||
135 | die "Should have never got any input from the server!"; | |
136 | }, | |
137 | ServerError => sub | |
138 | { | |
139 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
140 | # The default PoCo::Client::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
141 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
142 | ||
143 | # TODO are there other "errors" that is harmless? | |
144 | $error = "Normal disconnection" unless $error; | |
145 | my $msg = "Got CLIENT $syscall error $errno: $error"; | |
146 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
147 | fail( $msg ); | |
148 | } else { | |
149 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
150 | } | |
151 | }, | |
152 | ); | |
153 | ||
154 | $poe_kernel->run(); | |
155 | ||
156 | pass( 'shut down sanely' ); | |
157 | ||
158 | exit 0; |
0 | #!/usr/bin/perl | |
1 | # | |
2 | # This file is part of POE-Component-SSLify | |
3 | # | |
4 | # This software is copyright (c) 2011 by Apocalypse. | |
5 | # | |
6 | # This is free software; you can redistribute it and/or modify it under | |
7 | # the same terms as the Perl 5 programming language system itself. | |
8 | # | |
9 | use strict; use warnings; | |
10 | use strict; use warnings; | |
11 | ||
12 | # Thanks to ASCENT for this test! | |
13 | # This test adds renegotiation to the connection from server-side | |
14 | ||
15 | # In an older version of this test, there was ok() littered everywhere | |
16 | # but dngor replied in http://rt.cpan.org/Public/Bug/Display.html?id=66741 | |
17 | # that it's not going to work... how do I predict which ok() will fail and "simulate" them? | |
18 | # the solution was to... only run a few tests and print the diag | |
19 | # because the rest of the tests just redo what we already have in 1_simple.t and stuff... | |
20 | ||
21 | my $numtests; | |
22 | BEGIN { | |
23 | $numtests = 16; | |
24 | ||
25 | eval "use Test::NoWarnings"; | |
26 | if ( ! $@ ) { | |
27 | # increment by one | |
28 | $numtests++; | |
29 | } | |
30 | } | |
31 | ||
32 | use Test::More tests => $numtests; | |
33 | ||
34 | use POE 1.267; | |
35 | use POE::Component::Client::TCP; | |
36 | use POE::Component::Server::TCP; | |
37 | use POE::Component::SSLify qw/Client_SSLify Server_SSLify SSLify_Options SSLify_GetCipher SSLify_ContextCreate SSLify_GetSocket SSLify_GetSSL/; | |
38 | ||
39 | # TODO rewrite this to use Test::POE::Server::TCP and stuff :) | |
40 | ||
41 | my $port; | |
42 | my $server_ping2; | |
43 | my $client_ping2; | |
44 | ||
45 | POE::Component::Server::TCP->new | |
46 | ( | |
47 | Alias => 'myserver', | |
48 | Address => '127.0.0.1', | |
49 | Port => 0, | |
50 | ||
51 | Started => sub | |
52 | { | |
53 | use Socket qw/sockaddr_in/; | |
54 | $port = (sockaddr_in($_[HEAP]->{listener}->getsockname))[0]; | |
55 | }, | |
56 | ClientConnected => sub | |
57 | { | |
58 | ok(1, 'SERVER: accepted'); | |
59 | $_[HEAP]->{client}->put("ping"); | |
60 | }, | |
61 | ClientDisconnected => sub | |
62 | { | |
63 | ok(1, 'SERVER: client disconnected'); | |
64 | $_[KERNEL]->post(myserver => 'shutdown'); | |
65 | }, | |
66 | ClientPreConnect => sub | |
67 | { | |
68 | eval { SSLify_Options('mylib/example.key', 'mylib/example.crt', 'sslv3') }; | |
69 | eval { SSLify_Options('../mylib/example.key', '../mylib/example.crt', 'sslv3') } if ($@); | |
70 | ok(!$@, "SERVER: SSLify_Options $@"); | |
71 | ||
72 | my $socket = eval { Server_SSLify($_[ARG0]) }; | |
73 | ok(!$@, "SERVER: Server_SSLify $@"); | |
74 | ok(1, 'SERVER: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
75 | ||
76 | # We pray that IO::Handle is sane... | |
77 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'SERVER: SSLified socket is non-blocking?'); | |
78 | ||
79 | return ($socket); | |
80 | }, | |
81 | ClientInput => sub | |
82 | { | |
83 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
84 | ||
85 | if ($line eq 'pong') { | |
86 | ok(1, "SERVER: recv: $line"); | |
87 | ||
88 | ## At this point, connection MUST be encrypted. | |
89 | my $cipher = SSLify_GetCipher($heap->{client}->get_output_handle); | |
90 | ok($cipher ne '(NONE)', "SERVER: SSLify_GetCipher: $cipher"); | |
91 | ||
92 | Net::SSLeay::renegotiate( SSLify_GetSSL( $heap->{client}->get_output_handle ) ); | |
93 | ||
94 | $heap->{client}->put("ping2"); | |
95 | } elsif ($line eq 'pong2') { | |
96 | $server_ping2++; | |
97 | $kernel->yield( 'shutdown' ); | |
98 | } else { | |
99 | die "Unknown line from CLIENT: $line"; | |
100 | } | |
101 | }, | |
102 | ClientError => sub | |
103 | { | |
104 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
105 | # The default PoCo::Server::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
106 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
107 | ||
108 | # TODO are there other "errors" that is harmless? | |
109 | $error = "Normal disconnection" unless $error; | |
110 | my $msg = "Got SERVER $syscall error $errno: $error"; | |
111 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
112 | # fail( $msg ); | |
113 | } else { | |
114 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
115 | } | |
116 | }, | |
117 | ); | |
118 | ||
119 | POE::Component::Client::TCP->new | |
120 | ( | |
121 | Alias => 'myclient', | |
122 | RemoteAddress => '127.0.0.1', | |
123 | RemotePort => $port, | |
124 | ||
125 | Connected => sub | |
126 | { | |
127 | ok(1, 'CLIENT: connected'); | |
128 | }, | |
129 | PreConnect => sub | |
130 | { | |
131 | my $ctx = eval { SSLify_ContextCreate(undef, undef, 'sslv3') }; | |
132 | ok(!$@, "CLIENT: SSLify_ContextCreate $@"); | |
133 | my $socket = eval { Client_SSLify($_[ARG0], undef, undef, $ctx) }; | |
134 | ok(!$@, "CLIENT: Client_SSLify $@"); | |
135 | ok(1, 'CLIENT: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
136 | ||
137 | # We pray that IO::Handle is sane... | |
138 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'CLIENT: SSLified socket is non-blocking?'); | |
139 | ||
140 | return ($socket); | |
141 | }, | |
142 | ServerInput => sub | |
143 | { | |
144 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
145 | ||
146 | if ($line eq 'ping') { | |
147 | ok(1, "CLIENT: recv: $line"); | |
148 | ||
149 | ## At this point, connection MUST be encrypted. | |
150 | my $cipher = SSLify_GetCipher($heap->{server}->get_output_handle); | |
151 | ok($cipher ne '(NONE)', "CLIENT: SSLify_GetCipher: $cipher"); | |
152 | ||
153 | $_[HEAP]->{server}->put("pong"); | |
154 | } elsif ( $line eq 'ping2' ) { | |
155 | $client_ping2++; | |
156 | $_[HEAP]->{server}->put("pong2"); | |
157 | } else { | |
158 | die "Unknown line from SERVER: $line"; | |
159 | } | |
160 | }, | |
161 | ServerError => sub | |
162 | { | |
163 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
164 | # The default PoCo::Client::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
165 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
166 | ||
167 | $error = "Normal disconnection" unless $error; | |
168 | my $msg = "Got CLIENT $syscall error $errno: $error"; | |
169 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
170 | }, | |
171 | ); | |
172 | ||
173 | $poe_kernel->run(); | |
174 | ||
175 | if ( ! $server_ping2 or ! $client_ping2 ) { | |
176 | diag( "WARNING: Your platform/SSL library does not support renegotiation of the SSL socket." ); | |
177 | diag( "This test harness detected that trying to renegotiate resulted in a disconnected socket." ); | |
178 | diag( "POE::Component::SSLify will work on your system, but please do not attempt a SSL renegotiate." ); | |
179 | diag( "Please talk with the author to figure out if this issue can be worked around, thank you!" ); | |
180 | } | |
181 | ||
182 | pass( 'shut down sanely' ); | |
183 | ||
184 | exit 0; |
0 | #!/usr/bin/perl | |
1 | # | |
2 | # This file is part of POE-Component-SSLify | |
3 | # | |
4 | # This software is copyright (c) 2011 by Apocalypse. | |
5 | # | |
6 | # This is free software; you can redistribute it and/or modify it under | |
7 | # the same terms as the Perl 5 programming language system itself. | |
8 | # | |
9 | use strict; use warnings; | |
10 | use strict; use warnings; | |
11 | ||
12 | # Thanks to ASCENT for this test! | |
13 | # This test adds renegotiation to the connection from client-side | |
14 | # Since this is not supported on all platforms, it's marked TODO and adds custom logic | |
15 | # to make sure it doesn't FAIL if it's not supported. | |
16 | ||
17 | # this version of the test doesn't work as reported in http://rt.cpan.org/Public/Bug/Display.html?id=66741 | |
18 | # renamed it to this version for posterity and in case I need it for future analysis... | |
19 | ||
20 | #my $numtests; | |
21 | #BEGIN { | |
22 | # $numtests = 23; | |
23 | # | |
24 | # eval "use Test::NoWarnings"; | |
25 | # if ( ! $@ ) { | |
26 | # # increment by one | |
27 | # $numtests++; | |
28 | # } | |
29 | #} | |
30 | ||
31 | #use Test::More tests => $numtests; | |
32 | use Test::More; | |
33 | BEGIN { | |
34 | plan skip_all => "AUTHOR TEST"; | |
35 | } | |
36 | ||
37 | use POE 1.267; | |
38 | use POE::Component::Client::TCP; | |
39 | use POE::Component::Server::TCP; | |
40 | use POE::Component::SSLify qw/Client_SSLify Server_SSLify SSLify_Options SSLify_GetCipher SSLify_ContextCreate SSLify_GetSocket SSLify_GetSSL/; | |
41 | use Net::SSLeay qw/ERROR_WANT_READ ERROR_WANT_WRITE/; | |
42 | ||
43 | # TODO rewrite this to use Test::POE::Server::TCP and stuff :) | |
44 | ||
45 | my $port; | |
46 | my $server_ping2; | |
47 | my $client_ping2; | |
48 | ||
49 | POE::Component::Server::TCP->new | |
50 | ( | |
51 | Alias => 'myserver', | |
52 | Address => '127.0.0.1', | |
53 | Port => 0, | |
54 | ||
55 | Started => sub | |
56 | { | |
57 | use Socket qw/sockaddr_in/; | |
58 | $port = (sockaddr_in($_[HEAP]->{listener}->getsockname))[0]; | |
59 | }, | |
60 | ClientConnected => sub | |
61 | { | |
62 | ok(1, 'SERVER: accepted'); | |
63 | }, | |
64 | ClientDisconnected => sub | |
65 | { | |
66 | ok(1, 'SERVER: client disconnected'); | |
67 | $_[KERNEL]->post(myserver => 'shutdown'); | |
68 | }, | |
69 | ClientPreConnect => sub | |
70 | { | |
71 | eval { SSLify_Options('mylib/example.key', 'mylib/example.crt', 'sslv3') }; | |
72 | eval { SSLify_Options('../mylib/example.key', '../mylib/example.crt', 'sslv3') } if ($@); | |
73 | ok(!$@, "SERVER: SSLify_Options $@"); | |
74 | ||
75 | my $socket = eval { Server_SSLify($_[ARG0]) }; | |
76 | ok(!$@, "SERVER: Server_SSLify $@"); | |
77 | ok(1, 'SERVER: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
78 | ||
79 | # We pray that IO::Handle is sane... | |
80 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'SERVER: SSLified socket is non-blocking?'); | |
81 | ||
82 | return ($socket); | |
83 | }, | |
84 | ClientInput => sub | |
85 | { | |
86 | my ($kernel, $heap, $request) = @_[KERNEL, HEAP, ARG0]; | |
87 | ||
88 | ## At this point, connection MUST be encrypted. | |
89 | my $cipher = SSLify_GetCipher($heap->{client}->get_output_handle); | |
90 | ok($cipher ne '(NONE)', "SERVER: SSLify_GetCipher: $cipher"); | |
91 | ||
92 | if ($request eq 'ping') | |
93 | { | |
94 | ok(1, "SERVER: recv: $request"); | |
95 | $heap->{client}->put("pong"); | |
96 | } | |
97 | elsif ($request eq 'ping2') | |
98 | { | |
99 | ok(1, "SERVER: recv: $request"); | |
100 | $server_ping2++; | |
101 | $heap->{client}->put("pong2"); | |
102 | } | |
103 | }, | |
104 | ClientError => sub | |
105 | { | |
106 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
107 | # The default PoCo::Server::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
108 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
109 | ||
110 | # TODO are there other "errors" that is harmless? | |
111 | $error = "Normal disconnection" unless $error; | |
112 | my $msg = "Got SERVER $syscall error $errno: $error"; | |
113 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
114 | fail( $msg ); | |
115 | } else { | |
116 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
117 | } | |
118 | }, | |
119 | ); | |
120 | ||
121 | POE::Component::Client::TCP->new | |
122 | ( | |
123 | Alias => 'myclient', | |
124 | RemoteAddress => '127.0.0.1', | |
125 | RemotePort => $port, | |
126 | ||
127 | Connected => sub | |
128 | { | |
129 | ok(1, 'CLIENT: connected'); | |
130 | ||
131 | $_[HEAP]->{server}->put("ping"); | |
132 | }, | |
133 | PreConnect => sub | |
134 | { | |
135 | my $ctx = eval { SSLify_ContextCreate(undef, undef, 'sslv3') }; | |
136 | ok(!$@, "CLIENT: SSLify_ContextCreate $@"); | |
137 | my $socket = eval { Client_SSLify($_[ARG0], undef, undef, $ctx) }; | |
138 | ok(!$@, "CLIENT: Client_SSLify $@"); | |
139 | ok(1, 'CLIENT: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
140 | ||
141 | # We pray that IO::Handle is sane... | |
142 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'CLIENT: SSLified socket is non-blocking?'); | |
143 | ||
144 | return ($socket); | |
145 | }, | |
146 | ServerInput => sub | |
147 | { | |
148 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
149 | ||
150 | ## At this point, connection MUST be encrypted. | |
151 | my $cipher = SSLify_GetCipher($heap->{server}->get_output_handle); | |
152 | ok($cipher ne '(NONE)', "CLIENT: SSLify_GetCipher: $cipher"); | |
153 | ||
154 | if ($line eq 'pong') | |
155 | { | |
156 | ok(1, "CLIENT: recv: $line"); | |
157 | ||
158 | # Skip 2 Net::SSLeay::renegotiate() tests on FreeBSD because of | |
159 | # http://security.freebsd.org/advisories/FreeBSD-SA-09:15.ssl.asc | |
160 | TODO: { | |
161 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
162 | ||
163 | ## Force SSL renegotiation | |
164 | my $ssl = SSLify_GetSSL( $heap->{server}->get_output_handle ); | |
165 | my $reneg_num = Net::SSLeay::num_renegotiations($ssl); | |
166 | ||
167 | ok(1 == Net::SSLeay::renegotiate($ssl), 'CLIENT: SSL renegotiation'); | |
168 | my $handshake = Net::SSLeay::do_handshake($ssl); | |
169 | my $err = Net::SSLeay::get_error($ssl, $handshake); | |
170 | ||
171 | ## 1 == Successful handshake, ERROR_WANT_(READ|WRITE) == non-blocking. | |
172 | ok($handshake == 1 || $err == ERROR_WANT_READ || $err == ERROR_WANT_WRITE, 'CLIENT: SSL handshake'); | |
173 | ok($reneg_num < Net::SSLeay::num_renegotiations($ssl), 'CLIENT: Increased number of negotiations'); | |
174 | } | |
175 | ||
176 | $heap->{server}->put('ping2'); | |
177 | } | |
178 | ||
179 | elsif ($line eq 'pong2') | |
180 | { | |
181 | ok(1, "CLIENT: recv: $line"); | |
182 | $client_ping2++; | |
183 | $kernel->yield('shutdown'); | |
184 | } | |
185 | }, | |
186 | ServerError => sub | |
187 | { | |
188 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
189 | # The default PoCo::Client::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
190 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
191 | ||
192 | # TODO are there other "errors" that is harmless? | |
193 | $error = "Normal disconnection" unless $error; | |
194 | my $msg = "Got CLIENT $syscall error $errno: $error"; | |
195 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
196 | fail( $msg ); | |
197 | } else { | |
198 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
199 | } | |
200 | }, | |
201 | ); | |
202 | ||
203 | $poe_kernel->run(); | |
204 | ||
205 | # Add extra pass() to make the test harness happy if renegotiate did not work | |
206 | if ( ! $server_ping2 ) { | |
207 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
208 | fail( "SERVER: Failed SSL renegotiation" ); | |
209 | } | |
210 | if ( ! $client_ping2 ) { | |
211 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
212 | fail( "CLIENT: Failed SSL renegotiation" ); | |
213 | } | |
214 | if ( ! $server_ping2 or ! $client_ping2 ) { | |
215 | diag( "WARNING: Your platform/SSL library does not support renegotiation of the SSL socket." ); | |
216 | diag( "This test harness detected that trying to renegotiate resulted in a disconnected socket." ); | |
217 | diag( "POE::Component::SSLify will work on your system, but please do not attempt a SSL renegotiate." ); | |
218 | diag( "Please talk with the author to figure out if this issue can be worked around, thank you!" ); | |
219 | } | |
220 | ||
221 | pass( 'shut down sanely' ); | |
222 | ||
223 | exit 0; |
0 | #!/usr/bin/perl | |
1 | # | |
2 | # This file is part of POE-Component-SSLify | |
3 | # | |
4 | # This software is copyright (c) 2011 by Apocalypse. | |
5 | # | |
6 | # This is free software; you can redistribute it and/or modify it under | |
7 | # the same terms as the Perl 5 programming language system itself. | |
8 | # | |
9 | use strict; use warnings; | |
10 | ||
11 | # Test contributed by mire@irc which used this to hit the WRITE_WANTS_READ case | |
12 | # mire created package Ub because he couldn't reproduce it with poco-cl-http :( | |
13 | # tweaked slightly to turn it into a real testcase ( not done yet ) | |
14 | ||
15 | BEGIN { | |
16 | # sub POE::Kernel::ASSERT_DEFAULT () { 1 } | |
17 | # sub POE::Kernel::TRACE_STATISTICS () { 0 } # makes POE hang, it's been removed in git but not in 1.299 heh | |
18 | # sub POE::Kernel::TRACE_DEFAULT () { 1 } | |
19 | # sub POE::Kernel::CATCH_EXCEPTIONS () { 0 } # make sure we die right away so it's easier to debug | |
20 | } | |
21 | ||
22 | use strict; | |
23 | use warnings; | |
24 | use POE; | |
25 | ||
26 | use Test::More; | |
27 | BEGIN { | |
28 | plan skip_all => "AUTHOR TEST"; | |
29 | } | |
30 | ||
31 | our $DEBUG=0; | |
32 | ||
33 | package Ub; | |
34 | use strict; | |
35 | use warnings; | |
36 | use POE qw( Component::Client::TCP Filter::Stream ); | |
37 | use POE::Component::SSLify qw( Client_SSLify ); | |
38 | ||
39 | # non-core deps | |
40 | BEGIN { | |
41 | eval "use POE::Filter::HTTPChunk; use HTTP::Parser; use HTTP::Response;"; | |
42 | if ( $@ ) { | |
43 | use Test::More; | |
44 | plan skip_all => "Unable to load deps: $@"; | |
45 | } | |
46 | } | |
47 | ||
48 | sub new { | |
49 | my $this = shift; | |
50 | my %p = @_; | |
51 | ||
52 | my $class = ref($this) || $this; | |
53 | my $self = {}; | |
54 | bless $self, $class; | |
55 | ||
56 | $self->{'_p'} = \%p; | |
57 | ||
58 | return $self; | |
59 | } | |
60 | ||
61 | sub spawn { | |
62 | my $self = shift; | |
63 | ||
64 | my $session_id = POE::Session->create( | |
65 | inline_states => { | |
66 | _child => sub {}, | |
67 | _start => sub { | |
68 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
69 | ($heap->{'self'}) = @_[ARG0..$#_]; | |
70 | print 'INFO: ' . __PACKAGE__ . "_start\n" | |
71 | if $main::DEBUG; | |
72 | $kernel->alias_set( 'ub' ); | |
73 | #$_[KERNEL]->refcount_increment($_[SESSION]->ID, 'ub'); | |
74 | }, | |
75 | _stop => sub { | |
76 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
77 | print 'INFO: ' . __PACKAGE__ . "_stop\n" | |
78 | if $main::DEBUG; | |
79 | $heap = {}; | |
80 | }, | |
81 | on_shutdown => sub { | |
82 | print 'INFO: ' . __PACKAGE__ . "on_shutdown\n" | |
83 | if $main::DEBUG; | |
84 | }, | |
85 | _shutdown => sub { | |
86 | print 'INFO: ' . __PACKAGE__ . "_shutdown\n" | |
87 | if $main::DEBUG; | |
88 | }, | |
89 | r => sub { | |
90 | my ($kernel, $heap, $ev_res, $cont_ref, $host, $port, $do_ssl) = @_[KERNEL, HEAP, ARG0..$#_]; | |
91 | ||
92 | my $s_res = $_[SENDER]->ID; | |
93 | ||
94 | # TODO pravi alarm za ubijanje konekcije | |
95 | my $tcp_sid = POE::Component::Client::TCP->new( | |
96 | #SessionParams => [ options => { debug => 1, trace => 1 } ], | |
97 | # SessionParams => [ options => { debug => 1 } ], | |
98 | Args => [$s_res, $ev_res, $cont_ref, $do_ssl], | |
99 | Filter => "POE::Filter::Stream", | |
100 | RemoteAddress => $host, | |
101 | RemotePort => $port, | |
102 | ConnectTimeout => 30, | |
103 | Started => sub { | |
104 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
105 | print "INFO: Started\n" | |
106 | if $main::DEBUG; | |
107 | (@$heap{qw|s_res ev_res cont_ref do_ssl|}) = @_[ARG0..$#_]; | |
108 | }, | |
109 | PreConnect => sub { | |
110 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
111 | ||
112 | print "INFO: PreConnect\n" | |
113 | if $main::DEBUG; | |
114 | ||
115 | $heap->{'parser'} = HTTP::Parser->new(response => 1); | |
116 | ||
117 | return $_[ARG0] | |
118 | unless $heap->{'do_ssl'}; | |
119 | ||
120 | # Convert the socket into an SSL socket. | |
121 | my $socket = eval { Client_SSLify($_[ARG0]) }; | |
122 | ||
123 | # Disconnect if SSL failed. | |
124 | if ($@) { | |
125 | warn $@ if $main::DEBUG; | |
126 | return; | |
127 | } | |
128 | # Return the SSL-ified socket. | |
129 | return $socket; | |
130 | }, | |
131 | ConnectError => sub { | |
132 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
133 | #print Dumper $heap; exit; | |
134 | my ($operation, $error_number, $error_string) = @_[ARG0..ARG2]; | |
135 | print "ERROR: ConnectError $operation error $error_number occurred: $error_string\n" | |
136 | if $main::DEBUG; | |
137 | my $dc = ''; | |
138 | $kernel->post($heap->{'s_res'}, $heap->{'ev_res'}, {'error' => 1, 'error_type' => 'connect_error', 'content' => \$dc}); | |
139 | $_[KERNEL]->yield('shutdown'); | |
140 | }, | |
141 | ServerError => sub { | |
142 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
143 | my ($operation, $error_number, $error_string) = @_[ARG0..ARG2]; | |
144 | ||
145 | print "not informing master session, ERROR: ServerError $operation error $error_number occurred: $error_string\n" | |
146 | if $main::DEBUG; | |
147 | $kernel->yield('shutdown'); | |
148 | }, | |
149 | Connected => sub { | |
150 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
151 | print "INFO: Connected\n" | |
152 | if $main::DEBUG; | |
153 | $heap->{server}->put(${$heap->{'cont_ref'}}); | |
154 | # start timeout thing | |
155 | # za pravu shutdown funkciju | |
156 | $heap->{'al_cest_id'} = $_[KERNEL]->alarm_set( shutdown => time + 60 ); | |
157 | }, | |
158 | ServerInput => sub { | |
159 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
160 | print "INFO: ServerInput\n" | |
161 | if $main::DEBUG; | |
162 | my $input = $_[ARG0]; | |
163 | #print 'from server: ' . Dumper $input; | |
164 | eval { | |
165 | $heap->{'parser'}->add($input); | |
166 | }; | |
167 | # TODO error response | |
168 | $kernel->yield('shutdown') | |
169 | if $@; | |
170 | }, | |
171 | ServerFlushed => sub { | |
172 | print "INFO: ServerFlushed\n" | |
173 | if $main::DEBUG; | |
174 | }, | |
175 | Disconnected => sub { | |
176 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
177 | print "INFO: disconnected ;)\n" | |
178 | if $main::DEBUG; | |
179 | my $dc = ''; | |
180 | $dc = $heap->{'parser'}->object->decoded_content | |
181 | if $heap->{'parser'}->object; | |
182 | $kernel->post($heap->{'s_res'}, $heap->{'ev_res'}, {'error' => 0, 'error_type' => '', 'content' => \$dc}); | |
183 | $_[KERNEL]->alarm_remove(delete $heap->{'al_cest_id'}) | |
184 | if (exists $heap->{'al_cest_id'} and $heap->{'al_cest_id'}); | |
185 | $_[KERNEL]->yield('shutdown'); | |
186 | }, | |
187 | ||
188 | ); | |
189 | print "tcp_sid: $tcp_sid\n" | |
190 | if $main::DEBUG; | |
191 | ||
192 | }, | |
193 | }, | |
194 | 'args' => [$self], | |
195 | )->ID; | |
196 | ||
197 | return $session_id; | |
198 | } | |
199 | ||
200 | 1; | |
201 | ||
202 | package main; | |
203 | ||
204 | my $ub = Ub->new()->spawn(); | |
205 | ||
206 | ||
207 | ||
208 | ||
209 | my $session_id_test = POE::Session->create( | |
210 | inline_states => { | |
211 | _start => sub { | |
212 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
213 | ($heap->{'self'}) = @_[ARG0..$#_]; | |
214 | print 'INFO: ' . __PACKAGE__ . "_start\n" | |
215 | if $main::DEBUG; | |
216 | $kernel->yield('test'); | |
217 | }, | |
218 | _stop => sub { | |
219 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
220 | print 'INFO: ' . __PACKAGE__ . "_stop\n" | |
221 | if $main::DEBUG; | |
222 | $heap = {}; | |
223 | }, | |
224 | on_shutdown => sub { | |
225 | print 'INFO: ' . __PACKAGE__ . "on_shutdown\n" | |
226 | if $main::DEBUG; | |
227 | }, | |
228 | _shutdown => sub { | |
229 | print 'INFO: ' . __PACKAGE__ . "_shutdown\n" | |
230 | if $main::DEBUG; | |
231 | }, | |
232 | test => sub { | |
233 | my ($kernel, $heap) = @_[KERNEL, HEAP]; | |
234 | my ($cont, $host, $port, $do_ssl); | |
235 | ||
236 | $kernel->refcount_increment($_[SESSION]->ID, 'test'); | |
237 | ||
238 | if (1) { | |
239 | $host = '0ne.us'; | |
240 | $port = 443; | |
241 | $do_ssl = 1; | |
242 | ||
243 | $cont = <<'EOF'; | |
244 | GET /get.php HTTP/1.1 | |
245 | Host: osadmin.com | |
246 | User-Agent: proba 123 | |
247 | Connection: close | |
248 | ||
249 | ||
250 | EOF | |
251 | ||
252 | } | |
253 | $kernel->post('ub', 'r', 'test_res', \$cont, $host, $port, $do_ssl); | |
254 | ||
255 | }, | |
256 | test_res => sub { | |
257 | my ($kernel, $heap, $dat) = @_[KERNEL, HEAP, ARG0..$#_]; | |
258 | $kernel->refcount_decrement($_[SESSION]->ID, 'test'); | |
259 | my $cont = ${$dat->{'content'}}; | |
260 | chomp $cont; | |
261 | warn $cont; | |
262 | die "HIT BUG" if length $cont == 0; | |
263 | $kernel->yield('test'); | |
264 | return; | |
265 | }, | |
266 | },)->ID; | |
267 | ||
268 | POE::Kernel->run(); | |
269 | exit; |