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]

Reply via email to