. * * * ************************************************************************ * * Bots/PHPGod.class.php * * simple PHP debugger... * */ class {$_NAME} extends Bot { private $uplink; private $php, $phpcache = array(); public function load($uplink, $old = false) { $this->uplink = $uplink; if(!$old) { $nick = "PHP"; $ident = "php"; $host = "Services.WebGamesNet.net"; $ip = "0::0"; $realname = "PHP PHP PHP PHP PHP"; $modes = "ioknISD"; $this->php = $this->uplink->addUser($nick,$ident,$host,$ip,$modes,$realname); if(is_a($this->php, "P10_User")) { $this->uplink->join($this->php, "#php", (P10_Channel::USERPRIV_OPED | P10_Channel::USERPRIV_VOICE)); $this->uplink->join($this->php, "#dev", P10_Channel::USERPRIV_VOICE); $this->uplink->join($this->php, "#CoderCom", P10_Channel::USERPRIV_VOICE); } } else { $this->php = $old; } ModCMD::bind($this, BIND_CHANMSG, "recive_privmsg"); ModCMD::bind($this, BIND_QUIT, "recive_quit"); } public function unload($rehash = false) { foreach($this->phpcache as $id => $php) { fclose($php['pipes'][1]); fclose($php['pipes'][2]); proc_terminate($php['proc'],9); } $this->phpcache = array(); if($rehash) { return $this->php; } else { $this->uplink->delUser($this->php, "Bye."); } } public function loop() { foreach($this->phpcache as $id => $php) { if(!$this->checkstate($php)) { unset($this->phpcache[$id]); } } } function recive_privmsg($user, $channel, $message) { $opOnPHPChannel = false; $PHPChannel = P10_Channel::getChannelByName("#PHP"); if($PHPChannel) { $privs = $PHPChannel->getUserPrivs($user); $opOnPHPChannel = ($privs & P10_Channel::USERPRIV_OPED); } if(!$user->getModes()->hasMode('o') && !$opOnPHPChannel) return 0; $exp=explode(" ", $message, 2); switch (strtolower($exp[0])) { case "~php": if(count($this->phpcache) > 5) { $this->uplink->notice($this->php, $user, "too many running php processes at the moment!"); return; } $entry=array(); $entry['channel'] = $channel; $descriptor = array(0 => array("pipe", "r"),1 => array("pipe", "w"),2 => array("pipe", "w")); $entry['proc'] = proc_open('php', $descriptor, $entry['pipes']); if(!is_resource($entry['proc'])) { $this->uplink->notice($this->php, $user, "error while loading php!"); return; } $entry['time'] = time(); if(preg_match("#pastebin\.com/([a-zA-Z0-9]*)$#i", $exp[1])) { $pasteid = explode("/", $exp[1]); $pasteid = $pasteid[count($pasteid)-1]; $codecontent = file_get_contents("http://pastebin.com/download.php?i=".$pasteid); if(preg_match("#Unknown Paste ID!#i", $codecontent)) { $this->uplink->notice($this->bot, $user, "Unknown Paste ID!"); return; } $code = $codecontent; } elseif(preg_match("#scriptpaste\.(com|de)/([a-zA-Z0-9]*)$#i", $exp[1])) { $pasteid = explode("/", $exp[1]); $pasteid = $pasteid[count($pasteid)-1]; $codecontent = file_get_contents("http://scriptpaste.com/".$pasteid."/download"); $code = $codecontent; } else { $code = "<"."?php " . $exp[1] . " ?".">"; }; fwrite($entry['pipes'][0], $code); fclose($entry['pipes'][0]); $this->phpcache[] = $entry; break; } } function recive_quit($user, $reason) { if($user === $this->php) { $this->load($this->uplink); } } function checkstate($php) { $data = proc_get_status($php['proc']); if(!$data['running']) { $out=""; while(!feof($php['pipes'][1])) { $out .= fgets($php['pipes'][1], 128); } $eout=""; while(!feof($php['pipes'][2])) { $eout .= fgets($php['pipes'][2], 128); } if($out != "") { $out=str_replace("\r","",$out); $lines=explode("\n",$out); $i=0; foreach($lines as $line) { $i++; if($i>1000) { $this->uplink->privmsg($this->php, $php['channel'], "too many lines!"); break; } $this->uplink->privmsg($this->php, $php['channel'], $line); } } if($eout != "") { $eout=str_replace("\r","",$eout); $lines=explode("\n",$eout); $i=0; foreach($lines as $line) { $i++; if($i>1000) { $this->uplink->privmsg($this->php, $php['channel'], "too many lines!"); break; } $this->uplink->privmsg($this->php, $php['channel'], "4".$line.""); } } fclose($php['pipes'][1]); fclose($php['pipes'][2]); proc_close($php['proc']); return false; } else { if($php['time']+10 > time()) { return true; } else { //TIMEOUT if($php['term']) { fclose($php['pipes'][1]); fclose($php['pipes'][2]); proc_terminate($php['proc'],9); $this->uplink->privmsg($this->php, $php['channel'], "php hard timeout. sending SIGKILL"); return false; } else { proc_terminate($php['proc']); $php['term']=true; $this->uplink->privmsg($this->php, $php['channel'], "php timeout. (maximum of 10 seconds exceeded) sending SIGTERM"); return true; } } } } } ?>