Merge branch 'ZNCv1' into MixedVersions
authorpk910 <philipp@zoelle1.de>
Sat, 29 Jun 2013 22:37:32 +0000 (00:37 +0200)
committerpk910 <philipp@zoelle1.de>
Sat, 29 Jun 2013 22:37:32 +0000 (00:37 +0200)
1  2 
zncadmin/ZNCServer.class.php
zncadmin/ZNCServerV1.class.php

index f85dd5607848db4c340006978b1f0ef6e9fd9f0a,21d134bcf81281fe20c78799168ec8977a87a410..8af0194188fc6687affcae0c52db3a3c274382e0
@@@ -20,82 -20,369 +20,83 @@@ define("ERR_OK", 0)
  define("ERR_UNKNOWN", 1);
  define("ERR_MODULE_NOT_FOUND", 2);
  define("ERR_USER_NOT_FOUND", 3);
 +define("ERR_UNKNOWN_ZNC_VERSION_OR_METHOD", 4);
  
 -class ZNCServer {
 -    private $host, $port;
 -    private $connector;
 -
 -    public function ZNCServer($host, $port) {
 -        $this->host = $host;
 -        $this->port = $port;
 -        $this->connector = new HTTPConnector();
 -    }
 -
 -    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('<div class="toptable">', $html);
 -        $exp = explode('</div>', $exp[1]);
 -        $exp = explode('<tbody>', $exp[0]);
 -        $exp = explode('</tbody>', $exp[1]);
 -        $list = explode('<tr class=', $exp[0]);
 -        $userlist = array();
 -        for($i = 1; $i < count($list); $i++) {
 -            $userdata = array();
 -            $exp = explode('<td>', $list[$i]);
 -            $exp2 = explode('</td>', $exp[2]);
 -            $userdata['user'] = $exp2[0];
 -            $exp2 = explode('</td>', $exp[3]);
 -            $userdata['server'] = $exp2[0];
 -            $exp2 = explode('</td>', $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('<div class="toptable">', $html);
 -        $exp = explode('</div>', $exp[1]);
 -        $exp = explode('<tbody>', $exp[0]);
 -        $exp = explode('</tbody>', $exp[1]);
 -        $list = explode('<tr class=', $exp[0]);
 -        $seenlist = array();
 -        for($i = 1; $i < count($list); $i++) {
 -            $userdata = array();
 -            $exp = explode('<td>', $list[$i]);
 -
 -            $exp2 = explode('</td>', $exp[1]);
 -            $userdata['user'] = $exp2[0];
 -            $exp2 = explode('</td>', $exp[2]);
 -            $userdata['seen'] = $exp2[0];
 -            $userdata['seen_unix'] = strtotime($exp2[0]);
 -            $exp2 = explode('</td>', $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);
 +$zncserver_classes = array(
 +      "ZNCServerV0.class.php",
++      "ZNCServerV1.class.php",
 +);
  
 -        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("<input ([^\>]*)>", $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("<textarea ", $html);
 -        for($i = 1; $i < count($textareas); $i++) {
 -            $exp = explode(">", $textareas[$i]);
 -            $name = explode("name=\"", $exp[0]);
 -            $name = explode("\"", $name[1]);
 -            $name = $name[0];
 -            $content = explode("</textarea", $exp[1]);
 -            $content = $content[0];
 -            $post[$name] = $content;
 -        }
 -        //select boxes
 -        $selectboxes = explode("<select ", $html);
 -        for($j = 1; $j < count($selectboxes); $j++) {
 -            $exp = explode(">", $selectboxes[$j], 2);
 -            $name = explode("name=\"", $exp[0]);
 -            $name = explode("\"", $name[1]);
 -            $name = $name[0];
 -            $content = explode("</select", $exp[1]);
 -            $content = $content[0];
 -            preg_match_all("<option ([^\>]*)>", $content, $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];
 -                }
 -                if(!$post[$name] || $cfields['selected']) {
 -                    $post[$name] = $cfields['value'];
 -                }
 -            }
 -        }
 -    }
 -
 -    public function editZNC($username, $password = NULL, $new_servers = NULL, $add_modules = NULL, $del_modules = NULL, $others = NULL) {
 -        $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/webadmin/edituser?user=".$username);
 -        if(preg_match("/No such username/i", $html)) return false;
 -        $post = array();
 -        $post['loadmod'] = array();
 -        $this->parseHTMLFields($html, $post);
 -        if($password) {
 -            $post['password'] = $password;
 -            $post['password2'] = $password;
 -        }
 -        if($new_servers) {
 -            $post['servers'] = implode("\n", $new_servers);
 -        }
 -        foreach($add_modules as $name => $args) {
 -            $post['loadmod'][] = $name;
 -            if($args != "")
 -                $post['modargs_'.$name] = $args;
 -        }
 -        foreach($del_modules as $name => $args) {
 -            foreach($post['loadmod'] as $index => $mod) {
 -                if(strtolower($mod) == strtolower($name))
 -                    unset($post['loadmod'][$index]);
 -            }
 -        }
 -        foreach($others as $name => $value) {
 -            $post[$name] = $value;
 -        }
 -        $html = $this->connector->post("http://".$this->host.":".$this->port."/mods/global/webadmin/edituser?user=".$username, $post);
 -        return !preg_match("/Invalid Submission/i", $html);
 -    }
 -
 -    public function blockZNC($username, $block) {
 -        $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/webadmin/edituser?user=".$username);
 -        $handle = fopen('/home/srvx/neonserv/log.txt', 'a');
 -        fwrite($handle, "$html\r\n");
 -        fclose($handle);
 -        if(preg_match("/No such username/i", $html)) return ERR_USER_NOT_FOUND;
 -        $post = array();
 -        $post['user'] = $username;
 -        $post['loadmod'] = array();
 -        $this->parseHTMLFields($html, $post);
 -        if(!$post['embed_blockuser_presented']) return ERR_MODULE_NOT_FOUND;
 -        if(!($post['embed_blockuser_block'] xor $block)) return ERR_OK;
 -        $post['embed_blockuser_block'] = ($block ? "1" : null);
 -        if(!$block) {
 -            $post['doconnect'] = 1;
 -        }
 -        $html = $this->connector->post("http://".$this->host.":".$this->port."/mods/global/webadmin/edituser", $post);
 -        $handle = fopen('/home/srvx/neonserv/log.txt', 'a');
 -        fwrite($handle, "$html\r\n");
 -        fclose($handle);
 -        return (preg_match("/Invalid Submission/i", $html) ? ERR_UNKNOWN : ERR_OK);
 -    }
 -
 -    public function simulZNC($username, $raw, &$errmsg, $server = true) {
 -        $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/user/send_raw/");
 -        if(preg_match("/Not Found/i", $html)) return ERR_MODULE_NOT_FOUND;
 -        $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'] = $username.'/default';
 -        $post['send_to'] = ($server ? "server" : "client");
 -        $post['line'] = $raw;
 -        $html = $this->connector->post("http://".$this->host.":".$this->port."/mods/user/send_raw/", $post);
 -        return ERR_OK;
 -    }
 -
 -    public function addChan($username, $channel, $key = NULL, $buffer = NULL) {
 -        $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/webadmin/addchan?user=".$username.'&network=default');
 -        if(preg_match("/No such username/i", $html)) return false;
 -        $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['user'] = $username;
 -        $post['name'] = $channel;
 -        $exp = explode('name="key" value="', $html);
 -        $exp = explode('"', $exp[1]);
 -        $default_key = $exp[0];
 -        $post['key'] = ($key ? $key : $default_key);
 -        $exp = explode('name="buffercount" value="', $html);
 -        $exp = explode('"', $exp[1]);
 -        $default_buffer = $exp[0];
 -        $post['buffercount'] = ($buffer ? $buffer : $default_buffer);
 -        $post['defmodes'] = '';
 -        $post['save'] = 'true';
 -        $post['autoclearchanbuffer'] = 'true';
 -        $this->connector->post("http://".$this->host.":".$this->port."/mods/global/webadmin/addchan?user=".$username.'&network=default', $post);
 -    }
 +class ZNCServer {
 +      private static $zncserver_classes = array();
 +      private $host, $port, $server = NULL;
 +      
 +      private static function load_classes() {
 +              global $zncserver_classes;
 +              foreach($zncserver_classes as $classfile) {
 +                      if(isset($classinfo))
 +                              unset($classinfo);
 +                      include($classfile);
 +                      if(isset($classinfo))
 +                              self::$zncserver_classes[] = $classinfo;
 +              }
 +      }
 +      
 +      public function ZNCServer($host, $port, $version = null) {
 +              $this->host = $host;
 +              $this->port = $port;
 +              if(is_empty(self::$zncserver_classes))
 +                      self::load_classes();
 +              if($version !== null) {
 +                      $this->loadServerObject($version);
 +              }
 +      }
 +      
 +      private function loadServerObject($version, $http_connector = null) {
 +              $preferred_class = null;
 +              foreach(self::$zncserver_classes as $classinfo) {
 +                      if($version < $classinfo['version']) 
 +                              continue;
 +                      if($preferred_class && $classinfo['version'] < $preferred_class['version'])
 +                              continue;
 +                      $preferred_class = $classinfo;
 +              }
 +              if($preferred_class) {
 +                      $classname = $preferred_class['name'];
 +                      $this->server = new $classname($this->host, $this->port, $http_connector);
 +              }
 +      }
 +      
 +      public function login($user, $pass) { /* Version independent login, maybe there's a better way? */
 +              if($this->server)
 +                      return $this->server->login($user, $pass);
 +              
 +              $post = array(
 +                      "user" => $user,
 +                      "pass" => $pass,
 +                      "submitted" => "1"
 +              );
 +              $connector = new HTTPConnector();
 +              $connector->post("http://".$this->host.":".$this->port."/login", $post);
 +              $http = $connector->get("http://".$this->host.":".$this->port."/?cookie_check=true");
 +              $logged_in = !preg_match("/errorbar/i", $http);
 +              
 +              /* Version detection */
 +              if(preg_match("ZNC ([0-9]+\.[0-9]+)", $http, $version_match))
 +                      $this->loadServerObject($version_match[1], $connector);
 +              
 +              return $logged_in;
 +      }
 +      
 +      
 +      
 +      public function __call($name, $arguments) {
 +              if(!$this->server)
 +                      return ERR_UNKNOWN_ZNC_VERSION_OR_METHOD;
 +              if(!method_exists($this->server, $name))
 +                      return ERR_UNKNOWN_ZNC_VERSION_OR_METHOD;
 +              return call_user_func_array(array($this->server, $name), $arguments);
 +      }
  
  }
  
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..1cac8e1c0e7586859597f08d561939e6314cdeb5
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,391 @@@
++<?php
++/* ZNCServerV1.class.php - ZNC Server Class - ZNCAdmin
++ * Copyright (C) 2011-2012  Philipp Kreil (pk910)
++ * 
++ * This program is free software: you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation, either version 3 of the License, or
++ * (at your option) any later version.
++ * 
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ * 
++ * You should have received a copy of the GNU General Public License 
++ * along with this program. If not, see <http://www.gnu.org/licenses/>. 
++ */
++
++$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('<div class="toptable">', $html);
++        $exp = explode('</div>', $exp[1]);
++        $exp = explode('<tbody>', $exp[0]);
++        $exp = explode('</tbody>', $exp[1]);
++        $list = explode('<tr class=', $exp[0]);
++        $userlist = array();
++        for($i = 1; $i < count($list); $i++) {
++            $userdata = array();
++            $exp = explode('<td>', $list[$i]);
++            $exp2 = explode('</td>', $exp[2]);
++            $userdata['user'] = $exp2[0];
++            $exp2 = explode('</td>', $exp[3]);
++            $userdata['server'] = $exp2[0];
++            $exp2 = explode('</td>', $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('<div class="toptable">', $html);
++        $exp = explode('</div>', $exp[1]);
++        $exp = explode('<tbody>', $exp[0]);
++        $exp = explode('</tbody>', $exp[1]);
++        $list = explode('<tr class=', $exp[0]);
++        $seenlist = array();
++        for($i = 1; $i < count($list); $i++) {
++            $userdata = array();
++            $exp = explode('<td>', $list[$i]);
++
++            $exp2 = explode('</td>', $exp[1]);
++            $userdata['user'] = $exp2[0];
++            $exp2 = explode('</td>', $exp[2]);
++            $userdata['seen'] = $exp2[0];
++            $userdata['seen_unix'] = strtotime($exp2[0]);
++            $exp2 = explode('</td>', $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("<input ([^\>]*)>", $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("<textarea ", $html);
++        for($i = 1; $i < count($textareas); $i++) {
++            $exp = explode(">", $textareas[$i]);
++            $name = explode("name=\"", $exp[0]);
++            $name = explode("\"", $name[1]);
++            $name = $name[0];
++            $content = explode("</textarea", $exp[1]);
++            $content = $content[0];
++            $post[$name] = $content;
++        }
++        //select boxes
++        $selectboxes = explode("<select ", $html);
++        for($j = 1; $j < count($selectboxes); $j++) {
++            $exp = explode(">", $selectboxes[$j], 2);
++            $name = explode("name=\"", $exp[0]);
++            $name = explode("\"", $name[1]);
++            $name = $name[0];
++            $content = explode("</select", $exp[1]);
++            $content = $content[0];
++            preg_match_all("<option ([^\>]*)>", $content, $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];
++                }
++                if(!$post[$name] || $cfields['selected']) {
++                    $post[$name] = $cfields['value'];
++                }
++            }
++        }
++    }
++
++    public function editZNC($username, $password = NULL, $new_servers = NULL, $add_modules = NULL, $del_modules = NULL, $others = NULL) {
++        $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/webadmin/edituser?user=".$username);
++        if(preg_match("/No such username/i", $html)) return false;
++        $post = array();
++        $post['loadmod'] = array();
++        $this->parseHTMLFields($html, $post);
++        if($password) {
++            $post['password'] = $password;
++            $post['password2'] = $password;
++        }
++        if($new_servers) {
++            $post['servers'] = implode("\n", $new_servers);
++        }
++        foreach($add_modules as $name => $args) {
++            $post['loadmod'][] = $name;
++            if($args != "")
++                $post['modargs_'.$name] = $args;
++        }
++        foreach($del_modules as $name => $args) {
++            foreach($post['loadmod'] as $index => $mod) {
++                if(strtolower($mod) == strtolower($name))
++                    unset($post['loadmod'][$index]);
++            }
++        }
++        foreach($others as $name => $value) {
++            $post[$name] = $value;
++        }
++        $html = $this->connector->post("http://".$this->host.":".$this->port."/mods/global/webadmin/edituser?user=".$username, $post);
++        return !preg_match("/Invalid Submission/i", $html);
++    }
++
++    public function blockZNC($username, $block) {
++        $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/webadmin/edituser?user=".$username);
++        $handle = fopen('/home/srvx/neonserv/log.txt', 'a');
++        fwrite($handle, "$html\r\n");
++        fclose($handle);
++        if(preg_match("/No such username/i", $html)) return ERR_USER_NOT_FOUND;
++        $post = array();
++        $post['user'] = $username;
++        $post['loadmod'] = array();
++        $this->parseHTMLFields($html, $post);
++        if(!$post['embed_blockuser_presented']) return ERR_MODULE_NOT_FOUND;
++        if(!($post['embed_blockuser_block'] xor $block)) return ERR_OK;
++        $post['embed_blockuser_block'] = ($block ? "1" : null);
++        if(!$block) {
++            $post['doconnect'] = 1;
++        }
++        $html = $this->connector->post("http://".$this->host.":".$this->port."/mods/global/webadmin/edituser", $post);
++        $handle = fopen('/home/srvx/neonserv/log.txt', 'a');
++        fwrite($handle, "$html\r\n");
++        fclose($handle);
++        return (preg_match("/Invalid Submission/i", $html) ? ERR_UNKNOWN : ERR_OK);
++    }
++
++    public function simulZNC($username, $raw, &$errmsg, $server = true) {
++        $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/user/send_raw/");
++        if(preg_match("/Not Found/i", $html)) return ERR_MODULE_NOT_FOUND;
++        $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'] = $username.'/default';
++        $post['send_to'] = ($server ? "server" : "client");
++        $post['line'] = $raw;
++        $html = $this->connector->post("http://".$this->host.":".$this->port."/mods/user/send_raw/", $post);
++        return ERR_OK;
++    }
++
++    public function addChan($username, $channel, $key = NULL, $buffer = NULL) {
++        $html = $this->connector->get("http://".$this->host.":".$this->port."/mods/global/webadmin/addchan?user=".$username.'&network=default');
++        if(preg_match("/No such username/i", $html)) return false;
++        $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['user'] = $username;
++        $post['name'] = $channel;
++        $exp = explode('name="key" value="', $html);
++        $exp = explode('"', $exp[1]);
++        $default_key = $exp[0];
++        $post['key'] = ($key ? $key : $default_key);
++        $exp = explode('name="buffercount" value="', $html);
++        $exp = explode('"', $exp[1]);
++        $default_buffer = $exp[0];
++        $post['buffercount'] = ($buffer ? $buffer : $default_buffer);
++        $post['defmodes'] = '';
++        $post['save'] = 'true';
++        $post['autoclearchanbuffer'] = 'true';
++        $this->connector->post("http://".$this->host.":".$this->port."/mods/global/webadmin/addchan?user=".$username.'&network=default', $post);
++    }
++      
++}
++
++?>