Initial move to common config code directory
[tpg/opendispense2.git] / src / client / protocol.c
index 483ee57..fb69850 100644 (file)
@@ -21,6 +21,7 @@
 #include <unistd.h>    // close/getuid
 #include <limits.h>    // INT_MIN/INT_MAX
 #include <stdarg.h>
+#include <ctype.h>     // 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

UCC git Repository :: git.ucc.asn.au