xspasswd.c
上传用户:lampled
上传日期:2007-01-07
资源大小:94k
文件大小:2k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /* Copyright (C) 1995, 1996 by Sven Berkvens (sven@stack.nl) */
  2. #include "config.h"
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #ifdef HAVE_ERR_H
  6. #include <err.h>
  7. #else /* Not HAVE_ERR_H */
  8. #include "err.h"
  9. #endif /* HAVE_ERR_H */
  10. #include <sys/stat.h>
  11. #include "extra.h"
  12. #include "xscrypt.h"
  13. #include "string.h"
  14. extern int
  15. main DECL2(int, argc, char **, argv)
  16. {
  17. char pwd[128], username[32], passbak[32], total[64],
  18. line[BUFSIZ], newfile[XS_PATH_MAX];
  19. const char *password;
  20. int found, passwdlock;
  21. FILE *authinp, *authout;
  22. umask(S_IRWXG | S_IRWXO);
  23. printf("The information will be stored in %snn", AUTHFILE);
  24. printf("Please enter a username: "); fflush(stdout);
  25. if (!fgets(username, 16, stdin))
  26. errx(1, "Username input failed");
  27. while (username[0] && (username[strlen(username) - 1] < ' '))
  28. username[strlen(username) - 1] = 0;
  29. if (strchr(username, ':'))
  30. errx(1, "Username may not contain a colon");
  31. if (!(password = (const char *)getpass("Please enter a password: ")))
  32. errx(1, "Password input failed");
  33. strcpy(passbak, password);
  34. if (!(password = (const char *)getpass("Please reenter password: ")))
  35. errx(1, "Password input failed");
  36. if (strcmp(password, passbak))
  37. errx(1, "Password did not match previous entry!");
  38. printf("Lock this password (y/n): ");
  39. if (!fgets(line, 16, stdin))
  40. errx(1, "Lock input failed");
  41. passwdlock = ((line[0] == 'y') || (line[0] == 'Y'));
  42. strcpy(pwd, password); password = pwd;
  43. xs_encrypt(pwd);
  44. sprintf(total, "%c%s:%s", passwdlock ? 'L' : 'U', username, password);
  45. authinp = fopen(AUTHFILE, "r");
  46. sprintf(newfile, "%s.new", AUTHFILE);
  47. if (!(authout = fopen(newfile, "w")))
  48. err(1, "fopen(`%s', `w')", newfile);
  49. found = 0;
  50. while (authinp && fgets(line, BUFSIZ, authinp))
  51. {
  52. if (!strncmp(line + 1, username, strlen(username)) &&
  53. (line[strlen(username) + 1] == ':'))
  54. {
  55. found = 1;
  56. fprintf(authout, "%sn", total);
  57. } else
  58. fprintf(authout, "%s", line);
  59. }
  60. if (found)
  61. printf("Password for `%s' has been changed.n", username);
  62. else
  63. {
  64. fprintf(authout, "%sn", total);
  65. printf("New user `%s' has been created.n", username);
  66. }
  67. if (authinp)
  68. fclose(authinp);
  69. fclose(authout);
  70. if (rename(newfile, AUTHFILE))
  71. err(1, "Cannot rename(`%s', `%s')", newfile, AUTHFILE);
  72. exit(0);
  73. }