From 75969686c23575e61f306ae4502f132968848096 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Mon, 10 Aug 2009 17:32:44 -0400
Subject: [PATCH] Added 'message_compose' hook

---
 CHANGELOG                      |    1 
 program/include/main.inc       |   28 ++++++++++++-
 program/steps/mail/compose.inc |   59 +++++++++++++++++------------
 3 files changed, 61 insertions(+), 27 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index dc16c53..6a79079 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Added 'message_compose' hook
 - Added 'imap_connect' hook (#1485956)
 - Fix vcard_attachments plugin (#1486035)
 - Updated PEAR::Auth_SASL to 1.0.3 version
diff --git a/program/include/main.inc b/program/include/main.inc
index 9401e28..ce27b75 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -545,7 +545,7 @@
  * @return string   Field value or NULL if not available
  */
 function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL)
-  {
+{
   global $OUTPUT;
   $value = NULL;
   
@@ -582,7 +582,26 @@
     return rcube_charset_convert($value, $OUTPUT->get_charset(), $charset);
   else
     return $value;
+}
+
+/**
+ * Convert array of request parameters (prefixed with _)
+ * to a regular array with non-prefixed keys.
+ *
+ * @param  int   Source to get value from (GPC)
+ * @return array Hash array with all request parameters
+ */
+function request2param($mode = RCUBE_INPUT_GPC)
+{
+  $out = array();
+  $src = $mode == RCUBE_INPUT_GET ? $_GET : ($mode == RCUBE_INPUT_POST ? $_POST : $_REQUEST);
+  foreach ($src as $key => $value) {
+    $fname = $key[0] == '_' ? substr($key, 1) : $key;
+    $out[$fname] = get_input_value($key, $mode);
   }
+  
+  return $out;
+}
 
 /**
  * Remove all non-ascii and non-word chars
@@ -958,8 +977,11 @@
   {
   $args = func_get_args();
 
-  if (class_exists('rcmail', false))
-    rcmail::get_instance()->plugins->exec_hook('console', $args);
+  if (class_exists('rcmail', false)) {
+    $rcmail = rcmail::get_instance();
+    if (is_object($rcmail->plugins))
+      $rcmail->plugins->exec_hook('console', $args);
+  }
 
   $msg = array();
   foreach ($args as $arg)
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index d178401..5d5a949 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -38,20 +38,24 @@
   rcmail_compose_cleanup();
   $_SESSION['compose'] = array(
     'id' => uniqid(rand()),
-    'param' => array_map('strip_tags', $_GET),
+    'param' => request2param(RCUBE_INPUT_GET),
     'mailbox' => $IMAP->get_mailbox_name(),
   );
   
   // process values like "mailto:foo@bar.com?subject=new+message&cc=another"
-  if ($_SESSION['compose']['param']['_to']) {
-    $mailto = explode('?', $_SESSION['compose']['param']['_to']);
+  if ($_SESSION['compose']['param']['to']) {
+    $mailto = explode('?', $_SESSION['compose']['param']['to']);
     if (count($mailto) > 1) {
-      $_SESSION['compose']['param']['_to'] = $mailto[0];
+      $_SESSION['compose']['param']['to'] = $mailto[0];
       parse_str($mailto[1], $query);
       foreach ($query as $f => $val)
-        $_SESSION['compose']['param']["_$f"] = $val;
+        $_SESSION['compose']['param'][$f] = $val;
     }
   }
+  
+  // pipe compose parameters thru plugins
+  $plugin = $RCMAIL->plugins->exec_hook('message_compose', $_SESSION['compose']);
+  $_SESSION['compose']['param'] = $plugin['param'];
 
   // redirect to a unique URL with all parameters stored in session
   $OUTPUT->redirect(array('_action' => 'compose', '_id' => $_SESSION['compose']['id']));
@@ -71,13 +75,13 @@
 $OUTPUT->set_env('mailbox', $IMAP->get_mailbox_name());
 
 // get reference message and set compose mode
-if ($msg_uid = $_SESSION['compose']['param']['_reply_uid'])
+if ($msg_uid = $_SESSION['compose']['param']['reply_uid'])
   $compose_mode = RCUBE_COMPOSE_REPLY;
-else if ($msg_uid = $_SESSION['compose']['param']['_forward_uid'])
+else if ($msg_uid = $_SESSION['compose']['param']['forward_uid'])
   $compose_mode = RCUBE_COMPOSE_FORWARD;
-else if ($msg_uid = $_SESSION['compose']['param']['_uid'])
+else if ($msg_uid = $_SESSION['compose']['param']['uid'])
   $compose_mode = RCUBE_COMPOSE_EDIT;
-else if ($msg_uid = $_SESSION['compose']['param']['_draft_uid']) {
+else if ($msg_uid = $_SESSION['compose']['param']['draft_uid']) {
   $RCMAIL->imap->set_mailbox($CONFIG['drafts_mbox']);
   $compose_mode = RCUBE_COMPOSE_DRAFT;
 }
@@ -98,7 +102,7 @@
     $_SESSION['compose']['reply_msgid'] = $MESSAGE->headers->messageID;
     $_SESSION['compose']['references']  = trim($MESSAGE->headers->references . " " . $MESSAGE->headers->messageID);
 
-    if (!empty($_SESSION['compose']['param']['_all']))
+    if (!empty($_SESSION['compose']['param']['all']))
       $MESSAGE->reply_all = 1;
   }
   else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
@@ -138,23 +142,23 @@
 
     case 'to':
       $fname = '_to';
-      $header = 'to';
+      $header = $param = 'to';
       
       // we have a set of recipients stored is session
-      if (($mailto_id = $_SESSION['compose']['param']['_mailto']) && $_SESSION['mailto'][$mailto_id])
+      if (($mailto_id = $_SESSION['compose']['param']['mailto']) && $_SESSION['mailto'][$mailto_id])
         $fvalue = urldecode($_SESSION['mailto'][$mailto_id]);
       
     case 'cc':
       if (!$fname)
       {
         $fname = '_cc';
-        $header = 'cc';
+        $header = $param = 'cc';
       }
     case 'bcc':
       if (!$fname)
       {
         $fname = '_bcc';
-        $header = 'bcc';
+        $header = $param = 'bcc';
       }
         
       $allow_attrib = array('id', 'class', 'style', 'cols', 'rows', 'tabindex');
@@ -164,17 +168,19 @@
     case 'replyto':
     case 'reply-to':
       $fname = '_replyto';
+      $param = 'replyto';
       $allow_attrib = array('id', 'class', 'style', 'size', 'tabindex');
       $field_type = 'html_inputfield';
       break;
   }
  
-  if ($fname && !empty($_POST[$fname]))
+  if ($fname && !empty($_POST[$fname])) {
     $fvalue = get_input_value($fname, RCUBE_INPUT_POST, TRUE);
-  else if ($fname && !$fvalue && !empty($_SESSION['compose']['param'][$fname]))
-    $fvalue = $_SESSION['compose']['param'][$fname];
-  else if ($header && $compose_mode == RCUBE_COMPOSE_REPLY)
-  {
+  }
+  else if ($fname && !$fvalue && !empty($_SESSION['compose']['param'][$param])) {
+    $fvalue = $_SESSION['compose']['param'][$param];
+  }
+  else if ($header && $compose_mode == RCUBE_COMPOSE_REPLY) {
     // get recipent address(es) out of the message headers
     if ($header=='to' && !empty($MESSAGE->headers->replyto))
       $fvalue = $MESSAGE->headers->replyto;
@@ -298,7 +304,7 @@
       $select_from->add(format_email_recipient($sql_arr['email'], $sql_arr['name']), $identity_id);
 
       // add signature to array
-      if (!empty($sql_arr['signature']) && empty($_SESSION['compose']['param']['_nosig']))
+      if (!empty($sql_arr['signature']) && empty($_SESSION['compose']['param']['nosig']))
       {
         $a_signatures[$identity_id]['text'] = $sql_arr['signature'];
         $a_signatures[$identity_id]['is_html'] = ($sql_arr['html_signature'] == 1) ? true : false;
@@ -369,6 +375,11 @@
   {
     $body = get_input_value('_message', RCUBE_INPUT_POST, true);
   }
+  else if ($_SESSION['compose']['param']['body'])
+  {
+    $body = $_SESSION['compose']['param']['body'];
+    $isHtml = false;
+  }
   else if ($compose_mode)
   {
     if (($isHtml || $compose_mode == RCUBE_COMPOSE_DRAFT) && $MESSAGE->has_html_part())
@@ -392,9 +403,9 @@
     else if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT)
       $body = rcmail_create_draft_body($body, $isHtml);
   }
-  else if (!empty($_SESSION['compose']['param']['_body']))
+  else if (!empty($_SESSION['compose']['param']['body']))
   {
-    $body = $_SESSION['compose']['param']['_body'];
+    $body = $_SESSION['compose']['param']['body'];
   }
 
   $out = $form_start ? "$form_start\n" : '';
@@ -719,8 +730,8 @@
   else if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT) {
     $subject = $MESSAGE->subject;
   }
-  else if (!empty($_SESSION['compose']['param']['_subject'])) {
-    $subject = $_SESSION['compose']['param']['_subject'];
+  else if (!empty($_SESSION['compose']['param']['subject'])) {
+    $subject = $_SESSION['compose']['param']['subject'];
   }
   
   $out = $form_start ? "$form_start\n" : '';

--
Gitblit v1.9.1