Fossil SCM

Enhancements to the password prompt logic for Windows so that it works better in non-standard shells.

drh 2017-05-02 19:13 trunk
Commit 513dd003a55d0134b0f34d79db4b5f6793f2a85125dd4d0c966ec44041e865ef
1 file changed +34 -2
+34 -2
--- src/user.c
+++ src/user.c
@@ -53,10 +53,13 @@
5353
5454
static char *getpass(const char *prompt){
5555
char *zPwd;
5656
size_t nPwd;
5757
size_t i;
58
+#if defined(_WIN32)
59
+ int useGetch = _isatty(_fileno(stderr));
60
+#endif
5861
5962
if( zPwdBuffer==0 ){
6063
zPwdBuffer = fossil_secure_alloc_page(&nPwdBuffer);
6164
assert( zPwdBuffer );
6265
}else{
@@ -68,11 +71,11 @@
6871
fflush(stderr);
6972
assert( zPwd!=0 );
7073
assert( nPwd>0 );
7174
for(i=0; i<nPwd-1; ++i){
7275
#if defined(_WIN32)
73
- zPwd[i] = _getch();
76
+ zPwd[i] = useGetch ? _getch() : getc(stdin);
7477
#else
7578
zPwd[i] = getc(stdin);
7679
#endif
7780
if(zPwd[i]=='\r' || zPwd[i]=='\n'){
7881
break;
@@ -91,10 +94,13 @@
9194
else if(zPwd[i]==27){
9295
i=0;
9396
break;
9497
}
9598
else{
99
+#if defined(_WIN32)
100
+ if( useGetch )
101
+#endif
96102
fputc('*',stderr);
97103
}
98104
}
99105
zPwd[i]='\0';
100106
fputs("\n", stderr);
@@ -583,11 +589,37 @@
583589
*/
584590
void test_prompt_user_cmd(void){
585591
Blob answer;
586592
if( g.argc!=3 ) usage("PROMPT");
587593
prompt_user(g.argv[2], &answer);
588
- fossil_print("%s", blob_str(&answer));
594
+ fossil_print("%s\n", blob_str(&answer));
595
+}
596
+
597
+/*
598
+** COMMAND: test-prompt-password
599
+**
600
+** Usage: %fossil test-prompt-password PROMPT VERIFY
601
+**
602
+** Prompts the user for a password and then prints it verbatim.
603
+**
604
+** Behavior is controlled by the VERIFY parameter:
605
+**
606
+** 0 Just ask once.
607
+**
608
+** 1 If the first answer is a non-empty string, ask for
609
+** verification. Repeat if the two strings do not match.
610
+**
611
+** 2 Ask twice, repeat if the strings do not match.
612
+
613
+*/
614
+void test_prompt_password_cmd(void){
615
+ Blob answer;
616
+ int iVerify = 0;
617
+ if( g.argc!=4 ) usage("PROMPT VERIFY");
618
+ iVerify = atoi(g.argv[3]);
619
+ prompt_for_password(g.argv[2], &answer, iVerify);
620
+ fossil_print("[%s]\n", blob_str(&answer));
589621
}
590622
591623
/*
592624
** WEBPAGE: access_log
593625
**
594626
--- src/user.c
+++ src/user.c
@@ -53,10 +53,13 @@
53
54 static char *getpass(const char *prompt){
55 char *zPwd;
56 size_t nPwd;
57 size_t i;
 
 
 
58
59 if( zPwdBuffer==0 ){
60 zPwdBuffer = fossil_secure_alloc_page(&nPwdBuffer);
61 assert( zPwdBuffer );
62 }else{
@@ -68,11 +71,11 @@
68 fflush(stderr);
69 assert( zPwd!=0 );
70 assert( nPwd>0 );
71 for(i=0; i<nPwd-1; ++i){
72 #if defined(_WIN32)
73 zPwd[i] = _getch();
74 #else
75 zPwd[i] = getc(stdin);
76 #endif
77 if(zPwd[i]=='\r' || zPwd[i]=='\n'){
78 break;
@@ -91,10 +94,13 @@
91 else if(zPwd[i]==27){
92 i=0;
93 break;
94 }
95 else{
 
 
 
96 fputc('*',stderr);
97 }
98 }
99 zPwd[i]='\0';
100 fputs("\n", stderr);
@@ -583,11 +589,37 @@
583 */
584 void test_prompt_user_cmd(void){
585 Blob answer;
586 if( g.argc!=3 ) usage("PROMPT");
587 prompt_user(g.argv[2], &answer);
588 fossil_print("%s", blob_str(&answer));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
589 }
590
591 /*
592 ** WEBPAGE: access_log
593 **
594
--- src/user.c
+++ src/user.c
@@ -53,10 +53,13 @@
53
54 static char *getpass(const char *prompt){
55 char *zPwd;
56 size_t nPwd;
57 size_t i;
58 #if defined(_WIN32)
59 int useGetch = _isatty(_fileno(stderr));
60 #endif
61
62 if( zPwdBuffer==0 ){
63 zPwdBuffer = fossil_secure_alloc_page(&nPwdBuffer);
64 assert( zPwdBuffer );
65 }else{
@@ -68,11 +71,11 @@
71 fflush(stderr);
72 assert( zPwd!=0 );
73 assert( nPwd>0 );
74 for(i=0; i<nPwd-1; ++i){
75 #if defined(_WIN32)
76 zPwd[i] = useGetch ? _getch() : getc(stdin);
77 #else
78 zPwd[i] = getc(stdin);
79 #endif
80 if(zPwd[i]=='\r' || zPwd[i]=='\n'){
81 break;
@@ -91,10 +94,13 @@
94 else if(zPwd[i]==27){
95 i=0;
96 break;
97 }
98 else{
99 #if defined(_WIN32)
100 if( useGetch )
101 #endif
102 fputc('*',stderr);
103 }
104 }
105 zPwd[i]='\0';
106 fputs("\n", stderr);
@@ -583,11 +589,37 @@
589 */
590 void test_prompt_user_cmd(void){
591 Blob answer;
592 if( g.argc!=3 ) usage("PROMPT");
593 prompt_user(g.argv[2], &answer);
594 fossil_print("%s\n", blob_str(&answer));
595 }
596
597 /*
598 ** COMMAND: test-prompt-password
599 **
600 ** Usage: %fossil test-prompt-password PROMPT VERIFY
601 **
602 ** Prompts the user for a password and then prints it verbatim.
603 **
604 ** Behavior is controlled by the VERIFY parameter:
605 **
606 ** 0 Just ask once.
607 **
608 ** 1 If the first answer is a non-empty string, ask for
609 ** verification. Repeat if the two strings do not match.
610 **
611 ** 2 Ask twice, repeat if the strings do not match.
612
613 */
614 void test_prompt_password_cmd(void){
615 Blob answer;
616 int iVerify = 0;
617 if( g.argc!=4 ) usage("PROMPT VERIFY");
618 iVerify = atoi(g.argv[3]);
619 prompt_for_password(g.argv[2], &answer, iVerify);
620 fossil_print("[%s]\n", blob_str(&answer));
621 }
622
623 /*
624 ** WEBPAGE: access_log
625 **
626

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button