Blame


1 5cdb1798 2005-10-29 devnull #include <u.h>
2 5cdb1798 2005-10-29 devnull #include <libc.h>
3 5cdb1798 2005-10-29 devnull #include <libsec.h>
4 b5f65921 2006-02-11 devnull #include <libString.h>
5 5cdb1798 2005-10-29 devnull #include "dat.h"
6 5cdb1798 2005-10-29 devnull
7 5cdb1798 2005-10-29 devnull void
8 5cdb1798 2005-10-29 devnull usage(void)
9 5cdb1798 2005-10-29 devnull {
10 5cdb1798 2005-10-29 devnull fprint(2, "usage: %s key [token]\n", argv0);
11 5cdb1798 2005-10-29 devnull exits("usage");
12 5cdb1798 2005-10-29 devnull }
13 5cdb1798 2005-10-29 devnull
14 5cdb1798 2005-10-29 devnull static String*
15 5cdb1798 2005-10-29 devnull mktoken(char *key, long thetime)
16 5cdb1798 2005-10-29 devnull {
17 5cdb1798 2005-10-29 devnull char *now;
18 5cdb1798 2005-10-29 devnull uchar digest[SHA1dlen];
19 5cdb1798 2005-10-29 devnull char token[64];
20 5cdb1798 2005-10-29 devnull String *s;
21 5cdb1798 2005-10-29 devnull
22 5cdb1798 2005-10-29 devnull now = ctime(thetime);
23 5cdb1798 2005-10-29 devnull memset(now+11, ':', 8);
24 5cdb1798 2005-10-29 devnull hmac_sha1((uchar*)now, strlen(now), (uchar*)key, strlen(key), digest, nil);
25 5cdb1798 2005-10-29 devnull enc64(token, sizeof token, digest, sizeof digest);
26 5cdb1798 2005-10-29 devnull s = s_new();
27 5cdb1798 2005-10-29 devnull s_nappend(s, token, 5);
28 5cdb1798 2005-10-29 devnull return s;
29 5cdb1798 2005-10-29 devnull }
30 5cdb1798 2005-10-29 devnull
31 5cdb1798 2005-10-29 devnull static char*
32 5cdb1798 2005-10-29 devnull check_token(char *key, char *file)
33 5cdb1798 2005-10-29 devnull {
34 5cdb1798 2005-10-29 devnull String *s;
35 5cdb1798 2005-10-29 devnull long now;
36 5cdb1798 2005-10-29 devnull int i;
37 5cdb1798 2005-10-29 devnull char buf[1024];
38 5cdb1798 2005-10-29 devnull int fd;
39 5cdb1798 2005-10-29 devnull
40 5cdb1798 2005-10-29 devnull fd = open(file, OREAD);
41 5cdb1798 2005-10-29 devnull if(fd < 0)
42 5cdb1798 2005-10-29 devnull return "no match";
43 5cdb1798 2005-10-29 devnull i = read(fd, buf, sizeof(buf)-1);
44 5cdb1798 2005-10-29 devnull close(fd);
45 5cdb1798 2005-10-29 devnull if(i < 0)
46 5cdb1798 2005-10-29 devnull return "no match";
47 5cdb1798 2005-10-29 devnull buf[i] = 0;
48 5cdb1798 2005-10-29 devnull
49 5cdb1798 2005-10-29 devnull now = time(0);
50 5cdb1798 2005-10-29 devnull
51 5cdb1798 2005-10-29 devnull for(i = 0; i < 14; i++){
52 5cdb1798 2005-10-29 devnull s = mktoken(key, now-24*60*60*i);
53 5cdb1798 2005-10-29 devnull if(strstr(buf, s_to_c(s)) != nil){
54 5cdb1798 2005-10-29 devnull s_free(s);
55 5cdb1798 2005-10-29 devnull return nil;
56 5cdb1798 2005-10-29 devnull }
57 5cdb1798 2005-10-29 devnull s_free(s);
58 5cdb1798 2005-10-29 devnull }
59 5cdb1798 2005-10-29 devnull return "no match";
60 5cdb1798 2005-10-29 devnull }
61 5cdb1798 2005-10-29 devnull
62 5cdb1798 2005-10-29 devnull static char*
63 5cdb1798 2005-10-29 devnull create_token(char *key)
64 5cdb1798 2005-10-29 devnull {
65 5cdb1798 2005-10-29 devnull String *s;
66 5cdb1798 2005-10-29 devnull
67 5cdb1798 2005-10-29 devnull s = mktoken(key, time(0));
68 5cdb1798 2005-10-29 devnull print("%s", s_to_c(s));
69 5cdb1798 2005-10-29 devnull return nil;
70 5cdb1798 2005-10-29 devnull }
71 5cdb1798 2005-10-29 devnull
72 5cdb1798 2005-10-29 devnull void
73 5cdb1798 2005-10-29 devnull main(int argc, char **argv)
74 5cdb1798 2005-10-29 devnull {
75 5cdb1798 2005-10-29 devnull ARGBEGIN {
76 5cdb1798 2005-10-29 devnull } ARGEND;
77 5cdb1798 2005-10-29 devnull
78 5cdb1798 2005-10-29 devnull switch(argc){
79 5cdb1798 2005-10-29 devnull case 2:
80 5cdb1798 2005-10-29 devnull exits(check_token(argv[0], argv[1]));
81 5cdb1798 2005-10-29 devnull break;
82 5cdb1798 2005-10-29 devnull case 1:
83 5cdb1798 2005-10-29 devnull exits(create_token(argv[0]));
84 5cdb1798 2005-10-29 devnull break;
85 5cdb1798 2005-10-29 devnull default:
86 5cdb1798 2005-10-29 devnull usage();
87 5cdb1798 2005-10-29 devnull }
88 5cdb1798 2005-10-29 devnull exits(0);
89 5cdb1798 2005-10-29 devnull }