X-Git-Url: https://git.ucc.asn.au/?p=tpg%2Fopendispense2.git;a=blobdiff_plain;f=src%2Fserver%2Fserver.c;h=974efca34166c503ca7927852a6560389c963320;hp=f0d7d46efe5af9596a13c3b87d6537aa36ea072a;hb=24654ef0078320798912a273508e37f9ce921ba7;hpb=ec400f11ebc2e81079e464145915fb2d25602fbc diff --git a/src/server/server.c b/src/server/server.c index f0d7d46..974efca 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -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; @@ -143,6 +143,13 @@ void Server_Start(void) printf("Listening on 0.0.0.0:%i\n", giServer_Port); + // write pidfile +// { +// FILE *fp = fopen("/var/run/dispsrv.pid", "w"); +// fprintf(fp, "%i", getpid()); +// fclose(fp); +// } + for(;;) { uint len = sizeof(client_addr); @@ -186,11 +193,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 +310,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 +342,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 +384,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 +424,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) ) { @@ -414,16 +445,24 @@ void Server_Cmd_AUTOAUTH(tClient *Client, char *Args) if( Client->UID < 0 ) { if(giDebugLevel) Debug(Client, "Unknown user '%s'", username); - sendf(Client->Socket, "401 Auth Failure\n"); + sendf(Client->Socket, "403 Auth Failure\n"); 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 +480,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 +494,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,11 +508,18 @@ 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"); } @@ -652,10 +704,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);