From 751b22b41f960971b966341a386dbf1fd8e2629a Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Fri, 02 Apr 2010 09:53:39 -0400
Subject: [PATCH] - Added optional (max_recipients) support to restrict total number of recipients per message (#1484542)

---
 CHANGELOG                               |    1 +
 program/localization/en_US/messages.inc |    1 +
 config/main.inc.php.dist                |    3 +++
 program/localization/pl_PL/messages.inc |    1 +
 program/steps/mail/sendmail.inc         |   31 ++++++++++++++++++++++---------
 5 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 11ce596..673f65f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Added optional (max_recipients) support to restrict total number of recipients per message (#1484542)
 - Re-organize editor buttons, add blockquote and search buttons
 - Make possible to write inside or after a quoted html message (#1485476)
 - Fix bugs on unexpected IMAP connection close (#1486190, #1486270)
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index 75110e4..6be1f1e 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -180,6 +180,9 @@
 // How many seconds must pass between emails sent by a user
 $rcmail_config['sendmail_delay'] = 0;
 
+// Maximum number of recipients per message. Default: 0 (no limit)
+$rcmail_config['max_recipients'] = 0; 
+
 // add this user-agent to message headers when sending
 $rcmail_config['useragent'] = 'RoundCube Webmail/'.RCMAIL_VERSION;
 
diff --git a/program/localization/en_US/messages.inc b/program/localization/en_US/messages.inc
index f87cfb5..1dfdb96 100644
--- a/program/localization/en_US/messages.inc
+++ b/program/localization/en_US/messages.inc
@@ -111,5 +111,6 @@
 $messages['smtprecipientserror'] = 'SMTP Error: Unable to parse recipients list';
 $messages['smtperror'] = 'SMTP Error: $msg';
 $messages['emailformaterror'] = 'Incorrect e-mail address: $email';
+$messages['toomanyrecipients'] = 'Too many recipients. Reduce the number of recipients to $max.';
 
 ?>
diff --git a/program/localization/pl_PL/messages.inc b/program/localization/pl_PL/messages.inc
index 250e3e6..796bad2 100644
--- a/program/localization/pl_PL/messages.inc
+++ b/program/localization/pl_PL/messages.inc
@@ -114,5 +114,6 @@
 $messages['invalidrequest'] = 'Błędne żądanie! Nie zapisano danych.';
 $messages['emailformaterror'] = 'Błędny adres e-mail: $email';
 $messages['notuploadedwarning'] = 'Nie wszystkie załączniki zostały pobrane. Poczekaj lub anuluj pobieranie.';
+$messages['toomanyrecipients'] = 'Zbyt wielu odbiorców. Zmniejsz ich liczbę do $max.';
 
 ?>
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index b89edc4..e9d2150 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -149,10 +149,10 @@
   return $body;
 }
 
-// parse email address input
-function rcmail_email_input_format($mailto)
+// parse email address input (and count addresses)
+function rcmail_email_input_format($mailto, $count=false)
 {
-  global $EMAIL_FORMAT_ERROR;
+  global $EMAIL_FORMAT_ERROR, $RECIPIENT_COUNT;
 
   $regexp = array('/[,;]\s*[\r\n]+/', '/[\r\n]+/', '/[,;]\s*$/m', '/;/', '/(\S{1})(<\S+@\S+>)/U');
   $replace = array(', ', ', ', '', ',', '\\1 \\2');
@@ -197,6 +197,10 @@
     }
   }
 
+  if ($count) {
+    $RECIPIENT_COUNT += count($result);
+  }
+
   return implode(', ', $result);
 }
 
@@ -212,10 +216,11 @@
 $message_charset = isset($_POST['_charset']) ? $_POST['_charset'] : $input_charset;
 
 $EMAIL_FORMAT_ERROR = NULL;
+$RECIPIENT_COUNT = 0;
 
-$mailto = rcmail_email_input_format(get_input_value('_to', RCUBE_INPUT_POST, TRUE, $message_charset));
-$mailcc = rcmail_email_input_format(get_input_value('_cc', RCUBE_INPUT_POST, TRUE, $message_charset));
-$mailbcc = rcmail_email_input_format(get_input_value('_bcc', RCUBE_INPUT_POST, TRUE, $message_charset));
+$mailto = rcmail_email_input_format(get_input_value('_to', RCUBE_INPUT_POST, TRUE, $message_charset), true);
+$mailcc = rcmail_email_input_format(get_input_value('_cc', RCUBE_INPUT_POST, TRUE, $message_charset), true);
+$mailbcc = rcmail_email_input_format(get_input_value('_bcc', RCUBE_INPUT_POST, TRUE, $message_charset), true);
 
 if ($EMAIL_FORMAT_ERROR) {
   $OUTPUT->show_message('emailformaterror', 'error', array('email' => $EMAIL_FORMAT_ERROR)); 
@@ -297,8 +302,17 @@
 if (!empty($mailbcc))
   $headers['Bcc'] = $mailbcc;
   
-if (!empty($identity_arr['bcc']))
+if (!empty($identity_arr['bcc'])) {
   $headers['Bcc'] = ($headers['Bcc'] ? $headers['Bcc'].', ' : '') . $identity_arr['bcc'];
+  $RECIPIENT_COUNT ++;
+}
+
+if (($max_recipients = (int) $RCMAIL->config->get('max_recipients')) > 0) {
+  if ($RECIPIENT_COUNT > $max_recipients) {
+    $OUTPUT->show_message('toomanyrecipients', 'error', array('max' => $max_recipients));
+    $OUTPUT->send('iframe');
+  }
+}
 
 // add subject
 $headers['Subject'] = trim(get_input_value('_subject', RCUBE_INPUT_POST, TRUE, $message_charset));
@@ -359,8 +373,7 @@
   $headers = $data['headers'];
 
 
-$isHtmlVal = strtolower(get_input_value('_is_html', RCUBE_INPUT_POST));
-$isHtml = ($isHtmlVal == "1");
+$isHtml = (bool) get_input_value('_is_html', RCUBE_INPUT_POST);
 
 // fetch message body
 $message_body = get_input_value('_message', RCUBE_INPUT_POST, TRUE, $message_charset);

--
Gitblit v1.9.1