X-Git-Url: https://git.ucc.asn.au/?p=tpg%2Fopendispense2.git;a=blobdiff_plain;f=src%2Fserver%2Fserver.c;h=9f59489e823f571a842442eff7cdfb594eb1fb70;hp=c9ab63e7e786a8d804c9054185bba36067969c79;hb=05918a67e8509a2b2df6509039a801affd3444eb;hpb=650ed689f2d8c30fe9c448fbec0e58037cc2ce25 diff --git a/src/server/server.c b/src/server/server.c index c9ab63e..9f59489 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -48,6 +48,7 @@ char *Server_Cmd_PASS(tClient *Client, char *Args); char *Server_Cmd_AUTOAUTH(tClient *Client, char *Args); char *Server_Cmd_ENUMITEMS(tClient *Client, char *Args); char *Server_Cmd_ITEMINFO(tClient *Client, char *Args); +char *Server_Cmd_DISPENSE(tClient *Client, char *Args); // --- Helpers --- void HexBin(uint8_t *Dest, char *Src, int BufSize); @@ -63,7 +64,8 @@ struct sClientCommand { {"PASS", Server_Cmd_PASS}, {"AUTOAUTH", Server_Cmd_AUTOAUTH}, {"ENUM_ITEMS", Server_Cmd_ENUMITEMS}, - {"ITEM_INFO", Server_Cmd_ITEMINFO} + {"ITEM_INFO", Server_Cmd_ITEMINFO}, + {"DISPENSE", Server_Cmd_DISPENSE} }; #define NUM_COMMANDS (sizeof(gaServer_Commands)/sizeof(gaServer_Commands[0])) @@ -302,6 +304,15 @@ char *Server_Cmd_PASS(tClient *Client, char *Args) // Read user's hash HexBin(clienthash, Args, HASH_LENGTH); + // TODO: Decrypt password passed + + Client->UID = GetUserAuth(Client->Username, ""); + + if( Client->UID != -1 ) { + Client->bIsAuthed = 1; + return strdup("200 Auth OK\n"); + } + if( giDebugLevel ) { int i; printf("Client %i: Password hash ", Client->ID); @@ -374,21 +385,15 @@ char *Server_Cmd_ENUMITEMS(tClient *Client, char *Args) return ret; } -/** - * \brief Fetch information on a specific item - */ -char *Server_Cmd_ITEMINFO(tClient *Client, char *Args) +tItem *_GetItemFromString(char *String) { - int retLen = 0; - char *ret; - tItem *item; tHandler *handler; - char *type = Args; - char *colon = strchr(Args, ':'); + char *type = String; + char *colon = strchr(String, ':'); int num, i; if( !colon ) { - return strdup("406 Bad Item ID\n"); + return NULL; } num = atoi(colon+1); @@ -404,7 +409,7 @@ char *Server_Cmd_ITEMINFO(tClient *Client, char *Args) } } if( !handler ) { - return strdup("406 Bad Item ID\n"); + return NULL; } // Find item @@ -412,23 +417,54 @@ char *Server_Cmd_ITEMINFO(tClient *Client, char *Args) { if( gaItems[i].Handler != handler ) continue; if( gaItems[i].ID != num ) continue; - item = &gaItems[i]; - break; + return &gaItems[i]; } + return NULL; +} + +/** + * \brief Fetch information on a specific item + */ +char *Server_Cmd_ITEMINFO(tClient *Client, char *Args) +{ + int retLen = 0; + char *ret; + tItem *item = _GetItemFromString(Args); + if( !item ) { return strdup("406 Bad Item ID\n"); } // Create return retLen = snprintf(NULL, 0, "202 Item %s:%i %i %s\n", - handler->Name, item->ID, item->Price, item->Name); + item->Handler->Name, item->ID, item->Price, item->Name); ret = malloc(retLen+1); sprintf(ret, "202 Item %s:%i %i %s\n", - handler->Name, item->ID, item->Price, item->Name); + item->Handler->Name, item->ID, item->Price, item->Name); return ret; } +char *Server_Cmd_DISPENSE(tClient *Client, char *Args) +{ + tItem *item; + if( !Client->bIsAuthed ) return strdup("401 Not Authenticated\n"); + + item = _GetItemFromString(Args); + if( !item ) { + return strdup("406 Bad Item ID\n"); + } + + switch( DispenseItem( Client->UID, item ) ) + { + case 0: return strdup("200 Dispense OK\n"); + case 1: return strdup("501 Unable to dispense\n"); + case 2: return strdup("402 Poor You\n"); + default: + return strdup("500 Dispense Error\n"); + } +} + // --- INTERNAL HELPERS --- // TODO: Move to another file void HexBin(uint8_t *Dest, char *Src, int BufSize)