changeuser.c 2.9 KB

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