#!/usr/bin/perl use strict; use warnings; use IO::Select; use IO::Socket; $|++; my ($server_port,$server_ver,$server_userdb,$server_cfgpath,$server_event,$serve_escape,$server_info,$server_help,$server_masterpw,$server_ident); # Server based my ($user_welcome); # User based my ($client,$client_recv,$client_send); # Client based my ($new,$addr,$tmp1,$tmp2,$tmp,$x,$server_cfg,$line); # Tmps etc... my (@ready,@data,@USERS); # Arrays ## Error & OK Messages ### my ($error_userfile,$error_serverstart,$error_send); my ($ok_serverstart,$ok_oneuser,$ok_nouser,$ok_mooreuser,$ok_useraccess,$ok_send); my ($msg_dbuserlist,$msg_dbuseraccess,$msg_dbuserdelok,$msg_dbuserdelerror,$msg_dbuseraddok,$msg_dbuseradderror,$msg_unkown,$msg_info,$msg_connect,$msg_disconnect,$msg_help); if ($#ARGV==0) { if ($ARGV[0] =~ /^\s*(\w+\.\w+)\s*$/) { $server_cfg = $1; } else { cancel("Aborting... Valid Argumments? \nUsage: \ \\n"); } } else { cancel("Aborting... Not enough Argumments for Runnings this File! \nUsage: \ \\n"); } $server_cfg = $ARGV[0]; $server_ver = 1337; # Open Config Files (general,error,ok) open(CONFIG, "<$server_cfg") or cancel("Can't open $server_cfg: $!\n"); @data = ; foreach $line (@data) { if ($line =~ /^\s*Server User Database\s*\=\s*\"(.+)\"\s*$/) { $server_userdb = $1; } if ($line =~ /^\s*Server TCP Port\s*\=\s*\"(.+)\"\s*$/) { $server_port = $1; } if ($line =~ /^\s*Server Escape\s*\=\s*\"(.+)\"\s*$/) { $serve_escape = $1; } if ($line =~ /^\s*User Welcome Message\s*\=\s*\"(.+)\"\s*$/) { $user_welcome = $1; } if ($line =~ /^\s*Server Config Path\s*\=\s*\"(.+)\"\s*$/) { $server_cfgpath = $1; } if ($line =~ /^\s*Server Event\s*\=\s*\"(.+)\"\s*$/) { $server_event = $1;} if ($line =~ /^\s*Server Information\s*\=\s*\"(.+)\"\s*$/) { $server_info = $1; } if ($line =~ /^\s*Server Help\s*\=\s*\"(.+)\"\s*$/) { $server_help = $1; } if ($line =~ /^\s*Server Master Password\s*\=\s*\"(.+)\"\s*$/) { $server_masterpw = $1; } if ($line =~ /^\s*Server Ident\s*\=\s*\"(.+)\"\s*$/) { $server_ident = $1; } } close(CONFIG); open(CONFIG, "<".$server_cfgpath."".$server_event) or cancel("Can't open $server_event: $!\n"); @data = ; foreach $line (@data) { if ($line =~ /^\s*Userfile\s*\=\s*\"(.+)\"\s*$/i) { $error_userfile = convert($1);} if ($line =~ /^\s*Server Start Error\s*\=\s*\"(.+)\"\s*$/i) { $error_serverstart = convert($1);} if ($line =~ /^\s*Server Start Ok\s*\=\s*\"(.+)\"\s*$/i) { $ok_serverstart = convert($1);} if ($line =~ /^\s*One User Found\s*\=\s*\"(.+)\"\s*$/i) { $ok_oneuser = convert($1);} if ($line =~ /^\s*Moore User Found\s*\=\s*\"(.+)\"\s*$/i) { $ok_mooreuser = convert($1);} if ($line =~ /^\s*No User Found\s*\=\s*\"(.+)\"\s*$/i) { $ok_nouser = convert($1);} if ($line =~ /^\s*Send User Access\s*\=\s*\"(.+)\"\s*$/i) { $ok_useraccess = convert($1);} if ($line =~ /^\s*DB User List\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuserlist = convert($1);} if ($line =~ /^\s*DB User Access\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuseraccess = convert($1);} if ($line =~ /^\s*DB User Del Ok\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuserdelok = convert($1);} if ($line =~ /^\s*DB User Del Error\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuserdelerror = convert($1);} if ($line =~ /^\s*DB User Add Ok\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuseraddok = convert($1);} if ($line =~ /^\s*DB User Add Error\s*\=\s*\"(.+)\"\s*$/i) { $msg_dbuseradderror = convert($1);} if ($line =~ /^\s*Unkown Request\s*\=\s*\"(.+)\"\s*$/i) { $msg_unkown = convert($1);} if ($line =~ /^\s*Information\s*\=\s*\"(.+)\"\s*$/i) { $msg_info = convert($1);} if ($line =~ /^\s*Help\s*\=\s*\"(.+)\"\s*$/i) { $msg_help = convert($1);} if ($line =~ /^\s*Connect\s*\=\s*\"(.+)\"\s*$/i) { $msg_connect = convert($1);} if ($line =~ /^\s*Disconnect\s*\=\s*\"(.+)\"\s*$/i) { $msg_disconnect = convert($1);} if ($line =~ /^\s*Ok\s*\=\s*\"(.+)\"\s*$/i) { $ok_send = convert($1);} if ($line =~ /^\s*Error\s*\=\s*\"(.+)\"\s*$/i) { $error_send = convert($1);} } close(CONFIG); sub convert { if ($#_==0 or $#_ > 0) { my $tmp_convert_match; my $tmp_convert = $_[0]; foreach $line (@_) { if ($line =~ /^\s*COUNTER\:(.*)/) { $tmp_convert_match = $1; $tmp_convert =~ s/\%\%/$tmp_convert_match/g; undef $tmp_convert_match; } if ($line =~ /^\s*USER_ADDR\:(.*)/) { $tmp_convert_match = $1; $tmp_convert =~ s/\%USER_ADDR\%/$tmp_convert_match/g; undef $tmp_convert_match; } if ($line =~ /^\s*USER_NAME\:(.*)/) { $tmp_convert_match = $1; $tmp_convert =~ s/\%USER_NAME\%/$tmp_convert_match/g; undef $tmp_convert_match; } if ($line =~ /^\s*USER_ACCESS\:(.*)/) { $tmp_convert_match = $1; $tmp_convert =~ s/\%USER_ACCESS\%/$tmp_convert_match/g; undef $tmp_convert_match; } if ($line =~ /^\s*STDIN\:(.*)/) { $tmp_convert_match = $1; $tmp_convert =~ s/\%STDIN\%/$tmp_convert_match/g; undef $tmp_convert_match; } } $tmp_convert =~ s/\%SERVER_PORT\%/$server_port/g; $tmp_convert =~ s/\%SERVER_VER\%/$server_ver/g; return $tmp_convert; } else { return 0; } } sub cancel { if ($#_==0) { $tmp = $_[0]; print "$tmp\n"; sleep 2; exit; } else { return 0; } } sub send_client { my $tmp_send_client; if ($#_==1) { $tmp_send_client = $_[0]; print $tmp_send_client "$_[1]\r\n"; } else { return 0; } undef $tmp_send_client; } sub send_client_file { if ($#_==1) { my $file = $_[1]; $tmp = $_[0]; open(FILE, "<".$server_cfgpath."".$file) or cancel("Can't open $file : $!\n"); @data = ; foreach $line (@data) { chomp($line); send_client($tmp,$line); } close(FILE); } else { return 0; } } sub console { my $TIME_String; if ($#_==0) { $tmp = $_[0]; $TIME_String = localtime(time); if ($TIME_String =~ /(\d+\d+\:\d+\d+:\d+\d+)/) { print "\[$1\] $tmp\n"; } undef $tmp; } else { return 0; } } sub read_users { if ($#_==0) { my $userfile = $_[0]; my $line; my (@USERS_TMP,@USERS_RETURN); open(USER_FILE, "<$userfile") or cancel($error_userfile); @USERS_TMP = ; foreach $line (@USERS_TMP) { if ($line =~ /^(.+)\;\;(\w+)\;\;(\d+)/) { push (@USERS_RETURN,$1); } } close(USER_FILE); return @USERS_RETURN; } else { return 0; } } sub check_user_pw { if ($#_==2) { my $userfile = $_[0]; my $check_name = $_[1]; my $check_pw = $_[2]; my $line; my (@USERS_TMP,@USERS_RETURN); open(USER_FILE, "<$userfile") or cancel($error_userfile); @USERS_TMP = ; foreach $line (@USERS_TMP) { if ($line =~ /^$check_name\;\;$check_pw\;\;/) { return 1; } } close(USER_FILE); } else { return 0; } } sub read_user_access { if ($#_==1) { my $userfile = $_[0]; my $search_user = $_[1]; my ($line,$tmp1,$tmp2); my (@USERS_TMP,@USERS); open(USER_FILE, "<$userfile") or cancel($error_userfile); @USERS_TMP = ; foreach $line (@USERS_TMP) { if ($line =~ /^(.+)\;\;(\w+)\;\;(\d+)/) { $tmp2 = $1; $tmp1 = $3; if ($1 =~ /$search_user/i) { return ($tmp1,$tmp2); } } } close(USER_FILE); return (0,0); } else { return 0; } } sub user_add { if ($#_==3) { my ($userfile,$name,$pass,$right) = @_; open(USER_FILE,">>$userfile") or cancel($error_userfile); print USER_FILE "\n$name\;\;$pass\;\;$right"; close(USER_FILE); return 1; } else { return 0; } } sub user_del { if ($#_==1) { my (@USERS,@tmp); my ($line,$state); open(USER_FILE,$_[0]) or die cancel($error_userfile); while () { push @USERS, $_; } close(USER_FILE); foreach $line (@USERS) { if (not($line =~ /^$_[1]\;\;(\w+)\;\;(\d+)/)) { push (@tmp,$line); } else { $state = 1; } } open(USER_FILE,">$_[0]") or cancel($error_userfile); foreach $line (@tmp) { print USER_FILE $line; } close(USER_FILE); if ($state) { return 1; } else { return 0; } } else { return 0; } } my $socket = new IO::Socket::INET(Listen => 1, LocalPort => $server_port); my $sel = new IO::Select( $socket ); if ($socket) { console $ok_serverstart; } else { cancel($error_serverstart); } while(@ready = $sel->can_read) { foreach $client (@ready) { if($client == $socket) { # Create a new socket $new = $socket->accept; $sel->add($new); $addr = $new->peerhost; # push(@data,($addr,)); $tmp = convert($msg_connect,"USER_ADDR\:".$addr); console $tmp; send_client($new,$user_welcome); } else { $client_recv = <$client>; if ($client_recv) { chomp($client_recv); if ($client_recv =~ /^\s*info\s*$/i) { $tmp = convert($msg_info,"USER_ADDR\:".$addr); console $tmp; send_client_file($client,$server_info); } elsif ($client_recv =~ /^\s*help\s*$/i) { $tmp = convert($msg_help,"USER_ADDR\:".$addr); console $tmp; send_client_file($client,$server_help); } elsif ($client_recv =~ /^\s*dbuseraccess\s*(\w+)\s*$/i) { console "$addr Request: dbuseraccess (Database User Access Information)"; ($tmp1,$tmp2) = read_user_access($server_userdb,$1); if ($tmp1 and $tmp2) { $tmp = convert($ok_useraccess,"USER_NAME\:".$tmp2,"USER_ACCESS\:".$tmp1); send_client($client,$tmp); } else { send_client($client,$ok_nouser); } } elsif ($client_recv =~ /^\s*dbuserlist\s*$/i) { $tmp = convert($msg_dbuserlist,"USER_ADDR\:".$addr); console $tmp; @USERS = read_users($server_userdb); $x = 0; foreach $tmp (@USERS) { chomp ($tmp); send_client($client,$tmp); $x++; } if ($x < 1) { $tmp = convert($ok_nouser,"COUNTER\:".$x); send_client($client,$tmp); } elsif ($x == 1) { $tmp = convert($ok_oneuser,"COUNTER\:".$x); send_client($client,$tmp); } else { $tmp = convert($ok_mooreuser,"COUNTER\:".$x); send_client($client,$tmp); } } elsif ($client_recv =~ /^\s*dbuserdel\s*(\w+)\s*$/i) { my $tmp = user_del($server_userdb,$1); if ($tmp) { $tmp = convert($ok_mooreuser,"COUNTER\:".$x); send_client($client,$tmp); $tmp = convert($msg_dbuserdelok,"USER_ADDR\:".$addr); console $tmp; } else { $tmp = convert($ok_nouser,"COUNTER\:".$x); send_client($client,$tmp); $tmp = convert($msg_dbuserdelerror,"USER_ADDR\:".$addr); console $tmp; } } elsif ($client_recv =~ /^\s*dbuseradd\s*(\w+)\s*(\w+)\s*(\d+)\s*$/i) { my $tmp = user_add($server_userdb,$1,$2,$3); if ($tmp) { send_client($client,$ok_send); $tmp = convert($msg_dbuseraddok,"USER_ADDR\:".$addr); console $tmp; } else { send_client($client,$error_send); $tmp = convert($msg_dbuseradderror,"USER_ADDR\:".$addr); console $tmp; } } elsif ($client_recv eq "\r") { } else { $tmp = convert($msg_unkown,"USER_ADDR\:".$addr); console $tmp; } } else { $tmp = convert($msg_disconnect,"USER_ADDR\:".$addr); console $tmp; $sel->remove($client); $client->close; } } } }