1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
<?php
/**
* Implements the Accounts API for servers with unix accounts on the localhost
* machine (same machine as the web server). Should work for local unix
* accounts, nis/nis+ accounts, or any PAM oriented accounts that appear as
* local accounts on the local machine. The exception is the quota support.
* See that routine for additional comments.
*
* Copyright 2002-2016 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (LGPL-2). If you
* did not receive this file, see http://www.horde.org/licenses/lgpl.
*
* @author Eric Jon Rostetter <eric.rostetter@physics.utexas.edu>
* @author Jan Schneider <jan@horde.org>
* @package Horde
*/
class Horde_Block_Account_Localhost extends Horde_Block_Account_Base
{
/**
* User information hash.
*
* @var array
*/
protected $_information;
/**
* Constructor.
*
* @param array $params Hash containing connection parameters.
*/
public function __construct($params = array())
{
$params = array_merge(
array('quota_path' => 'quota',
'grep_path' => 'grep'),
$params);
parent::__construct($params);
}
/**
* Returns the user account from the posix information.
*
* @return array A hash with complete account details.
*
* @throws Horde_Exception if posix extension is missing.
*/
protected function _getAccount()
{
if (!isset($this->_information)) {
// This won't work if we don't have posix extensions.
if (!Horde_Util::extensionExists('posix')) {
throw new Horde_Exception(_("POSIX extension is missing"));
}
$user = Horde_String::lower($this->getUsername());
$this->_information = posix_getpwnam($user);
}
return $this->_information;
}
/**
* Returns the user's quota for servers with a unix quota command.
*
* This may require a modified "quota" command that allows the httpd
* server account to get quotas for other users... It requires that your
* web server and user server be the same server or at least have shared
* authentication and file servers (e.g. via NIS/NFS). And last, it (as
* written) requires the posix php extensions.
*
* If your quota command wraps the output onto two lines, then this module
* will only work if you have a grep which supports the -A switch, and you
* append an -A1 switch to your grep_path (e.g. '/bin/grep -A1').
*
* @return array A quota array, elements are used bytes and limit bytes.
*
* @throws Horde_Exception if posix extension is missing.
*/
public function getQuota()
{
$information = $this->_getAccount();
$homedir = $information['dir'];
// If we want mount point translations, then translate the login dir
// name to a mount point. If not, then simply parse out the device
// name from the login directory, and use that instead.
if ($this->_params['translateMountPoint'] &&
file_exists($this->_params['translationTable'])) {
$sysTab = File_Fstab::singleton($this->_params['translationTable']);
do {
$entry = $sysTab->getEntryForPath($homedir);
$homedir = dirname($homedir);
if ($homedir == '.' || empty($homedir)) {
$homedir = '/';
}
} while (is_a($entry, 'PEAR_Error'));
$mountPoint = $entry->device;
} else {
$homedir = explode('/', $homedir);
$mountPoint = '/' . $homedir[1];
}
$cmdline = sprintf('%s -u %s 2>&1 | %s %s',
$this->_params['quota_path'],
$this->getUserName(),
$this->_params['grep_path'],
$mountPoint);
exec($cmdline, $quota_data, $return_code);
if ($return_code == 0 && !empty($quota_data[0])) {
// In case of quota output wrapping on two lines, we concat the
// second line of results, if any, here.
if (!empty($quota_data[1])) {
$quota_data[0] .= $quota_data[1];
}
// Now parse out the quota info and return it.
$quota = preg_split('/\s+/', trim($quota_data[0]));
return array('used' => $quota[1] * 1024, 'limit' => $quota[2] * 1024);
}
return array();
}
/**
* Returns the user's full name.
*
* @return string The user's full name.
*
* @throws Horde_Exception if posix extension is missing.
*/
public function getFullname()
{
$information = $this->_getAccount();
$gecos_array = explode(',', $information['gecos']);
return $gecos_array[0];
}
/**
* Returns the user's home (login) directory.
*
* @return string The user's directory.
*
* @throws Horde_Exception if posix extension is missing.
*/
public function getHome()
{
$information = $this->_getAccount();
return $information['dir'];
}
/**
* Returns the user's default shell.
*
* @return string The user's shell.
*
* @throws Horde_Exception if posix extension is missing.
*/
public function getShell()
{
$information = $this->_getAccount();
return $information['shell'];
}
}
|