From: pk910 Date: Sat, 29 Jun 2013 22:37:32 +0000 (+0200) Subject: Merge branch 'ZNCv1' into MixedVersions X-Git-Url: http://git.pk910.de/?p=ZNCAdmin.git;a=commitdiff_plain;h=35d6cfed78a76d9cf7a679faba96df2ccc40a111;hp=af798c5febaeefd3cb1378438442522eaae8285f Merge branch 'ZNCv1' into MixedVersions --- diff --git a/.gitignore b/.gitignore index 2b9ce0a..3b725d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -config.inc.php \ No newline at end of file +config.inc.php +.project \ No newline at end of file diff --git a/config.example.php b/config.example.php index 0e76bc5..d3139ea 100644 --- a/config.example.php +++ b/config.example.php @@ -57,6 +57,16 @@ $add_settings = array( "servers" => array( "irc.onlinegamesnet.net 6667" ), + "channel" => array( + "#Krypton" + ), + "mirccmds" => array( + "hosts" => array( + "free-bnc.de", + "krypton-bouncer.de" + ), + "groupname" => "KryptonZNC" + ), "modules" => array( "autocycle" => "", "awaynick" => "%nick%|ZNC", diff --git a/zncadmin.php b/zncadmin.php index 7893792..4949a10 100644 --- a/zncadmin.php +++ b/zncadmin.php @@ -159,7 +159,7 @@ function zncadmin_search() { } $mask = preg_prepare($mask); $table = new Table(5); - $table->add("Server", "User", "Clients", "Server", "Nick"); + $table->add("Server", "User", "Clients", "Server"); $count = 0; foreach($zncservers as $zncserver) { $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']); @@ -209,7 +209,7 @@ function zncadmin_search() { } if($skip) continue; if(preg_match("#^".$mask."$#i", $user['user'])) { - $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server'], $user['nick']); + $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server']); $count++; } } @@ -316,6 +316,10 @@ function zncadmin_add() { foreach($zncservers as $zncserver) { if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue; if(!$argv[3] && $zncserver['priority'] < $priority) continue; + if($zncserver['protected'] === true && !$force) { + error("Access denied\n"); + return; + } $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); $zncserver['users'] = $zncserver['conn']->getUserList(); @@ -359,12 +363,15 @@ function zncadmin_add() { echo " Server Host: ".$addserv['public']." Port: ".$addserv['port']." SSL Port: ".$addserv['sslport']."\n"; echo " Password: ".$password."\n"; echo "[mIRC]\n"; - echo " /server -a ".$addserv['public']." -p ".$addserv['port']." -g KryptonZNC -w ".$argv[2].":".$password." -d KryptonZNC\n"; - echo " /AS addmask *@*.free-bnc.de\n"; - echo " /AS addmask *@*.krypton-bouncer.de\n"; - echo " /server -m KryptonZNC\n"; + echo " /server -a ".$addserv['public']." -p ".$addserv['port']." -g ".$add_settings['mirccmds']['groupname']." -w ".$argv[2].":".$password." -d ".$add_settings['mirccmds']['groupname']."\n"; + foreach($add_settings['mirccmds']['hosts'] AS $host) { + echo " /AS addmask *@*.".$host."\n"; + } + echo " /server -m ".$add_settings['mirccmds']['groupname']."\n"; echo"/log\n"; - $addserv['conn']->addChan($argv[2], "#Krypton"); + foreach($add_settings["channel"] AS $channel) { + $addserv['conn']->addChan($argv[2], $channel); + } } else error("Error while adding user."); } @@ -558,8 +565,8 @@ function zncadmin_unblock() { //SUBCOMMAND: stats function zncadmin_stats() { global $argv, $zncservers; - $table = new Table(5); - $table->add("Server", "Port / SSL Port", "Total ZNC's", "Connected (IRC)", "Online (User)"); + $table = new Table(6); + $table->add("Server", "Port / SSL Port", "Total ZNC's", "Connected (IRC)", "Online (User)", "Protected?"); $count = 0; foreach($zncservers as $zncserver) { $total = 0; @@ -572,7 +579,7 @@ function zncadmin_stats() { if($user['clients'] > 0) $online++; $total++; } - $table->add($zncserver['name'], $zncserver['port'].($zncserver['sslport'] ? "/".$zncserver['sslport'] : ""), $total.($zncserver['maxznc'] ? "/".$zncserver['maxznc'] : ""), $connected, $online); + $table->add($zncserver['name'], $zncserver['port'].($zncserver['sslport'] ? "/".$zncserver['sslport'] : ""), $total.($zncserver['maxznc'] ? "/".$zncserver['maxznc'] : ""), $connected, $online, ($zncserver['protected'] === true ? "X" : "")); $count++; } if($count) { diff --git a/zncadmin/ZNCServer.class.php b/zncadmin/ZNCServer.class.php index f85dd56..8af0194 100644 --- a/zncadmin/ZNCServer.class.php +++ b/zncadmin/ZNCServer.class.php @@ -1,19 +1,19 @@ . + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ define("ERR_OK", 0); @@ -24,6 +24,7 @@ define("ERR_UNKNOWN_ZNC_VERSION_OR_METHOD", 4); $zncserver_classes = array( "ZNCServerV0.class.php", + "ZNCServerV1.class.php", ); class ZNCServer { diff --git a/zncadmin/ZNCServerV1.class.php b/zncadmin/ZNCServerV1.class.php new file mode 100644 index 0000000..1cac8e1 --- /dev/null +++ b/zncadmin/ZNCServerV1.class.php @@ -0,0 +1,391 @@ +. + */ + +$classinfo = array( + "name" => "ZNCServerV1", + "version" => 1.000, +); + +class ZNCServerV1 { + private $host, $port; + private $connector; + + public function ZNCServerV1($host, $port, $connector = NULL) { + $this->host = $host; + $this->port = $port; + if($connector == NULL) + $connector = new HTTPConnector(); + $this->connector = $connector; + } + + public function login($user, $pass) { + $post = array( + "user" => $user, + "pass" => $pass, + "submitted" => "1" + ); + $this->connector->post("http://".$this->host.":".$this->port."/login", $post); + $http = $this->connector->get("http://".$this->host.":".$this->port."/?cookie_check=true"); + $logged_in = !preg_match("/errorbar/i", $http); + + return $logged_in; + } + + public function getUserList() { + $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/webadmin/listusers"); + $exp = explode('
', $html); + $exp = explode('
', $exp[1]); + $exp = explode('', $exp[0]); + $exp = explode('', $exp[1]); + $list = explode('', $list[$i]); + $exp2 = explode('', $exp[2]); + $userdata['user'] = $exp2[0]; + $exp2 = explode('', $exp[3]); + $userdata['server'] = $exp2[0]; + $exp2 = explode('', $exp[4]); + $userdata['clients'] = $exp2[0]; + $userlist[] = $userdata; + } + return $userlist; + } + + public function getSeenList() { + $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/lastseen/"); + $exp = explode('
', $html); + $exp = explode('
', $exp[1]); + $exp = explode('', $exp[0]); + $exp = explode('', $exp[1]); + $list = explode('', $list[$i]); + + $exp2 = explode('', $exp[1]); + $userdata['user'] = $exp2[0]; + $exp2 = explode('', $exp[2]); + $userdata['seen'] = $exp2[0]; + $userdata['seen_unix'] = strtotime($exp2[0]); + $exp2 = explode('', $exp[3]); + $userdata['info'] = $exp2[0]; + $seenlist[] = $userdata; + } + return $seenlist; + } + + /* + $settings array elements: + nick + altnick + ident + */ + public function addZNC($username, $password, $settings, $servers, $modules, $others) { + $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/webadmin/adduser"); + $exp = explode('name="_CSRF_Check" value="', $html); + $exp = explode('"', $exp[1]); + $csrf = $exp[0]; + $post = array(); + $post['_CSRF_Check'] = $csrf; + $post['submitted'] = '1'; + //$post['doconnect'] = '1'; + $post['user'] = $username; + $post['password'] = $password; + $post['password2'] = $password; + $post['nick'] = $settings['nick']; + $post['altnick'] = $settings['altnick']; + $post['ident'] = $settings['ident']; + $post['statusprefix'] = '*'; + $post['loadmod'] = array(); + foreach($modules as $name => $args) { + $post['loadmod'][] = $name; + if($args != "") + $post['modargs_'.$name] = $args; + } + + foreach($others as $name => $value) { + $post[$name] = $value; + } + + $html = $this->connector->post("http://".$this->host.":".$this->port."/mods/global/webadmin/adduser", $post); + + if(!preg_match("/Invalid Submission/i", $html)) { + if(!$this->addNetwork($username, $settings, $servers, $other)) { + return false; + } + return !preg_match("/Invalid Submission/i", $html); + } + return !preg_match("/Invalid Submission/i", $html); + } + + public function addNetwork($username, $settings, $servers, $other) { + $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/webadmin/addnetwork?user=".$username); + $exp = explode('name="_CSRF_Check" value="', $html); + $exp = explode('"', $exp[1]); + $csrf = $exp[0]; + $post = array(); + $post['_CSRF_Check'] = $csrf; + $post['submitted'] = '1'; + $post['network'] = 'default'; + $post['nick'] = $settings['nick']; + $post['altnick'] = $settings['altnick']; + $post['ident'] = $settings['ident']; + $post['servers'] = implode("\n", $servers); + $post['doconnect'] = '1'; + $post['floodprotection'] = '1'; + $post['floodrate'] = '1.0'; + $post['floodburst'] = '4'; + $post['user'] = $username; + + foreach($others as $name => $value) { + $post[$name] = $value; + } + + $html = $this->connector->post("http://".$this->host.":".$this->port."/mods/global/webadmin/addnetwork", $post); + return !preg_match("/Invalid Submission/i", $html); + } + + public function delZNC($username) { + $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/webadmin/deluser?user=".$username); + $exp = explode('name="_CSRF_Check" value="', $html); + $exp = explode('"', $exp[1]); + $csrf = $exp[0]; + $post = array(); + $post['_CSRF_Check'] = $csrf; + $post['submitted'] = '1'; + $post['user'] = $username; + $this->connector->post("http://".$this->host.":".$this->port."/mods/global/webadmin/deluser", $post); + } + + private function parseHTMLFields($html, &$post) { + preg_match_all("]*)>", $html, $matches); + foreach($matches[0] as $input) { + $fields = array(0 => ""); + $esc = false; $str = false; + $fieldid = 0; + for($i = 0; $i < strlen($input); $i++) { + if($esc) { + $esc = false; + $fields[$fieldid] .= $input[$i]; + continue; + } + if($input[$i] == "\\") { + $esc = true; + } + if($input[$i] == "\"") { + $str = !$str; + continue; + } + if($input[$i] == " " && !$str) { + $fields[++$fieldid] = ""; + continue; + } + $fields[$fieldid] .= $input[$i]; + } + $cfields = array(); + foreach($fields as $field) { + $fieldexp = explode("=", $field, 2); + if(count($fieldexp) != 2) continue; + $cfields[$fieldexp[0]] = $fieldexp[1]; + } + $name = $cfields['name']; + switch($cfields['type']) { + case "text": + case "hidden": + $value = $cfields['value']; + break; + case "checkbox": + if($cfields['checked']) { + $value = ($cfields['value'] ? $cfields['value'] : "1"); + } else + $value = null; + break; + default: + $value = null; + } + if($name && $value) { + if(array_key_exists($name, $post)) { + if(!is_array($post[$name])) { + $cvalue = $post[$name]; + $post[$name] = array(); + $post[$name][] = $cvalue; + } + $post[$name][] = $value; + } else + $post[$name] = $value; + } + } + //textareas + $textareas = explode("