ref: c0f88502eeb6f5895783497f8a92467a36d851bf
dir: /mez.c/
#include <u.h>
#include <libc.h>
#include <auth.h>
#include <mp.h>
#include <libsec.h>
void
usage(void)
{
fprint(2, "usage: %s [-u user] host\n", argv0);
exits("usage");
}
void
error(char *s)
{
fprint(2, "%s: fatal error: %s: %r\n", argv0, s);
exits(s);
}
void*
emallocz(ulong sz, int clr)
{
void *p;
if((p = mallocz(sz, clr)) == nil)
error("Out of memory");
setmalloctag(p, getcallerpc(&sz));
return p;
}
void
vmsg(int fd, char *fmt, va_list v)
{
static char buf[8192];
char *e;
e = vseprint(buf, buf+sizeof(buf), fmt, v);
va_end(v);
*e++ = '\r';
*e++ = '\n';
write(fd, buf, e-buf);
}
void
msg(int fd, char *fmt, ...)
{
va_list v;
va_start(v, fmt);
vmsg(fd, fmt, v);
}
char*
rtmsg(int fd, char *fmt, ...)
{
static char buf[8192];
int bytes;
va_list v;
va_start(v, fmt);
vmsg(fd, fmt, v);
bytes = read(fd, buf, sizeof(buf));
buf[bytes] = '\0';
return buf;
}
void
main(int argc, char **argv)
{
TLSconn conn;
int fd;
long bytes;
UserPasswd *up;
uchar buf[512];
char *user, *host, b64[512];
user = getenv("user");
ARGBEGIN{
default:
usage();
case 'u':
user = EARGF(usage());
break;
}ARGEND
if (argc != 1)
usage();
host = argv[0];
up = auth_getuserpasswd(auth_getkey, "proto=pass server=%s service=irc user=%s", host, user);
fd = dial(netmkaddr(host, "tcp", "6697"), nil, nil, nil);
if(fd == -1)
error("Could not connect");
fd = tlsClient(fd, &conn);
if(fd == -1)
error("Could not negotiate tls connection");
msg(fd, "CAP LS 302");
msg(fd, "NICK %s", user);
print(rtmsg(fd, "USER %s 0 * %s", user, user));
//:domain.dom CAP * LS :draft/chathistory batch soju.im/account-required draft/read-marker setname draft/pre-away message-tags away-notify soju.im/bouncer-networks-notify soju.im/search account-notify cap-notify server-time invite-notify draft/extended-monitor extended-join multi-prefix soju.im/read extended-monitor chghost account-tag soju.im/bouncer-networks echo-message soju.im/webpush sasl=PLAIN soju.im/no-implicit-names draft/no-implicit-names
print(rtmsg(fd, "CAP REQ :sasl"));
//:domain.dom CAP * ACK sasl
print(rtmsg(fd, "AUTHENTICATE PLAIN\r\n"));
//AUTHENTICATE +
bytes = snprint((char*)buf, sizeof(buf), "%c%s%c%s", '\0', user, '\0', up->passwd);
free(up);
enc64(b64, sizeof(b64), buf, bytes);
print(rtmsg(fd, "AUTHENTICATE %s\r\n", b64));
//:domain.dom 903 * :SASL authentication successful
exits(0);
}