Changeset 1235cb


Ignore:
Timestamp:
06/14/09 15:31:35 (3 years ago)
Author:
Erik Ekman <yarrick@…>
Branches:
master
Children:
de976d
Parents:
c92ed9
git-author:
Erik Ekman <yarrick@…> (06/14/09 15:31:35)
git-committer:
Erik Ekman <erik@…> (02/04/12 20:34:02)
Message:

#36 server now responds to raw login, quite a hack

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/iodined.c

    rc92ed9 r1235cb  
    839839} 
    840840 
     841static void 
     842send_raw(int fd, char *buf, int buflen, int cmd, struct query *q) 
     843{ 
     844        unsigned char packet[4096]; 
     845        int len; 
     846 
     847        len = MIN(sizeof(packet) - RAW_HDR_LEN, buflen); 
     848 
     849        memcpy(packet, raw_header, RAW_HDR_LEN); 
     850        memcpy(&packet[RAW_HDR_LEN], buf, len); 
     851 
     852        len += RAW_HDR_LEN; 
     853        packet[RAW_HDR_CMD] = cmd; 
     854 
     855        sendto(fd, packet, len, 0, &q->from, q->fromlen); 
     856} 
     857 
     858static void 
     859handle_raw_login(char *packet, int len, struct query *q, int fd) 
     860{ 
     861        int userid; 
     862        char myhash[16]; 
     863         
     864        if (len < 17) return; 
     865 
     866        userid = packet[16]; 
     867        if (userid < 0 || userid > created_users) return; 
     868        if (!users[userid].active) return; 
     869 
     870        login_calculate(myhash, 16, password, users[userid].seed + 1); 
     871        if (memcmp(packet, myhash, 16) == 0) { 
     872                /* Correct hash, reply with hash of seed - 1 */ 
     873                users[userid].last_pkt = time(NULL); 
     874                login_calculate(myhash, 16, password, users[userid].seed - 1); 
     875                memcpy(packet, myhash, 16); 
     876                send_raw(fd, packet, 17, RAW_HDR_CMD_LOGIN, q); 
     877        } 
     878} 
     879 
     880static int 
     881raw_decode(char *packet, int len, struct query *q, int fd) 
     882{ 
     883        /* minimum length */ 
     884        if (len < RAW_HDR_LEN) return 0; 
     885        /* should start with header */ 
     886        if (memcmp(packet, raw_header, RAW_HDR_IDENT_LEN)) return 0; 
     887 
     888        if (packet[RAW_HDR_CMD] == RAW_HDR_CMD_LOGIN) { 
     889                handle_raw_login(&packet[RAW_HDR_LEN], len - RAW_HDR_LEN, q, fd); 
     890        } else { 
     891                warnx("Unhandled raw command %02X\n", packet[RAW_HDR_CMD]); 
     892        } 
     893        return 1; 
     894} 
     895 
    841896static int 
    842897read_dns(int fd, struct query *q) 
     
    871926 
    872927        if (r > 0) { 
     928                memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen); 
     929                q->fromlen = addrlen; 
     930 
     931                /* TODO do not handle raw packets here! */ 
     932                if (raw_decode(packet, r, q, fd)) { 
     933                        return 0; 
     934                } 
    873935                if (dns_decode(NULL, 0, q, QR_QUERY, packet, r) < 0) { 
    874936                        return 0; 
    875937                } 
    876                 memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen); 
    877                 q->fromlen = addrlen; 
    878938                 
    879939#ifndef WINDOWS32 
Note: See TracChangeset for help on using the changeset viewer.