New class rcube_user + send message disposition notification
parent
d39eecad6d
commit
fba1f5ab81
@ -0,0 +1,470 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| program/include/rcube_user.inc |
|
||||
| |
|
||||
| This file is part of the RoundCube Webmail client |
|
||||
| Copyright (C) 2005-2007, RoundCube Dev. - Switzerland |
|
||||
| Licensed under the GNU GPL |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| This class represents a system user linked and provides access |
|
||||
| to the related database records. |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
$Id: rcube_user.inc 933 2007-11-29 14:17:32Z thomasb $
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Class representing a system user
|
||||
*
|
||||
* @package core
|
||||
* @author Thomas Bruederli <roundcube@gmail.com>
|
||||
*/
|
||||
class rcube_user
|
||||
{
|
||||
var $ID = null;
|
||||
var $data = null;
|
||||
|
||||
|
||||
/**
|
||||
* Object constructor
|
||||
*
|
||||
* @param object DB Database connection
|
||||
*/
|
||||
function __construct($id = null, $sql_arr = null)
|
||||
{
|
||||
global $DB;
|
||||
|
||||
if ($id && !$sql_arr)
|
||||
{
|
||||
$sql_result = $DB->query("SELECT * FROM ".get_table_name('users')." WHERE user_id=?", $id);
|
||||
$sql_arr = $DB->fetch_assoc($sql_result);
|
||||
}
|
||||
|
||||
if (!empty($sql_arr))
|
||||
{
|
||||
$this->ID = $sql_arr['user_id'];
|
||||
$this->data = $sql_arr;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* PHP 4 object constructor
|
||||
*
|
||||
* @see rcube_user::__construct
|
||||
*/
|
||||
function rcube_user($id = null, $sql_arr = null)
|
||||
{
|
||||
$this->__construct($id, $sql_arr);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Build a user name string (as e-mail address)
|
||||
*
|
||||
* @return string Full user name
|
||||
*/
|
||||
function get_username()
|
||||
{
|
||||
return $this->data['username'] ? $this->data['username'] . (!strpos($this->data['username'], '@') ? '@'.$this->data['mail_host'] : '') : false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the preferences saved for this user
|
||||
*
|
||||
* @return array Hash array with prefs
|
||||
*/
|
||||
function get_prefs()
|
||||
{
|
||||
if ($this->ID && $this->data['preferences'])
|
||||
return unserialize($this->data['preferences']);
|
||||
else
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Write the given user prefs to the user's record
|
||||
*
|
||||
* @param mixed User prefs to save
|
||||
* @return boolean True on success, False on failure
|
||||
*/
|
||||
function save_prefs($a_user_prefs)
|
||||
{
|
||||
global $DB, $CONFIG, $sess_user_lang;
|
||||
|
||||
if (!$this->ID)
|
||||
return false;
|
||||
|
||||
// merge (partial) prefs array with existing settings
|
||||
$a_user_prefs += (array)$this->get_prefs();
|
||||
|
||||
$DB->query(
|
||||
"UPDATE ".get_table_name('users')."
|
||||
SET preferences=?,
|
||||
language=?
|
||||
WHERE user_id=?",
|
||||
serialize($a_user_prefs),
|
||||
$sess_user_lang,
|
||||
$this->ID);
|
||||
|
||||
if ($DB->affected_rows())
|
||||
{
|
||||
$CONFIG = array_merge($CONFIG, $a_user_prefs);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get default identity of this user
|
||||
*
|
||||
* @param int Identity ID. If empty, the default identity is returned
|
||||
* @return array Hash array with all cols of the
|
||||
*/
|
||||
function get_identity($id = null)
|
||||
{
|
||||
global $DB;
|
||||
|
||||
$sql_result = $this->list_identities($id ? sprintf('AND identity_id=%d', $id) : '');
|
||||
return $DB->fetch_assoc($sql_result);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return a list of all identities linked with this user
|
||||
*
|
||||
* @return array List of identities
|
||||
*/
|
||||
function list_identities($sql_add = '')
|
||||
{
|
||||
global $DB;
|
||||
|
||||
// get contacts from DB
|
||||
$sql_result = $DB->query(
|
||||
"SELECT * FROM ".get_table_name('identities')."
|
||||
WHERE del<>1
|
||||
AND user_id=?
|
||||
$sql_add
|
||||
ORDER BY ".$DB->quoteIdentifier('standard')." DESC, name ASC",
|
||||
$this->ID);
|
||||
|
||||
return $sql_result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update a specific identity record
|
||||
*
|
||||
* @param int Identity ID
|
||||
* @param array Hash array with col->value pairs to save
|
||||
* @return boolean True if saved successfully, false if nothing changed
|
||||
*/
|
||||
function update_identity($iid, $data)
|
||||
{
|
||||
global $DB;
|
||||
|
||||
if (!$this->ID)
|
||||
return false;
|
||||
|
||||
$write_sql = array();
|
||||
|
||||
foreach ((array)$data as $col => $value)
|
||||
{
|
||||
$write_sql[] = sprintf("%s=%s",
|
||||
$DB->quoteIdentifier($col),
|
||||
$DB->quote($value));
|
||||
}
|
||||
|
||||
$DB->query(
|
||||
"UPDATE ".get_table_name('identities')."
|
||||
SET ".join(', ', $write_sql)."
|
||||
WHERE identity_id=?
|
||||
AND user_id=?
|
||||
AND del<>1",
|
||||
$iid,
|
||||
$this->ID);
|
||||
|
||||
return $DB->affected_rows();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new identity record linked with this user
|
||||
*
|
||||
* @param array Hash array with col->value pairs to save
|
||||
* @return int The inserted identity ID or false on error
|
||||
*/
|
||||
function insert_identity($data)
|
||||
{
|
||||
global $DB;
|
||||
|
||||
if (!$this->ID)
|
||||
return false;
|
||||
|
||||
$insert_cols = $insert_values = array();
|
||||
foreach ((array)$data as $col => $value)
|
||||
{
|
||||
$insert_cols[] = $DB->quoteIdentifier($col);
|
||||
$insert_values[] = $DB->quote($value);
|
||||
}
|
||||
|
||||
$DB->query(
|
||||
"INSERT INTO ".get_table_name('identities')."
|
||||
(user_id, ".join(', ', $insert_cols).")
|
||||
VALUES (?, ".join(', ', $insert_values).")",
|
||||
$this->ID);
|
||||
|
||||
return $DB->insert_id(get_sequence_name('identities'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Mark the given identity as deleted
|
||||
*
|
||||
* @param int Identity ID
|
||||
* @return boolean True if deleted successfully, false if nothing changed
|
||||
*/
|
||||
function delete_identity($iid)
|
||||
{
|
||||
global $DB;
|
||||
|
||||
if (!$this->ID)
|
||||
return false;
|
||||
|
||||
$DB->query(
|
||||
"UPDATE ".get_table_name('identities')."
|
||||
SET del=1
|
||||
WHERE user_id=?
|
||||
AND identity_id=?",
|
||||
$this->ID,
|
||||
$iid);
|
||||
|
||||
return $DB->affected_rows();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make this identity the default one for this user
|
||||
*
|
||||
* @param int The identity ID
|
||||
*/
|
||||
function set_default($iid)
|
||||
{
|
||||
global $DB;
|
||||
|
||||
if ($this->ID && $iid)
|
||||
{
|
||||
$DB->query(
|
||||
"UPDATE ".get_table_name('identities')."
|
||||
SET ".$DB->quoteIdentifier('standard')."='0'
|
||||
WHERE user_id=?
|
||||
AND identity_id<>?
|
||||
AND del<>1",
|
||||
$this->ID,
|
||||
$iid);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update user's last_login timestamp
|
||||
*/
|
||||
function touch()
|
||||
{
|
||||
global $DB;
|
||||
|
||||
if ($this->ID)
|
||||
{
|
||||
$DB->query(
|
||||
"UPDATE ".get_table_name('users')."
|
||||
SET last_login=".$DB->now()."
|
||||
WHERE user_id=?",
|
||||
$this->ID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Clear the saved object state
|
||||
*/
|
||||
function reset()
|
||||
{
|
||||
$this->ID = null;
|
||||
$this->data = null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Find a user record matching the given name and host
|
||||
*
|
||||
* @param string IMAP user name
|
||||
* @param string IMAP host name
|
||||
* @return object rcube_user New user instance
|
||||
* @static
|
||||
*/
|
||||
function query($user, $host)
|
||||
{
|
||||
global $DB;
|
||||
|
||||
// query if user already registered
|
||||
$sql_result = $DB->query(
|
||||
"SELECT * FROM ".get_table_name('users')."
|
||||
WHERE mail_host=? AND (username=? OR alias=?)",
|
||||
$host,
|
||||
$user,
|
||||
$user);
|
||||
|
||||
// user already registered -> overwrite username
|
||||
if ($sql_arr = $DB->fetch_assoc($sql_result))
|
||||
return new rcube_user($sql_arr['user_id'], $sql_arr);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new user record and return a rcube_user instance
|
||||
*
|
||||
* @param string IMAP user name
|
||||
* @param string IMAP host
|
||||
* @return object rcube_user New user instance
|
||||
* @static
|
||||
*/
|
||||
function create($user, $host)
|
||||
{
|
||||
global $DB, $CONFIG;
|
||||
|
||||
$user_email = '';
|
||||
|
||||
// try to resolve user in virtusertable
|
||||
if (!empty($CONFIG['virtuser_file']) && !strpos($user, '@'))
|
||||
$user_email = self::user2email($user);
|
||||
|
||||
$DB->query(
|
||||
"INSERT INTO ".get_table_name('users')."
|
||||
(created, last_login, username, mail_host, alias, language)
|
||||
VALUES (".$DB->now().", ".$DB->now().", ?, ?, ?, ?)",
|
||||
strip_newlines($user),
|
||||
strip_newlines($host),
|
||||
strip_newlines($user_email),
|
||||
$_SESSION['user_lang']);
|
||||
|
||||
if ($user_id = $DB->insert_id(get_sequence_name('users')))
|
||||
{
|
||||
$mail_domain = rcmail_mail_domain($host);
|
||||
|
||||
if ($user_email=='')
|
||||
$user_email = strpos($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
|
||||
|
||||
$user_name = $user != $user_email ? $user : '';
|
||||
|
||||
// try to resolve the e-mail address from the virtuser table
|
||||
if (!empty($CONFIG['virtuser_query']) &&
|
||||
($sql_result = $DB->query(preg_replace('/%u/', $DB->escapeSimple($user), $CONFIG['virtuser_query']))) &&
|
||||
($DB->num_rows()>0))
|
||||
{
|
||||
while ($sql_arr = $DB->fetch_array($sql_result))
|
||||
{
|
||||
$DB->query(
|
||||
"INSERT INTO ".get_table_name('identities')."
|
||||
(user_id, del, standard, name, email)
|
||||
VALUES (?, 0, 1, ?, ?)",
|
||||
$user_id,
|
||||
strip_newlines($user_name),
|
||||
preg_replace('/^@/', $user . '@', $sql_arr[0]));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// also create new identity records
|
||||
$DB->query(
|
||||
"INSERT INTO ".get_table_name('identities')."
|
||||
(user_id, del, standard, name, email)
|
||||
VALUES (?, 0, 1, ?, ?)",
|
||||
$user_id,
|
||||
strip_newlines($user_name),
|
||||
strip_newlines($user_email));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
raise_error(array(
|
||||
'code' => 500,
|
||||
'type' => 'php',
|
||||
'line' => __LINE__,
|
||||
'file' => __FILE__,
|
||||
'message' => "Failed to create new user"), true, false);
|
||||
}
|
||||
|
||||
return $user_id ? new rcube_user($user_id) : false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resolve username using a virtuser table
|
||||
*
|
||||
* @param string E-mail address to resolve
|
||||
* @return string Resolved IMAP username
|
||||
* @static
|
||||
*/
|
||||
function email2user($email)
|
||||
{
|
||||
$user = $email;
|
||||
$r = rcmail_findinvirtual("^$email");
|
||||
|
||||
for ($i=0; $i<count($r); $i++)
|
||||
{
|
||||
$data = $r[$i];
|
||||
$arr = preg_split('/\s+/', $data);
|
||||
if (count($arr) > 0)
|
||||
{
|
||||
$user = trim($arr[count($arr)-1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resolve e-mail address from virtuser table
|
||||
*
|
||||
* @param string User name
|
||||
* @return string Resolved e-mail address
|
||||
* @static
|
||||
*/
|
||||
function user2email($user)
|
||||
{
|
||||
$email = "";
|
||||
$r = rcmail_findinvirtual("$user$");
|
||||
|
||||
for ($i=0; $i<count($r); $i++)
|
||||
{
|
||||
$data = $r[$i];
|
||||
$arr = preg_split('/\s+/', $data);
|
||||
if (count($arr) > 0)
|
||||
{
|
||||
$email = trim($arr[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $email;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
+-----------------------------------------------------------------------+
|
||||
| program/steps/mail/sendmdn.inc |
|
||||
| |
|
||||
| This file is part of the RoundCube Webmail client |
|
||||
| Copyright (C) 2007, RoundCube Dev. - Switzerland |
|
||||
| Licensed under the GNU GPL |
|
||||
| |
|
||||
| PURPOSE: |
|
||||
| Send a message disposition notification for a specific mail |
|
||||
| |
|
||||
+-----------------------------------------------------------------------+
|
||||
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
||||
+-----------------------------------------------------------------------+
|
||||
|
||||
$Id: sendmail.inc 930 2007-11-25 17:34:19Z thomasb $
|
||||
|
||||
*/
|
||||
|
||||
require_once('lib/rc_mail_mime.inc');
|
||||
|
||||
|
||||
if (!empty($_POST['_uid']))
|
||||
{
|
||||
$MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_POST));
|
||||
$MESSAGE['headers'] = $IMAP->get_headers($MESSAGE['UID']);
|
||||
$MESSAGE['subject'] = rcube_imap::decode_mime_string($MESSAGE['headers']->subject, $MESSAGE['headers']->charset);
|
||||
|
||||
if ($MESSAGE['headers']->mdn_to && !$MESSAGE['headers']->mdn_sent)
|
||||
{
|
||||
$identity = $USER->get_identity();
|
||||
$sender = format_email_recipient($identity['email'], $identity['name']);
|
||||
$recipient = array_shift($IMAP->decode_address_list($MESSAGE['headers']->mdn_to));
|
||||
$mailto = $recipient['mailto'];
|
||||
|
||||
$COMPOSE = new rc_mail_mime(rcmail_header_delm());
|
||||
$COMPOSE->setParam(array(
|
||||
'text_encoding' => 'quoted-printable',
|
||||
'html_encoding' => 'quoted-printable',
|
||||
'head_encoding' => 'quoted-printable',
|
||||
'head_charset' => RCMAIL_CHARSET,
|
||||
'html_charset' => RCMAIL_CHARSET,
|
||||
'text_charset' => RCMAIL_CHARSET,
|
||||
));
|
||||
|
||||
// compose headers array
|
||||
$headers = array(
|
||||
'Date' => date('r'),
|
||||
'From' => $sender,
|
||||
'To' => $MESSAGE['headers']->mdn_to,
|
||||
'Subject' => rcube_label('receiptread') . ': ' . $MESSAGE['subject'],
|
||||
'Message-ID' => sprintf('<%s@%s>', md5(uniqid('rcmail'.rand(),true)), rcmail_mail_domain($_SESSION['imap_host'])),
|
||||
'X-Sender' => $identity['email'],
|
||||
'Content-Type' => 'multipart/report; report-type=disposition-notification',
|
||||
);
|
||||
|
||||
if (!empty($CONFIG['useragent']))
|
||||
$headers['User-Agent'] = $CONFIG['useragent'];
|
||||
|
||||
$body = rcube_label("yourmessage") . "\r\n\r\n" .
|
||||
"\t" . rcube_label("to") . ': ' . rcube_imap::decode_mime_string($MESSAGE['headers']->to, $MESSAGE['headers']->charset) . "\r\n" .
|
||||
"\t" . rcube_label("subject") . ': ' . $MESSAGE['subject'] . "\r\n" .
|
||||
"\t" . rcube_label("sent") . ': ' . format_date(strtotime($MESSAGE['headers']->date), $CONFIG['date_long']) . "\r\n" .
|
||||
"\r\n" . rcube_label("receiptnote") . "\r\n";
|
||||
|
||||
$report = "Reporting-UA: RoundCube Webmail (Version ".RCMAIL_VERSION.")\r\n";
|
||||
|
||||
if ($MESSAGE['headers']->to)
|
||||
$report .= "Original-Recipient: {$MESSAGE['headers']->to}\r\n";
|
||||
|
||||
$report .= "Final-Recipient: rfc822; {$identity['email']}\r\n" .
|
||||
"Original-Message-ID: {$MESSAGE['headers']->messageID}\r\n" .
|
||||
"Disposition: manual-action/MDN-sent-manually; displayed\r\n";
|
||||
|
||||
$COMPOSE->headers($headers, true);
|
||||
$COMPOSE->setTXTBody($body);
|
||||
$COMPOSE->addAttachment($report, 'message/disposition-notification', 'MDNPart2.txt', false, '7bit', 'inline');
|
||||
|
||||
$sent = rcmail_deliver_message($COMPOSE, $identity['email'], $mailto);
|
||||
|
||||
if ($sent)
|
||||
{
|
||||
$IMAP->set_flag($MESSAGE['UID'], 'MDNSENT');
|
||||
$OUTPUT->set_env('mdn_request', false);
|
||||
$OUTPUT->show_message('receiptsent', 'confirmation');
|
||||
$OUTPUT->send();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Error if arrive here
|
||||
$OUTPUT->show_message('errorsendingreceipt', 'error');
|
||||
$OUTPUT->send();
|
||||
|
||||
?>
|
Loading…
Reference in New Issue