Cleanups ready for distribution
[tpg/opendispense2.git] / src / server / server.c
index dbb08cb..806ecce 100644 (file)
@@ -99,7 +99,7 @@ const struct sClientCommand {
 #define NUM_COMMANDS   ((int)(sizeof(gaServer_Commands)/sizeof(gaServer_Commands[0])))
 
 // === GLOBALS ===
- int   giServer_Port = 1020;
+ int   giServer_Port = 11020;
  int   giServer_NextClientID = 1;
  int   giServer_Socket;
 
@@ -186,11 +186,12 @@ void Server_Start(void)
                        switch( ntohl( client_addr.sin_addr.s_addr ) )
                        {
                        case 0x7F000001:        // 127.0.0.1    localhost
-               //      case 0x825E0D00:        // 130.95.13.0
-                       case 0x825E0D07:        // 130.95.13.7  motsugo
-                       case 0x825E0D11:        // 130.95.13.17 mermaid
-                       case 0x825E0D12:        // 130.95.13.18 mussel
-                       case 0x825E0D17:        // 130.95.13.23 martello
+               //      case 0x825F0D00:        // 130.95.13.0
+                       case 0x825F0D07:        // 130.95.13.7  motsugo
+                       case 0x825F0D11:        // 130.95.13.17 mermaid
+                       case 0x825F0D12:        // 130.95.13.18 mussel
+                       case 0x825F0D17:        // 130.95.13.23 martello
+                       case 0x825F0D42:        // 130.95.13.66 heathred
                                bTrusted = 1;
                                break;
                        default:
@@ -302,6 +303,7 @@ void Server_ParseClientCommand(tClient *Client, char *CommandString)
        
        if( Server_int_ParseArgs(1, CommandString, &command, &args, NULL) )
        {
+//             printf("command=%s, args=%s\n", command, args);
                // Is this an error? (just ignore for now)
                //args = "";
        }
@@ -333,7 +335,11 @@ void Server_Cmd_USER(tClient *Client, char *Args)
 {
        char    *username;
        
-       Server_int_ParseArgs(0, Args, &username, NULL);
+       if( Server_int_ParseArgs(0, Args, &username, NULL) )
+       {
+               sendf(Client->Socket, "407 USER takes 1 argument\n");
+               return ;
+       }
        
        // Debug!
        if( giDebugLevel )
@@ -371,19 +377,36 @@ void Server_Cmd_USER(tClient *Client, char *Args)
 void Server_Cmd_PASS(tClient *Client, char *Args)
 {
        char    *passhash;
-       
-       Server_int_ParseArgs(0, Args, &passhash, NULL);
+        int    flags;
+
+       if( Server_int_ParseArgs(0, Args, &passhash, NULL) )
+       {
+               sendf(Client->Socket, "407 PASS takes 1 argument\n");
+               return ;
+       }
        
        // Pass on to cokebank
        Client->UID = Bank_GetUserAuth(Client->Salt, Client->Username, passhash);
 
-       if( Client->UID != -1 ) {
-               Client->bIsAuthed = 1;
-               sendf(Client->Socket, "200 Auth OK\n");
+       if( Client->UID == -1 ) {
+               sendf(Client->Socket, "401 Auth Failure\n");
+               return ;
+       }
+
+       flags = Bank_GetFlags(Client->UID);
+       if( flags & USER_FLAG_DISABLED ) {
+               Client->UID = -1;
+               sendf(Client->Socket, "403 Account Disabled\n");
+               return ;
+       }
+       if( flags & USER_FLAG_INTERNAL ) {
+               Client->UID = -1;
+               sendf(Client->Socket, "403 Internal account\n");
                return ;
        }
        
-       sendf(Client->Socket, "401 Auth Failure\n");
+       Client->bIsAuthed = 1;
+       sendf(Client->Socket, "200 Auth OK\n");
 }
 
 /**
@@ -394,6 +417,7 @@ void Server_Cmd_PASS(tClient *Client, char *Args)
 void Server_Cmd_AUTOAUTH(tClient *Client, char *Args)
 {
        char    *username;
+        int    userflags;
        
        if( Server_int_ParseArgs(0, Args, &username, NULL) )
        {
@@ -418,12 +442,20 @@ void Server_Cmd_AUTOAUTH(tClient *Client, char *Args)
                return ;
        }
        
+       userflags = Bank_GetFlags(Client->UID);
        // You can't be an internal account
-       if( Bank_GetFlags(Client->UID) & USER_FLAG_INTERNAL ) {
+       if( userflags & USER_FLAG_INTERNAL ) {
                if(giDebugLevel)
                        Debug(Client, "Autoauth as '%s', not allowed", username);
                Client->UID = -1;
-               sendf(Client->Socket, "401 Auth Failure\n");
+               sendf(Client->Socket, "403 Account is internal\n");
+               return ;
+       }
+
+       // Disabled accounts
+       if( userflags & USER_FLAG_DISABLED ) {
+               Client->UID = -1;
+               sendf(Client->Socket, "403 Account disabled\n");
                return ;
        }
 
@@ -441,8 +473,13 @@ void Server_Cmd_AUTOAUTH(tClient *Client, char *Args)
 void Server_Cmd_SETEUSER(tClient *Client, char *Args)
 {
        char    *username;
+        int    eUserFlags, userFlags;
        
-       Server_int_ParseArgs(0, Args, &username, NULL);
+       if( Server_int_ParseArgs(0, Args, &username, NULL) )
+       {
+               sendf(Client->Socket, "407 SETEUSER takes 1 argument\n");
+               return ;
+       }
        
        if( !strlen(Args) ) {
                sendf(Client->Socket, "407 SETEUSER expects an argument\n");
@@ -450,7 +487,8 @@ void Server_Cmd_SETEUSER(tClient *Client, char *Args)
        }
 
        // Check user permissions
-       if( !(Bank_GetFlags(Client->UID) & (USER_FLAG_COKE|USER_FLAG_ADMIN)) ) {
+       userFlags = Bank_GetFlags(Client->UID);
+       if( !(userFlags & (USER_FLAG_COKE|USER_FLAG_ADMIN)) ) {
                sendf(Client->Socket, "403 Not in coke\n");
                return ;
        }
@@ -463,15 +501,48 @@ void Server_Cmd_SETEUSER(tClient *Client, char *Args)
        }
        
        // You can't be an internal account
-       if( Bank_GetFlags(Client->EffectiveUID) & USER_FLAG_INTERNAL ) {
+       eUserFlags = Bank_GetFlags(Client->EffectiveUID);
+       if( eUserFlags & USER_FLAG_INTERNAL ) {
                Client->EffectiveUID = -1;
                sendf(Client->Socket, "404 User not found\n");
                return ;
        }
+       // Disabled only avaliable to admins
+       if( (eUserFlags & USER_FLAG_DISABLED) && !(userFlags & USER_FLAG_ADMIN) ) {
+               Client->EffectiveUID = -1;
+               sendf(Client->Socket, "403 Account disabled\n");
+               return ;
+       }
        
        sendf(Client->Socket, "200 User set\n");
 }
 
+/**
+ * \brief Send an item status to the client
+ * \param Client       Who to?
+ * \param Item Item to send
+ */
+void Server_int_SendItem(tClient *Client, tItem *Item)
+{
+       char    *status = "avail";
+       
+       if( Item->Handler->CanDispense )
+       {
+               switch(Item->Handler->CanDispense(Client->UID, Item->ID))
+               {
+               case  0:        status = "avail";       break;
+               case  1:        status = "sold";        break;
+               default:
+               case -1:        status = "error";       break;
+               }
+       }
+       
+       sendf(Client->Socket,
+               "202 Item %s:%i %s %i %s\n",
+               Item->Handler->Name, Item->ID, status, Item->Price, Item->Name
+               );
+}
+
 /**
  * \brief Enumerate the items that the server knows about
  */
@@ -495,10 +566,7 @@ void Server_Cmd_ENUMITEMS(tClient *Client, char *Args)
 
        for( i = 0; i < giNumItems; i ++ ) {
                if( gaItems[i].bHidden )        continue;
-               sendf(Client->Socket,
-                       "202 Item %s:%i %i %s\n",
-                        gaItems[i].Handler->Name, gaItems[i].ID, gaItems[i].Price, gaItems[i].Name
-                        );
+               Server_int_SendItem( Client, &gaItems[i] );
        }
 
        sendf(Client->Socket, "200 List end\n");
@@ -560,10 +628,7 @@ void Server_Cmd_ITEMINFO(tClient *Client, char *Args)
                return ;
        }
        
-       sendf(Client->Socket,
-               "202 Item %s:%i %i %s\n",
-                item->Handler->Name, item->ID, item->Price, item->Name
-                );
+       Server_int_SendItem( Client, item );
 }
 
 void Server_Cmd_DISPENSE(tClient *Client, char *Args)
@@ -632,10 +697,10 @@ void Server_Cmd_GIVE(tClient *Client, char *Args)
        }
        
        // You can't alter an internal account
-       if( Bank_GetFlags(uid) & USER_FLAG_INTERNAL ) {
-               sendf(Client->Socket, "404 Invalid target user\n");
-               return ;
-       }
+//     if( Bank_GetFlags(uid) & USER_FLAG_INTERNAL ) {
+//             sendf(Client->Socket, "404 Invalid target user\n");
+//             return ;
+//     }
 
        // Parse ammount
        iAmmount = atoi(ammount);

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