secpwd.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:4k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. #include "secutil.h"
  34. /*
  35.  * NOTE:  The contents of this file are NOT used by the client.
  36.  * (They are part of the security library as a whole, but they are
  37.  * NOT USED BY THE CLIENT.)  Do not change things on behalf of the
  38.  * client (like localizing strings), or add things that are only
  39.  * for the client (put them elsewhere).  
  40.  */
  41. #ifdef XP_UNIX
  42. #include <termios.h>
  43. #endif
  44. #ifdef _WINDOWS
  45. #include <conio.h>
  46. #define QUIET_FGETS quiet_fgets
  47. static int quiet_fgets (char *buf, int length, FILE *input);
  48. #else
  49. #define QUIET_FGETS fgets
  50. #endif
  51. static void echoOff(int fd)
  52. {
  53. #ifdef XP_UNIX
  54.     if (isatty(fd)) {
  55. struct termios tio;
  56. tcgetattr(fd, &tio);
  57. tio.c_lflag &= ~ECHO;
  58. tcsetattr(fd, TCSAFLUSH, &tio);
  59.     }
  60. #endif
  61. }
  62. static void echoOn(int fd)
  63. {
  64. #ifdef XP_UNIX
  65.     if (isatty(fd)) {
  66. struct termios tio;
  67. tcgetattr(fd, &tio);
  68. tio.c_lflag |= ECHO;
  69. tcsetattr(fd, TCSAFLUSH, &tio);
  70.     }
  71. #endif
  72. }
  73. char *SEC_GetPassword(FILE *input, FILE *output, char *prompt,
  74.        PRBool (*ok)(char *))
  75. {
  76.     char phrase[200];
  77.     int infd = fileno(input);
  78.     int isTTY = isatty(infd);
  79.     for (;;) {
  80. /* Prompt for password */
  81. if (isTTY) {
  82.     fprintf(output, "%s", prompt);
  83.             fflush (output);
  84.     echoOff(infd);
  85. }
  86. QUIET_FGETS ( phrase, sizeof(phrase), input);
  87. if (isTTY) {
  88.     fprintf(output, "n");
  89.     echoOn(infd);
  90. }
  91. /* stomp on newline */
  92. phrase[PORT_Strlen(phrase)-1] = 0;
  93. /* Validate password */
  94. if (!(*ok)(phrase)) {
  95.     /* Not weird enough */
  96.     if (!isTTY) return 0;
  97.     fprintf(output, "Password must be at least 8 characters long with one or moren");
  98.     fprintf(output, "non-alphabetic charactersn");
  99.     continue;
  100. }
  101. return (char*) PORT_Strdup(phrase);
  102.     }
  103. }
  104. PRBool SEC_CheckPassword(char *cp)
  105. {
  106.     int len;
  107.     char *end;
  108.     len = PORT_Strlen(cp);
  109.     if (len < 8) {
  110. return PR_FALSE;
  111.     }
  112.     end = cp + len;
  113.     while (cp < end) {
  114. unsigned char ch = *cp++;
  115. if (!((ch >= 'A') && (ch <= 'Z')) &&
  116.     !((ch >= 'a') && (ch <= 'z'))) {
  117.     /* pass phrase has at least one non alphabetic in it */
  118.     return PR_TRUE;
  119. }
  120.     }
  121.     return PR_FALSE;
  122. }
  123. PRBool SEC_BlindCheckPassword(char *cp)
  124. {
  125.     if (cp != NULL) {
  126. return PR_TRUE;
  127.     }
  128.     return PR_FALSE;
  129. }
  130. /* Get a password from the input terminal, without echoing */
  131. #ifdef _WINDOWS
  132. static int quiet_fgets (char *buf, int length, FILE *input)
  133.   {
  134.   int c;
  135.   char *end = buf;
  136.   /* fflush (input); */
  137.   memset (buf, 0, length);
  138.   if (input != stdin) {
  139.      return fgets(buf,length,input);
  140.   }
  141.   while (1)
  142.     {
  143.     c = getch();
  144.     if (c == 'b')
  145.       {
  146.       if (end > buf)
  147.         end--;
  148.       }
  149.     else if (--length > 0)
  150.       *end++ = c;
  151.     if (!c || c == 'n' || c == 'r')
  152.       break;
  153.     }
  154.   return 0;
  155.   }
  156. #endif