Fossil SCM
Enhancements to the password prompt logic for Windows so that it works better in non-standard shells.
Commit
513dd003a55d0134b0f34d79db4b5f6793f2a85125dd4d0c966ec44041e865ef
Parent
0ec71205708f73d…
1 file changed
+34
-2
+34
-2
| --- src/user.c | ||
| +++ src/user.c | ||
| @@ -53,10 +53,13 @@ | ||
| 53 | 53 | |
| 54 | 54 | static char *getpass(const char *prompt){ |
| 55 | 55 | char *zPwd; |
| 56 | 56 | size_t nPwd; |
| 57 | 57 | size_t i; |
| 58 | +#if defined(_WIN32) | |
| 59 | + int useGetch = _isatty(_fileno(stderr)); | |
| 60 | +#endif | |
| 58 | 61 | |
| 59 | 62 | if( zPwdBuffer==0 ){ |
| 60 | 63 | zPwdBuffer = fossil_secure_alloc_page(&nPwdBuffer); |
| 61 | 64 | assert( zPwdBuffer ); |
| 62 | 65 | }else{ |
| @@ -68,11 +71,11 @@ | ||
| 68 | 71 | fflush(stderr); |
| 69 | 72 | assert( zPwd!=0 ); |
| 70 | 73 | assert( nPwd>0 ); |
| 71 | 74 | for(i=0; i<nPwd-1; ++i){ |
| 72 | 75 | #if defined(_WIN32) |
| 73 | - zPwd[i] = _getch(); | |
| 76 | + zPwd[i] = useGetch ? _getch() : getc(stdin); | |
| 74 | 77 | #else |
| 75 | 78 | zPwd[i] = getc(stdin); |
| 76 | 79 | #endif |
| 77 | 80 | if(zPwd[i]=='\r' || zPwd[i]=='\n'){ |
| 78 | 81 | break; |
| @@ -91,10 +94,13 @@ | ||
| 91 | 94 | else if(zPwd[i]==27){ |
| 92 | 95 | i=0; |
| 93 | 96 | break; |
| 94 | 97 | } |
| 95 | 98 | else{ |
| 99 | +#if defined(_WIN32) | |
| 100 | + if( useGetch ) | |
| 101 | +#endif | |
| 96 | 102 | fputc('*',stderr); |
| 97 | 103 | } |
| 98 | 104 | } |
| 99 | 105 | zPwd[i]='\0'; |
| 100 | 106 | fputs("\n", stderr); |
| @@ -583,11 +589,37 @@ | ||
| 583 | 589 | */ |
| 584 | 590 | void test_prompt_user_cmd(void){ |
| 585 | 591 | Blob answer; |
| 586 | 592 | if( g.argc!=3 ) usage("PROMPT"); |
| 587 | 593 | 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)); | |
| 589 | 621 | } |
| 590 | 622 | |
| 591 | 623 | /* |
| 592 | 624 | ** WEBPAGE: access_log |
| 593 | 625 | ** |
| 594 | 626 |
| --- 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 |