changeuser.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <authsrv.h>
  4. #include <ctype.h>
  5. #include "authcmdlib.h"
  6. void install(char*, char*, char*, long, int);
  7. int exists (char*, char*);
  8. void
  9. usage(void)
  10. {
  11. fprint(2, "usage: changeuser [-pnm] user\n");
  12. exits("usage");
  13. }
  14. void
  15. main(int argc, char *argv[])
  16. {
  17. char *u, key[DESKEYLEN], answer[32], p9pass[32];
  18. int which, i, newkey, newbio, dosecret;
  19. long t;
  20. Acctbio a;
  21. Fs *f;
  22. srand(getpid()*time(0));
  23. fmtinstall('K', keyfmt);
  24. which = 0;
  25. ARGBEGIN{
  26. case 'p':
  27. which |= Plan9;
  28. break;
  29. case 'n':
  30. which |= Securenet;
  31. break;
  32. default:
  33. usage();
  34. }ARGEND
  35. argv0 = "changeuser";
  36. if(argc != 1)
  37. usage();
  38. u = *argv;
  39. if(memchr(u, '\0', ANAMELEN) == 0)
  40. error("bad user name");
  41. if(!which)
  42. which = Plan9;
  43. newbio = 0;
  44. t = 0;
  45. a.user = 0;
  46. if(which & Plan9){
  47. f = &fs[Plan9];
  48. newkey = 1;
  49. if(exists(f->keys, u)){
  50. readln("assign new password? [y/n]: ", answer, sizeof answer, 0);
  51. if(answer[0] != 'y' && answer[0] != 'Y')
  52. newkey = 0;
  53. }
  54. if(newkey)
  55. getpass(key, p9pass, 1, 1);
  56. dosecret = getsecret(newkey, p9pass);
  57. t = getexpiration(f->keys, u);
  58. install(f->keys, u, key, t, newkey);
  59. if(dosecret && setsecret(KEYDB, u, p9pass) == 0)
  60. error("error writing Inferno/pop secret");
  61. newbio = querybio(f->who, u, &a);
  62. if(newbio)
  63. wrbio(f->who, &a);
  64. print("user %s installed for Plan 9\n", u);
  65. syslog(0, AUTHLOG, "user %s installed for plan 9", u);
  66. }
  67. if(which & Securenet){
  68. f = &fs[Securenet];
  69. newkey = 1;
  70. if(exists(f->keys, u)){
  71. readln("assign new key? [y/n]: ", answer, sizeof answer, 0);
  72. if(answer[0] != 'y' && answer[0] != 'Y')
  73. newkey = 0;
  74. }
  75. if(newkey)
  76. for(i=0; i<DESKEYLEN; i++)
  77. key[i] = nrand(256);
  78. if(a.user == 0){
  79. t = getexpiration(f->keys, u);
  80. newbio = querybio(f->who, u, &a);
  81. }
  82. install(f->keys, u, key, t, newkey);
  83. if(newbio)
  84. wrbio(f->who, &a);
  85. findkey(f->keys, u, key);
  86. print("user %s: SecureNet key: %K\n", u, key);
  87. checksum(key, answer);
  88. print("verify with checksum %s\n", answer);
  89. print("user %s installed for SecureNet\n", u);
  90. syslog(0, AUTHLOG, "user %s installed for securenet", u);
  91. }
  92. exits(0);
  93. }
  94. void
  95. install(char *db, char *u, char *key, long t, int newkey)
  96. {
  97. char buf[KEYDBBUF+ANAMELEN+20];
  98. int fd;
  99. if(!exists(db, u)){
  100. sprint(buf, "%s/%s", db, u);
  101. fd = create(buf, OREAD, 0777|DMDIR);
  102. if(fd < 0)
  103. error("can't create user %s: %r", u);
  104. close(fd);
  105. }
  106. if(newkey){
  107. sprint(buf, "%s/%s/key", db, u);
  108. fd = open(buf, OWRITE);
  109. if(fd < 0 || write(fd, key, DESKEYLEN) != DESKEYLEN)
  110. error("can't set key: %r");
  111. close(fd);
  112. }
  113. if(t == -1)
  114. return;
  115. sprint(buf, "%s/%s/expire", db, u);
  116. fd = open(buf, OWRITE);
  117. if(fd < 0 || fprint(fd, "%ld", t) < 0)
  118. error("can't write expiration time");
  119. close(fd);
  120. }
  121. int
  122. exists(char *db, char *u)
  123. {
  124. char buf[KEYDBBUF+ANAMELEN+6];
  125. sprint(buf, "%s/%s/expire", db, u);
  126. if(access(buf, 0) < 0)
  127. return 0;
  128. return 1;
  129. }