wsmancli/replace-getpass.patch
2023-01-10 12:46:13 +01:00

62 lines
1.5 KiB
Diff

diff -up wsmancli-2.6.0/src/wsman.c.orig wsmancli-2.6.0/src/wsman.c
--- wsmancli-2.6.0/src/wsman.c.orig 2023-01-09 11:46:15.771553135 +0100
+++ wsmancli-2.6.0/src/wsman.c 2023-01-09 11:54:13.968830290 +0100
@@ -40,6 +40,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <termios.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
@@ -57,6 +58,8 @@
extern char *getpass (const char *__prompt);
#endif
+#define BASE_LEN 21
+
static long int server_port = 0;
static char *cainfo = NULL;
static char *cert = NULL;
@@ -498,6 +501,10 @@ request_usr_pwd( WsManClient *client, ws
char *pw;
char user[21];
char *p;
+ char c;
+ int len = BASE_LEN;
+ int pos = 0;
+ struct termios term;
/*
* fprintf(stdout,"Authentication failed, please retry\n");
@@ -560,8 +567,28 @@ request_usr_pwd( WsManClient *client, ws
}
/* but always ask for the password !? */
- pw = (char *)getpass("Password: ");
+ /* set no echo */
+ tcgetattr(1, &term);
+ term.c_lflag &= ~ECHO;
+ tcsetattr(1, TCSANOW, &term);
+ /* get pass */
+ pw = (char*) u_malloc(sizeof(char) * len);
+ pw[0] = '\0';
+ printf("Password: ");
+ fflush(stdout);
+ while ((c = fgetc(stdin)) != '\n') {
+ pw[pos++] = (char) c;
+ if (pos >= len) {
+ len += BASE_LEN;
+ pw = realloc(pw, len);
+ }
+ }
+ pw[pos] = '\0';
*password = u_strdup_printf ("%s", pw);
+ u_free(pw);
+ /* set echo back again */
+ term.c_lflag |= ECHO;
+ tcsetattr(1, TCSANOW, &term);
/* make backup, *password will become free'd when next try of http-auth fails */
if (*password) {