X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fserver%2Fserver.c;h=c997c43b68767db767b90019c6dd8f22090ffe97;hb=15d5ac704abc63c3f11ac8743cbd2ffa1fb70c88;hp=330ac66a860d0fad84259465fdc2de8112ce2faf;hpb=3d919eb78adae49b0871332458b6183a2c12af7a;p=tpg%2Fopendispense2.git diff --git a/src/server/server.c b/src/server/server.c index 330ac66..c997c43 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -67,7 +67,6 @@ void Server_Cmd_USERADD(tClient *Client, char *Args); void Server_Cmd_USERFLAGS(tClient *Client, char *Args); // --- Helpers --- int sendf(int Socket, const char *Format, ...); -void HexBin(uint8_t *Dest, char *Src, int BufSize); // === CONSTANTS === // - Commands @@ -89,7 +88,7 @@ const struct sClientCommand { {"USER_ADD", Server_Cmd_USERADD}, {"USER_FLAGS", Server_Cmd_USERFLAGS} }; -#define NUM_COMMANDS (sizeof(gaServer_Commands)/sizeof(gaServer_Commands[0])) +#define NUM_COMMANDS ((int)(sizeof(gaServer_Commands)/sizeof(gaServer_Commands[0]))) // === GLOBALS === int giServer_Port = 1020; @@ -195,7 +194,9 @@ void Server_HandleClient(int Socket, int bTrusted) char *buf = inbuf; int remspace = INPUT_BUFFER_SIZE-1; int bytes = -1; - tClient clientInfo = {0}; + tClient clientInfo; + + memset(&clientInfo, 0, sizeof(clientInfo)); // Initialise Client info clientInfo.Socket = Socket; @@ -364,7 +365,7 @@ void Server_Cmd_PASS(tClient *Client, char *Args) if(space) *space = '\0'; // Remove characters after the ' ' // Pass on to cokebank - Client->UID = GetUserAuth(Client->Salt, Client->Username, Args); + Client->UID = Bank_GetUserAuth(Client->Salt, Client->Username, Args); if( Client->UID != -1 ) { Client->bIsAuthed = 1; @@ -394,7 +395,7 @@ void Server_Cmd_AUTOAUTH(tClient *Client, char *Args) } // Get UID - Client->UID = GetUserID( Args ); + Client->UID = Bank_GetAcctByName( Args ); if( Client->UID < 0 ) { if(giDebugLevel) printf("Client %i: Unknown user '%s'\n", Client->ID, Args); @@ -402,6 +403,13 @@ void Server_Cmd_AUTOAUTH(tClient *Client, char *Args) return ; } + // You can't be an internal account + if( Bank_GetFlags(Client->UID) & USER_FLAG_INTERNAL ) { + Client->UID = -1; + sendf(Client->Socket, "401 Auth Failure\n"); + return ; + } + if(giDebugLevel) printf("Client %i: Authenticated as '%s' (%i)\n", Client->ID, Args, Client->UID); @@ -425,18 +433,25 @@ void Server_Cmd_SETEUSER(tClient *Client, char *Args) } // Check user permissions - if( (GetFlags(Client->UID) & USER_FLAG_TYPEMASK) < USER_TYPE_COKE ) { + if( !(Bank_GetFlags(Client->UID) & USER_FLAG_COKE) ) { sendf(Client->Socket, "403 Not in coke\n"); return ; } // Set id - Client->EffectiveUID = GetUserID(Args); + Client->EffectiveUID = Bank_GetAcctByName(Args); if( Client->EffectiveUID == -1 ) { sendf(Client->Socket, "404 User not found\n"); return ; } + // You can't be an internal account + if( Bank_GetFlags(Client->EffectiveUID) & USER_FLAG_INTERNAL ) { + Client->EffectiveUID = -1; + sendf(Client->Socket, "404 User not found\n"); + return ; + } + sendf(Client->Socket, "200 User set\n"); } @@ -447,6 +462,11 @@ void Server_Cmd_ENUMITEMS(tClient *Client, char *Args) { int i; + if( Args != NULL && strlen(Args) ) { + sendf(Client->Socket, "407 ENUM_ITEMS takes no arguments\n"); + return ; + } + sendf(Client->Socket, "201 Items %i\n", giNumItems); for( i = 0; i < giNumItems; i ++ ) { @@ -579,11 +599,17 @@ void Server_Cmd_GIVE(tClient *Client, char *Args) reason ++; // Get recipient - uid = GetUserID(recipient); + uid = Bank_GetAcctByName(recipient); if( uid == -1 ) { sendf(Client->Socket, "404 Invalid target user\n"); return ; } + + // You can't alter an internal account + if( Bank_GetFlags(uid) & USER_FLAG_INTERNAL ) { + sendf(Client->Socket, "404 Invalid target user\n"); + return ; + } // Parse ammount iAmmount = atoi(ammount); @@ -643,20 +669,20 @@ void Server_Cmd_ADD(tClient *Client, char *Args) reason ++; // Check user permissions - if( (GetFlags(Client->UID) & USER_FLAG_TYPEMASK) < USER_TYPE_COKE ) { + if( !(Bank_GetFlags(Client->UID) & USER_FLAG_COKE) ) { sendf(Client->Socket, "403 Not in coke\n"); return ; } // Get recipient - uid = GetUserID(user); - - // Check user permissions - if( (GetFlags(Client->UID) & USER_FLAG_TYPEMASK) < USER_TYPE_COKE ) { - sendf(Client->Socket, "403 Not in coke\n"); + uid = Bank_GetAcctByName(user); + if( uid == -1 ) { + sendf(Client->Socket, "404 Invalid user\n"); return ; } - if( uid == -1 ) { + + // You can't alter an internal account + if( Bank_GetFlags(uid) & USER_FLAG_INTERNAL ) { sendf(Client->Socket, "404 Invalid user\n"); return ; } @@ -687,7 +713,8 @@ void Server_Cmd_ENUMUSERS(tClient *Client, char *Args) { int i, numRet = 0; int maxBal = INT_MAX, minBal = INT_MIN; - int numUsr = GetMaxID(); + tAcctIterator *it; + int sort = BANK_ITFLAG_SORT_NAME; // Parse arguments if( Args && strlen(Args) ) @@ -708,10 +735,18 @@ void Server_Cmd_ENUMUSERS(tClient *Client, char *Args) maxBal = atoi(max); } + // Create iterator + if( maxBal != INT_MAX ) + it = Bank_Iterator(0, 0, sort|BANK_ITFLAG_MAXBALANCE, maxBal, 0); + else if( minBal != INT_MIN ) + it = Bank_Iterator(0, 0, sort|BANK_ITFLAG_MINBALANCE, minBal, 0); + else + it = Bank_Iterator(0, 0, sort, 0, 0); + // Get return number - for( i = 0; i < numUsr; i ++ ) + while( (i = Bank_IteratorNext(it)) != -1 ) { - int bal = GetBalance(i); + int bal = Bank_GetBalance(i); if( bal == INT_MIN ) continue; @@ -721,12 +756,23 @@ void Server_Cmd_ENUMUSERS(tClient *Client, char *Args) numRet ++; } + Bank_DelIterator(it); + // Send count sendf(Client->Socket, "201 Users %i\n", numRet); - for( i = 0; i < numUsr; i ++ ) + + // Create iterator + if( maxBal != INT_MAX ) + it = Bank_Iterator(0, 0, sort|BANK_ITFLAG_MAXBALANCE, maxBal, 0); + else if( minBal != INT_MIN ) + it = Bank_Iterator(0, 0, sort|BANK_ITFLAG_MINBALANCE, minBal, 0); + else + it = Bank_Iterator(0, 0, sort, 0, 0); + + while( (i = Bank_IteratorNext(it)) != -1 ) { - int bal = GetBalance(i); + int bal = Bank_GetBalance(i); if( bal == INT_MIN ) continue; @@ -736,6 +782,8 @@ void Server_Cmd_ENUMUSERS(tClient *Client, char *Args) _SendUserInfo(Client, i); } + Bank_DelIterator(it); + sendf(Client->Socket, "200 List End\n"); } @@ -749,7 +797,7 @@ void Server_Cmd_USERINFO(tClient *Client, char *Args) if(space) *space = '\0'; // Get recipient - uid = GetUserID(user); + uid = Bank_GetAcctByName(user); if( uid == -1 ) { sendf(Client->Socket, "404 Invalid user"); return ; @@ -760,27 +808,34 @@ void Server_Cmd_USERINFO(tClient *Client, char *Args) void _SendUserInfo(tClient *Client, int UserID) { - char *type, *disabled=""; - int flags = GetFlags(UserID); + char *type, *disabled="", *door=""; + int flags = Bank_GetFlags(UserID); - switch( flags & USER_FLAG_TYPEMASK ) - { - default: - case USER_TYPE_NORMAL: type = "user"; break; - case USER_TYPE_COKE: type = "coke"; break; - case USER_TYPE_WHEEL: type = "wheel"; break; - case USER_TYPE_GOD: type = "meta"; break; + if( flags & USER_FLAG_INTERNAL ) { + type = "internal"; + } + else if( flags & USER_FLAG_COKE ) { + if( flags & USER_FLAG_WHEEL ) + type = "coke,wheel"; + else + type = "coke"; + } + else if( flags & USER_FLAG_WHEEL ) { + type = "wheel"; + } + else { + type = "user"; } if( flags & USER_FLAG_DISABLED ) disabled = ",disabled"; if( flags & USER_FLAG_DOORGROUP ) - disabled = ",door"; + door = ",door"; // TODO: User flags/type sendf( Client->Socket, "202 User %s %i %s%s\n", - GetUserName(UserID), GetBalance(UserID), + Bank_GetAcctName(UserID), Bank_GetBalance(UserID), type, disabled ); } @@ -790,7 +845,7 @@ void Server_Cmd_USERADD(tClient *Client, char *Args) char *username, *space; // Check permissions - if( (GetFlags(Client->UID) & USER_FLAG_TYPEMASK) < USER_TYPE_WHEEL ) { + if( !(Bank_GetFlags(Client->UID) & USER_FLAG_WHEEL) ) { sendf(Client->Socket, "403 Not Wheel\n"); return ; } @@ -802,7 +857,7 @@ void Server_Cmd_USERADD(tClient *Client, char *Args) if(space) *space = '\0'; // Try to create user - if( CreateUser(username) == -1 ) { + if( Bank_CreateAcct(username) == -1 ) { sendf(Client->Socket, "404 User exists\n"); return ; } @@ -818,7 +873,7 @@ void Server_Cmd_USERFLAGS(tClient *Client, char *Args) int uid; // Check permissions - if( (GetFlags(Client->UID) & USER_FLAG_TYPEMASK) < USER_TYPE_WHEEL ) { + if( !(Bank_GetFlags(Client->UID) & USER_FLAG_WHEEL) ) { sendf(Client->Socket, "403 Not Wheel\n"); return ; } @@ -840,7 +895,7 @@ void Server_Cmd_USERFLAGS(tClient *Client, char *Args) if(space) *space = '\0'; // Get UID - uid = GetUserID(username); + uid = Bank_GetAcctByName(username); if( uid == -1 ) { sendf(Client->Socket, "404 User '%s' not found\n", username); return ; @@ -855,12 +910,11 @@ void Server_Cmd_USERFLAGS(tClient *Client, char *Args) int Mask; int Value; } cFLAGS[] = { - {"disabled", USER_FLAG_DISABLED, USER_FLAG_DISABLED}, - {"door", USER_FLAG_DOORGROUP, USER_FLAG_DOORGROUP}, - {"user", USER_FLAG_TYPEMASK, USER_TYPE_NORMAL}, - {"coke", USER_FLAG_TYPEMASK, USER_TYPE_COKE}, - {"wheel", USER_FLAG_TYPEMASK, USER_TYPE_WHEEL}, - {"meta", USER_FLAG_TYPEMASK, USER_TYPE_GOD} + {"disabled", USER_FLAG_DISABLED, USER_FLAG_DISABLED} + ,{"door", USER_FLAG_DOORGROUP, USER_FLAG_DOORGROUP} + ,{"coke", USER_FLAG_COKE, USER_FLAG_COKE} + ,{"wheel", USER_FLAG_WHEEL, USER_FLAG_WHEEL} + // ,{"internal", USER_FLAG_INTERNAL, USER_FLAG_INTERNAL} }; const int ciNumFlags = sizeof(cFLAGS)/sizeof(cFLAGS[0]); @@ -899,7 +953,7 @@ void Server_Cmd_USERFLAGS(tClient *Client, char *Args) } while(space); // Apply flags - SetFlags(uid, mask, value); + Bank_SetFlags(uid, mask, value); // Return OK sendf(Client->Socket, "200 User Updated\n"); @@ -928,46 +982,3 @@ int sendf(int Socket, const char *Format, ...) return send(Socket, buf, len, 0); } } - -/** - * \brief Decode a Base64 value - */ -int UnBase64(uint8_t *Dest, char *Src, int BufSize) -{ - uint32_t val; - int i, j; - char *start_src = Src; - - for( i = 0; i+2 < BufSize; i += 3 ) - { - val = 0; - for( j = 0; j < 4; j++, Src ++ ) { - if('A' <= *Src && *Src <= 'Z') - val |= (*Src - 'A') << ((3-j)*6); - else if('a' <= *Src && *Src <= 'z') - val |= (*Src - 'a' + 26) << ((3-j)*6); - else if('0' <= *Src && *Src <= '9') - val |= (*Src - '0' + 52) << ((3-j)*6); - else if(*Src == '+') - val |= 62 << ((3-j)*6); - else if(*Src == '/') - val |= 63 << ((3-j)*6); - else if(!*Src) - break; - else if(*Src != '=') - j --; // Ignore invalid characters - } - Dest[i ] = (val >> 16) & 0xFF; - Dest[i+1] = (val >> 8) & 0xFF; - Dest[i+2] = val & 0xFF; - if(j != 4) break; - } - - // Finish things off - if(i < BufSize) - Dest[i] = (val >> 16) & 0xFF; - if(i+1 < BufSize) - Dest[i+1] = (val >> 8) & 0xFF; - - return Src - start_src; -}