Hacked to stop root dispenses
[tpg/opendispense2.git] / src / server / server.c
index 3973690..b103e83 100644 (file)
@@ -23,6 +23,7 @@
 // Statistics
 #define MAX_CONNECTION_QUEUE   5
 #define INPUT_BUFFER_SIZE      256
+#define CLIENT_TIMEOUT 10      // Seconds
 
 #define HASH_TYPE      SHA1
 #define HASH_LENGTH    20
@@ -68,6 +69,7 @@ void  _SendUserInfo(tClient *Client, int UserID);
 void   Server_Cmd_USERADD(tClient *Client, char *Args);
 void   Server_Cmd_USERFLAGS(tClient *Client, char *Args);
 // --- Helpers ---
+void   Debug(tClient *Client, const char *Format, ...);
  int   Server_int_ParseFlags(tClient *Client, const char *Str, int *Mask, int *Value);
  int   sendf(int Socket, const char *Format, ...);
 
@@ -152,6 +154,18 @@ void Server_Start(void)
                        return ;
                }
                
+               // Set a timeout on the user conneciton
+               {
+                       struct timeval tv;
+                       tv.tv_sec = CLIENT_TIMEOUT;
+                       tv.tv_usec = 0;
+                       if( setsockopt(client_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) )
+                       {
+                               perror("setsockopt");
+                               return ;
+                       }
+               }
+               
                // Debug: Print the connection string
                if(giDebugLevel >= 2) {
                        char    ipstr[INET_ADDRSTRLEN];
@@ -224,6 +238,7 @@ void Server_HandleClient(int Socket, int bTrusted)
         *   it is saved to the beginning of `inbuf` and `buf` is updated to
         *   the end of it.
         */
+       // TODO: Use select() instead (to give a timeout)
        while( (bytes = recv(Socket, buf, remspace, 0)) > 0 )
        {
                char    *eol, *start;
@@ -341,7 +356,7 @@ void Server_Cmd_USER(tClient *Client, char *Args)
        
        // Debug!
        if( giDebugLevel )
-               printf("Client %i authenticating as '%s'\n", Client->ID, Args);
+               Debug(Client, "Authenticating as '%s'", Args);
        
        // Save username
        if(Client->Username)
@@ -402,7 +417,7 @@ void Server_Cmd_AUTOAUTH(tClient *Client, char *Args)
        // Check if trusted
        if( !Client->bIsTrusted ) {
                if(giDebugLevel)
-                       printf("Client %i: Untrusted client attempting to AUTOAUTH\n", Client->ID);
+                       Debug(Client, "Untrusted client attempting to AUTOAUTH");
                sendf(Client->Socket, "401 Untrusted\n");
                return ;
        }
@@ -411,7 +426,7 @@ void Server_Cmd_AUTOAUTH(tClient *Client, char *Args)
        Client->UID = Bank_GetAcctByName( Args );       
        if( Client->UID < 0 ) {
                if(giDebugLevel)
-                       printf("Client %i: Unknown user '%s'\n", Client->ID, Args);
+                       Debug(Client, "Unknown user '%s'", Args);
                sendf(Client->Socket, "401 Auth Failure\n");
                return ;
        }
@@ -422,9 +437,11 @@ void Server_Cmd_AUTOAUTH(tClient *Client, char *Args)
                sendf(Client->Socket, "401 Auth Failure\n");
                return ;
        }
+
+       Client->bIsAuthed = 1;
        
        if(giDebugLevel)
-               printf("Client %i: Authenticated as '%s' (%i)\n", Client->ID, Args, Client->UID);
+               Debug(Client, "Auto authenticated as '%s' (%i)", Args, Client->UID);
        
        sendf(Client->Socket, "200 Auth OK\n");
 }
@@ -1028,10 +1045,14 @@ void Server_Cmd_USERINFO(tClient *Client, char *Args)
        space = strchr(user, ' ');
        if(space)       *space = '\0';
        
+       if( giDebugLevel )      Debug(Client, "User Info '%s'", user);
+       
        // Get recipient
        uid = Bank_GetAcctByName(user);
+       
+       if( giDebugLevel >= 2 ) Debug(Client, "uid = %i", uid);
        if( uid == -1 ) {
-               sendf(Client->Socket, "404 Invalid user");
+               sendf(Client->Socket, "404 Invalid user\n");
                return ;
        }
        
@@ -1151,6 +1172,17 @@ void Server_Cmd_USERFLAGS(tClient *Client, char *Args)
 }
 
 // --- INTERNAL HELPERS ---
+void Debug(tClient *Client, const char *Format, ...)
+{
+       va_list args;
+       //printf("%010i [%i] ", (int)time(NULL), Client->ID);
+       printf("[%i] ", Client->ID);
+       va_start(args, Format);
+       vprintf(Format, args);
+       va_end(args);
+       printf("\n");
+}
+
 int sendf(int Socket, const char *Format, ...)
 {
        va_list args;

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