Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
7 / 7
CRAP
100.00% covered (success)
100.00%
71 / 71
Hm_Server_List
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
8 / 8
33
100.00% covered (success)
100.00%
70 / 70
 service_connect($id, $server, $user, $pass, $cache)
100.00% covered (success)
100.00%
1 / 1
1  
 
 connect($id, $cache=false, $user=false, $pass=false, $save_credentials=false)
100.00% covered (success)
100.00%
1 / 1
11
100.00% covered (success)
100.00%
20 / 20
 forget_credentials($id)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
5 / 5
 add($atts, $id=false)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
7 / 7
 del($id)
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
4 / 4
 dump($id=false, $full=false)
100.00% covered (success)
100.00%
1 / 1
7
100.00% covered (success)
100.00%
20 / 20
 clean_up($id=false)
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
7 / 7
 disconnect($id)
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
7 / 7
<?php
if (!defined('DEBUG_MODE')) { die(); }
/**
 * Struct that makes it easy for a module set to manage a list of server connections
 */
trait Hm_Server_List {
    /* list of server connections */
    private static $server_list = array();
    /**
     * Server lists must override this method to connect
     *
     * @param $id int server id
     * @param $server string server hostname or ip
     * @param $user string username for authentication
     * @param $pass string password for authentication
     * @param $cache mixed cached connection data
     *
     * @return bool true on success
     */
    abstract public function service_connect($id, $server, $user, $pass, $cache);
    /**
     * Connect to a server
     *
     * @param $id int server id
     * @param $cache mixed cached server data
     * @param $user string username
     * @param $pass string password
     * @param $save_credentials bool true to save the username and password
     *
     * @return mixed connection object on success, otherwise false
     */
    public static function connect($id, $cache=false, $user=false, $pass=false, $save_credentials=false) {
        if (array_key_exists($id, self::$server_list)) {
            $server = self::$server_list[$id];
            if ($server['object']) {
                return $server['object'];
            }
            else {
                if ((!$user || !$pass) && (!array_key_exists('user', $server) || !array_key_exists('pass', $server))) {
                    return false;
                }
                elseif (array_key_exists('user', $server) && array_key_exists('pass', $server)) {
                    $user = $server['user'];
                    $pass = $server['pass'];
                }
                $res = self::service_connect($id, $server, $user, $pass, $cache);
                if ($res) {
                    self::$server_list[$id]['connected'] = true;
                    if ($save_credentials) {
                        self::$server_list[$id]['user'] = $user;
                        self::$server_list[$id]['pass'] = $pass;
                    }
                }
                return self::$server_list[$id]['object'];
            }
        }
        return false;
    }
    /**
     * Remove the username and password from a connection
     *
     * @param $id int server id
     *
     * @return void
     */
    public static function forget_credentials($id) {
        if (array_key_exists($id, self::$server_list)) {
            unset(self::$server_list[$id]['user']);
            unset(self::$server_list[$id]['pass']);
        }
    }
    /**
     * Add a server definition
     *
     * @param $atts array server details
     * @param $id int server id
     *
     * @return void
     */
    public static function add($atts, $id=false) {
        $atts['object'] = false;
        $atts['connected'] = false;
        if ($id !== false) {
            self::$server_list[$id] = $atts;
        }
        else {
            self::$server_list[] = $atts;
        }
    }
    /**
     * Remove a server
     *
     * @param $id int server id
     *
     * @return bool true on success
     */
    public static function del($id) {
        if (array_key_exists($id, self::$server_list)) {
            unset(self::$server_list[$id]);
            return true;
        }
        return false;
    }
    /**
     * Return all server details
     *
     * @param $id int if not false, return details for this server only
     * @param $full bool true to return passwords for server connections. CAREFUL!
     *
     * @return array server details
     */
    public static function dump($id=false, $full=false) {
        $list = array();
        foreach (self::$server_list as $index => $server) {
            if ($id !== false && $index != $id) {
                continue;
            }
            if ($full) {
                $list[$index] = $server;
            }
            else {
                $list[$index] = array(
                    'name' => $server['name'],
                    'server' => $server['server'],
                    'port' => $server['port'],
                    'tls' => $server['tls']
                );
                if (array_key_exists('user', $server)) {
                    $list[$index]['user'] = $server['user'];
                }
            }
            if ($id !== false) {
                return $list[$index];
            }
        }
        return $list;
    }
    /**
     * Try to disconnect cleanly
     *
     * @param $id int server id
     *
     * @return void
     */
    public static function clean_up($id=false) {
        if ($id !== false && array_key_exists($id, self::$server_list)) {
            self::disconnect($id);
        }
        else {
            foreach (self::$server_list as $index => $server) {
                self::disconnect($index);
            }
        }
    }
    /**
     * Disconnect from a server
     *
     * @param $id int the server id to disconnect
     *
     * @return void
     */
    public static function disconnect($id) {
        if (self::$server_list[$id]['connected'] && self::$server_list[$id]['object']) {
            if (method_exists(self::$server_list[$id]['object'], 'disconnect')) {
                self::$server_list[$id]['object']->disconnect();
            }
            self::$server_list[$id]['connected'] = false;
        }
    }
}
?>