Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4
Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4
Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4
Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4
Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4
Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4
* filename => path to addressbook file
* ? create => if true: file is created if it does not exist.
* ? umask => umask set before opening file.
* ? name => name of address book.
* ? detect_writeable => detect address book access permissions by
* checking file permissions.
* ? writeable => allow writing into address book. Used only when
* detect_writeable is set to false.
* ? listing => enable/disable listing
* ? line_length => allowed address book record size
*
* NOTE. This class should not be used directly. Use the
* "AddressBook" class instead.
* @package squirrelmail
*/
class abook_local_file extends addressbook_backend {
/**
* Backend type
* @var string
*/
var $btype = 'local';
/**
* Backend name
* @var string
*/
var $bname = 'local_file';
/**
* File used to store data
* @var string
*/
var $filename = '';
/**
* File handle
* @var object
*/
var $filehandle = 0;
/**
* Create file, if it not present
* @var bool
*/
var $create = false;
/**
* Detect, if address book is writeable by checking file permisions
* @var bool
*/
var $detect_writeable = true;
/**
* Control write access to address book
*
* Option does not have any effect, if 'detect_writeable' is 'true'
* @var bool
*/
var $writeable = false;
/**
* controls listing of address book
* @var bool
* @since 1.5.1 and 1.4.9
*/
var $listing = true;
/**
* Umask of the file
* @var string
*/
var $umask;
/**
* Sets max entry size (number of bytes used for all address book fields
* (including escapes) + 4 delimiters + 1 linefeed)
* @var integer
* @since 1.5.2 and 1.4.9
*/
var $line_length = 2048;
/* ========================== Private ======================= */
/**
* Constructor
* @param array $param backend options
* @return bool
*/
function abook_local_file($param) {
$this->sname = _("Personal address book");
$this->umask = Umask();
if(is_array($param)) {
if(empty($param['filename'])) {
return $this->set_error('Invalid parameters');
}
if(!is_string($param['filename'])) {
return $this->set_error($param['filename'] . ': '.
_("Not a file name"));
}
$this->filename = $param['filename'];
if(isset($param['create'])) {
$this->create = $param['create'];
}
if(isset($param['umask'])) {
$this->umask = $param['umask'];
}
if(isset($param['name'])) {
$this->sname = $param['name'];
}
if(isset($param['detect_writeable'])) {
$this->detect_writeable = $param['detect_writeable'];
}
if(!empty($param['writeable'])) {
$this->writeable = $param['writeable'];
}
if(isset($param['listing'])) {
$this->listing = $param['listing'];
}
if(isset($param['line_length']) && ! empty($param['line_length'])) {
$this->line_length = (int) $param['line_length'];
}
$this->open(true);
} else {
$this->set_error('Invalid argument to constructor');
}
}
/**
* Open the addressbook file and store the file pointer.
* Use $file as the file to open, or the class' own
* filename property. If $param is empty and file is
* open, do nothing.
* @param bool $new is file already opened
* @return bool
*/
function open($new = false) {
$this->error = '';
$file = $this->filename;
$create = $this->create;
$fopenmode = (($this->writeable && is_writable($file)) ? 'a+' : 'r');
/* Return true is file is open and $new is unset */
if($this->filehandle && !$new) {
return true;
}
/* Check that new file exitsts */
if((!(file_exists($file) && is_readable($file))) && !$create) {
return $this->set_error("$file: " . _("No such file or directory"));
}
/* Close old file, if any */
if($this->filehandle) { $this->close(); }
umask($this->umask);
if (! $this->detect_writeable) {
$fh = @fopen($file,$fopenmode);
if ($fh) {
$this->filehandle = &$fh;
$this->filename = $file;
} else {
return $this->set_error("$file: " . _("Open failed"));
}
} else {
/* Open file. First try to open for reading and writing,
* but fall back to read only. */
$fh = @fopen($file, 'a+');
if($fh) {
$this->filehandle = &$fh;
$this->filename = $file;
$this->writeable = true;
} else {
$fh = @fopen($file, 'r');
if($fh) {
$this->filehandle = &$fh;
$this->filename = $file;
$this->writeable = false;
} else {
return $this->set_error("$file: " . _("Open failed"));
}
}
}
return true;
}
/** Close the file and forget the filehandle */
function close() {
@fclose($this->filehandle);
$this->filehandle = 0;
$this->filename = '';
$this->writable = false;
}
/** Lock the datafile - try 20 times in 5 seconds */
function lock() {
for($i = 0 ; $i < 20 ; $i++) {
if(flock($this->filehandle, 2 + 4))
return true;
else
usleep(250000);
}
return false;
}
/** Unlock the datafile */
function unlock() {
return flock($this->filehandle, 3);
}
/**
* Overwrite the file with data from $rows
* NOTE! Previous locks are broken by this function
* @param array $rows new data
* @return bool
*/
function overwrite(&$rows) {
$this->unlock();
$newfh = @fopen($this->filename.'.tmp', 'w');
if(!$newfh) {
return $this->set_error($this->filename. '.tmp:' . _("Open failed"));
}
for($i = 0, $cnt=sizeof($rows) ; $i < $cnt ; $i++) {
if(is_array($rows[$i])) {
for($j = 0, $cnt_part=count($rows[$i]) ; $j < $cnt_part ; $j++) {
$rows[$i][$j] = $this->quotevalue($rows[$i][$j]);
}
$tmpwrite = sq_fwrite($newfh, join('|', $rows[$i]) . "\n");
if ($tmpwrite === FALSE) {
return $this->set_error($this->filename . '.tmp:' . _("Write failed"));
}
}
}
fclose($newfh);
if (!@copy($this->filename . '.tmp' , $this->filename)) {
return $this->set_error($this->filename . ':' . _("Unable to update"));
}
@unlink($this->filename . '.tmp');
@chmod($this->filename, 0600);
$this->unlock();
$this->open(true);
return true;
}
/* ========================== Public ======================== */
/**
* Search the file
* @param string $expr search expression
* @return array search results
*/
function search($expr) {
/* To be replaced by advanded search expression parsing */
if(is_array($expr)) { return; }
// don't allow wide search when listing is disabled.
if ($expr=='*' && ! $this->listing)
return array();
/* Make regexp from glob'ed expression
* May want to quote other special characters like (, ), -, [, ], etc. */
$expr = str_replace('?', '.', $expr);
$expr = str_replace('*', '.*', $expr);
$res = array();
if(!$this->open()) {
return false;
}
@rewind($this->filehandle);
while ($row = @fgetcsv($this->filehandle, $this->line_length, '|')) {
if (count($row)<5) {
/** address book is corrupted. */
global $color;
error_box(_("Address book is corrupted. Required fields are missing."),$color);
die('