mirror of
https://github.com/yarrick/iodine.git
synced 2024-11-16 21:03:17 +00:00
#36 server now responds to raw login, quite a hack
This commit is contained in:
parent
08efbdac69
commit
b37d5481cd
|
@ -838,6 +838,61 @@ tunnel(int tun_fd, int dns_fd, int bind_fd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
send_raw(int fd, char *buf, int buflen, int cmd, struct query *q)
|
||||||
|
{
|
||||||
|
unsigned char packet[4096];
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = MIN(sizeof(packet) - RAW_HDR_LEN, buflen);
|
||||||
|
|
||||||
|
memcpy(packet, raw_header, RAW_HDR_LEN);
|
||||||
|
memcpy(&packet[RAW_HDR_LEN], buf, len);
|
||||||
|
|
||||||
|
len += RAW_HDR_LEN;
|
||||||
|
packet[RAW_HDR_CMD] = cmd;
|
||||||
|
|
||||||
|
sendto(fd, packet, len, 0, &q->from, q->fromlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_raw_login(char *packet, int len, struct query *q, int fd)
|
||||||
|
{
|
||||||
|
int userid;
|
||||||
|
char myhash[16];
|
||||||
|
|
||||||
|
if (len < 17) return;
|
||||||
|
|
||||||
|
userid = packet[16];
|
||||||
|
if (userid < 0 || userid > created_users) return;
|
||||||
|
if (!users[userid].active) return;
|
||||||
|
|
||||||
|
login_calculate(myhash, 16, password, users[userid].seed + 1);
|
||||||
|
if (memcmp(packet, myhash, 16) == 0) {
|
||||||
|
/* Correct hash, reply with hash of seed - 1 */
|
||||||
|
users[userid].last_pkt = time(NULL);
|
||||||
|
login_calculate(myhash, 16, password, users[userid].seed - 1);
|
||||||
|
memcpy(packet, myhash, 16);
|
||||||
|
send_raw(fd, packet, 17, RAW_HDR_CMD_LOGIN, q);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
raw_decode(char *packet, int len, struct query *q, int fd)
|
||||||
|
{
|
||||||
|
/* minimum length */
|
||||||
|
if (len < RAW_HDR_LEN) return 0;
|
||||||
|
/* should start with header */
|
||||||
|
if (memcmp(packet, raw_header, RAW_HDR_IDENT_LEN)) return 0;
|
||||||
|
|
||||||
|
if (packet[RAW_HDR_CMD] == RAW_HDR_CMD_LOGIN) {
|
||||||
|
handle_raw_login(&packet[RAW_HDR_LEN], len - RAW_HDR_LEN, q, fd);
|
||||||
|
} else {
|
||||||
|
warnx("Unhandled raw command %02X\n", packet[RAW_HDR_CMD]);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
read_dns(int fd, struct query *q)
|
read_dns(int fd, struct query *q)
|
||||||
{
|
{
|
||||||
|
@ -870,11 +925,16 @@ read_dns(int fd, struct query *q)
|
||||||
#endif /* !WINDOWS32 */
|
#endif /* !WINDOWS32 */
|
||||||
|
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
|
memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen);
|
||||||
|
q->fromlen = addrlen;
|
||||||
|
|
||||||
|
/* TODO do not handle raw packets here! */
|
||||||
|
if (raw_decode(packet, r, q, fd)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if (dns_decode(NULL, 0, q, QR_QUERY, packet, r) < 0) {
|
if (dns_decode(NULL, 0, q, QR_QUERY, packet, r) < 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen);
|
|
||||||
q->fromlen = addrlen;
|
|
||||||
|
|
||||||
#ifndef WINDOWS32
|
#ifndef WINDOWS32
|
||||||
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
|
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
|
||||||
|
|
Loading…
Reference in a new issue