diff options
-rw-r--r-- | index.php | 38 | ||||
-rw-r--r-- | program/include/html.php | 8 | ||||
-rwxr-xr-x | program/include/iniset.php | 2 | ||||
-rw-r--r-- | program/include/main.inc | 147 | ||||
-rw-r--r-- | program/include/rcube_config.php | 41 | ||||
-rw-r--r-- | program/include/rcube_json_output.php | 2 | ||||
-rwxr-xr-x | program/include/rcube_template.php | 5 | ||||
-rw-r--r-- | program/include/rcube_user.php | 39 | ||||
-rw-r--r-- | program/steps/mail/func.inc | 16 | ||||
-rw-r--r-- | program/steps/mail/sendmail.inc | 6 |
10 files changed, 129 insertions, 175 deletions
@@ -2,7 +2,7 @@ /* +-------------------------------------------------------------------------+ | RoundCube Webmail IMAP Client | - | Version 0.1-20080506 | + | Version 0.2-20080614 | | | | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland | | | @@ -33,6 +33,12 @@ require_once 'program/include/iniset.php'; // define global vars $OUTPUT_TYPE = 'html'; +// init application and start session with requested task +$RCMAIL = rcmail::get_instance(); + +// init output class +$OUTPUT = !empty($_REQUEST['_remote']) ? $RCMAIL->init_json() : $RCMAIL->load_gui(!empty($_REQUEST['_framed'])); + // set output buffering if ($RCMAIL->action != 'get' && $RCMAIL->action != 'viewsource') { // use gzip compression if supported @@ -46,14 +52,6 @@ if ($RCMAIL->action != 'get' && $RCMAIL->action != 'viewsource') { } } - -// init application and start session with requested task -$RCMAIL = rcmail::get_instance(); - -// init output class -$OUTPUT = (!empty($_GET['_remote']) || !empty($_POST['_remote'])) ? $RCMAIL->init_json() : $RCMAIL->load_gui((!empty($_GET['_framed']) || !empty($_POST['_framed']))); - - // check DB connections and exit on failure if ($err_str = $DB->is_error()) { raise_error(array( @@ -127,18 +125,9 @@ if (!empty($RCMAIL->user->ID) && $RCMAIL->task == 'mail') { } -// not logged in -> set task to 'login -if (empty($RCMAIL->user->ID)) { - if ($OUTPUT->ajax_call) - $OUTPUT->remote_response("setTimeout(\"location.href='\"+this.env.comm_path+\"'\", 2000);"); - - $RCMAIL->set_task('login'); -} - - // check client X-header to verify request origin if ($OUTPUT->ajax_call) { - if (empty($CONFIG['devel_mode']) && !rc_request_header('X-RoundCube-Referer')) { + if ($RCMAIL->config->get('devel_mode') && !rc_request_header('X-RoundCube-Referer')) { header('HTTP/1.1 404 Not Found'); die("Invalid Request"); } @@ -147,8 +136,12 @@ if ($OUTPUT->ajax_call) { // not logged in -> show login page if (empty($RCMAIL->user->ID)) { + + if ($OUTPUT->ajax_call) + $OUTPUT->remote_response("setTimeout(\"location.href='\"+this.env.comm_path+\"'\", 2000);"); + // check if installer is still active - if ($CONFIG['enable_installer'] && is_readable('./installer/index.php')) { + if ($RCMAIL->config->get('enable_installer') && is_readable('./installer/index.php')) { $OUTPUT->add_footer(html::div(array('style' => "background:#ef9398; border:2px solid #dc5757; padding:0.5em; margin:2em auto; width:50em"), html::tag('h2', array('style' => "margin-top:0.2em"), "Installer script is still accessible") . html::p(null, "The install script of your RoundCube installation is still stored in its default location!") . @@ -160,17 +153,14 @@ if (empty($RCMAIL->user->ID)) { } $OUTPUT->set_env('task', 'login'); - $OUTPUT->task = 'login'; $OUTPUT->send('login'); - exit; } // handle keep-alive signal if ($RCMAIL->action=='keep-alive') { $OUTPUT->reset(); - $OUTPUT->send(''); - exit; + $OUTPUT->send(); } // include task specific files diff --git a/program/include/html.php b/program/include/html.php index 4ac45da65..4057bd14d 100644 --- a/program/include/html.php +++ b/program/include/html.php @@ -571,7 +571,7 @@ class html_table extends html * @param array Cell attributes * @param string Cell content */ - private function add_header($attr, $cont) + public function add_header($attr, $cont) { if (is_string($attr)) $attr = array('class' => $attr); @@ -587,7 +587,7 @@ class html_table extends html * * @param array Row attributes */ - private function add_row($attr = array()) + public function add_row($attr = array()) { $this->rowindex++; $this->colindex = 0; @@ -612,7 +612,7 @@ class html_table extends html if (!empty($this->header)) { $rowcontent = ''; foreach ($this->header as $c => $col) { - $rowcontent .= self::tag('th', $col->attrib, $col->content); + $rowcontent .= self::tag('td', $col->attrib, $col->content); } $thead = self::tag('thead', null, self::tag('tr', null, $rowcontent)); } @@ -624,7 +624,7 @@ class html_table extends html } if ($r < $this->rowindex || count($row->cells)) { - $tbody .= self::tag('tr', $rows->attrib, $rowcontent); + $tbody .= self::tag('tr', $row->attrib, $rowcontent); } } diff --git a/program/include/iniset.php b/program/include/iniset.php index 5072d636c..5dacf8552 100755 --- a/program/include/iniset.php +++ b/program/include/iniset.php @@ -22,7 +22,7 @@ // application constants -define('RCMAIL_VERSION', '0.1-trunk'); +define('RCMAIL_VERSION', '0.2-trunk'); define('RCMAIL_CHARSET', 'UTF-8'); define('JS_OBJECT_NAME', 'rcmail'); diff --git a/program/include/main.inc b/program/include/main.inc index cdcc710cc..73b9c4124 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -105,51 +105,6 @@ function rcube_label($p) /** - * Load virtuser table in array - * - * @return array Virtuser table entries - */ -function rcmail_getvirtualfile() - { - global $CONFIG; - if (empty($CONFIG['virtuser_file']) || !is_file($CONFIG['virtuser_file'])) - return FALSE; - - // read file - $a_lines = file($CONFIG['virtuser_file']); - return $a_lines; - } - - -/** - * Find matches of the given pattern in virtuser table - * - * @param string Regular expression to search for - * @return array Matching entries - */ -function rcmail_findinvirtual($pattern) - { - $result = array(); - $virtual = rcmail_getvirtualfile(); - if ($virtual==FALSE) - return $result; - - // check each line for matches - foreach ($virtual as $line) - { - $line = trim($line); - if (empty($line) || $line{0}=='#') - continue; - - if (eregi($pattern, $line)) - $result[] = $line; - } - - return $result; - } - - -/** * Overwrite action variable * * @param string New action value @@ -574,65 +529,46 @@ function template_exists($name) */ function rcube_table_output($attrib, $table_data, $a_show_cols, $id_col) { - global $DB; - - // allow the following attributes to be added to the <table> tag - $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id', 'cellpadding', 'cellspacing', 'border', 'summary')); + global $RCMAIL; - $table = '<table' . $attrib_str . ">\n"; + $table = new html_table(/*array('cols' => count($a_show_cols))*/); - // add table title - $table .= "<thead><tr>\n"; - + // add table header foreach ($a_show_cols as $col) - $table .= '<td class="'.$col.'">' . Q(rcube_label($col)) . "</td>\n"; - - $table .= "</tr></thead>\n<tbody>\n"; + $table->add_header($col, Q(rcube_label($col))); $c = 0; if (!is_array($table_data)) + { + $db = $RCMAIL->get_dbh(); + while ($table_data && ($sql_arr = $db->fetch_assoc($table_data))) { - while ($table_data && ($sql_arr = $DB->fetch_assoc($table_data))) - { - $zebra_class = $c%2 ? 'even' : 'odd'; - - $table .= sprintf('<tr id="rcmrow%d" class="contact '.$zebra_class.'">'."\n", $sql_arr[$id_col]); + $zebra_class = $c % 2 ? 'even' : 'odd'; + $table->add_row(array('id' => 'rcmrow' . $sql_arr[$id_col], 'class' => "contact $zebra_class")); // format each col foreach ($a_show_cols as $col) - { - $cont = Q($sql_arr[$col]); - $table .= '<td class="'.$col.'">' . $cont . "</td>\n"; - } - - $table .= "</tr>\n"; + $table->add($col, Q($sql_arr[$col])); + $c++; - } } + } else - { + { foreach ($table_data as $row_data) - { - $zebra_class = $c%2 ? 'even' : 'odd'; - - $table .= sprintf('<tr id="rcmrow%s" class="contact '.$zebra_class.'">'."\n", $row_data[$id_col]); + { + $zebra_class = $c % 2 ? 'even' : 'odd'; + $table->add_row(array('id' => 'rcmrow' . $row_data[$id_col], 'class' => "contact $zebra_class")); // format each col foreach ($a_show_cols as $col) - { - $cont = Q($row_data[$col]); - $table .= '<td class="'.$col.'">' . $cont . "</td>\n"; - } - - $table .= "</tr>\n"; + $table->add($col, Q($row_data[$col])); + $c++; - } } + } - // complete message table - $table .= "</tbody></table>\n"; - - return $table; + return $table->show($attrib); } @@ -674,29 +610,6 @@ function rcmail_get_edit_field($col, $value, $attrib, $type='text') /** - * Return the mail domain configured for the given host - * - * @param string IMAP host - * @return string Resolved SMTP host - */ -function rcmail_mail_domain($host) - { - global $CONFIG; - - $domain = $host; - if (is_array($CONFIG['mail_domain'])) - { - if (isset($CONFIG['mail_domain'][$host])) - $domain = $CONFIG['mail_domain'][$host]; - } - else if (!empty($CONFIG['mail_domain'])) - $domain = $CONFIG['mail_domain']; - - return $domain; - } - - -/** * Replace all css definitions with #container [def] * and remove css-inlined scripting * @@ -744,26 +657,6 @@ function rcmail_mod_css_styles($source, $container_id, $base_url = '') return $styles; } -/** - * Try to autodetect operating system and find the correct line endings - * - * @return string The appropriate mail header delimiter - */ -function rcmail_header_delm() -{ - global $CONFIG; - - // use the configured delimiter for headers - if (!empty($CONFIG['mail_header_delimiter'])) - return $CONFIG['mail_header_delimiter']; - else if (strtolower(substr(PHP_OS, 0, 3)=='win')) - return "\r\n"; - else if (strtolower(substr(PHP_OS, 0, 3)=='mac')) - return "\r\n"; - else - return "\n"; -} - /** * Compose a valid attribute string for HTML tags diff --git a/program/include/rcube_config.php b/program/include/rcube_config.php index 8e956de1e..5c744ba53 100644 --- a/program/include/rcube_config.php +++ b/program/include/rcube_config.php @@ -177,5 +177,46 @@ class rcube_config } + /** + * Try to autodetect operating system and find the correct line endings + * + * @return string The appropriate mail header delimiter + */ + public function header_delimiter() + { + // use the configured delimiter for headers + if (!empty($this->prop['mail_header_delimiter'])) + return $this->prop['mail_header_delimiter']; + else if (strtolower(substr(PHP_OS, 0, 3) == 'win')) + return "\r\n"; + else if (strtolower(substr(PHP_OS, 0, 3) == 'mac')) + return "\r\n"; + else + return "\n"; + } + + + + /** + * Return the mail domain configured for the given host + * + * @param string IMAP host + * @return string Resolved SMTP host + */ + public function mail_domain($host) + { + $domain = $host; + + if (is_array($this->prop['mail_domain'])) { + if (isset($this->prop['mail_domain'][$host])) + $domain = $this->prop['mail_domain'][$host]; + } + else if (!empty($this->prop['mail_domain'])) + $domain = $this->prop['mail_domain']; + + return $domain; + } + + } diff --git a/program/include/rcube_json_output.php b/program/include/rcube_json_output.php index a633f8555..678b1948a 100644 --- a/program/include/rcube_json_output.php +++ b/program/include/rcube_json_output.php @@ -34,7 +34,6 @@ class rcube_json_output private $texts = array(); private $commands = array(); - public $task = ''; public $ajax_call = true; @@ -43,7 +42,6 @@ class rcube_json_output */ public function __construct($task) { - $this->task = $task; $this->config = rcmail::get_instance()->config; } diff --git a/program/include/rcube_template.php b/program/include/rcube_template.php index 0c0a9211b..5834e42ab 100755 --- a/program/include/rcube_template.php +++ b/program/include/rcube_template.php @@ -32,7 +32,6 @@ class rcube_template extends rcube_html_page { var $app; var $config; - var $task = ''; var $framed = false; var $pagetitle = ''; var $env = array(); @@ -56,7 +55,7 @@ class rcube_template extends rcube_html_page $this->config = $this->app->config->all(); //$this->framed = $framed; - $this->task = $task; + $this->set_env('task', $task); // add common javascripts $javascript = 'var '.JS_OBJECT_NAME.' = new rcube_webmail();'; @@ -542,7 +541,7 @@ class rcube_template extends rcube_html_page return $ver; } if ($object=='pagetitle') { - $task = $this->task; + $task = $this->env['task']; $title = !empty($this->config['product_name']) ? $this->config['product_name'].' :: ' : ''; if (!empty($this->pagetitle)) { diff --git a/program/include/rcube_user.php b/program/include/rcube_user.php index c808d079e..5f970ec6a 100644 --- a/program/include/rcube_user.php +++ b/program/include/rcube_user.php @@ -362,7 +362,7 @@ class rcube_user if ($user_id = $dbh->insert_id(get_sequence_name('users'))) { - $mail_domain = rcmail_mail_domain($host); + $mail_domain = $rcmail->config->mail_domain($host); if ($user_email=='') $user_email = strpos($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain); @@ -420,7 +420,7 @@ class rcube_user static function email2user($email) { $user = $email; - $r = rcmail_findinvirtual("^$email"); + $r = self::findinvirtual("^$email"); for ($i=0; $i<count($r); $i++) { @@ -446,7 +446,7 @@ class rcube_user static function user2email($user) { $email = ""; - $r = rcmail_findinvirtual("$user$"); + $r = self::findinvirtual("$user$"); for ($i=0; $i<count($r); $i++) { @@ -461,6 +461,39 @@ class rcube_user return $email; } + + + /** + * Find matches of the given pattern in virtuser table + * + * @param string Regular expression to search for + * @return array Matching entries + */ + private static function findinvirtual($pattern) + { + $result = array(); + $virtual = null; + + if ($virtuser_file = rcmail::get_instance()->config->get('virtuser_file')) + $virtual = file($virtuser_file); + + if (empty($virtual)) + return $result; + + // check each line for matches + foreach ($virtual as $line) + { + $line = trim($line); + if (empty($line) || $line{0}=='#') + continue; + + if (eregi($pattern, $line)) + $result[] = $line; + } + + return $result; + } + } diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 718461ec2..af3f6e72f 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -1040,18 +1040,18 @@ function rcmail_deliver_message(&$message, $from, $mailto) function rcmail_send_mdn($uid) { - global $CONFIG, $USER, $IMAP; + global $RCMAIL, $IMAP; $message = new rcube_message($uid); if ($message->headers->mdn_to && !$message->headers->mdn_sent) { - $identity = $USER->get_identity(); + $identity = $RCMAIL->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 rcube_mail_mime(rcmail_header_delm()); + $compose = new rcube_mail_mime($RCMAIL->config->header_delimiter()); $compose->setParam(array( 'text_encoding' => 'quoted-printable', 'html_encoding' => 'quoted-printable', @@ -1067,21 +1067,21 @@ function rcmail_send_mdn($uid) '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'])), + 'Message-ID' => sprintf('<%s@%s>', md5(uniqid('rcmail'.rand(),true)), $RCMAIL->config->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']; + if ($agent = $RCMAIL->config->get('useragent')) + $headers['User-Agent'] = $agent; $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($message->headers->date, $CONFIG['date_long']) . "\r\n" . + "\t" . rcube_label("sent") . ': ' . format_date($message->headers->date, $RCMAIL->config->get('date_long')) . "\r\n" . "\r\n" . rcube_label("receiptnote") . "\r\n"; - $ua = !empty($CONFIG['useragent']) ? $CONFIG['useragent'] : "RoundCube Webmail (Version ".RCMAIL_VERSION.")"; + $ua = $RCMAIL->config->get('useragent', "RoundCube Webmail (Version ".RCMAIL_VERSION.")"); $report = "Reporting-UA: $ua\r\n"; if ($message->headers->to) diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 72ef9f4d6..3860c4fd0 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -113,7 +113,7 @@ function rcmail_attach_emoticons(&$mime_message) if (strlen($_POST['_draft_saveid']) > 3) $olddraftmessageid = get_input_value('_draft_saveid', RCUBE_INPUT_POST); -$message_id = sprintf('<%s@%s>', md5(uniqid('rcmail'.rand(),true)), rcmail_mail_domain($_SESSION['imap_host'])); +$message_id = sprintf('<%s@%s>', md5(uniqid('rcmail'.rand(),true)), $RCMAIL->config->mail_domain($_SESSION['imap_host'])); $savedraft = !empty($_POST['_draft']) ? TRUE : FALSE; // remove all scripts and act as called in frame @@ -207,7 +207,7 @@ if (!empty($_POST['_receipt'])) // additional headers if ($CONFIG['http_received_header']) { - $nldlm = rcmail_header_delm() . "\t"; + $nldlm = $RCMAIL->config->header_delimiter() . "\t"; $headers['Received'] = wordwrap('from ' . (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']).' ['.$_SERVER['HTTP_X_FORWARDED_FOR'].']'.$nldlm.' via ' : '') . gethostbyaddr($_SERVER['REMOTE_ADDR']).' ['.$_SERVER['REMOTE_ADDR'].']'.$nldlm.'with ' . @@ -232,7 +232,7 @@ $isHtmlVal = strtolower(get_input_value('_is_html', RCUBE_INPUT_POST)); $isHtml = ($isHtmlVal == "1"); // create extended PEAR::Mail_mime instance -$MAIL_MIME = new rcube_mail_mime(rcmail_header_delm()); +$MAIL_MIME = new rcube_mail_mime($RCMAIL->config->header_delimiter()); // For HTML-formatted messages, construct the MIME message with both // the HTML part and the plain-text part |