dzilification and insitu test and remove old crufty NBIO code
Apocalypse
12 years ago
0 | # Build.PL | |
1 | use strict; use warnings; | |
2 | use Module::Build; | |
3 | ||
4 | my $build = Module::Build->new( | |
5 | # look up Module::Build::API for the info! | |
6 | 'dynamic_config' => 0, | |
7 | 'module_name' => 'POE::Component::SSLify', | |
8 | 'license' => 'perl', | |
9 | ||
10 | 'dist_abstract' => 'SSL in the world of POE made easy', | |
11 | 'dist_author' => 'Apocalypse <APOCAL@cpan.org>', | |
12 | ||
13 | 'create_packlist' => 1, | |
14 | 'create_makefile_pl' => 'traditional', | |
15 | 'create_readme' => 1, | |
16 | 'create_license' => 1, | |
17 | 'sign' => 0, | |
18 | ||
19 | 'test_files' => 't/*.t', | |
20 | ||
21 | 'requires' => { | |
22 | # Networking | |
23 | 'Net::SSLeay' => '1.36', | |
24 | ||
25 | # minimum perl version | |
26 | 'perl' => '5.006', | |
27 | }, | |
28 | ||
29 | 'build_requires' => { | |
30 | # For the t/simple.t test | |
31 | 'POE' => '1.267', | |
32 | 'POE::Component::Client::TCP' => 0, | |
33 | 'POE::Component::Server::TCP' => 0, | |
34 | }, | |
35 | ||
36 | # include the standard stuff in META.yml | |
37 | 'meta_merge' => { | |
38 | 'resources' => { | |
39 | 'license' => 'http://dev.perl.org/licenses/', | |
40 | 'homepage' => 'http://search.cpan.org/dist/POE-Component-SSLify', | |
41 | 'bugtracker' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=POE-Component-SSLify', | |
42 | 'repository' => 'http://github.com/apocalypse/perl-poe-sslify', | |
43 | }, | |
44 | }, | |
45 | ); | |
46 | ||
47 | # all done! | |
48 | $build->create_build_script; |
0 | 0 | Revision history for Perl extension POE::Component::SSLify. |
1 | 1 | |
2 | * 0.20 | |
2 | {{$NEXT}} | |
3 | ||
4 | Converted to Dist::Zilla for the release process! | |
5 | Add a test for in-situ sslification, thanks mordy@irc! | |
6 | Add prereq for IO::Handle 1.28 to get sane $socket->blocking( 0 ) behavior on MSWin32 | |
7 | Remove crufty old code for nonblocking and use $socket->blocking() instead | |
8 | ||
9 | 0.20 | |
3 | 10 | |
4 | 11 | Split up the simple.t test into 2 tests for clarity, and added more diag messages for renegotiate, thanks HMBRAND! |
5 | 12 | |
6 | * 0.19 | |
13 | 0.19 | |
7 | 14 | |
8 | 15 | Fixed a warning generated by POE::Component::Client::TCP in t/simple.t, thanks HMBRAND! |
9 | 16 | |
10 | * 0.18 | |
17 | 0.18 | |
11 | 18 | |
12 | 19 | Bumped POE dep to at least 1.267 for t/simple.t - thanks CPANTesters! |
13 | 20 | Minor typo fixes in POD/Build.PL |
14 | 21 | |
15 | * 0.17 | |
22 | 0.17 | |
16 | 23 | |
17 | 24 | Fixed the t/simple.t test to PASS on FreeBSD because Net::SSLeay::renegotiate was buggy on it, thanks CPANTesters! |
18 | 25 | Added note about OpenSSL functions in the POD. |
19 | 26 | |
20 | * 0.16 | |
27 | 0.16 | |
21 | 28 | |
22 | 29 | Updated the nonblocking code to be production-ready, thanks ASCENT! |
23 | 30 | Removed the NONBLOCKING() sub, this module is now always nonblocking. |
26 | 33 | Misc kwalitee and POD fixes. |
27 | 34 | Bumped Net::SSLeay prereq to 1.36 so we have the latest SSL stuff to ensure sanity :) |
28 | 35 | |
29 | * 0.15 | |
36 | 0.15 | |
30 | 37 | |
31 | 38 | Added "examples/serverclient.pl" to track down same-process sslification problems, thanks LotR! |
32 | 39 | |
36 | 43 | |
37 | 44 | Added experimental NONBLOCKING code, thanks ASCENT for the motivation! |
38 | 45 | |
39 | * 0.14 | |
46 | 0.14 | |
40 | 47 | |
41 | 48 | removed Test::* modules from dependency list, thanks BINGOS - RT #36725 |
42 | 49 | |
44 | 51 | |
45 | 52 | added Build.PL |
46 | 53 | |
47 | * 0.13 | |
54 | 0.13 | |
48 | 55 | |
49 | 56 | POD typo errors in SSLify_ContextCreate - thanks ASCENT! |
50 | 57 | |
51 | * 0.12 | |
58 | 0.12 | |
52 | 59 | |
53 | 60 | Kwalitee-related fixes |
54 | 61 | |
55 | * 0.11 | |
62 | 0.11 | |
56 | 63 | |
57 | 64 | allowed setting of client-side context ( $ctx ) object - thanks RT #34442 |
58 | 65 | |
64 | 71 | |
65 | 72 | backported Net::SSLeay's removal of %Filenum_Objects hash |
66 | 73 | |
67 | * 0.10 | |
74 | 0.10 | |
68 | 75 | |
69 | 76 | More tweaks of POD - finally close RT #31238 |
70 | 77 | Added SSL version support - thanks RT #31492 |
71 | 78 | Added SSL CTX option support as a side effect |
72 | 79 | Added client.pl example with ReadLine support |
73 | 80 | |
74 | * 0.09 | |
81 | 0.09 | |
75 | 82 | |
76 | 83 | Minor tweak of POD to enable better distro building - thanks RT #31238 |
77 | 84 | |
78 | * 0.08 | |
85 | 0.08 | |
79 | 86 | |
80 | 87 | Added support for BINMODE - thanks RT #27117 |
81 | 88 | |
82 | * 0.07 | |
89 | 0.07 | |
83 | 90 | |
84 | 91 | Fixed undefined $info - thanks RT #22372 |
85 | 92 | |
86 | * 0.06 | |
93 | 0.06 | |
87 | 94 | |
88 | 95 | Kwalitee-related fixes |
89 | 96 | |
90 | * 0.05 | |
97 | 0.05 | |
91 | 98 | |
92 | 99 | Finally use a Changes file - thanks RT #18981 |
93 | 100 | Documentation tweaks |
94 | 101 | Upgraded Net::SSLeay requirement to 1.30 to help Win32 problems |
95 | 102 | |
96 | * 0.04 | |
103 | 0.04 | |
97 | 104 | |
98 | 105 | Added new functions to extract data from the SSL socket -> GetCipher and GetSocket |
99 | 106 | In the case somebody knows Net::SSLeay more than me, added GetCTX to return the server-side CTX object |
100 | 107 | Removed the dependency on Net::SSLeay::Handle |
101 | 108 | |
102 | * 0.03 | |
109 | 0.03 | |
103 | 110 | |
104 | 111 | First stab at the server-side code, help me test it out! |
105 | 112 | Refactored SSLify() into client/server side, so update your program accordingly! |
106 | 113 | |
107 | * 0.02 | |
114 | 0.02 | |
108 | 115 | |
109 | 116 | Made sure the IO::Handle way was used only on MSWin32 |
110 | 117 | |
113 | 120 | Oops, forgot to override _get_self and _get_ssl |
114 | 121 | Fixed a nasty leak issue |
115 | 122 | |
116 | * 0.01 | |
123 | 0.01 | |
117 | 124 | |
118 | 125 | Initial release |
0 | Build.PL | |
1 | MANIFEST | |
2 | MANIFEST.SKIP | |
3 | README | |
4 | Makefile.PL | |
5 | META.yml | |
6 | Changes | |
7 | LICENSE | |
8 | ||
9 | lib/POE/Component/SSLify.pm | |
10 | lib/POE/Component/SSLify/ClientHandle.pm | |
11 | lib/POE/Component/SSLify/ServerHandle.pm | |
12 | ||
13 | examples/client.pl | |
14 | examples/server.pl | |
15 | examples/serverclient.pl | |
16 | ||
17 | mylib/example.crt | |
18 | mylib/example.key | |
19 | ||
20 | t/1_load.t | |
21 | t/2_simple.t | |
22 | t/3_renegotiate.t | |
23 | t/apocalypse.t |
0 | # skip Eclipse IDE stuff | |
1 | \.includepath$ | |
2 | \.project$ | |
3 | \.settings/ | |
4 | ||
5 | # Avoid version control files. | |
6 | \B\.svn\b | |
7 | \B\.git\b | |
8 | ^\.gitignore$ | |
9 | ||
10 | # Avoid Makemaker generated and utility files. | |
11 | \bMakefile$ | |
12 | \bblib/ | |
13 | \bMakeMaker-\d | |
14 | \bpm_to_blib$ | |
15 | ||
16 | # Avoid Module::Build generated and utility files. | |
17 | \bBuild$ | |
18 | \b_build/ | |
19 | ^MYMETA.yml$ | |
20 | ||
21 | # Avoid temp and backup files. | |
22 | ~$ | |
23 | \.old$ | |
24 | \#$ | |
25 | \b\.# | |
26 | \.bak$ | |
27 | ||
28 | # our tarballs | |
29 | \.tar\.gz$ |
0 | 0 | #!/usr/bin/perl |
1 | use strict; use warnings; | |
2 | 1 | |
3 | 2 | use POE; |
4 | 3 | use POE::Component::SSLify qw( Client_SSLify ); |
0 | 0 | #!/usr/bin/perl |
1 | use strict; use warnings; | |
2 | 1 | |
3 | 2 | use POE; |
4 | 3 | use Socket qw( inet_ntoa unpack_sockaddr_in ); |
0 | 0 | #!/usr/bin/perl |
1 | use strict; use warnings; | |
2 | 1 | |
3 | 2 | use POE; |
4 | 3 | use Socket qw( inet_ntoa unpack_sockaddr_in ); |
0 | 0 | package POE::Component::SSLify::ClientHandle; |
1 | use strict; use warnings; | |
2 | 1 | |
3 | # Initialize our version | |
4 | use vars qw( $VERSION ); | |
5 | $VERSION = '0.20'; | |
2 | # ABSTRACT: Client-side handle for SSLify | |
6 | 3 | |
7 | 4 | # Import the SSL death routines |
8 | 5 | use Net::SSLeay qw( die_now die_if_ssl_error ); |
44 | 41 | return $self; |
45 | 42 | } |
46 | 43 | |
47 | # End of module | |
48 | 44 | 1; |
49 | 45 | |
50 | __END__ | |
51 | ||
52 | =head1 NAME | |
53 | ||
54 | POE::Component::SSLify::ClientHandle - client object for POE::Component::SSLify | |
55 | ||
56 | =head1 ABSTRACT | |
57 | ||
58 | See POE::Component::SSLify::ServerHandle | |
46 | =pod | |
59 | 47 | |
60 | 48 | =head1 DESCRIPTION |
61 | 49 | |
62 | 50 | This is a subclass of ServerHandle to accomodate clients setting custom context objects. |
63 | 51 | |
64 | 52 | =head1 SEE ALSO |
65 | ||
66 | L<POE::Component::SSLify> | |
67 | ||
68 | L<POE::Component::SSLify::ServerHandle> | |
69 | ||
70 | =head1 AUTHOR | |
71 | ||
72 | Apocalypse E<lt>apocal@cpan.orgE<gt> | |
73 | ||
74 | =head1 COPYRIGHT AND LICENSE | |
75 | ||
76 | Copyright 2010 by Apocalypse | |
77 | ||
78 | This library is free software; you can redistribute it and/or modify | |
79 | it under the same terms as Perl itself. | |
53 | POE::Component::SSLify::ServerHandle | |
80 | 54 | |
81 | 55 | =cut |
0 | 0 | package POE::Component::SSLify::ServerHandle; |
1 | use strict; use warnings; | |
2 | 1 | |
3 | # Initialize our version | |
4 | use vars qw( $VERSION ); | |
5 | $VERSION = '0.20'; | |
2 | # ABSTRACT: Server-side handle for SSLify | |
6 | 3 | |
7 | 4 | # Import the SSL death routines |
8 | 5 | use Net::SSLeay qw( die_now die_if_ssl_error ); |
156 | 153 | die 'Not Implemented'; |
157 | 154 | } |
158 | 155 | |
159 | # End of module | |
160 | 156 | 1; |
161 | 157 | |
162 | __END__ | |
163 | ||
164 | =head1 NAME | |
165 | ||
166 | POE::Component::SSLify::ServerHandle - server object for POE::Component::SSLify | |
167 | ||
168 | =head1 ABSTRACT | |
169 | ||
170 | See POE::Component::SSLify | |
158 | =pod | |
171 | 159 | |
172 | 160 | =head1 DESCRIPTION |
173 | 161 | |
181 | 169 | |
182 | 170 | This subclass doesn't know what to do with PRINT/READLINE, as they usually are not used in POE::Wheel operations... |
183 | 171 | |
184 | =head1 SEE ALSO | |
185 | ||
186 | L<POE::Component::SSLify> | |
187 | ||
188 | =head1 AUTHOR | |
189 | ||
190 | Apocalypse E<lt>apocal@cpan.orgE<gt> | |
191 | ||
192 | =head1 COPYRIGHT AND LICENSE | |
193 | ||
194 | Copyright 2010 by Apocalypse | |
195 | ||
196 | This library is free software; you can redistribute it and/or modify | |
197 | it under the same terms as Perl itself. | |
198 | ||
199 | 172 | =cut |
0 | 0 | package POE::Component::SSLify; |
1 | use strict; use warnings; | |
2 | ||
3 | # Initialize our version | |
4 | use vars qw( $VERSION ); | |
5 | $VERSION = '0.20'; | |
1 | ||
2 | # ABSTRACT: Makes using SSL in the world of POE easy! | |
6 | 3 | |
7 | 4 | # We need Net::SSLeay or all's a failure! |
8 | 5 | BEGIN { |
9 | 6 | eval { |
10 | require Net::SSLeay; | |
11 | ||
12 | 7 | # We need >= 1.36 because it contains a lot of important fixes |
13 | Net::SSLeay->import( 1.36 ); | |
8 | use Net::SSLeay 1.36 qw( die_now die_if_ssl_error ); | |
14 | 9 | }; |
15 | 10 | |
16 | 11 | # Check for errors... |
18 | 13 | # Oh boy! |
19 | 14 | die $@; |
20 | 15 | } else { |
21 | # Finally, load our subclass :) | |
16 | # Finally, load our subclasses :) | |
22 | 17 | # ClientHandle isa ServerHandle so it will get loaded automatically |
23 | 18 | require POE::Component::SSLify::ClientHandle; |
24 | 19 | |
38 | 33 | |
39 | 34 | # Bring in some socket-related stuff |
40 | 35 | use Symbol qw( gensym ); |
41 | use POSIX qw( F_GETFL F_SETFL O_NONBLOCK EAGAIN EWOULDBLOCK ); | |
42 | ||
43 | # We need the server-side stuff | |
44 | use Net::SSLeay qw( die_now die_if_ssl_error ); | |
36 | ||
37 | # we need IO 1.24 for it's win32 fixes but it includes IO::Handle 1.27_02 which is dev... | |
38 | # unfortunately we have to jump to IO 1.25 which includes IO::Handle 1.28... argh! | |
39 | use IO::Handle 1.28; | |
45 | 40 | |
46 | 41 | # The server-side CTX stuff |
47 | 42 | my $ctx = undef; |
48 | ||
49 | # Helper sub to set nonblocking on a handle | |
50 | sub _NonBlocking { | |
51 | my $socket = shift; | |
52 | ||
53 | # ActiveState Perl 5.8.0 dislikes the Win32-specific code to make | |
54 | # a socket blocking, so we use IO::Handle's blocking(0) method. | |
55 | # Perl 5.005_03 doesn't like blocking(), so we only use it in | |
56 | # 5.8.0 and beyond. | |
57 | if ( $] >= 5.008 and $^O eq 'MSWin32' ) { | |
58 | # TODO investigate this? | |
59 | # <kmx> kthakore: Apocalypse: FYI - as regards no-blocking socket dark magic commited to FB while ago - IO::Socket 1.24 (=May/2009) and later supports on Win32 simply $socket->blocking(0); | |
60 | # <Apocalypse> kmx: Ah didn't know that - maybe I can use that :) | |
61 | # <kmx> Apocalypse: I uderstand that used workaround is from pre IO::Socket 1.24 times | |
62 | # <Apocalypse> Ah, my code already did that eh | |
63 | # <Apocalypse> if ( $] >= 5.008 and $^O eq 'MSWin32' ) { | |
64 | # <Apocalypse> But maybe 5.008 check isn't enough? | |
65 | # <kmx> Apocalypse: You'd better check version of IO - see changelog http://cpansearch.perl.org/src/GBARR/IO-1.25/ChangeLog | |
66 | # <Apocalypse> Hmm yeah | |
67 | # <Apocalypse> * Make non-blocking mode work on Windows in IO::Socket::INET | |
68 | # <kmx> Apocalypse: exactly | |
69 | # <Apocalypse> Thanks for the tip! I'll go and add a TODO to the sslify code to investigate that :) | |
70 | ||
71 | ||
72 | # From IO::Handle POD | |
73 | # If an error occurs blocking will return undef and $! will be set. | |
74 | if ( ! $socket->blocking( 0 ) ) { | |
75 | die "Unable to set nonblocking mode on socket: $!"; | |
76 | } | |
77 | } else { | |
78 | # Make the handle nonblocking, the POSIX way. | |
79 | if ( $^O ne 'MSWin32' ) { | |
80 | # Get the old flags | |
81 | my $flags = fcntl( $socket, F_GETFL, 0 ) or die "fcntl( $socket, F_GETFL, 0 ) fails: $!"; | |
82 | ||
83 | # Okay, we patiently wait until the socket turns nonblocking mode | |
84 | until( fcntl( $socket, F_SETFL, $flags | O_NONBLOCK ) ) { | |
85 | # What was the error? | |
86 | if ( ! ( $! == EAGAIN or $! == EWOULDBLOCK ) ) { | |
87 | # Fatal error... | |
88 | die "fcntl( $socket, FSETFL, etc ) fails: $!"; | |
89 | } | |
90 | } | |
91 | } else { | |
92 | # Darned MSWin32 way... | |
93 | # Do some ioctl magic here | |
94 | # 126 is FIONBIO ( some docs say 0x7F << 16 ) | |
95 | my $flag = "1"; | |
96 | ioctl( $socket, 0x80000000 | ( 4 << 16 ) | ( ord( 'f' ) << 8 ) | 126, $flag ) or die "ioctl( $socket, FIONBIO, $flag ) fails: $!"; | |
97 | } | |
98 | } | |
99 | ||
100 | # All done! | |
101 | return $socket; | |
102 | } | |
103 | 43 | |
104 | 44 | # Okay, the main routine here! |
105 | 45 | sub Client_SSLify { |
111 | 51 | die "Did not get a defined socket"; |
112 | 52 | } |
113 | 53 | |
114 | # Set non-blocking | |
115 | $socket = _NonBlocking( $socket ); | |
54 | # From IO::Handle POD | |
55 | # If an error occurs blocking will return undef and $! will be set. | |
56 | if ( ! defined $socket->blocking( 0 ) ) { | |
57 | die "Unable to set nonblocking mode on socket: $!"; | |
58 | } | |
116 | 59 | |
117 | 60 | # Now, we create the new socket and bind it to our subclass of Net::SSLeay::Handle |
118 | 61 | my $newsock = gensym(); |
138 | 81 | die 'Please do SSLify_Options() first ( or pass in a $ctx object )'; |
139 | 82 | } |
140 | 83 | |
141 | # Set non-blocking | |
142 | $socket = _NonBlocking( $socket ); | |
84 | # From IO::Handle POD | |
85 | # If an error occurs blocking will return undef and $! will be set. | |
86 | if ( ! defined $socket->blocking( 0 ) ) { | |
87 | die "Unable to set nonblocking mode on socket: $!"; | |
88 | } | |
143 | 89 | |
144 | 90 | # Now, we create the new socket and bind it to our subclass of Net::SSLeay::Handle |
145 | 91 | my $newsock = gensym(); |
249 | 195 | return tied( *$sock )->{'socket'}; |
250 | 196 | } |
251 | 197 | |
252 | # End of module | |
253 | 198 | 1; |
254 | __END__ | |
255 | ||
256 | =for stopwords AnnoCPAN CPAN CPANTS Kwalitee RT SSL com diff github FreeBSD OpenSSL | |
257 | ||
258 | =head1 NAME | |
259 | ||
260 | POE::Component::SSLify - Makes using SSL in the world of POE easy! | |
199 | ||
200 | =pod | |
261 | 201 | |
262 | 202 | =head1 SYNOPSIS |
263 | 203 | |
290 | 230 | |
291 | 231 | # SERVER-side usage |
292 | 232 | |
293 | # !!! Make sure you have a public key + certificate generated via Net::SSLeay's makecert.pl | |
233 | # !!! Make sure you have a public key + certificate | |
294 | 234 | # excellent howto: http://www.akadia.com/services/ssh_test_certificate.html |
295 | 235 | |
296 | 236 | # Import the module |
322 | 262 | # Use it as you wish... |
323 | 263 | # End of example |
324 | 264 | |
325 | =head1 ABSTRACT | |
326 | ||
327 | Makes SSL use in POE a breeze! | |
328 | ||
329 | 265 | =head1 DESCRIPTION |
330 | 266 | |
331 | 267 | This component represents the standard way to do SSL in POE. |
365 | 301 | |
366 | 302 | =head3 Net::SSLeay::renegotiate |
367 | 303 | |
368 | This function has been tested ( it's in t/3_renegotiate.t ) but it doesn't work on FreeBSD! I tracked it down to this security advisory: | |
304 | 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: | |
369 | 305 | L<http://security.freebsd.org/advisories/FreeBSD-SA-09:15.ssl.asc> which explains it in detail. The test will skip this function |
370 | 306 | 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. |
307 | ||
308 | =head3 In-Situ sslification | |
309 | ||
310 | You can have a normal plaintext socket, and convert it to SSL anytime. Just keep in mind that the client and the server must agree to sslify | |
311 | at the same time, or they will be waiting on each other forever! See C<t/3_insitu.t> for an example of how this works. | |
371 | 312 | |
372 | 313 | =head1 FUNCTIONS |
373 | 314 | |
495 | 436 | |
496 | 437 | Stuffs all of the above functions in @EXPORT_OK so you have to request them directly |
497 | 438 | |
498 | =head1 SUPPORT | |
499 | ||
500 | You can find documentation for this module with the perldoc command. | |
501 | ||
502 | perldoc POE::Component::SSLify | |
503 | ||
504 | =head2 Websites | |
505 | ||
506 | =over 4 | |
507 | ||
508 | =item * Search CPAN | |
509 | ||
510 | L<http://search.cpan.org/dist/POE-Component-SSLify> | |
511 | ||
512 | =item * AnnoCPAN: Annotated CPAN documentation | |
513 | ||
514 | L<http://annocpan.org/dist/POE-Component-SSLify> | |
515 | ||
516 | =item * CPAN Ratings | |
517 | ||
518 | L<http://cpanratings.perl.org/d/POE-Component-SSLify> | |
519 | ||
520 | =item * CPAN Forum | |
521 | ||
522 | L<http://cpanforum.com/dist/POE-Component-SSLify> | |
523 | ||
524 | =item * RT: CPAN's Request Tracker | |
525 | ||
526 | L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=POE-Component-SSLify> | |
527 | ||
528 | =item * CPANTS Kwalitee | |
529 | ||
530 | L<http://cpants.perl.org/dist/overview/POE-Component-SSLify> | |
531 | ||
532 | =item * CPAN Testers Results | |
533 | ||
534 | L<http://cpantesters.org/distro/P/POE-Component-SSLify.html> | |
535 | ||
536 | =item * CPAN Testers Matrix | |
537 | ||
538 | L<http://matrix.cpantesters.org/?dist=POE-Component-SSLify> | |
539 | ||
540 | =item * Git Source Code Repository | |
541 | ||
542 | This code is currently hosted on github.com under the account "apocalypse". Please feel free to browse it | |
543 | and pull from it, or whatever. If you want to contribute patches, please send me a diff or prod me to pull | |
544 | from your repository :) | |
545 | ||
546 | L<http://github.com/apocalypse/perl-poe-sslify> | |
547 | ||
548 | =back | |
549 | ||
550 | =head2 Bugs | |
551 | ||
552 | Please report any bugs or feature requests to C<bug-poe-component-sslify at rt.cpan.org>, or through | |
553 | the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=POE-Component-SSLify>. I will be | |
554 | notified, and then you'll automatically be notified of progress on your bug as I make changes. | |
555 | ||
556 | 439 | =head1 SEE ALSO |
557 | ||
558 | L<POE> | |
559 | ||
560 | L<Net::SSLeay> | |
561 | ||
562 | =head1 AUTHOR | |
563 | ||
564 | Apocalypse E<lt>apocal@cpan.orgE<gt> | |
440 | POE | |
441 | Net::SSLeay | |
442 | ||
443 | =head1 ACKNOWLEDGEMENTS | |
565 | 444 | |
566 | 445 | Original code is entirely Rocco Caputo ( Creator of POE ) -> I simply |
567 | 446 | packaged up the code into something everyone could use and accepted the burden |
575 | 454 | ASCENT also helped a lot with the nonblocking mode, without his hard work this |
576 | 455 | module would still be stuck in the stone age :) |
577 | 456 | |
578 | =head1 COPYRIGHT AND LICENSE | |
579 | ||
580 | Copyright 2010 by Apocalypse/Rocco Caputo/Dariusz Jackowski | |
581 | ||
582 | This library is free software; you can redistribute it and/or modify | |
583 | it under the same terms as Perl itself. | |
584 | ||
585 | The full text of the license can be found in the LICENSE file included with this module. | |
586 | ||
587 | 457 | =cut |
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
0 | #!/usr/bin/perl | |
1 | use strict; use warnings; | |
2 | ||
3 | my $numtests; | |
4 | BEGIN { | |
5 | $numtests = 3; | |
6 | ||
7 | eval "use Test::NoWarnings"; | |
8 | if ( ! $@ ) { | |
9 | # increment by one | |
10 | $numtests++; | |
11 | ||
12 | } | |
13 | } | |
14 | ||
15 | use Test::More tests => $numtests; | |
16 | ||
17 | use_ok( 'POE::Component::SSLify::ServerHandle' ); | |
18 | use_ok( 'POE::Component::SSLify::ClientHandle' ); | |
19 | use_ok( 'POE::Component::SSLify' );⏎ |
0 | #!/usr/bin/perl | |
1 | ||
2 | # Thanks to ASCENT for this test! | |
3 | ||
4 | use strict; use warnings; | |
5 | ||
6 | my $numtests; | |
7 | BEGIN { | |
8 | $numtests = 16; | |
9 | ||
10 | eval "use Test::NoWarnings"; | |
11 | if ( ! $@ ) { | |
12 | # increment by one | |
13 | $numtests++; | |
14 | ||
15 | } | |
16 | } | |
17 | ||
18 | use Test::More tests => $numtests; | |
19 | ||
20 | use POE 1.267; | |
21 | use POE::Component::Client::TCP; | |
22 | use POE::Component::Server::TCP; | |
23 | use POE::Component::SSLify qw/Client_SSLify Server_SSLify SSLify_Options SSLify_GetCipher SSLify_ContextCreate SSLify_GetSocket/; | |
24 | ||
25 | # TODO rewrite this to use Test::POE::Server::TCP and stuff :) | |
26 | ||
27 | my $port; | |
28 | ||
29 | POE::Component::Server::TCP->new | |
30 | ( | |
31 | Alias => 'myserver', | |
32 | Address => '127.0.0.1', | |
33 | Port => 0, | |
34 | ||
35 | Started => sub | |
36 | { | |
37 | use Socket qw/sockaddr_in/; | |
38 | $port = (sockaddr_in($_[HEAP]->{listener}->getsockname))[0]; | |
39 | }, | |
40 | ClientConnected => sub | |
41 | { | |
42 | ok(1, 'SERVER: accepted'); | |
43 | }, | |
44 | ClientDisconnected => sub | |
45 | { | |
46 | ok(1, 'SERVER: client disconnected'); | |
47 | $_[KERNEL]->post(myserver => 'shutdown'); | |
48 | }, | |
49 | ClientPreConnect => sub | |
50 | { | |
51 | eval { SSLify_Options('mylib/example.key', 'mylib/example.crt', 'sslv3') }; | |
52 | eval { SSLify_Options('../mylib/example.key', '../mylib/example.crt', 'sslv3') } if ($@); | |
53 | ok(!$@, "SERVER: SSLify_Options $@"); | |
54 | ||
55 | my $socket = eval { Server_SSLify($_[ARG0]) }; | |
56 | ok(!$@, "SERVER: Server_SSLify $@"); | |
57 | ok(1, 'SERVER: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
58 | ||
59 | # We pray that IO::Handle is sane... | |
60 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'SERVER: SSLified socket is non-blocking?'); | |
61 | ||
62 | return ($socket); | |
63 | }, | |
64 | ClientInput => sub | |
65 | { | |
66 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
67 | ||
68 | if ( $line eq 'ping' ) { | |
69 | ok(1, "SERVER: recv: $line"); | |
70 | ||
71 | ## At this point, connection MUST be encrypted. | |
72 | my $cipher = SSLify_GetCipher($heap->{client}->get_output_handle); | |
73 | ok($cipher ne '(NONE)', "SERVER: SSLify_GetCipher: $cipher"); | |
74 | ||
75 | $heap->{client}->put("pong"); | |
76 | } else { | |
77 | die "Unknown line from CLIENT: $line"; | |
78 | } | |
79 | }, | |
80 | ClientError => sub | |
81 | { | |
82 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
83 | # The default PoCo::Server::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
84 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
85 | ||
86 | # TODO are there other "errors" that is harmless? | |
87 | $error = "Normal disconnection" unless $error; | |
88 | my $msg = "Got SERVER $syscall error $errno: $error"; | |
89 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
90 | fail( $msg ); | |
91 | } else { | |
92 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
93 | } | |
94 | }, | |
95 | ); | |
96 | ||
97 | POE::Component::Client::TCP->new | |
98 | ( | |
99 | Alias => 'myclient', | |
100 | RemoteAddress => '127.0.0.1', | |
101 | RemotePort => $port, | |
102 | Connected => sub | |
103 | { | |
104 | ok(1, 'CLIENT: connected'); | |
105 | ||
106 | $_[HEAP]->{server}->put("ping"); | |
107 | }, | |
108 | PreConnect => sub | |
109 | { | |
110 | my $ctx = eval { SSLify_ContextCreate(undef, undef, 'sslv3') }; | |
111 | ok(!$@, "CLIENT: SSLify_ContextCreate $@"); | |
112 | my $socket = eval { Client_SSLify($_[ARG0], undef, undef, $ctx) }; | |
113 | ok(!$@, "CLIENT: Client_SSLify $@"); | |
114 | ok(1, 'CLIENT: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
115 | ||
116 | # We pray that IO::Handle is sane... | |
117 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'CLIENT: SSLified socket is non-blocking?'); | |
118 | ||
119 | return ($socket); | |
120 | }, | |
121 | ServerInput => sub | |
122 | { | |
123 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
124 | ||
125 | if ($line eq 'pong') { | |
126 | ok(1, "CLIENT: recv: $line"); | |
127 | ||
128 | ## At this point, connection MUST be encrypted. | |
129 | my $cipher = SSLify_GetCipher($heap->{server}->get_output_handle); | |
130 | ok($cipher ne '(NONE)', "CLIENT: SSLify_GetCipher: $cipher"); | |
131 | ||
132 | $kernel->yield('shutdown'); | |
133 | } else { | |
134 | die "Unknown line from SERVER: $line"; | |
135 | } | |
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 | # Thanks to ASCENT for this test! | |
3 | ||
4 | # This test adds renegotiation to the connection | |
5 | # Since this is not supported on all platforms, it's marked TODO and adds custom logic | |
6 | # to make sure it doesn't FAIL if it's not supported. | |
7 | ||
8 | use strict; use warnings; | |
9 | ||
10 | my $numtests; | |
11 | BEGIN { | |
12 | $numtests = 23; | |
13 | ||
14 | eval "use Test::NoWarnings"; | |
15 | if ( ! $@ ) { | |
16 | # increment by one | |
17 | $numtests++; | |
18 | ||
19 | } | |
20 | } | |
21 | ||
22 | use Test::More tests => $numtests; | |
23 | ||
24 | use POE 1.267; | |
25 | use POE::Component::Client::TCP; | |
26 | use POE::Component::Server::TCP; | |
27 | use POE::Component::SSLify qw/Client_SSLify Server_SSLify SSLify_Options SSLify_GetCipher SSLify_ContextCreate SSLify_GetSocket/; | |
28 | use Net::SSLeay qw/ERROR_WANT_READ ERROR_WANT_WRITE/; | |
29 | ||
30 | # TODO rewrite this to use Test::POE::Server::TCP and stuff :) | |
31 | ||
32 | my $port; | |
33 | my $server_ping2; | |
34 | my $client_ping2; | |
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', 'sslv3') }; | |
59 | eval { SSLify_Options('../mylib/example.key', '../mylib/example.crt', 'sslv3') } if ($@); | |
60 | ok(!$@, "SERVER: SSLify_Options $@"); | |
61 | ||
62 | my $socket = eval { Server_SSLify($_[ARG0]) }; | |
63 | ok(!$@, "SERVER: Server_SSLify $@"); | |
64 | ok(1, 'SERVER: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
65 | ||
66 | # We pray that IO::Handle is sane... | |
67 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'SERVER: SSLified socket is non-blocking?'); | |
68 | ||
69 | return ($socket); | |
70 | }, | |
71 | ClientInput => sub | |
72 | { | |
73 | my ($kernel, $heap, $request) = @_[KERNEL, HEAP, ARG0]; | |
74 | ||
75 | ## At this point, connection MUST be encrypted. | |
76 | my $cipher = SSLify_GetCipher($heap->{client}->get_output_handle); | |
77 | ok($cipher ne '(NONE)', "SERVER: SSLify_GetCipher: $cipher"); | |
78 | ||
79 | if ($request eq 'ping') | |
80 | { | |
81 | ok(1, "SERVER: recv: $request"); | |
82 | $heap->{client}->put("pong"); | |
83 | } | |
84 | elsif ($request eq 'ping2') | |
85 | { | |
86 | ok(1, "SERVER: recv: $request"); | |
87 | $server_ping2++; | |
88 | $heap->{client}->put("pong2"); | |
89 | } | |
90 | }, | |
91 | ClientError => sub | |
92 | { | |
93 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
94 | # The default PoCo::Server::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
95 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
96 | ||
97 | # TODO are there other "errors" that is harmless? | |
98 | $error = "Normal disconnection" unless $error; | |
99 | my $msg = "Got SERVER $syscall error $errno: $error"; | |
100 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
101 | fail( $msg ); | |
102 | } else { | |
103 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
104 | } | |
105 | }, | |
106 | ); | |
107 | ||
108 | POE::Component::Client::TCP->new | |
109 | ( | |
110 | Alias => 'myclient', | |
111 | RemoteAddress => '127.0.0.1', | |
112 | RemotePort => $port, | |
113 | Connected => sub | |
114 | { | |
115 | ok(1, 'CLIENT: connected'); | |
116 | ||
117 | $_[HEAP]->{server}->put("ping"); | |
118 | }, | |
119 | PreConnect => sub | |
120 | { | |
121 | my $ctx = eval { SSLify_ContextCreate(undef, undef, 'sslv3') }; | |
122 | ok(!$@, "CLIENT: SSLify_ContextCreate $@"); | |
123 | my $socket = eval { Client_SSLify($_[ARG0], undef, undef, $ctx) }; | |
124 | ok(!$@, "CLIENT: Client_SSLify $@"); | |
125 | ok(1, 'CLIENT: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
126 | ||
127 | # We pray that IO::Handle is sane... | |
128 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'CLIENT: SSLified socket is non-blocking?'); | |
129 | ||
130 | return ($socket); | |
131 | }, | |
132 | ServerInput => sub | |
133 | { | |
134 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
135 | ||
136 | ## At this point, connection MUST be encrypted. | |
137 | my $cipher = SSLify_GetCipher($heap->{server}->get_output_handle); | |
138 | ok($cipher ne '(NONE)', "CLIENT: SSLify_GetCipher: $cipher"); | |
139 | ||
140 | if ($line eq 'pong') | |
141 | { | |
142 | ok(1, "CLIENT: recv: $line"); | |
143 | ||
144 | # Skip 2 Net::SSLeay::renegotiate() tests on FreeBSD because of | |
145 | # http://security.freebsd.org/advisories/FreeBSD-SA-09:15.ssl.asc | |
146 | TODO: { | |
147 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
148 | ||
149 | ## Force SSL renegotiation | |
150 | my $ssl = tied(*{$heap->{server}->get_output_handle})->{ssl}; | |
151 | my $reneg_num = Net::SSLeay::num_renegotiations($ssl); | |
152 | ||
153 | ok(1 == Net::SSLeay::renegotiate($ssl), 'CLIENT: SSL renegotiation'); | |
154 | my $handshake = Net::SSLeay::do_handshake($ssl); | |
155 | my $err = Net::SSLeay::get_error($ssl, $handshake); | |
156 | ||
157 | ## 1 == Successful handshake, ERROR_WANT_(READ|WRITE) == non-blocking. | |
158 | ok($handshake == 1 || $err == ERROR_WANT_READ || $err == ERROR_WANT_WRITE, 'CLIENT: SSL handshake'); | |
159 | ok($reneg_num < Net::SSLeay::num_renegotiations($ssl), 'CLIENT: Increased number of negotiations'); | |
160 | } | |
161 | ||
162 | $heap->{server}->put('ping2'); | |
163 | } | |
164 | ||
165 | elsif ($line eq 'pong2') | |
166 | { | |
167 | ok(1, "CLIENT: recv: $line"); | |
168 | $client_ping2++; | |
169 | $kernel->yield('shutdown'); | |
170 | } | |
171 | }, | |
172 | ServerError => sub | |
173 | { | |
174 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
175 | # The default PoCo::Client::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
176 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
177 | ||
178 | # TODO are there other "errors" that is harmless? | |
179 | $error = "Normal disconnection" unless $error; | |
180 | my $msg = "Got CLIENT $syscall error $errno: $error"; | |
181 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
182 | fail( $msg ); | |
183 | } else { | |
184 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
185 | } | |
186 | }, | |
187 | ); | |
188 | ||
189 | $poe_kernel->run(); | |
190 | ||
191 | # Add extra pass() to make the test harness happy if renegotiate did not work | |
192 | if ( ! $server_ping2 ) { | |
193 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
194 | fail( "SERVER: Failed SSL renegotiation" ); | |
195 | } | |
196 | if ( ! $client_ping2 ) { | |
197 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
198 | fail( "CLIENT: Failed SSL renegotiation" ); | |
199 | } | |
200 | if ( ! $server_ping2 or ! $client_ping2 ) { | |
201 | diag( "WARNING: Your platform/SSL library does not support renegotiation of the SSL socket." ); | |
202 | diag( "This test harness detected that trying to renegotiate resulted in a disconnected socket." ); | |
203 | diag( "POE::Component::SSLify will work on your system, but please do not attempt a SSL renegotiate." ); | |
204 | diag( "Please talk with the author to figure out if this issue can be worked around, thank you!" ); | |
205 | } | |
206 | ||
207 | pass( 'shut down sanely' ); | |
208 | ||
209 | exit 0; |
0 | #!/usr/bin/perl | |
1 | ||
2 | # Thanks to ASCENT for this test! | |
3 | ||
4 | use strict; use warnings; | |
5 | ||
6 | my $numtests; | |
7 | BEGIN { | |
8 | $numtests = 16; | |
9 | ||
10 | eval "use Test::NoWarnings"; | |
11 | if ( ! $@ ) { | |
12 | # increment by one | |
13 | $numtests++; | |
14 | ||
15 | } | |
16 | } | |
17 | ||
18 | use Test::More tests => $numtests; | |
19 | ||
20 | use POE; | |
21 | use POE::Component::Client::TCP; | |
22 | use POE::Component::Server::TCP; | |
23 | use POE::Component::SSLify qw/Client_SSLify Server_SSLify SSLify_Options SSLify_GetCipher SSLify_ContextCreate/; | |
24 | use POSIX qw/F_GETFL O_NONBLOCK/; | |
25 | ||
26 | # TODO rewrite this to use Test::POE::Server::TCP and stuff :) | |
27 | ||
28 | my $port; | |
29 | ||
30 | POE::Component::Server::TCP->new | |
31 | ( | |
32 | Alias => 'myserver', | |
33 | Address => '127.0.0.1', | |
34 | Port => 0, | |
35 | ||
36 | Started => sub | |
37 | { | |
38 | use Socket qw/sockaddr_in/; | |
39 | $port = (sockaddr_in($_[HEAP]->{listener}->getsockname))[0]; | |
40 | }, | |
41 | ClientConnected => sub | |
42 | { | |
43 | ok(1, 'SERVER: accepted'); | |
44 | }, | |
45 | ClientDisconnected => sub | |
46 | { | |
47 | ok(1, 'SERVER: client disconnected'); | |
48 | $_[KERNEL]->post(myserver => 'shutdown'); | |
49 | }, | |
50 | ClientPreConnect => sub | |
51 | { | |
52 | eval { SSLify_Options('mylib/example.key', 'mylib/example.crt', 'sslv3') }; | |
53 | eval { SSLify_Options('../mylib/example.key', '../mylib/example.crt', 'sslv3') } if ($@); | |
54 | ok(!$@, "SERVER: SSLify_Options $@"); | |
55 | ||
56 | my $socket = eval { Server_SSLify($_[ARG0]) }; | |
57 | ok(!$@, "SERVER: Server_SSLify $@"); | |
58 | ok(1, 'SERVER: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
59 | ||
60 | # MSWin32 doesn't have F_GETFL and friends | |
61 | if ( $^O eq 'MSWin32' ) { | |
62 | # We pray that IO::Handle is sane... | |
63 | ok( ! $_[ARG0]->blocking, 'SERVER: SSLified socket is non-blocking?'); | |
64 | } else { | |
65 | my $flags = fcntl($_[ARG0], F_GETFL, 0); | |
66 | ok($flags & O_NONBLOCK, 'SERVER: SSLified socket is non-blocking?'); | |
67 | } | |
68 | ||
69 | return ($socket); | |
70 | }, | |
71 | ClientInput => sub | |
72 | { | |
73 | my ($kernel, $heap, $request) = @_[KERNEL, HEAP, ARG0]; | |
74 | ||
75 | ## At this point, connection MUST be encrypted. | |
76 | my $cipher = SSLify_GetCipher($heap->{client}->get_output_handle); | |
77 | ok($cipher ne '(NONE)', "SERVER: SSLify_GetCipher: $cipher"); | |
78 | ||
79 | if ($request eq 'ping') | |
80 | { | |
81 | ok(1, "SERVER: recv: $request"); | |
82 | $heap->{client}->put("pong"); | |
83 | } | |
84 | }, | |
85 | ClientError => sub | |
86 | { | |
87 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
88 | # The default PoCo::Server::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
89 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
90 | ||
91 | # TODO are there other "errors" that is harmless? | |
92 | $error = "Normal disconnection" unless $error; | |
93 | my $msg = "Got SERVER $syscall error $errno: $error"; | |
94 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
95 | fail( $msg ); | |
96 | } else { | |
97 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
98 | } | |
99 | }, | |
100 | ); | |
101 | ||
102 | POE::Component::Client::TCP->new | |
103 | ( | |
104 | Alias => 'myclient', | |
105 | RemoteAddress => '127.0.0.1', | |
106 | RemotePort => $port, | |
107 | Connected => sub | |
108 | { | |
109 | ok(1, 'CLIENT: connected'); | |
110 | ||
111 | $_[HEAP]->{server}->put("ping"); | |
112 | }, | |
113 | PreConnect => sub | |
114 | { | |
115 | my $ctx = eval { SSLify_ContextCreate(undef, undef, 'sslv3') }; | |
116 | ok(!$@, "CLIENT: SSLify_ContextCreate $@"); | |
117 | my $socket = eval { Client_SSLify($_[ARG0], undef, undef, $ctx) }; | |
118 | ok(!$@, "CLIENT: Client_SSLify $@"); | |
119 | ok(1, 'CLIENT: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
120 | ||
121 | # MSWin32 doesn't have F_GETFL and friends | |
122 | if ( $^O eq 'MSWin32' ) { | |
123 | # We pray that IO::Handle is sane... | |
124 | ok( ! $_[ARG0]->blocking, 'CLIENT: SSLified socket is non-blocking?'); | |
125 | } else { | |
126 | my $flags = fcntl($_[ARG0], F_GETFL, 0); | |
127 | ok($flags & O_NONBLOCK, 'CLIENT: SSLified socket is non-blocking?'); | |
128 | } | |
129 | ||
130 | return ($socket); | |
131 | }, | |
132 | ServerInput => sub | |
133 | { | |
134 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
135 | ||
136 | ## At this point, connection MUST be encrypted. | |
137 | my $cipher = SSLify_GetCipher($heap->{server}->get_output_handle); | |
138 | ok($cipher ne '(NONE)', "CLIENT: SSLify_GetCipher: $cipher"); | |
139 | ||
140 | if ($line eq 'pong') | |
141 | { | |
142 | ok(1, "CLIENT: recv: $line"); | |
143 | $kernel->yield('shutdown'); | |
144 | } | |
145 | }, | |
146 | ServerError => sub | |
147 | { | |
148 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
149 | # The default PoCo::Client::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
150 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
151 | ||
152 | # TODO are there other "errors" that is harmless? | |
153 | $error = "Normal disconnection" unless $error; | |
154 | my $msg = "Got CLIENT $syscall error $errno: $error"; | |
155 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
156 | fail( $msg ); | |
157 | } else { | |
158 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
159 | } | |
160 | }, | |
161 | ); | |
162 | ||
163 | $poe_kernel->run(); | |
164 | ||
165 | pass( 'shut down sanely' ); | |
166 | ||
167 | exit 0; |
0 | #!/usr/bin/perl | |
1 | ||
2 | # Thanks to ASCENT for this test! | |
3 | ||
4 | use strict; use warnings; | |
5 | ||
6 | my $numtests; | |
7 | BEGIN { | |
8 | $numtests = 18; | |
9 | ||
10 | eval "use Test::NoWarnings"; | |
11 | if ( ! $@ ) { | |
12 | # increment by one | |
13 | $numtests++; | |
14 | ||
15 | } | |
16 | } | |
17 | ||
18 | use Test::More tests => $numtests; | |
19 | ||
20 | use POE 1.267; | |
21 | use POE::Component::Client::TCP; | |
22 | use POE::Component::Server::TCP; | |
23 | use POE::Component::SSLify qw/Client_SSLify Server_SSLify SSLify_Options SSLify_GetCipher SSLify_ContextCreate SSLify_GetSocket/; | |
24 | ||
25 | # TODO rewrite this to use Test::POE::Server::TCP and stuff :) | |
26 | ||
27 | my $port; | |
28 | ||
29 | POE::Component::Server::TCP->new | |
30 | ( | |
31 | Alias => 'myserver', | |
32 | Address => '127.0.0.1', | |
33 | Port => 0, | |
34 | ||
35 | Started => sub | |
36 | { | |
37 | use Socket qw/sockaddr_in/; | |
38 | $port = (sockaddr_in($_[HEAP]->{listener}->getsockname))[0]; | |
39 | }, | |
40 | ClientConnected => sub | |
41 | { | |
42 | ok(1, 'SERVER: accepted'); | |
43 | }, | |
44 | ClientDisconnected => sub | |
45 | { | |
46 | ok(1, 'SERVER: client disconnected'); | |
47 | $_[KERNEL]->post(myserver => 'shutdown'); | |
48 | }, | |
49 | ClientInput => sub | |
50 | { | |
51 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
52 | ||
53 | if ( $line eq 'plaintext_ping' ) { | |
54 | ok(1, "SERVER: recv: $line"); | |
55 | $heap->{client}->put('plaintext_pong'); | |
56 | $heap->{client}->flush; # make sure we sent the pong | |
57 | ||
58 | # sslify it in-situ! | |
59 | eval { SSLify_Options('mylib/example.key', 'mylib/example.crt', 'sslv3') }; | |
60 | eval { SSLify_Options('../mylib/example.key', '../mylib/example.crt', 'sslv3') } if ($@); | |
61 | ok(!$@, "SERVER: SSLify_Options $@"); | |
62 | my $socket = eval { Server_SSLify($heap->{client}->get_output_handle) }; | |
63 | ok(!$@, "SERVER: Server_SSLify $@"); | |
64 | ok(1, 'SERVER: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
65 | ||
66 | # We pray that IO::Handle is sane... | |
67 | ok( SSLify_GetSocket( $socket )->blocking == 0, 'SERVER: SSLified socket is non-blocking?'); | |
68 | ||
69 | # TODO evil code here, ha! | |
70 | # Should I ask rcaputo to add a $rw->replace_handle($socket) method? | |
71 | # if you don't do the undef and just replace it - you'll get a bad file descriptor error from POE! | |
72 | # <fh> select error: Bad file descriptor (hits=-1) | |
73 | undef $heap->{client}; | |
74 | $heap->{client} = POE::Wheel::ReadWrite->new( | |
75 | Handle => $socket, | |
76 | InputEvent => 'tcp_server_got_input', | |
77 | ErrorEvent => 'tcp_server_got_error', | |
78 | FlushedEvent => 'tcp_server_got_flush', | |
79 | ); | |
80 | } elsif ( $line eq 'ssl_ping' ) { | |
81 | ok(1, "SERVER: recv: $line"); | |
82 | ||
83 | ## At this point, connection MUST be encrypted. | |
84 | my $cipher = SSLify_GetCipher($heap->{client}->get_output_handle); | |
85 | ok($cipher ne '(NONE)', "SERVER: SSLify_GetCipher: $cipher"); | |
86 | ||
87 | $heap->{client}->put('ssl_pong'); | |
88 | } else { | |
89 | die "Unknown line from CLIENT: $line"; | |
90 | } | |
91 | }, | |
92 | ClientError => sub | |
93 | { | |
94 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
95 | # The default PoCo::Server::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
96 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
97 | ||
98 | # TODO are there other "errors" that is harmless? | |
99 | $error = "Normal disconnection" unless $error; | |
100 | my $msg = "Got SERVER $syscall error $errno: $error"; | |
101 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
102 | fail( $msg ); | |
103 | } else { | |
104 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
105 | } | |
106 | }, | |
107 | ); | |
108 | ||
109 | POE::Component::Client::TCP->new | |
110 | ( | |
111 | Alias => 'myclient', | |
112 | RemoteAddress => '127.0.0.1', | |
113 | RemotePort => $port, | |
114 | Connected => sub | |
115 | { | |
116 | ok(1, 'CLIENT: connected'); | |
117 | ||
118 | $_[HEAP]->{server}->put("plaintext_ping"); | |
119 | }, | |
120 | ServerInput => sub | |
121 | { | |
122 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
123 | ||
124 | if ( $line eq 'plaintext_pong' ) { | |
125 | ok(1, "CLIENT: recv: $line"); | |
126 | ||
127 | # sslify it in-situ! | |
128 | my $ctx = eval { SSLify_ContextCreate(undef, undef, 'sslv3') }; | |
129 | ok(!$@, "CLIENT: SSLify_ContextCreate $@"); | |
130 | my $socket = eval { Client_SSLify($heap->{server}->get_output_handle, 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 | # TODO evil code here, ha! | |
138 | # Should I ask rcaputo to add a $rw->replace_handle($socket) method? | |
139 | # if you don't do the undef and just replace it - you'll get a bad file descriptor error from POE! | |
140 | # <fh> select error: Bad file descriptor (hits=-1) | |
141 | undef $heap->{server}; | |
142 | $heap->{server} = POE::Wheel::ReadWrite->new( | |
143 | Handle => $socket, | |
144 | InputEvent => 'got_server_input', | |
145 | ErrorEvent => 'got_server_error', | |
146 | FlushedEvent => 'got_server_flush', | |
147 | ); | |
148 | ||
149 | # Send the ssl ping! | |
150 | $heap->{server}->put('ssl_ping'); | |
151 | } elsif ( $line eq 'ssl_pong' ) { | |
152 | ok(1, "CLIENT: recv: $line"); | |
153 | ||
154 | ## At this point, connection MUST be encrypted. | |
155 | my $cipher = SSLify_GetCipher($heap->{server}->get_output_handle); | |
156 | ok($cipher ne '(NONE)', "CLIENT: SSLify_GetCipher: $cipher"); | |
157 | ||
158 | $kernel->yield('shutdown'); | |
159 | } else { | |
160 | die "Unknown line from SERVER: $line"; | |
161 | } | |
162 | }, | |
163 | ServerError => sub | |
164 | { | |
165 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
166 | # The default PoCo::Client::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
167 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
168 | ||
169 | # TODO are there other "errors" that is harmless? | |
170 | $error = "Normal disconnection" unless $error; | |
171 | my $msg = "Got CLIENT $syscall error $errno: $error"; | |
172 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
173 | fail( $msg ); | |
174 | } else { | |
175 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
176 | } | |
177 | }, | |
178 | ); | |
179 | ||
180 | $poe_kernel->run(); | |
181 | ||
182 | pass( 'shut down sanely' ); | |
183 | ||
184 | exit 0; |
0 | #!/usr/bin/perl | |
1 | ||
2 | # Thanks to ASCENT for this test! | |
3 | ||
4 | # This test adds renegotiation to the connection | |
5 | # Since this is not supported on all platforms, it's marked TODO and adds custom logic | |
6 | # to make sure it doesn't FAIL if it's not supported. | |
7 | ||
8 | use strict; use warnings; | |
9 | ||
10 | my $numtests; | |
11 | BEGIN { | |
12 | $numtests = 23; | |
13 | ||
14 | eval "use Test::NoWarnings"; | |
15 | if ( ! $@ ) { | |
16 | # increment by one | |
17 | $numtests++; | |
18 | ||
19 | } | |
20 | } | |
21 | ||
22 | use Test::More tests => $numtests; | |
23 | ||
24 | use POE; | |
25 | use POE::Component::Client::TCP; | |
26 | use POE::Component::Server::TCP; | |
27 | use POE::Component::SSLify qw/Client_SSLify Server_SSLify SSLify_Options SSLify_GetCipher SSLify_ContextCreate/; | |
28 | use Net::SSLeay qw/ERROR_WANT_READ ERROR_WANT_WRITE/; | |
29 | use POSIX qw/F_GETFL O_NONBLOCK/; | |
30 | ||
31 | # TODO rewrite this to use Test::POE::Server::TCP and stuff :) | |
32 | ||
33 | my $port; | |
34 | my $server_ping2; | |
35 | my $client_ping2; | |
36 | ||
37 | POE::Component::Server::TCP->new | |
38 | ( | |
39 | Alias => 'myserver', | |
40 | Address => '127.0.0.1', | |
41 | Port => 0, | |
42 | ||
43 | Started => sub | |
44 | { | |
45 | use Socket qw/sockaddr_in/; | |
46 | $port = (sockaddr_in($_[HEAP]->{listener}->getsockname))[0]; | |
47 | }, | |
48 | ClientConnected => sub | |
49 | { | |
50 | ok(1, 'SERVER: accepted'); | |
51 | }, | |
52 | ClientDisconnected => sub | |
53 | { | |
54 | ok(1, 'SERVER: client disconnected'); | |
55 | $_[KERNEL]->post(myserver => 'shutdown'); | |
56 | }, | |
57 | ClientPreConnect => sub | |
58 | { | |
59 | eval { SSLify_Options('mylib/example.key', 'mylib/example.crt', 'sslv3') }; | |
60 | eval { SSLify_Options('../mylib/example.key', '../mylib/example.crt', 'sslv3') } if ($@); | |
61 | ok(!$@, "SERVER: SSLify_Options $@"); | |
62 | ||
63 | my $socket = eval { Server_SSLify($_[ARG0]) }; | |
64 | ok(!$@, "SERVER: Server_SSLify $@"); | |
65 | ok(1, 'SERVER: SSLify_GetCipher: '. SSLify_GetCipher($socket)); | |
66 | ||
67 | # MSWin32 doesn't have F_GETFL and friends | |
68 | if ( $^O eq 'MSWin32' ) { | |
69 | # We pray that IO::Handle is sane... | |
70 | ok( ! $_[ARG0]->blocking, 'SERVER: SSLified socket is non-blocking?'); | |
71 | } else { | |
72 | my $flags = fcntl($_[ARG0], F_GETFL, 0); | |
73 | ok($flags & O_NONBLOCK, 'SERVER: SSLified socket is non-blocking?'); | |
74 | } | |
75 | ||
76 | return ($socket); | |
77 | }, | |
78 | ClientInput => sub | |
79 | { | |
80 | my ($kernel, $heap, $request) = @_[KERNEL, HEAP, ARG0]; | |
81 | ||
82 | ## At this point, connection MUST be encrypted. | |
83 | my $cipher = SSLify_GetCipher($heap->{client}->get_output_handle); | |
84 | ok($cipher ne '(NONE)', "SERVER: SSLify_GetCipher: $cipher"); | |
85 | ||
86 | if ($request eq 'ping') | |
87 | { | |
88 | ok(1, "SERVER: recv: $request"); | |
89 | $heap->{client}->put("pong"); | |
90 | } | |
91 | elsif ($request eq 'ping2') | |
92 | { | |
93 | ok(1, "SERVER: recv: $request"); | |
94 | $server_ping2++; | |
95 | $heap->{client}->put("pong2"); | |
96 | } | |
97 | }, | |
98 | ClientError => sub | |
99 | { | |
100 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
101 | # The default PoCo::Server::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
102 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
103 | ||
104 | # TODO are there other "errors" that is harmless? | |
105 | $error = "Normal disconnection" unless $error; | |
106 | my $msg = "Got SERVER $syscall error $errno: $error"; | |
107 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
108 | fail( $msg ); | |
109 | } else { | |
110 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
111 | } | |
112 | }, | |
113 | ); | |
114 | ||
115 | POE::Component::Client::TCP->new | |
116 | ( | |
117 | Alias => 'myclient', | |
118 | RemoteAddress => '127.0.0.1', | |
119 | RemotePort => $port, | |
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 | # MSWin32 doesn't have F_GETFL and friends | |
135 | if ( $^O eq 'MSWin32' ) { | |
136 | # We pray that IO::Handle is sane... | |
137 | ok( ! $_[ARG0]->blocking, 'CLIENT: SSLified socket is non-blocking?'); | |
138 | } else { | |
139 | my $flags = fcntl($_[ARG0], F_GETFL, 0); | |
140 | ok($flags & O_NONBLOCK, 'CLIENT: SSLified socket is non-blocking?'); | |
141 | } | |
142 | ||
143 | return ($socket); | |
144 | }, | |
145 | ServerInput => sub | |
146 | { | |
147 | my ($kernel, $heap, $line) = @_[KERNEL, HEAP, ARG0]; | |
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 | if ($line eq 'pong') | |
154 | { | |
155 | ok(1, "CLIENT: recv: $line"); | |
156 | ||
157 | # Skip 2 Net::SSLeay::renegotiate() tests on FreeBSD because of | |
158 | # http://security.freebsd.org/advisories/FreeBSD-SA-09:15.ssl.asc | |
159 | TODO: { | |
160 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
161 | ||
162 | ## Force SSL renegotiation | |
163 | my $ssl = tied(*{$heap->{server}->get_output_handle})->{ssl}; | |
164 | my $reneg_num = Net::SSLeay::num_renegotiations($ssl); | |
165 | ||
166 | ok(1 == Net::SSLeay::renegotiate($ssl), 'CLIENT: SSL renegotiation'); | |
167 | my $handshake = Net::SSLeay::do_handshake($ssl); | |
168 | my $err = Net::SSLeay::get_error($ssl, $handshake); | |
169 | ||
170 | ## 1 == Successful handshake, ERROR_WANT_(READ|WRITE) == non-blocking. | |
171 | ok($handshake == 1 || $err == ERROR_WANT_READ || $err == ERROR_WANT_WRITE, 'CLIENT: SSL handshake'); | |
172 | ok($reneg_num < Net::SSLeay::num_renegotiations($ssl), 'CLIENT: Increased number of negotiations'); | |
173 | } | |
174 | ||
175 | $heap->{server}->put('ping2'); | |
176 | } | |
177 | ||
178 | elsif ($line eq 'pong2') | |
179 | { | |
180 | ok(1, "CLIENT: recv: $line"); | |
181 | $client_ping2++; | |
182 | $kernel->yield('shutdown'); | |
183 | } | |
184 | }, | |
185 | ServerError => sub | |
186 | { | |
187 | # Thanks to H. Merijn Brand for spotting this FAIL in 5.12.0! | |
188 | # The default PoCo::Client::TCP handler will throw a warning, which causes Test::NoWarnings to FAIL :( | |
189 | my ($syscall, $errno, $error) = @_[ ARG0..ARG2 ]; | |
190 | ||
191 | # TODO are there other "errors" that is harmless? | |
192 | $error = "Normal disconnection" unless $error; | |
193 | my $msg = "Got CLIENT $syscall error $errno: $error"; | |
194 | unless ( $syscall eq 'read' and $errno == 0 ) { | |
195 | fail( $msg ); | |
196 | } else { | |
197 | diag( $msg ) if $ENV{TEST_VERBOSE}; | |
198 | } | |
199 | }, | |
200 | ); | |
201 | ||
202 | $poe_kernel->run(); | |
203 | ||
204 | # Add extra pass() to make the test harness happy if renegotiate did not work | |
205 | if ( ! $server_ping2 ) { | |
206 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
207 | fail( "SERVER: Failed SSL renegotiation" ); | |
208 | } | |
209 | if ( ! $client_ping2 ) { | |
210 | local $TODO = "Net::SSLeay::renegotiate() does not work on all platforms"; | |
211 | fail( "CLIENT: Failed SSL renegotiation" ); | |
212 | } | |
213 | if ( ! $server_ping2 or ! $client_ping2 ) { | |
214 | diag( "WARNING: Your platform/SSL library does not support renegotiation of the SSL socket." ); | |
215 | diag( "This test harness detected that trying to renegotiate resulted in a disconnected socket." ); | |
216 | diag( "POE::Component::SSLify will work on your system, but please do not attempt a SSL renegotiate." ); | |
217 | diag( "Please talk with the author to figure out if this issue can be worked around, thank you!" ); | |
218 | } | |
219 | ||
220 | pass( 'shut down sanely' ); | |
221 | ||
222 | exit 0; |
0 | #!/usr/bin/perl | |
1 | use strict; use warnings; | |
2 | ||
3 | use Test::More; | |
4 | eval "use Test::Apocalypse 0.10"; | |
5 | if ( $@ ) { | |
6 | plan skip_all => 'Test::Apocalypse required for validating the distribution'; | |
7 | } else { | |
8 | # lousy hack for kwalitee | |
9 | require Test::NoWarnings; require Test::Pod; require Test::Pod::Coverage; | |
10 | is_apocalypse_here(); | |
11 | } |