parent
9c4ed3ddae
commit
62d1425971
|
@ -81,7 +81,7 @@ M: array >insecure [ >insecure ] map ;
|
|||
M: f >insecure ;
|
||||
|
||||
: >secure ( addrspec -- addrspec' )
|
||||
>insecure [ dup secure? [ <secure> ] unless ] map ;
|
||||
>insecure [ dup secure? [ f <secure> ] unless ] map ;
|
||||
|
||||
: configurable-addrspecs ( addrspecs -- addrspecs' )
|
||||
[ inet6? not ipv6-supported? or ] filter ;
|
||||
|
@ -230,7 +230,7 @@ M: inet4 connect-addr [ "127.0.0.1" ] dip port>> <inet4> ;
|
|||
|
||||
M: inet6 connect-addr [ "::1" ] dip port>> <inet6> ;
|
||||
|
||||
M: secure connect-addr addrspec>> connect-addr <secure> ;
|
||||
M: secure connect-addr addrspec>> connect-addr f <secure> ;
|
||||
|
||||
M: local connect-addr ;
|
||||
|
||||
|
|
|
@ -171,11 +171,16 @@ SYMBOL: default-secure-context
|
|||
swap >>file
|
||||
] with-destructors ;
|
||||
|
||||
: <ssl-socket> ( winsock -- ssl )
|
||||
[
|
||||
socket-handle BIO_NOCLOSE BIO_new_socket dup ssl-error
|
||||
] keep <ssl-handle>
|
||||
[ handle>> swap dup SSL_set_bio ] keep ;
|
||||
:: <ssl-socket> ( winsock hostname -- ssl )
|
||||
winsock socket-handle BIO_NOCLOSE BIO_new_socket dup ssl-error :> bio
|
||||
winsock <ssl-handle> :> handle
|
||||
handle handle>> :> native-handle
|
||||
hostname [
|
||||
utf8 string>alien
|
||||
native-handle swap SSL_set_tlsext_host_name ssl-error
|
||||
] when*
|
||||
native-handle bio bio SSL_set_bio
|
||||
handle ;
|
||||
|
||||
! Error handling
|
||||
: syscall-error ( r -- event )
|
||||
|
@ -330,7 +335,7 @@ M: openssl check-certificate ( host ssl -- )
|
|||
|
||||
: make-input/output-secure ( input output -- )
|
||||
dup handle>> non-ssl-socket? [ upgrade-on-non-socket ] unless
|
||||
[ <ssl-socket> ] change-handle
|
||||
[ f <ssl-socket> ] change-handle
|
||||
handle>> >>handle drop ;
|
||||
|
||||
: (send-secure-handshake) ( output -- )
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
USING: io help.markup help.syntax calendar quotations io.sockets ;
|
||||
USING: io help.markup help.syntax calendar quotations strings io.sockets ;
|
||||
IN: io.sockets.secure
|
||||
|
||||
HELP: secure-socket-timeout
|
||||
|
@ -74,7 +74,7 @@ HELP: secure
|
|||
{ $class-description "The class of secure socket addresses." } ;
|
||||
|
||||
HELP: <secure>
|
||||
{ $values { "addrspec" "an address specifier" } { "secure" secure } }
|
||||
{ $values { "addrspec" "an address specifier" } { "hostname" { $maybe string } } { "secure" secure } }
|
||||
{ $description "Creates a new secure socket address, which can then be passed to " { $link <client> } " or " { $link <server> } "." } ;
|
||||
|
||||
ARTICLE: "ssl-addresses" "Secure socket addresses"
|
||||
|
|
|
@ -2,7 +2,7 @@ IN: io.sockets.secure.tests
|
|||
USING: accessors io.sockets io.sockets.secure io.sockets.secure.debug
|
||||
kernel system tools.test ;
|
||||
|
||||
{ "hello" 24 } [ "hello" 24 <inet> <secure> [ host>> ] [ port>> ] bi ] unit-test
|
||||
{ "hello" 24 } [ "hello" 24 <inet> "hello" <secure> [ host>> ] [ port>> ] bi ] unit-test
|
||||
|
||||
{ } [
|
||||
<test-secure-config> [ ] with-secure-context
|
||||
|
|
|
@ -44,7 +44,9 @@ HOOK: <secure-context> secure-socket-backend ( config -- context )
|
|||
with-disposal
|
||||
] with-scope ; inline
|
||||
|
||||
TUPLE: secure { addrspec read-only } ;
|
||||
TUPLE: secure
|
||||
{ addrspec read-only }
|
||||
{ hostname read-only } ;
|
||||
|
||||
C: <secure> secure
|
||||
|
||||
|
@ -53,7 +55,8 @@ M: secure present addrspec>> present " (secure)" append ;
|
|||
CONSULT: inet secure addrspec>> ;
|
||||
|
||||
M: secure resolve-host ( secure -- seq )
|
||||
addrspec>> resolve-host [ <secure> ] map ;
|
||||
[ addrspec>> resolve-host ] [ hostname>> ] bi
|
||||
[ <secure> ] curry map ;
|
||||
|
||||
HOOK: check-certificate secure-socket-backend ( host handle -- )
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ io.sockets.secure.debug ;
|
|||
:: server-test ( quot -- )
|
||||
[
|
||||
[
|
||||
"127.0.0.1" 0 <inet4> <secure> ascii <server> [
|
||||
"127.0.0.1" 0 <inet4> f <secure> ascii <server> [
|
||||
dup addr>> addrspec>> port>> "port" get fulfill
|
||||
accept [
|
||||
quot call
|
||||
|
@ -23,7 +23,7 @@ io.sockets.secure.debug ;
|
|||
|
||||
: client-test ( -- string )
|
||||
<secure-config> [
|
||||
"127.0.0.1" "port" get ?promise <inet4> <secure> ascii <client> drop stream-contents
|
||||
"127.0.0.1" "port" get ?promise <inet4> f <secure> ascii <client> drop stream-contents
|
||||
] with-secure-context ;
|
||||
|
||||
{ } [ [ class-of name>> write ] server-test ] unit-test
|
||||
|
@ -55,7 +55,7 @@ io.sockets.secure.debug ;
|
|||
|
||||
[
|
||||
<secure-config> [
|
||||
"localhost" "port" get ?promise <inet> <secure> ascii
|
||||
"localhost" "port" get ?promise <inet> f <secure> ascii
|
||||
<client> drop dispose
|
||||
] with-secure-context
|
||||
] [ certificate-verify-error? ] must-fail-with
|
||||
|
@ -95,7 +95,7 @@ io.sockets.secure.debug ;
|
|||
1 seconds secure-socket-timeout [
|
||||
[
|
||||
[
|
||||
"127.0.0.1" 0 <inet4> <secure> ascii <server> [
|
||||
"127.0.0.1" 0 <inet4> f <secure> ascii <server> [
|
||||
dup addr>> addrspec>> port>> "port" get fulfill
|
||||
accept drop &dispose dup stream-read1 drop
|
||||
] with-disposal
|
||||
|
@ -114,7 +114,7 @@ io.sockets.secure.debug ;
|
|||
[
|
||||
[
|
||||
[
|
||||
"127.0.0.1" 0 <inet4> <secure> ascii <server> [
|
||||
"127.0.0.1" 0 <inet4> f <secure> ascii <server> [
|
||||
dup addr>> addrspec>> port>> "port" get fulfill
|
||||
accept drop &dispose 1 minutes sleep
|
||||
] with-disposal
|
||||
|
@ -126,7 +126,7 @@ io.sockets.secure.debug ;
|
|||
[
|
||||
1 seconds secure-socket-timeout [
|
||||
<secure-config> [
|
||||
"127.0.0.1" "port" get ?promise <inet4> <secure>
|
||||
"127.0.0.1" "port" get ?promise <inet4> f <secure>
|
||||
ascii <client> drop dispose
|
||||
] with-secure-context
|
||||
] with-variable
|
||||
|
@ -140,7 +140,7 @@ io.sockets.secure.debug ;
|
|||
[
|
||||
[
|
||||
"127.0.0.1" "port" get ?promise
|
||||
<inet4> <secure> ascii <client> drop &dispose 1 minutes sleep
|
||||
<inet4> f <secure> ascii <client> drop &dispose 1 minutes sleep
|
||||
] with-test-context
|
||||
] with-destructors
|
||||
] "Silly client" spawn drop
|
||||
|
@ -150,7 +150,7 @@ io.sockets.secure.debug ;
|
|||
[
|
||||
1 seconds secure-socket-timeout [
|
||||
[
|
||||
"127.0.0.1" 0 <inet4> <secure> ascii <server> [
|
||||
"127.0.0.1" 0 <inet4> f <secure> ascii <server> [
|
||||
dup addr>> addrspec>> port>> "port" get fulfill
|
||||
accept drop &dispose
|
||||
] with-disposal
|
||||
|
|
|
@ -14,10 +14,10 @@ M: ssl-handle handle-fd file>> handle-fd ;
|
|||
|
||||
M: unix socket-handle fd>> ;
|
||||
|
||||
M: secure ((client)) ( addrspec -- handle )
|
||||
addrspec>> ((client)) <ssl-socket> ;
|
||||
M: secure ((client)) ( secure -- handle )
|
||||
[ addrspec>> ((client)) ] [ hostname>> ] bi <ssl-socket> ;
|
||||
|
||||
M: secure parse-sockaddr addrspec>> parse-sockaddr <secure> ;
|
||||
M: secure parse-sockaddr addrspec>> parse-sockaddr f <secure> ;
|
||||
|
||||
M: secure (get-local-address) addrspec>> (get-local-address) ;
|
||||
|
||||
|
@ -28,7 +28,8 @@ M: secure (server) addrspec>> (server) ;
|
|||
|
||||
M: secure (accept)
|
||||
[
|
||||
addrspec>> (accept) [ |dispose <ssl-socket> ] dip
|
||||
[ hostname>> ] [ addrspec>> ] bi (accept)
|
||||
[ |dispose <ssl-socket> ] dip
|
||||
] with-destructors ;
|
||||
|
||||
: check-shutdown-response ( handle r -- event )
|
||||
|
|
|
@ -14,7 +14,7 @@ M: secure ((client)) ( addrspec -- handle )
|
|||
M: secure (get-local-address) ( handle remote -- sockaddr )
|
||||
[ file>> ] [ addrspec>> ] bi* (get-local-address) ;
|
||||
|
||||
M: secure parse-sockaddr addrspec>> parse-sockaddr <secure> ;
|
||||
M: secure parse-sockaddr addrspec>> parse-sockaddr f <secure> ;
|
||||
|
||||
M:: secure establish-connection ( client-out addrspec -- )
|
||||
client-out handle>> file>> :> socket
|
||||
|
|
|
@ -392,7 +392,6 @@ FUNCTION: int SSL_connect ( SSL* ssl )
|
|||
FUNCTION: int SSL_read ( SSL* ssl, void* buf, int num )
|
||||
FUNCTION: int SSL_write ( SSL* ssl, void* buf, int num )
|
||||
FUNCTION: long SSL_ctrl ( SSL* ssl, int cmd, long larg, void* parg )
|
||||
! FUNCTION: long SSL_callback_ctrl ( SSL* ssl, int cmd, long larg, void* parg )
|
||||
|
||||
FUNCTION: int SSL_shutdown ( SSL* ssl )
|
||||
|
||||
|
@ -468,6 +467,10 @@ FUNCTION: void SSL_CTX_set_tmp_rsa_callback ( SSL_CTX* ctx, void* rsa )
|
|||
|
||||
FUNCTION: void* BIO_f_ssl ( )
|
||||
|
||||
: SSL_set_tlsext_host_name ( ctx hostname -- n )
|
||||
[ SSL_CTRL_SET_TLSEXT_HOSTNAME TLSEXT_NAMETYPE_host_name ] dip
|
||||
SSL_ctrl ;
|
||||
|
||||
: SSL_CTX_need_tmp_rsa ( ctx -- n )
|
||||
SSL_CTRL_NEED_TMP_RSA 0 f SSL_CTX_ctrl ;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
! Copyright (C) 2008, 2010 Slava Pestov.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: urls urls.private io.sockets io.sockets.secure ;
|
||||
USING: kernel urls urls.private io.sockets io.sockets.secure ;
|
||||
IN: urls.secure
|
||||
|
||||
UNION: abstract-inet inet inet4 inet6 ;
|
||||
|
|
|
@ -172,7 +172,7 @@ PRIVATE>
|
|||
|
||||
<PRIVATE
|
||||
|
||||
GENERIC: >secure-addr ( addrspec -- addrspec' )
|
||||
GENERIC# >secure-addr 1 ( addrspec host -- addrspec' )
|
||||
|
||||
PRIVATE>
|
||||
|
||||
|
@ -182,8 +182,10 @@ PRIVATE>
|
|||
[ port>> ]
|
||||
[ protocol>> protocol-port ]
|
||||
tri or <inet>
|
||||
] [ protocol>> ] bi
|
||||
secure-protocol? [ >secure-addr ] when ;
|
||||
]
|
||||
[ host>> ]
|
||||
[ protocol>> ] tri
|
||||
secure-protocol? [ >secure-addr ] [ drop ] if ;
|
||||
|
||||
: set-url-addr ( url addr -- url )
|
||||
[ host>> >>host ] [ port>> >>port ] bi ;
|
||||
|
|
|
@ -108,7 +108,7 @@ PRIVATE>
|
|||
|
||||
! Constructor
|
||||
: <imap4ssl> ( host -- imap4 )
|
||||
IMAP4_SSL_PORT <inet> <secure> binary <client> drop
|
||||
IMAP4_SSL_PORT <inet> f <secure> binary <client> drop
|
||||
! Read the useless welcome message.
|
||||
dup [ "\\*" read-response drop ] with-stream* ;
|
||||
|
||||
|
|
Loading…
Reference in New Issue