pass.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * This is just a repository for a password.
  3. * We don't want to encourage this, there's
  4. * no server side.
  5. */
  6. #include "dat.h"
  7. typedef struct State State;
  8. struct State
  9. {
  10. Key *key;
  11. };
  12. enum
  13. {
  14. HavePass,
  15. Maxphase,
  16. };
  17. static char *phasenames[Maxphase] =
  18. {
  19. [HavePass] "HavePass",
  20. };
  21. static int
  22. passinit(Proto *p, Fsstate *fss)
  23. {
  24. int ret;
  25. Key *k;
  26. Keyinfo ki;
  27. State *s;
  28. ret = findkey(&k, mkkeyinfo(&ki, fss, nil), "%s", p->keyprompt);
  29. if(ret != RpcOk)
  30. return ret;
  31. setattrs(fss->attr, k->attr);
  32. s = emalloc(sizeof(*s));
  33. s->key = k;
  34. fss->ps = s;
  35. fss->phase = HavePass;
  36. return RpcOk;
  37. }
  38. static void
  39. passclose(Fsstate *fss)
  40. {
  41. State *s;
  42. s = fss->ps;
  43. if(s->key)
  44. closekey(s->key);
  45. free(s);
  46. }
  47. static int
  48. passread(Fsstate *fss, void *va, uint *n)
  49. {
  50. int m;
  51. char buf[500];
  52. char *pass, *user;
  53. State *s;
  54. s = fss->ps;
  55. switch(fss->phase){
  56. default:
  57. return phaseerror(fss, "read");
  58. case HavePass:
  59. user = _strfindattr(s->key->attr, "user");
  60. pass = _strfindattr(s->key->privattr, "!password");
  61. if(user==nil || pass==nil)
  62. return failure(fss, "passread cannot happen");
  63. snprint(buf, sizeof buf, "%q %q", user, pass);
  64. m = strlen(buf);
  65. if(m > *n)
  66. return toosmall(fss, m);
  67. *n = m;
  68. memmove(va, buf, m);
  69. return RpcOk;
  70. }
  71. }
  72. static int
  73. passwrite(Fsstate *fss, void*, uint)
  74. {
  75. return phaseerror(fss, "write");
  76. }
  77. Proto pass =
  78. {
  79. .name= "pass",
  80. .init= passinit,
  81. .write= passwrite,
  82. .read= passread,
  83. .close= passclose,
  84. .addkey= replacekey,
  85. .keyprompt= "user? !password?",
  86. };