fill out SSLSocket with more methods.

This commit is contained in:
nicolson%netscape.com 2001-02-10 02:49:33 +00:00
Родитель d16ccaa1c1
Коммит ef3cc55525
2 изменённых файлов: 308 добавлений и 97 удалений

Просмотреть файл

@ -102,10 +102,16 @@ DestroyJSSL_SocketData(JNIEnv *env, JSSL_SocketData *sd)
} }
/*
* These must match up with the constants defined in SSLSocket.java.
*/
static PRInt32 enums[] = { static PRInt32 enums[] = {
SSL_ENABLE_SSL2, /* 0 */ SSL_ENABLE_SSL2, /* 0 */
SSL_ENABLE_SSL3, /* 1 */ SSL_ENABLE_SSL3, /* 1 */
SO_LINGER, /* 2 */ PR_SockOpt_NoDelay, /* 2 */
PR_SockOpt_Keepalive, /* 3 */
PR_SHUTDOWN_RCV, /* 4 */
PR_SHUTDOWN_SEND, /* 5 */
0 0
}; };
@ -157,9 +163,7 @@ Java_org_mozilla_jss_ssl_SSLSocket_forceHandshake(JNIEnv *env, jobject self)
int rv; int rv;
/* get my fd */ /* get my fd */
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS ) { if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS ) goto finish;
goto finish;
}
/* do the work */ /* do the work */
rv = SSL_ForceHandshake(sock->fd); rv = SSL_ForceHandshake(sock->fd);
@ -172,31 +176,6 @@ Java_org_mozilla_jss_ssl_SSLSocket_forceHandshake(JNIEnv *env, jobject self)
finish: finish:
} }
JNIEXPORT void JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_setTcpNoDelay(JNIEnv *env, jobject self,
jboolean on)
{
PRSocketOptionData sockOptions;
PRStatus status;
JSSL_SocketData *sock;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS ) {
goto finish;
}
sockOptions.option = PR_SockOpt_NoDelay;
sockOptions.value.no_delay = on;
status = PR_SetSocketOption(sock->fd, &sockOptions);
if( status != PR_SUCCESS ) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "PR_SetSocketOption failed");
goto finish;
}
finish:
}
/* /*
* linger * linger
* The linger time, in hundredths of a second. * The linger time, in hundredths of a second.
@ -253,6 +232,176 @@ finish:
return sockOptions.value.no_delay; return sockOptions.value.no_delay;
} }
JNIEXPORT void JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_setTcpNoDelay(JNIEnv *env, jobject self,
jboolean on)
{
PRSocketOptionData sockOptions;
PRStatus status;
JSSL_SocketData *sock;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS ) {
goto finish;
}
sockOptions.option = PR_SockOpt_NoDelay;
sockOptions.value.no_delay = on;
status = PR_SetSocketOption(sock->fd, &sockOptions);
if( status != PR_SUCCESS ) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "PR_SetSocketOption failed");
goto finish;
}
finish:
}
JNIEXPORT jint JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_getSendBufferSize(JNIEnv *env, jobject self)
{
PRSocketOptionData sockOptions;
JSSL_SocketData *sock;
PRStatus status;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS ) {
goto finish;
}
sockOptions.option = PR_SockOpt_SendBufferSize;
status = PR_GetSocketOption(sock->fd, &sockOptions);
if( status != PR_SUCCESS ) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "PR_GetSocketOption failed");
goto finish;
}
finish:
return sockOptions.value.send_buffer_size;
}
JNIEXPORT void JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_setSendBufferSize(JNIEnv *env, jobject self,
jint size)
{
PRSocketOptionData sockOptions;
PRStatus status;
JSSL_SocketData *sock;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS ) {
goto finish;
}
sockOptions.option = PR_SockOpt_SendBufferSize;
sockOptions.value.send_buffer_size = size;
status = PR_SetSocketOption(sock->fd, &sockOptions);
if( status != PR_SUCCESS ) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "PR_SetSocketOption failed");
goto finish;
}
finish:
}
JNIEXPORT jboolean JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_getKeepAlive(JNIEnv *env, jobject self)
{
PRSocketOptionData sockOptions;
JSSL_SocketData *sock;
PRStatus status;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS ) {
goto finish;
}
sockOptions.option = PR_SockOpt_Keepalive;
status = PR_GetSocketOption(sock->fd, &sockOptions);
if( status != PR_SUCCESS ) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "PR_GetSocketOption failed");
goto finish;
}
finish:
return sockOptions.value.keep_alive;
}
JNIEXPORT jint JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_getReceiveBufferSize(
JNIEnv *env, jobject self)
{
PRSocketOptionData sockOptions;
JSSL_SocketData *sock;
PRStatus status;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS ) {
goto finish;
}
sockOptions.option = PR_SockOpt_RecvBufferSize;
status = PR_GetSocketOption(sock->fd, &sockOptions);
if( status != PR_SUCCESS ) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "PR_GetSocketOption failed");
goto finish;
}
finish:
return sockOptions.value.recv_buffer_size;
}
JNIEXPORT void JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_setReceiveBufferSize(
JNIEnv *env, jobject self, jint size)
{
PRSocketOptionData sockOptions;
PRStatus status;
JSSL_SocketData *sock;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS ) {
goto finish;
}
sockOptions.option = PR_SockOpt_RecvBufferSize;
sockOptions.value.recv_buffer_size = size;
status = PR_SetSocketOption(sock->fd, &sockOptions);
if( status != PR_SUCCESS ) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "PR_SetSocketOption failed");
goto finish;
}
finish:
}
JNIEXPORT void JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_setKeepAlive(JNIEnv *env, jobject self,
jboolean on)
{
PRSocketOptionData sockOptions;
PRStatus status;
JSSL_SocketData *sock;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS ) {
goto finish;
}
sockOptions.option = PR_SockOpt_Keepalive;
sockOptions.value.keep_alive = on;
status = PR_SetSocketOption(sock->fd, &sockOptions);
if( status != PR_SUCCESS ) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "PR_SetSocketOption failed");
goto finish;
}
finish:
}
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_getSoLinger(JNIEnv *env, jobject self) Java_org_mozilla_jss_ssl_SSLSocket_getSoLinger(JNIEnv *env, jobject self)
{ {
@ -319,7 +468,7 @@ Java_org_mozilla_jss_ssl_SSLSocket_getLocalAddressNative(JNIEnv *env,
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_getLocalPort(JNIEnv *env, Java_org_mozilla_jss_ssl_SSLSocket_getLocalPortNative(JNIEnv *env,
jobject self) jobject self)
{ {
PRNetAddr addr; PRNetAddr addr;
@ -907,3 +1056,56 @@ finish:
(*env)->ReleaseByteArrayElements(env, bufBA, buf, JNI_ABORT); (*env)->ReleaseByteArrayElements(env, bufBA, buf, JNI_ABORT);
} }
} }
JNIEXPORT void JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_shutdownNative(
JNIEnv *env, jobject self, jint how)
{
JSSL_SocketData *sock;
PRStatus status;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS) goto finish;
status = PR_Shutdown(sock->fd, enums[how]);
if( status != PR_SUCCESS) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "Failed to shutdown socket");
goto finish;
}
finish:
}
JNIEXPORT void JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_invalidateSession(JNIEnv *env, jobject self)
{
JSSL_SocketData *sock;
SECStatus status;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS) goto finish;
status = SSL_InvalidateSession(sock->fd);
if(status != SECSuccess) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "Failed to invalidate session");
goto finish;
}
finish:
}
JNIEXPORT void JNICALL
Java_org_mozilla_jss_ssl_SSLSocket_redoHandshake(
JNIEnv *env, jobject self, jboolean flushCache)
{
JSSL_SocketData *sock;
SECStatus status;
if( JSS_SSL_getSockData(env, self, &sock) != PR_SUCCESS) goto finish;
status = SSL_ReHandshake(sock->fd, flushCache);
if(status != SECSuccess) {
JSS_throwMsg(env, SOCKET_EXCEPTION, "Failed to redo handshake");
goto finish;
}
finish:
}

Просмотреть файл

@ -38,7 +38,7 @@ import java.io.*;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.ListIterator; import java.util.ListIterator;
public class SSLSocket { public class SSLSocket extends java.net.Socket {
/** /**
* For sockets that get created by accept(). * For sockets that get created by accept().
@ -127,44 +127,62 @@ public class SSLSocket {
} }
public InetAddress getInetAddress() throws SocketException { public InetAddress getInetAddress() {
int intAddr = getPeerAddressNative();
InetAddress in;
byte[] addr = new byte[4];
addr[0] = (byte)((intAddr >>> 24) & 0xff);
addr[1] = (byte)((intAddr >>> 16) & 0xff);
addr[2] = (byte)((intAddr >>> 8) & 0xff);
addr[3] = (byte)((intAddr ) & 0xff);
try { try {
in = InetAddress.getByName( int intAddr = getPeerAddressNative();
addr[0] + "." + addr[1] + "." + addr[2] + "." + addr[3] ); InetAddress in;
} catch (java.net.UnknownHostException e) { byte[] addr = new byte[4];
in = null; addr[0] = (byte)((intAddr >>> 24) & 0xff);
addr[1] = (byte)((intAddr >>> 16) & 0xff);
addr[2] = (byte)((intAddr >>> 8) & 0xff);
addr[3] = (byte)((intAddr ) & 0xff);
try {
in = InetAddress.getByName(
addr[0] + "." + addr[1] + "." + addr[2] + "." + addr[3] );
} catch (java.net.UnknownHostException e) {
in = null;
}
return in;
} catch(SocketException e) {
e.printStackTrace();
return null;
} }
return in;
} }
private native int getPeerAddressNative() throws SocketException; private native int getPeerAddressNative() throws SocketException;
public InetAddress getLocalAddress() throws SocketException { public InetAddress getLocalAddress() {
int intAddr = getLocalAddressNative();
InetAddress in;
byte[] addr = new byte[4];
addr[0] = (byte)((intAddr >>> 24) & 0xff);
addr[1] = (byte)((intAddr >>> 16) & 0xff);
addr[2] = (byte)((intAddr >>> 8) & 0xff);
addr[3] = (byte)((intAddr ) & 0xff);
try { try {
in = InetAddress.getByName( int intAddr = getLocalAddressNative();
addr[0] + "." + addr[1] + "." + addr[2] + "." + addr[3] ); InetAddress in;
} catch (java.net.UnknownHostException e) { byte[] addr = new byte[4];
in = null; addr[0] = (byte)((intAddr >>> 24) & 0xff);
addr[1] = (byte)((intAddr >>> 16) & 0xff);
addr[2] = (byte)((intAddr >>> 8) & 0xff);
addr[3] = (byte)((intAddr ) & 0xff);
try {
in = InetAddress.getByName(
addr[0] + "." + addr[1] + "." + addr[2] + "." + addr[3] );
} catch (java.net.UnknownHostException e) {
in = null;
}
return in;
} catch(SocketException e) {
e.printStackTrace();
return null;
} }
return in;
} }
private native int getLocalAddressNative() throws SocketException; private native int getLocalAddressNative() throws SocketException;
private native int getLocalPort() throws SocketException; public int getLocalPort() {
try {
return getLocalPortNative();
} catch(SocketException e) {
e.printStackTrace();
return 0;
}
}
private native int getLocalPortNative() throws SocketException;
public native int getPort(); public native int getPort();
@ -181,6 +199,20 @@ public class SSLSocket {
public native boolean getTcpNoDelay() throws SocketException; public native boolean getTcpNoDelay() throws SocketException;
public native void setKeepAlive(boolean on) throws SocketException;
public native boolean getKeepAlive(boolean on) throws SocketException;
public void shutdownInput() throws IOException {
shutdownNative(PR_SHUTDOWN_RCV);
}
public void shutdownOutput() throws IOException {
shutdownNative(PR_SHUTDOWN_SEND);
}
private native void shutdownNative(int how) throws IOException;
/** /**
* param linger The time (in hundredths of a second) to linger for. * param linger The time (in hundredths of a second) to linger for.
*/ */
@ -200,18 +232,10 @@ public class SSLSocket {
// //
// XXX These aren't implemented by native code. Perhaps they could be. // XXX These aren't implemented by native code. Perhaps they could be.
// //
public void setSendBufferSize(int size) throws SocketException { public native void setSendBufferSize(int size) throws SocketException;
throw new SocketException("not implemented"); public native int getSendBufferSize() throws SocketException;
} public native void setReceiveBufferSize(int size) throws SocketException;
public int getSendBufferSize() throws SocketException { public native int getReceiveBufferSize(int size) throws SocketException;
throw new SocketException("not implemented");
}
public void setReceiveBufferSize(int size) throws SocketException {
throw new SocketException("not implemented");
}
public int getReceiveBufferSize(int size) throws SocketException {
throw new SocketException("not implemented");
}
public void close() throws IOException { public void close() throws IOException {
if( sockProxy != null ) { if( sockProxy != null ) {
@ -284,7 +308,10 @@ public class SSLSocket {
*/ */
private static final int SSL_ENABLE_SSL2 = 0; private static final int SSL_ENABLE_SSL2 = 0;
private static final int SSL_ENABLE_SSL3 = 1; private static final int SSL_ENABLE_SSL3 = 1;
private static final int SO_LINGER = 2; private static final int TCP_NODELAY = 2;
private static final int SO_KEEPALIVE = 3;
private static final int PR_SHUTDOWN_RCV = 4;
private static final int PR_SHUTDOWN_SEND = 5;
/** /**
* SO_TIMEOUT timeout in millis. I don't know why we have to keep it here * SO_TIMEOUT timeout in millis. I don't know why we have to keep it here
@ -329,32 +356,14 @@ public class SSLSocket {
private native void socketWrite(byte[] b, int off, int len, int timeout) private native void socketWrite(byte[] b, int off, int len, int timeout)
throws IOException; throws IOException;
/*
protected static native void setPermittedByPolicy(int cipher, public native void invalidateSession() throws SocketException;
int permitted);
public static native void configServerSessionIDCache(int maxSidEntries, public void redoHandshake() throws SocketException {
public static native void clearSessionCache(); redoHandshake(false);
protected native int invalidateSession(); }
native SSLSecurityStatus getStatus(); // throws ????
native void resetHandshake(); // throws ???? public native void redoHandshake(boolean flushCache) throws SocketException;
native void forceHandshake(); // throws ????
native void redoHandshake(); // throws ????
private native void socketConnect(InetAddress address, int port)
throws IOException;
private native void socketBind(InetAddress address, int port)
throws IOException;
private native void socketListen(int count)
throws IOException;
private native void socketAccept(SocketImpl s)
throws IOException;
private native void socketSetNeedClientAuth(boolean b);
private native void socketSetNeedClientAuthNoExpiryCheck(boolean b);
private native void socketSetOptionIntVal(int cmd, boolean on, int value)
throws SocketException;
private native int socketGetOption(int opt) throws SocketException;
private native void setClientNickname(String nickname);
private native void setServerNickname(String nickname);
*/
protected void finalize() throws Throwable { protected void finalize() throws Throwable {
close(); close();