<?php
// +----------------------------------------------------------------------+
// | PEAR :: Auth :: Container :: VPOPXMLRPC                              |
// +----------------------------------------------------------------------+
// | This source file is subject to version 3.0 of the PHP license,       |
// | that is available at http://www.php.net/license/3_0.txt              |
// | If you did not receive a copy of the PHP license and are unable      |
// | to obtain it through the world-wide-web, please send a note to       |
// | license@php.net so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Copyright (c) 2004 Michael Wallner <mike@iworks.at>                  |
// +----------------------------------------------------------------------+
//
// $Id$

require_once 'Auth/Container.php';
require_once 
'XML/RPC.php';

/** 
 * Auth_Container_VPOPXMLRPC
 *
 * @link    http://dev.iworks.at/ vpop-xmlrpc
 * @author  Michael Wallner <mike@php.net>
 * @access  public
 */
class Auth_Container_VPOPXMLRPC extends Auth_Container
{
    
/**
     * XML_RPC_Client
     * 
     * @var object
     */
    
var $client;
    
    
/**
     * Mail Domain
     * 
     * @var string
     */
    
var $domain;
    
    
/**
     * Constructor
     * 
     * @access  public
     * @param   array   $options
     *                      o 'url' the URL where the XML-RPC service resides,
     *                          somthing like http://user:pass@example.com/rpc
     *                      o 'maildomain' the defualt maildomain for users,
     *                          leave empty if you supply full email addresses
     *                          as parameters to fetchData() etc.
     */
    
function Auth_Container_VPOPXMLRPC($options)
    {
        if (isset(
$options['url'])) {
            
$parts parse_url($options['url']);
            
$this->client = &new XML_RPC_Client($parts['path'], $parts['host']);
            if (isset(
$parts['user'])) {
                
$this->client->setCredentials($parts['user'], $parts['pass']);
            }
        }
        if (!empty(
$options['maildomain'])) {
            
$this->domain $options['maildomain'];
        }
    }
    
    
/**
     * Fetch Data
     * 
     * @access  public
     * @return  mixed
     * @param   string  $user
     * @param   string  $pass
     */
    
function fetchData($user$pass)
    {
        
$params = array('password' => $pass);
        
$this->checkDomain($params$user);
        return 
$this->xmlrpc('vpop.auth'$params);
    }
    
    
/**
     * Add User
     * 
     * @access  public
     * @return  mixed
     * @param   string  $user
     * @param   string  $pass
     */
    
function addUser($user$pass$fullname '')
    {
        
$params = array('password' => $pass);
        
$this->checkDomain($params$user);
        
$params['fullname'] = $fullname;
        return 
$this->xmlrpc('vpop.adduser'$params);
    }
    
    
/**
     * Remove User
     * 
     * @access  public
     * @return  mixed
     * @param   string  $user
     */
    
function removeUser($user)
    {
        
$this->checkDomain($params$user);
        return 
$this->xmlrpc('vpop.deluser'$params);
    }
    
    
/**
     * Change Password
     * 
     * @access  public
     * @return  mixed
     * @param   string  $user
     * @param   string  $pass
     */
    
function changePassword($user$pass)
    {
        
$params = array('password' => $pass);
        
$this->checkDomain($params$user);
        return 
$this->xmlrpc('vpop.passwd'$params);
    }
    
    
/**
     * Check for default domain
     * 
     * @access  protected
     * @return  void
     * @param   array   $params
     * @param   string  $user
     */
    
function checkDomain(&$params$user)
    {
        if (
preg_match('/(.*)@(.*)/'$user$matches)) {
            
$params['user']     = $matches[1];
            
$params['domain']   = $matches[2];
        } else {
            
$params['user']     = $user;
            
$params['domain']   = $this->domain;
        }
    }
    
    
/**
     * XML-RPC call
     * 
     * @access  protected
     * @return  mixed
     * @param   string  $method
     * @param   array   $params
     */
    
function xmlrpc($method$params)
    {
        if (!
$this->client) {
            return 
PEAR::raiseError('XML_RPC_Client has not been initialized.');
        }
        
        
$values = array();
        foreach (
$params as $name => $value) {
            
$values[$name] = &new XML_RPC_Value($value'string');
        }

        
$struct  = &new XML_RPC_Value($values'struct');
        
$message = &new XML_RPC_Message($method, array(&$struct));

        if (
PEAR::isError($res = &$this->client->send($message))) {
            return 
$res;
        }

        if (
$res->faultCode()) {
            return 
PEAR::raiseError($res->faultString(), $res->faultCode());
        }

        return (bool) 
$res->xv->scalarval();
    }
    
}

?>