mturk 2005/06/07 00:22:06
Modified: jni/native/include ssl_private.h
jni/native/src sslutils.c
Log:
Use OpenSSL function for obtaining a password without echo.
On WIN32 if running from service mode (or redirected trough ant)
Open a new Console window and prompt for password.
Not sure if this is good idea, because the best would be to create a
small GUI dialog box rather then messing with console std handles.
Revision Changes Path
1.15 +12 -1
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.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- ssl_private.h 6 Jun 2005 08:14:50 -0000 1.14
+++ ssl_private.h 7 Jun 2005 07:22:06 -0000 1.15
@@ -118,6 +118,16 @@
#define SSL_CVERIFY_OPTIONAL_NO_CA (3)
#define SSL_VERIFY_PEER_STRICT
(SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT)
+#define SSL_PASSWORD_PROMPT (0)
+#define SSL_PASSWORD_FILE (1)
+#define SSL_PASSWORD_EXEC (2)
+#define SSL_PASSWORD_ENGINE (3)
+
+#define STR_PASSWORD_PROMPT ("pass:")
+#define STR_PASSWORD_FILE ("file:")
+#define STR_PASSWORD_EXEC ("exec:")
+#define STR_PASSWORD_ENGINE ("engine:")
+
extern void *SSL_temp_keys[SSL_TMP_KEY_MAX];
typedef struct {
@@ -132,6 +142,7 @@
typedef struct {
char password[SSL_MAX_PASSWORD_LEN];
const char *prompt;
+ int mode;
tcn_ssl_ctxt_t *ctx;
} tcn_pass_cb_t;
1.16 +33 -30 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.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- sslutils.c 6 Jun 2005 16:15:20 -0000 1.15
+++ sslutils.c 7 Jun 2005 07:22:06 -0000 1.16
@@ -100,30 +100,6 @@
return APR_SUCCESS;
}
-static void password_prompt(const char *prompt, char *buf, size_t len)
-{
- size_t i=0;
- int ch;
-
- fprintf(stderr, prompt);
- fflush(stderr);
- for (i = 0; i < (len - 1); i++) {
- ch = getchar();
- if (ch == EOF)
- break;
- if (ch == '\n')
- break;
- else if (ch == '\b') {
- i--;
- if (i > 0)
- i--;
- }
- else
- buf[i] = ch;
- }
- buf[i] = '\0';
-}
-
#define PROMPT_STRING "Enter password: "
/* Simple echo password prompting */
int SSL_password_prompt(tcn_pass_cb_t *data)
@@ -135,16 +111,29 @@
if (data->ctx && data->ctx->bio_is) {
if (data->ctx->bio_is->flags & SSL_BIO_FLAG_RDONLY) {
/* Use error BIO in case of stdin */
- BIO_printf(data->ctx->bio_is, data->prompt);
+ BIO_puts(data->ctx->bio_os, data->prompt);
}
rv = BIO_gets(data->ctx->bio_is,
data->password, SSL_MAX_PASSWORD_LEN);
}
else {
- password_prompt(data->prompt, data->password,
- SSL_MAX_PASSWORD_LEN);
- fputc('\n', stderr);
- fflush(stderr);
+#ifdef WIN32
+ STARTUPINFO si;
+ GetStartupInfo(&si);
+ /* Display a new Console window */
+ if (si.wShowWindow == 0) {
+ FreeConsole();
+ AllocConsole();
+ SetConsoleTitle("Enter password");
+ }
+#endif
+ des_read_pw_string(data->password, SSL_MAX_PASSWORD_LEN,
+ data->prompt, 0);
+#ifdef WIN32
+ /* Destroy a new Console window */
+ if (si.wShowWindow == 0)
+ FreeConsole();
+#endif
rv = strlen(data->password);
}
if (rv > 0) {
@@ -154,6 +143,12 @@
*r = '\0';
rv--;
}
+#ifdef WIN32
+ if ((r = strchr(data->password, '\r'))) {
+ *r = '\0';
+ rv--;
+ }
+#endif
}
return rv;
}
@@ -171,6 +166,12 @@
memset(&c, 0, sizeof(tcn_pass_cb_t));
cb_data = &c;
}
+ else {
+ /* TODO: Implement password prompt checking.
+ * and decide what mechanism to use for obtaining
+ * the password.
+ */
+ }
if (cb_data->password[0] ||
(SSL_password_prompt(cb_data) > 0)) {
strncpy(buf, cb_data->password, bufsiz);
@@ -386,6 +387,8 @@
break;
case 2048:
idx = SSL_TMP_KEY_RSA_2048;
+ if (conn->ctx->temp_keys[idx] == NULL)
+ idx = SSL_TMP_KEY_RSA_1024;
break;
case 4096:
idx = SSL_TMP_KEY_RSA_4096;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]