<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP Version 4                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2003 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license,      |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/2_02.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.               |
// +----------------------------------------------------------------------+
// | Authors: Stefan Ekman <stekman@sedata.org>                           |
// |          Martin Jansen <mj@php.net>                                  |
// |          Mika Tuupola <tuupola@appelsiini.net>                       |
// +----------------------------------------------------------------------+
//
// $Id: File.php 9707 2007-12-12 13:46:31Z mlaurent $
//

require_once "File/Passwd.php";
require_once "Auth/Container.php";
require_once "PEAR.php";

/**
 * Storage driver for fetching login data from an encrypted password file.
 *
 * This storage container can handle CVS pserver style passwd files.
 *
 * @author   Stefan Ekman <stekman@sedata.org>
 * @author   Michael Wallner <mike@php.net>
 * @package  Auth
 * @version $Revision: 9707 $
 */
class Auth_Container_File extends Auth_Container
{
    /**
     * Path to passwd file
     * 
     * @var string
     */
    var $pwfile = '';

    // {{{ Constructor

    /**
     * Constructor of the container class
     *
     * @param  string $filename             path to passwd file
     * @return object Auth_Container_File   new Auth_Container_File object
     */
    function Auth_Container_File($filename)
    {
        $this->pwfile = $filename;
    }

    // }}}
    // {{{ fetchData()

    /**
     * Authenticate an user
     *
     * @param   string  username
     * @param   string  password
     * @return  mixed   boolean|PEAR_Error
     */
    function fetchData($user, $pass)
    {
        return File_Passwd::staticAuth('Cvs', $this->pwfile, $user, $pass);
    }

    // }}}
    // {{{ listUsers()
    
    /**
     * List all available users
     * 
     * @return   array
     */
    function listUsers()
    {
        $pw_obj = &$this->_load();
        if (PEAR::isError($pw_obj)) {
            return array();
        }

        $users  = $pw_obj->listUser();
        if (!is_array($users)) {
            return array();
        }

        foreach ($users as $key => $value) {
            $retVal[] = array("username" => $key, 
                              "password" => $value['passwd'],
                              "cvsuser"  => $value['system']);
        }

        return $retVal;
    }

    // }}}
    // {{{ addUser()

    /**
     * Add a new user to the storage container
     *
     * @param string username
     * @param string password
     * @param mixed  CVS username
     *
     * @return boolean
     */
    function addUser($user, $pass, $additional='')
    {
        $cvs = (string) (is_array($additional) && isset($additional['cvsuser'])) ? 
               $additional['cvsuser'] : $additional;

        $pw_obj = &$this->_load();
        if (PEAR::isError($pw_obj)) {
            return false;
        }
        
        $res = $pw_obj->addUser($user, $pass, $cvs);
        if(PEAR::isError($res)){
            return false;
        }
        
        $res = $pw_obj->save();
        if (PEAR::isError($res)) {
            return false;
        }
        
        return true;
    }

    // }}}
    // {{{ removeUser()

    /**
     * Remove user from the storage container
     *
     * @param   string  Username
     * @return  boolean
     */
    function removeUser($user)
    {
        $pw_obj = &$this->_load();
        if (PEAR::isError($pw_obj)) {
            return false;
        }
        
        
        $res = $pw_obj->delUser($user);
        if(PEAR::isError($res)){
            return false;
        }
        
        $res = $pw_obj->save();
        if (PEAR::isError($res)) {
            return false;
        }
        
        return true;
    }

    // }}}
    // {{{ _load()
    
    /**
     * Load and initialize the File_Passwd object
     * 
     * @return  object  File_Passwd_Cvs|PEAR_Error
     */
    function &_load()
    {
        static $pw_obj;
        
        if (!isset($pw_obj)) {
            $pw_obj = File_Passwd::factory('Cvs');
            if (PEAR::isError($pw_obj)) {
                return $pw_obj;
            }
            
            $pw_obj->setFile($this->pwfile);
            
            $res = $pw_obj->load();
            if (PEAR::isError($res)) {
                return $res;
            }
        }
        
        return $pw_obj;
    }

    // }}}
}
?>
