All pastes #590967 Raw Edit

Something

public text v1 · immutable
#590967 ·published 2007-06-26 21:49 UTC
rendered paste body
#!/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: \<this file\> \<general file\>\n");
	}
}
else
{
	cancel("Aborting... Not enough Argumments for Runnings this File! \nUsage: \<this file\> \<general file\>\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 = <CONFIG>;
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 = <CONFIG>;
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 = <FILE>;
		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 = <USER_FILE>;
		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 = <USER_FILE>;
		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 = <USER_FILE>;
		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 (<USER_FILE>)
		{
			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;
			}
		}
	}
}