userdbpw.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:4k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.
  3. ** See COPYING for distribution information.
  4. */
  5. #if HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #include <sys/types.h>
  9. #if HAVE_SYS_STAT_H
  10. #include <sys/stat.h>
  11. #endif
  12. #if HAVE_FCNTL_H
  13. #include <fcntl.h>
  14. #endif
  15. #if HAVE_UNISTD_H
  16. #include <unistd.h>
  17. #endif
  18. #if TIME_WITH_SYS_TIME
  19. #include <sys/time.h>
  20. #include <time.h>
  21. #else
  22. #if HAVE_SYS_TIME_H
  23. #include <sys/time.h>
  24. #else
  25. #include <time.h>
  26. #endif
  27. #endif
  28. #if HAVE_MD5
  29. #include "md5/md5.h"
  30. #endif
  31. #if HAVE_HMAC
  32. #include "libhmac/hmac.h"
  33. #endif
  34. #include <string.h>
  35. #include <stdio.h>
  36. #include <signal.h>
  37. #include <stdlib.h>
  38. #if HAVE_TERMIOS_H
  39. #include <termios.h>
  40. #endif
  41. #if HAVE_CRYPT_H
  42. #include <crypt.h>
  43. #endif
  44. #if HAVE_CRYPT
  45. #if NEED_CRYPT_PROTOTYPE
  46. extern char *crypt(const char *, const char *);
  47. #endif
  48. #endif
  49. static char hex64[]="./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  50. #ifdef RANDOM
  51. static void get_random(char *buf, unsigned n)
  52. {
  53. int f=open(RANDOM, O_RDONLY);
  54. int l;
  55. if (f < 0)
  56. {
  57. perror(RANDOM);
  58. exit(1);
  59. }
  60. while (n)
  61. {
  62. l=read(f, buf, n);
  63. if (l < 0)
  64. {
  65. perror("read");
  66. exit(1);
  67. }
  68. n -= l;
  69. buf += l;
  70. }
  71. close(f);
  72. }
  73. #endif
  74. /*
  75. ** Where possible, we turn off echo when entering the password.
  76. ** We set up a signal handler to catch signals and restore the echo
  77. ** prior to exiting.
  78. */
  79. #if HAVE_TERMIOS_H
  80. static struct termios tios;
  81. static int have_tios;
  82. static RETSIGTYPE sighandler(int signum)
  83. {
  84. write(1, "n", 1);
  85. tcsetattr(0, TCSANOW, &tios);
  86. _exit(0);
  87. #if RETSIGTYPE != void
  88. return (0);
  89. #endif
  90. }
  91. #endif
  92. static void read_pw(char *buf)
  93. {
  94. int n, c;
  95. n=0;
  96. while ((c=getchar()) != EOF && c != 'n')
  97. if (n < BUFSIZ-1)
  98. buf[n++]=c;
  99. if (c == EOF && n == 0) exit(1);
  100. buf[n]=0;
  101. }
  102. int main(int argc, char **argv)
  103. {
  104. int n=1;
  105. int md5=0;
  106. char buf[BUFSIZ];
  107. char salt[9];
  108. #if HAVE_HMAC
  109. struct hmac_hashinfo *hmac=0;
  110. #endif
  111. while (n < argc)
  112. {
  113. if (strcmp(argv[n], "-md5") == 0)
  114. {
  115. md5=1;
  116. ++n;
  117. continue;
  118. }
  119. #if HAVE_HMAC
  120. if (strncmp(argv[n], "-hmac-", 6) == 0)
  121. {
  122. int i;
  123. for (i=0; hmac_list[i] &&
  124. strcmp(hmac_list[i]->hh_name, argv[n]+6); i++)
  125. ;
  126. if (hmac_list[i])
  127. {
  128. hmac=hmac_list[i];
  129. ++n;
  130. continue;
  131. }
  132. }
  133. #endif
  134. fprintf(stderr, "%s: invalid argument.n", argv[0]);
  135. exit(1);
  136. }
  137. /* Read the password */
  138. #if HAVE_TERMIOS_H
  139. have_tios=0;
  140. if (tcgetattr(0, &tios) == 0)
  141. {
  142. struct termios tios2;
  143. char buf2[BUFSIZ];
  144. have_tios=1;
  145. signal(SIGINT, sighandler);
  146. signal(SIGHUP, sighandler);
  147. tios2=tios;
  148. tios2.c_lflag &= ~ECHO;
  149. tcsetattr(0, TCSANOW, &tios2);
  150. for (;;)
  151. {
  152. write(2, "Password: ", 10);
  153. read_pw(buf);
  154. write(2, "nReenter password: ", 19);
  155. read_pw(buf2);
  156. if (strcmp(buf, buf2) == 0) break;
  157. write(2, "nPasswords don't match.nn", 25);
  158. }
  159. }
  160. else
  161. #endif
  162. read_pw(buf);
  163. #if HAVE_TERMIOS_H
  164. if (have_tios)
  165. {
  166. write(2, "n", 1);
  167. tcsetattr(0, TCSANOW, &tios);
  168. signal(SIGINT, SIG_DFL);
  169. signal(SIGHUP, SIG_DFL);
  170. }
  171. #endif
  172. /* Set the password */
  173. #if HAVE_HMAC
  174. if (hmac)
  175. {
  176. unsigned char *p=malloc(hmac->hh_L*2);
  177. unsigned i;
  178. if (!p)
  179. {
  180. perror("malloc");
  181. exit(1);
  182. }
  183. hmac_hashkey(hmac, buf, strlen(buf), p, p+hmac->hh_L);
  184. for (i=0; i<hmac->hh_L*2; i++)
  185. printf("%02x", (int)p[i]);
  186. printf("n");
  187. exit(0);
  188. }
  189. #endif
  190. #if HAVE_CRYPT
  191. #else
  192. md5=1;
  193. #endif
  194. #if HAVE_MD5
  195. if (md5)
  196. {
  197. int i;
  198. salt[8]=0;
  199. #ifdef RANDOM
  200. get_random(salt, 8);
  201. for (i=0; i<8; i++)
  202. salt[i] = hex64[salt[i] & 63 ];
  203. #else
  204. {
  205. struct {
  206. #if HAVE_GETTIMEOFDAY
  207. struct timeval tv;
  208. #else
  209. time_t tv;
  210. #endif
  211. pid_t p;
  212. } s;
  213. MD5_DIGEST d;
  214. #if HAVE_GETTIMEOFDAY
  215. struct timezone tz;
  216. gettimeofday(&s.tv, &tz);
  217. #else
  218. time(&s.tv);
  219. #endif
  220. s.p=getpid();
  221. md5_digest(&s, sizeof(s), d);
  222. for (i=0; i<8; i++)
  223. salt[i]=hex64[ ((unsigned char *)d)[i] ];
  224. }
  225. #endif
  226. printf("%sn", md5_crypt(buf, salt));
  227. exit(0);
  228. }
  229. #endif
  230. #ifdef RANDOM
  231. get_random(salt, 2);
  232. salt[0]=hex64[salt[0] & 63];
  233. salt[1]=hex64[salt[0] & 63];
  234. #else
  235. {
  236. time_t t;
  237. int i;
  238. time(&t);
  239. t ^= getpid();
  240. salt[0]=0;
  241. salt[1]=0;
  242. for (i=0; i<6; i++)
  243. {
  244. salt[0] <<= 1;
  245. salt[1] <<= 1;
  246. salt[0] |= (t & 1);
  247. t >>= 1;
  248. salt[1] |= (t & 1);
  249. t >>= 1;
  250. }
  251. salt[0]=hex64[(unsigned)salt[0]];
  252. salt[1]=hex64[(unsigned)salt[1]];
  253. }
  254. #endif
  255. #if HAVE_CRYPT
  256. printf("%sn", crypt(buf, salt));
  257. fflush(stdout);
  258. #endif
  259. return (0);
  260. }