Now enable TLS stream support by default.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@25912 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2008-01-10 08:56:03 +00:00
parent 5d124ff9cf
commit 3fbd8c2cf6
5 changed files with 8501 additions and 6609 deletions

View file

@ -1,3 +1,10 @@
2008-01-10 Richard Frith-Macdonald <rfm@gnu.org>
* Source/GSSocketStream.m: tweak TLS code
* Source/GSStream.m: simplify socket code
* configure.ac: enable gnu tls by default
* configure: regenerate
2008-01-09 Richard Frith-Macdonald <rfm@gnu.org> 2008-01-09 Richard Frith-Macdonald <rfm@gnu.org>
* Source/GSSocketStream.h: * Source/GSSocketStream.h:

View file

@ -113,6 +113,7 @@ GSPrivateSockaddrLength(struct sockaddr *addr)
{ {
istream = i; istream = i;
ostream = o; ostream = o;
handshake = YES;
return self; return self;
} }
@ -210,7 +211,7 @@ GSTLSPull(gnutls_transport_ptr_t handle, void *buffer, size_t len)
} }
else else
{ {
e = EAGAIN; e = EWOULDBLOCK;
} }
gnutls_transport_set_errno (tls->session, e); gnutls_transport_set_errno (tls->session, e);
} }
@ -237,7 +238,7 @@ GSTLSPush(gnutls_transport_ptr_t handle, const void *buffer, size_t len)
} }
else else
{ {
e = EAGAIN; e = EWOULDBLOCK;
} }
gnutls_transport_set_errno (tls->session, e); gnutls_transport_set_errno (tls->session, e);
} }
@ -275,7 +276,7 @@ static gnutls_anon_client_credentials_t anoncred;
/* Enable gnutls logging via NSLog /* Enable gnutls logging via NSLog
*/ */
gnutls_global_set_log_function (GSTLSLog); gnutls_global_set_log_function (GSTLSLog);
// gnutls_global_set_log_level (11); //gnutls_global_set_log_level (11);
} }
} }
@ -318,7 +319,9 @@ static gnutls_anon_client_credentials_t anoncred;
ret = gnutls_handshake (session); ret = gnutls_handshake (session);
if (ret < 0) if (ret < 0)
{ {
NSDebugMLog(@"NSThread", @"Handshake status %d", ret); NSDebugMLLog(@"NSStream",
@"Handshake status %d", ret);
// gnutls_perror(ret);
} }
else else
{ {
@ -450,15 +453,42 @@ static gnutls_anon_client_credentials_t anoncred;
- (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event - (void) stream: (NSStream*)stream handleEvent: (NSStreamEvent)event
{ {
//NSLog(@"GSTLS got %d on %p", event, stream); NSDebugMLLog(@"NSStream",
@"GSTLS got %d on %p", event, stream);
if (handshake == YES) if (handshake == YES)
{ {
switch (event)
{
case NSStreamEventHasSpaceAvailable:
case NSStreamEventHasBytesAvailable:
case NSStreamEventOpenCompleted:
[self hello]; /* try to complete the handshake */ [self hello]; /* try to complete the handshake */
if (handshake == NO) if (handshake == NO)
{
NSDebugMLLog(@"NSStream",
@"GSTLS completed on %p", stream);
if ([istream streamStatus] == NSStreamStatusOpen)
{ {
[istream _sendEvent: NSStreamEventOpenCompleted]; [istream _sendEvent: NSStreamEventOpenCompleted];
}
else
{
[istream _sendEvent: NSStreamEventErrorOccurred];
}
if ([ostream streamStatus] == NSStreamStatusOpen)
{
[ostream _sendEvent: NSStreamEventOpenCompleted]; [ostream _sendEvent: NSStreamEventOpenCompleted];
[ostream _sendEvent: NSStreamEventHasSpaceAvailable];
}
else
{
[ostream _sendEvent: NSStreamEventErrorOccurred];
}
}
break;
default:
break;
} }
} }
} }
@ -1442,6 +1472,30 @@ setNonBlocking(SOCKET fd)
} }
} }
if (_handler == nil)
{
NSString *tls;
tls = [self propertyForKey: NSStreamSocketSecurityLevelKey];
if (tls == nil && _sibling != nil)
{
tls = [_sibling propertyForKey: NSStreamSocketSecurityLevelKey];
if (tls != nil)
{
[self setProperty: tls
forKey: NSStreamSocketSecurityLevelKey];
}
}
if (tls != nil)
{
GSTLS *t;
t = [[GSTLS alloc] initWithInput: self output: _sibling];
[_sibling _setHandler: t];
[self _setHandler: t];
RELEASE(t);
}
}
result = connect([self _sock], _address, result = connect([self _sock], _address,
GSPrivateSockaddrLength(_address)); GSPrivateSockaddrLength(_address));
if (socketError(result)) if (socketError(result))
@ -1449,6 +1503,8 @@ setNonBlocking(SOCKET fd)
if (!socketWouldBlock()) if (!socketWouldBlock())
{ {
[self _recordError]; [self _recordError];
[self _setHandler: nil];
[_sibling _setHandler: nil];
return; return;
} }
/* /*
@ -1501,12 +1557,14 @@ setNonBlocking(SOCKET fd)
{ {
if (_currentStatus == NSStreamStatusNotOpen) if (_currentStatus == NSStreamStatusNotOpen)
{ {
NSDebugMLog(@"Attempt to close unopened stream %@", self); NSDebugMLLog(@"NSStream",
@"Attempt to close unopened stream %@", self);
return; return;
} }
if (_currentStatus == NSStreamStatusClosed) if (_currentStatus == NSStreamStatusClosed)
{ {
NSDebugMLog(@"Attempt to close already closed stream %@", self); NSDebugMLLog(@"NSStream",
@"Attempt to close already closed stream %@", self);
return; return;
} }
[_handler bye]; [_handler bye];
@ -1868,8 +1926,6 @@ setNonBlocking(SOCKET fd)
- (void) open - (void) open
{ {
NSString *tls;
// could be opened because of sibling // could be opened because of sibling
if ([self _isOpened]) if ([self _isOpened])
return; return;
@ -1885,6 +1941,48 @@ setNonBlocking(SOCKET fd)
{ {
int result; int result;
if ([self _sock] == INVALID_SOCKET)
{
SOCKET s;
s = socket(_address->sa_family, SOCK_STREAM, 0);
if (BADSOCKET(s))
{
[self _recordError];
return;
}
else
{
[self _setSock: s];
[_sibling _setSock: s];
}
}
if (_handler == nil)
{
NSString *tls;
tls = [self propertyForKey: NSStreamSocketSecurityLevelKey];
if (tls == nil && _sibling != nil)
{
tls = [_sibling propertyForKey: NSStreamSocketSecurityLevelKey];
if (tls != nil)
{
[self setProperty: tls
forKey: NSStreamSocketSecurityLevelKey];
}
}
if (tls != nil)
{
GSTLS *t;
t = [[GSTLS alloc] initWithInput: _sibling output: self];
[_sibling _setHandler: t];
[self _setHandler: t];
RELEASE(t);
}
}
result = connect([self _sock], _address, result = connect([self _sock], _address,
GSPrivateSockaddrLength(_address)); GSPrivateSockaddrLength(_address));
if (socketError(result)) if (socketError(result))
@ -1892,6 +1990,8 @@ setNonBlocking(SOCKET fd)
if (!socketWouldBlock()) if (!socketWouldBlock())
{ {
[self _recordError]; [self _recordError];
[self _setHandler: nil];
[_sibling _setHandler: nil];
return; return;
} }
/* /*
@ -1938,25 +2038,7 @@ setNonBlocking(SOCKET fd)
WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS); WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS);
#endif #endif
[super open]; [super open];
tls = [self propertyForKey: NSStreamSocketSecurityLevelKey];
if (tls == nil && _sibling != nil)
{
tls = [_sibling propertyForKey: NSStreamSocketSecurityLevelKey];
if (tls != nil)
{
[self setProperty: tls forKey: NSStreamSocketSecurityLevelKey];
}
}
if (tls != nil)
{
GSTLS *t;
t = [[GSTLS alloc] initWithInput: _sibling output: self];
[_sibling _setHandler: t];
[self _setHandler: t];
RELEASE(t);
[_handler hello];
}
} }
@ -1964,12 +2046,14 @@ setNonBlocking(SOCKET fd)
{ {
if (_currentStatus == NSStreamStatusNotOpen) if (_currentStatus == NSStreamStatusNotOpen)
{ {
NSDebugMLog(@"Attempt to close unopened stream %@", self); NSDebugMLLog(@"NSStream",
@"Attempt to close unopened stream %@", self);
return; return;
} }
if (_currentStatus == NSStreamStatusClosed) if (_currentStatus == NSStreamStatusClosed)
{ {
NSDebugMLog(@"Attempt to close already closed stream %@", self); NSDebugMLLog(@"NSStream",
@"Attempt to close already closed stream %@", self);
return; return;
} }
[_handler bye]; [_handler bye];
@ -2231,12 +2315,13 @@ setNonBlocking(SOCKET fd)
if (_currentStatus != NSStreamStatusNotOpen) if (_currentStatus != NSStreamStatusNotOpen)
{ {
NSDebugMLog(@"Attempt to re-open stream %@", self); NSDebugMLLog(@"NSStream",
@"Attempt to re-open stream %@", self);
return; return;
} }
s = socket(_address->sa_family, SOCK_STREAM, 0); s = socket(_address->sa_family, SOCK_STREAM, 0);
if (s < 0) if (BADSOCKET(s))
{ {
[self _recordError]; [self _recordError];
[self _sendEvent: NSStreamEventErrorOccurred]; [self _sendEvent: NSStreamEventErrorOccurred];

View file

@ -200,7 +200,8 @@ static RunLoopEventType typeForStream(NSStream *aStream)
- (void) open - (void) open
{ {
if (_currentStatus != NSStreamStatusNotOpen) if (_currentStatus != NSStreamStatusNotOpen
&& _currentStatus != NSStreamStatusOpening)
{ {
NSDebugMLog(@"Attempt to re-open stream %@", self); NSDebugMLog(@"Attempt to re-open stream %@", self);
} }

14541
configure vendored

File diff suppressed because it is too large Load diff

View file

@ -2120,7 +2120,7 @@ AC_SUBST(HAVE_LIBXML)
AC_ARG_ENABLE(tls, AC_ARG_ENABLE(tls,
[ --disable-tls Disable use of GNUTLS],, [ --disable-tls Disable use of GNUTLS],,
enable_tls=no) enable_tls=yes)
if test $enable_tls = yes; then if test $enable_tls = yes; then
# Save CFLAGS and LIBS as AM_PATH_TLS clobbers these variables regardless # Save CFLAGS and LIBS as AM_PATH_TLS clobbers these variables regardless