|
@@ -1,44 +1,54 @@
|
|
<?php
|
|
<?php
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* abook_local_file.php
|
|
* abook_local_file.php
|
|
*
|
|
*
|
|
* Copyright (c) 1999-2004 The SquirrelMail Project Team
|
|
* Copyright (c) 1999-2004 The SquirrelMail Project Team
|
|
* Licensed under the GNU GPL. For full terms see the file COPYING.
|
|
* Licensed under the GNU GPL. For full terms see the file COPYING.
|
|
*
|
|
*
|
|
- * Backend for addressbook as a pipe separated file
|
|
|
|
- *
|
|
|
|
- * An array with the following elements must be passed to
|
|
|
|
- * the class constructor (elements marked ? are optional):
|
|
|
|
- *
|
|
|
|
- * filename => path to addressbook file
|
|
|
|
- * ? create => if true: file is created if it does not exist.
|
|
|
|
- * ? umask => umask set before opening file.
|
|
|
|
- *
|
|
|
|
- * NOTE. This class should not be used directly. Use the
|
|
|
|
- * "AddressBook" class instead.
|
|
|
|
- *
|
|
|
|
* @version $Id$
|
|
* @version $Id$
|
|
* @package squirrelmail
|
|
* @package squirrelmail
|
|
* @subpackage addressbook
|
|
* @subpackage addressbook
|
|
*/
|
|
*/
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Store the addressbook in a local file
|
|
|
|
|
|
+ * Backend for address book as a pipe separated file
|
|
|
|
+ *
|
|
|
|
+ * Stores the address book in a local file
|
|
|
|
+ *
|
|
|
|
+ * An array with the following elements must be passed to
|
|
|
|
+ * the class constructor (elements marked ? are optional):
|
|
|
|
+ *<pre>
|
|
|
|
+ * 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
|
|
|
|
+ *</pre>
|
|
|
|
+ * NOTE. This class should not be used directly. Use the
|
|
|
|
+ * "AddressBook" class instead.
|
|
* @package squirrelmail
|
|
* @package squirrelmail
|
|
*/
|
|
*/
|
|
class abook_local_file extends addressbook_backend {
|
|
class abook_local_file extends addressbook_backend {
|
|
|
|
+ /** @var string backend type */
|
|
var $btype = 'local';
|
|
var $btype = 'local';
|
|
|
|
+ /** @var string backend name */
|
|
var $bname = 'local_file';
|
|
var $bname = 'local_file';
|
|
|
|
|
|
|
|
+ /** @var string file used to store data */
|
|
var $filename = '';
|
|
var $filename = '';
|
|
|
|
+ /** @var object file handle */
|
|
var $filehandle = 0;
|
|
var $filehandle = 0;
|
|
|
|
+ /** @var bool create file if it is not present */
|
|
var $create = false;
|
|
var $create = false;
|
|
|
|
+ /** @var string umask of the file */
|
|
var $umask;
|
|
var $umask;
|
|
|
|
|
|
/* ========================== Private ======================= */
|
|
/* ========================== Private ======================= */
|
|
|
|
|
|
- /* Constructor */
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Constructor
|
|
|
|
+ * @param array $param backend options
|
|
|
|
+ * @return bool
|
|
|
|
+ */
|
|
function abook_local_file($param) {
|
|
function abook_local_file($param) {
|
|
$this->sname = _("Personal address book");
|
|
$this->sname = _("Personal address book");
|
|
$this->umask = Umask();
|
|
$this->umask = Umask();
|
|
@@ -54,8 +64,8 @@ class abook_local_file extends addressbook_backend {
|
|
|
|
|
|
$this->filename = $param['filename'];
|
|
$this->filename = $param['filename'];
|
|
|
|
|
|
- if($param['create']) {
|
|
|
|
- $this->create = true;
|
|
|
|
|
|
+ if(isset($param['create'])) {
|
|
|
|
+ $this->create = $param['create'];
|
|
}
|
|
}
|
|
if(isset($param['umask'])) {
|
|
if(isset($param['umask'])) {
|
|
$this->umask = $param['umask'];
|
|
$this->umask = $param['umask'];
|
|
@@ -70,10 +80,14 @@ class abook_local_file extends addressbook_backend {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /* Open the addressbook file and store the file pointer.
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Open the addressbook file and store the file pointer.
|
|
* Use $file as the file to open, or the class' own
|
|
* Use $file as the file to open, or the class' own
|
|
* filename property. If $param is empty and file is
|
|
* filename property. If $param is empty and file is
|
|
- * open, do nothing. */
|
|
|
|
|
|
+ * open, do nothing.
|
|
|
|
+ * @param bool $new is file already opened
|
|
|
|
+ * @return bool
|
|
|
|
+ */
|
|
function open($new = false) {
|
|
function open($new = false) {
|
|
$this->error = '';
|
|
$this->error = '';
|
|
$file = $this->filename;
|
|
$file = $this->filename;
|
|
@@ -113,7 +127,7 @@ class abook_local_file extends addressbook_backend {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Close the file and forget the filehandle */
|
|
|
|
|
|
+ /** Close the file and forget the filehandle */
|
|
function close() {
|
|
function close() {
|
|
@fclose($this->filehandle);
|
|
@fclose($this->filehandle);
|
|
$this->filehandle = 0;
|
|
$this->filehandle = 0;
|
|
@@ -121,7 +135,7 @@ class abook_local_file extends addressbook_backend {
|
|
$this->writable = false;
|
|
$this->writable = false;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Lock the datafile - try 20 times in 5 seconds */
|
|
|
|
|
|
+ /** Lock the datafile - try 20 times in 5 seconds */
|
|
function lock() {
|
|
function lock() {
|
|
for($i = 0 ; $i < 20 ; $i++) {
|
|
for($i = 0 ; $i < 20 ; $i++) {
|
|
if(flock($this->filehandle, 2 + 4))
|
|
if(flock($this->filehandle, 2 + 4))
|
|
@@ -132,13 +146,17 @@ class abook_local_file extends addressbook_backend {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Lock the datafile */
|
|
|
|
|
|
+ /** Unlock the datafile */
|
|
function unlock() {
|
|
function unlock() {
|
|
return flock($this->filehandle, 3);
|
|
return flock($this->filehandle, 3);
|
|
}
|
|
}
|
|
|
|
|
|
- /* Overwrite the file with data from $rows
|
|
|
|
- * NOTE! Previous locks are broken by this function */
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 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) {
|
|
function overwrite(&$rows) {
|
|
$this->unlock();
|
|
$this->unlock();
|
|
$newfh = @fopen($this->filename.'.tmp', 'w');
|
|
$newfh = @fopen($this->filename.'.tmp', 'w');
|
|
@@ -171,7 +189,11 @@ class abook_local_file extends addressbook_backend {
|
|
|
|
|
|
/* ========================== Public ======================== */
|
|
/* ========================== Public ======================== */
|
|
|
|
|
|
- /* Search the file */
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Search the file
|
|
|
|
+ * @param string $expr search expression
|
|
|
|
+ * @return array search results
|
|
|
|
+ */
|
|
function search($expr) {
|
|
function search($expr) {
|
|
|
|
|
|
/* To be replaced by advanded search expression parsing */
|
|
/* To be replaced by advanded search expression parsing */
|
|
@@ -205,7 +227,11 @@ class abook_local_file extends addressbook_backend {
|
|
return $res;
|
|
return $res;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Lookup alias */
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Lookup alias
|
|
|
|
+ * @param string $alias alias
|
|
|
|
+ * @return array search results
|
|
|
|
+ */
|
|
function lookup($alias) {
|
|
function lookup($alias) {
|
|
if(empty($alias)) {
|
|
if(empty($alias)) {
|
|
return array();
|
|
return array();
|
|
@@ -232,7 +258,10 @@ class abook_local_file extends addressbook_backend {
|
|
return array();
|
|
return array();
|
|
}
|
|
}
|
|
|
|
|
|
- /* List all addresses */
|
|
|
|
|
|
+ /**
|
|
|
|
+ * List all addresses
|
|
|
|
+ * @return array list of all addresses
|
|
|
|
+ */
|
|
function list_addr() {
|
|
function list_addr() {
|
|
$res = array();
|
|
$res = array();
|
|
$this->open();
|
|
$this->open();
|
|
@@ -251,7 +280,11 @@ class abook_local_file extends addressbook_backend {
|
|
return $res;
|
|
return $res;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Add address */
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Add address
|
|
|
|
+ * @param array $userdata new data
|
|
|
|
+ * @return bool
|
|
|
|
+ */
|
|
function add($userdata) {
|
|
function add($userdata) {
|
|
if(!$this->writeable) {
|
|
if(!$this->writeable) {
|
|
return $this->set_error(_("Addressbook is read-only"));
|
|
return $this->set_error(_("Addressbook is read-only"));
|
|
@@ -294,15 +327,19 @@ class abook_local_file extends addressbook_backend {
|
|
|
|
|
|
/* Test write result */
|
|
/* Test write result */
|
|
if($r === FALSE) {
|
|
if($r === FALSE) {
|
|
- /* Fail */
|
|
|
|
- $this->set_error(_("Write to addressbook failed"));
|
|
|
|
- return FALSE;
|
|
|
|
- }
|
|
|
|
|
|
+ /* Fail */
|
|
|
|
+ $this->set_error(_("Write to addressbook failed"));
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
|
|
return TRUE;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Delete address */
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Delete address
|
|
|
|
+ * @param string $alias alias that has to be deleted
|
|
|
|
+ * @return bool
|
|
|
|
+ */
|
|
function remove($alias) {
|
|
function remove($alias) {
|
|
if(!$this->writeable) {
|
|
if(!$this->writeable) {
|
|
return $this->set_error(_("Addressbook is read-only"));
|
|
return $this->set_error(_("Addressbook is read-only"));
|
|
@@ -334,7 +371,12 @@ class abook_local_file extends addressbook_backend {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Modify address */
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Modify address
|
|
|
|
+ * @param string $alias modified alias
|
|
|
|
+ * @param array $userdata new data
|
|
|
|
+ * @return bool true, if operation successful
|
|
|
|
+ */
|
|
function modify($alias, $userdata) {
|
|
function modify($alias, $userdata) {
|
|
if(!$this->writeable) {
|
|
if(!$this->writeable) {
|
|
return $this->set_error(_("Addressbook is read-only"));
|
|
return $this->set_error(_("Addressbook is read-only"));
|
|
@@ -381,7 +423,11 @@ class abook_local_file extends addressbook_backend {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Function for quoting values before saving */
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Function for quoting values before saving
|
|
|
|
+ * @param string $value string that has to be quoted
|
|
|
|
+ * @param string quoted string
|
|
|
|
+ */
|
|
function quotevalue($value) {
|
|
function quotevalue($value) {
|
|
/* Quote the field if it contains | or ". Double quotes need to
|
|
/* Quote the field if it contains | or ". Double quotes need to
|
|
* be replaced with "" */
|
|
* be replaced with "" */
|