X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=src%2Fclient%2Fprotocol.c;h=fb698504b8298b2745f221adbac863e4bde47e09;hb=26a80cc0cae35a63247b69a262aacd2a3932d924;hp=483ee575ce147b7046b862a02f888cffddd48a5d;hpb=0b5755205d388b5704c040c21285c0b7ab58825e;p=tpg%2Fopendispense2.git diff --git a/src/client/protocol.c b/src/client/protocol.c index 483ee57..fb69850 100644 --- a/src/client/protocol.c +++ b/src/client/protocol.c @@ -21,6 +21,7 @@ #include // close/getuid #include // INT_MIN/INT_MAX #include +#include // isdigit #include "common.h" // === PROTOTYPES === @@ -55,8 +56,6 @@ int OpenConnection(const char *Host, int Port) return -1; } -// printf("geteuid() = %i, getuid() = %i\n", geteuid(), getuid()); - if( geteuid() == 0 || getuid() == 0 ) { int i; @@ -74,8 +73,6 @@ int OpenConnection(const char *Host, int Port) } if( i == 1024 ) printf("Warning: AUTOAUTH unavaliable\n"); -// else -// printf("Bound to 0.0.0.0:%i\n", i); } if( connect(sock, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0 ) { @@ -514,6 +511,105 @@ int Dispense_ItemInfo(int Socket, const char *Type, int ID) return 0; } +int DispenseCheckPin(int Socket, const char *Username, const char *Pin) +{ + int ret, responseCode; + char *buf; + + if( strlen(Pin) != 4 ) { + fprintf(stderr, "Pin format incorrect (not 4 characters long)\n"); + return RV_ARGUMENTS; + } + + for( int i = 0; i < 4; i ++ ) { + if( !isdigit(Pin[i]) ) { + fprintf(stderr, "Pin format incorrect (character %i not a digit)\n", i); + return RV_ARGUMENTS; + } + } + + sendf(Socket, "PIN_CHECK %s %s\n", Username, Pin); + buf = ReadLine(Socket); + + responseCode = atoi(buf); + switch( responseCode ) + { + case 200: // Pin correct + printf("Pin OK\n"); + ret = 0; + break; + case 201: + printf("Pin incorrect\n"); + ret = RV_INVALID_USER; + break; + case 401: + printf("Not authenticated\n"); + ret = RV_PERMISSIONS; + break; + case 403: + printf("Only coke members can check accounts other than their own\n"); + ret = RV_PERMISSIONS; + break; + case 404: + printf("User '%s' not found\n", Username); + ret = RV_INVALID_USER; + break; + case 407: + printf("Rate limited or client-server disagree on pin format\n"); + ret = RV_SERVER_ERROR; + break; + default: + printf("Unknown response code %i ('%s')\n", responseCode, buf); + ret = RV_UNKNOWN_ERROR; + break; + } + free(buf); + return ret; +} + +int DispenseSetPin(int Socket, const char *Pin) +{ + int ret, responseCode; + char *buf; + + if( strlen(Pin) != 4 ) { + fprintf(stderr, "Pin format incorrect (not 4 characters long)\n"); + return RV_ARGUMENTS; + } + + for( int i = 0; i < 4; i ++ ) { + if( !isdigit(Pin[i]) ) { + fprintf(stderr, "Pin format incorrect (character %i not a digit)\n", i); + return RV_ARGUMENTS; + } + } + + sendf(Socket, "PIN_SET %s\n", Pin); + buf = ReadLine(Socket); + + responseCode = atoi(buf); + switch(responseCode) + { + case 200: + printf("Pin Updated\n"); + ret = 0; + break; + case 401: + printf("Not authenticated\n"); + ret = RV_PERMISSIONS; + break; + case 407: + printf("Client/server disagreement on pin format\n"); + ret = RV_SERVER_ERROR; + break; + default: + printf("Unknown response code %i ('%s')\n", responseCode, buf); + ret = RV_UNKNOWN_ERROR; + break; + } + return ret; +} + /** * \brief Dispense an item * \return Boolean Failure @@ -605,7 +701,7 @@ int Dispense_AlterBalance(int Socket, const char *Username, int Ammount, const c rv = RV_BAD_ITEM; break; case 403: // Not in coke - fprintf(stderr, "You are not in coke (sucker)\n"); + fprintf(stderr, "Permissions error: %s\n", buf+4); rv = RV_PERMISSIONS; break; case 404: // Unknown user @@ -646,7 +742,7 @@ int Dispense_SetBalance(int Socket, const char *Username, int Balance, const cha switch(responseCode) { case 200: return 0; // OK - case 403: // Not in coke + case 403: // Not an administrator fprintf(stderr, "You are not an admin\n"); return RV_PERMISSIONS; case 404: // Unknown user