]>
jfr.im git - irc/quakenet/newserv.git/blob - ticketauth/ticketauth.c
7 #include "../control/control.h"
8 #include "../core/config.h"
9 #include "../nick/nick.h"
10 #include "../core/error.h"
11 #include "../lib/hmac.h"
12 #include "../lib/version.h"
13 #include "../localuser/localuser.h"
14 #include "../core/hooks.h"
15 #include "../irc/irc.h"
18 #include "../chanserv/chanserv.h"
20 #define WARN_CHANNEL "#twilightzone"
24 sstring
*sharedsecret
= NULL
;
26 int ta_ticketauth(void *source
, int cargc
, char **cargv
) {
27 nick
*np
= (nick
*)source
;
28 char buffer
[1024], *uhmac
, *acc
, *junk
, *flags
;
29 unsigned char digest
[32];
30 int expiry
, acclen
, id
;
35 controlreply(np
, "You're already authed.");
40 controlreply(np
, "%d\n", cargc
);
45 expiry
= atoi(cargv
[1]);
52 if((acclen
<= 1) || (acclen
> ACCOUNTLEN
)) {
53 controlreply(np
, "Bad account.");
57 if(time(NULL
) > expiry
+ 30) {
58 controlwall(NO_OPER
, NL_MISC
, "%s!%s@%s attempted to TICKETAUTH as %s (expired)", np
->nick
, np
->ident
, np
->host
->name
->content
, acc
);
59 controlreply(np
, "Ticket time is bad or has expired.");
63 hmacsha256_init(&hmac
, (unsigned char *)sharedsecret
->content
, sharedsecret
->length
);
64 snprintf(buffer
, sizeof(buffer
), "%s %d %d %s %s", acc
, expiry
, id
, flags
, junk
);
65 hmacsha256_update(&hmac
, (unsigned char *)buffer
, strlen(buffer
));
66 hmacsha256_final(&hmac
, digest
);
69 snprintf(buffer
, sizeof(buffer
), "%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x", digest
[0], digest
[1], digest
[2], digest
[3], digest
[4], digest
[5], digest
[6], digest
[7], digest
[8], digest
[9], digest
[10], digest
[11], digest
[12], digest
[13], digest
[14], digest
[15], digest
[16], digest
[17], digest
[18], digest
[19], digest
[20], digest
[21], digest
[22], digest
[23], digest
[24], digest
[25], digest
[26], digest
[27], digest
[28], digest
[29], digest
[30], digest
[31]);
71 if(strcasecmp(buffer
, uhmac
)) {
72 controlwall(NO_OPER
, NL_MISC
, "%s!%s@%s attempted to TICKETAUTH as %s (bad HMAC)", np
->nick
, np
->ident
, np
->host
->name
->content
, acc
);
73 controlreply(np
, "Bad HMAC.");
77 controlwall(NO_OPER
, NL_MISC
, "%s!%s@%s TICKETAUTH'ed as %s", np
->nick
, np
->ident
, np
->host
->name
->content
, acc
);
79 wcp
= findchannel(WARN_CHANNEL
);
81 controlchanmsg(wcp
, "WARNING: %s!%s@%s TICKETAUTH'ed as %s", np
->nick
, np
->ident
, np
->host
->name
->content
, acc
);
83 controlreply(np
, "Ticket valid, authing. . .");
85 localusersetaccount(np
, acc
, id
, cs_accountflagmap_str(flags
), 0);
87 controlreply(np
, "Done.");
92 sharedsecret
= getcopyconfigitem("ticketauth", "sharedsecret", "", 512);
93 if(!sharedsecret
|| !sharedsecret
->content
|| !sharedsecret
->content
[0]) {
94 Error("ticketauth", ERR_ERROR
, "Shared secret not defined in config file.");
96 freesstring(sharedsecret
);
103 registercontrolhelpcmd("ticketauth", NO_OPERED
, 6, ta_ticketauth
, "Usage: ticketauth <ticket>");
110 deregistercontrolcmd("ticketauth", ta_ticketauth
);
112 freesstring(sharedsecret
);