mturk 2005/06/12 00:33:08 Modified: jni/java/org/apache/tomcat/jni SSL.java jni/native/include ssl_private.h jni/native/src ssl.c sslcontext.c sslutils.c Added: jni/java/org/apache/tomcat/jni PasswordCallback.java Log: Change PasswordCallback instead BIO for obtaining passwords. A single global function is enough. Revision Changes Path 1.18 +4 -4 jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSL.java Index: SSL.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/SSL.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- SSL.java 11 Jun 2005 18:16:42 -0000 1.17 +++ SSL.java 12 Jun 2005 07:33:08 -0000 1.18 @@ -220,10 +220,10 @@ public static native int closeBIO(long bio); /** - * Set global Password callback BIO for obtaining passwords. - * @param bio BIO to use. + * Set global Password callback for obtaining passwords. + * @param callback PasswordCallback implementation to use. */ - public static native void setPasswordBIO(long bio); + public static native void setPasswordCallback(PasswordCallback callback); /** * Set global Password for decrypting certificates and keys. 1.1 jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/PasswordCallback.java Index: PasswordCallback.java =================================================================== /* * Copyright 1999-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.tomcat.jni; /** PasswordCallback Interface * * @author Mladen Turk * @version $Revision: 1.1 $, $Date: 2005/06/12 07:33:07 $ */ public interface PasswordCallback { /** * Called when the password is required * @param prompt Password prompt * @return Valid password or null */ public String callback(String prompt); } 1.27 +2 -2 jakarta-tomcat-connectors/jni/native/include/ssl_private.h Index: ssl_private.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/include/ssl_private.h,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- ssl_private.h 11 Jun 2005 18:20:10 -0000 1.26 +++ ssl_private.h 12 Jun 2005 07:33:08 -0000 1.27 @@ -168,7 +168,7 @@ typedef struct { char password[SSL_MAX_PASSWORD_LEN]; const char *prompt; - BIO *bio; + tcn_callback_t cb; } tcn_pass_cb_t; extern tcn_pass_cb_t tcn_password_callback; 1.35 +21 -11 jakarta-tomcat-connectors/jni/native/src/ssl.c Index: ssl.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/ssl.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- ssl.c 12 Jun 2005 07:01:03 -0000 1.34 +++ ssl.c 12 Jun 2005 07:33:08 -0000 1.35 @@ -113,6 +113,12 @@ if (!ssl_initialized) return APR_SUCCESS; ssl_initialized = 0; + + if (tcn_password_callback.cb.obj) { + TCN_UNLOAD_CLASS(tcn_password_callback.cb.env, + tcn_password_callback.cb.obj); + } + SSL_TMP_KEYS_FREE(RSA); SSL_TMP_KEYS_FREE(DH); /* @@ -693,19 +699,23 @@ return APR_SUCCESS; } -TCN_IMPLEMENT_CALL(void, SSL, setPasswordBIO)(TCN_STDARGS, jlong bio) +TCN_IMPLEMENT_CALL(void, SSL, setPasswordCallback)(TCN_STDARGS, + jobject callback) { - BIO *bio_handle = J2P(bio, BIO *); + jclass cls; - UNREFERENCED_STDARGS; - if (tcn_password_callback.bio && - tcn_password_callback.bio != bio_handle) { - SSL_BIO_close(tcn_password_callback.bio); - tcn_password_callback.bio = bio_handle; + UNREFERENCED(o); + if (tcn_password_callback.cb.obj) { + TCN_UNLOAD_CLASS(tcn_password_callback.cb.env, + tcn_password_callback.cb.obj); } - else - return; - SSL_BIO_doref(bio_handle); + cls = (*e)->GetObjectClass(e, callback); + tcn_password_callback.cb.env = e; + tcn_password_callback.cb.mid[0] = (*e)->GetMethodID(e, cls, "callback", + "(Ljava/lang/String;)Ljava/lang/String;"); + /* TODO: Check if method id is valid */ + tcn_password_callback.cb.obj = (*e)->NewGlobalRef(e, callback); + } TCN_IMPLEMENT_CALL(void, SSL, setPassword)(TCN_STDARGS, jstring password) 1.35 +1 -4 jakarta-tomcat-connectors/jni/native/src/sslcontext.c Index: sslcontext.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/sslcontext.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- sslcontext.c 11 Jun 2005 18:22:25 -0000 1.34 +++ sslcontext.c 12 Jun 2005 07:33:08 -0000 1.35 @@ -218,9 +218,6 @@ if (c->bio_is && c->bio_is != bio_handle) SSL_BIO_close(c->bio_is); c->bio_is = bio_handle; - if (!c->cb_data) - c->cb_data = (tcn_pass_cb_t *)apr_pcalloc(c->pool, sizeof(tcn_pass_cb_t)); - c->cb_data->bio = bio_handle; } else return; 1.27 +15 -4 jakarta-tomcat-connectors/jni/native/src/sslutils.c Index: sslutils.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/sslutils.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- sslutils.c 12 Jun 2005 07:01:03 -0000 1.26 +++ sslutils.c 12 Jun 2005 07:33:08 -0000 1.27 @@ -83,9 +83,20 @@ { int rv = 0; data->password[0] = '\0'; - if (data->bio) { - rv = BIO_gets(data->bio, data->password, - SSL_MAX_PASSWORD_LEN); + if (data->cb.env && data->cb.obj) { + JNIEnv *e = data->cb.env; + jobject o; + jstring prompt = AJP_TO_JSTRING(data->prompt); + if ((o = (*e)->CallObjectMethod(e, data->cb.obj, + data->cb.mid[0], prompt))) { + TCN_ALLOC_CSTRING(o); + if (J2S(o)) { + strncpy(data->password, J2S(o), SSL_MAX_PASSWORD_LEN); + data->password[SSL_MAX_PASSWORD_LEN-1] = '\0'; + rv = (int)strlen(data->password); + } + TCN_FREE_CSTRING(o); + } } else { #ifdef WIN32
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]