mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-12 09:01:05 +00:00
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:
parent
5d124ff9cf
commit
3fbd8c2cf6
5 changed files with 8501 additions and 6609 deletions
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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];
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue