From e5f21a9121fd5ad2d5456201059c648849e34504 Mon Sep 17 00:00:00 2001 From: pdontthink Date: Sat, 13 Jan 2007 07:34:17 +0000 Subject: [PATCH] Add ability for listcommands plugin to show reply and post links for user-configured non-RFC 2369-compliant lists; admin must enable by configuring plugin. git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@12115 7612ce4b-ef26-0410-bec9-ea0150e637f0 --- ChangeLog | 3 + plugins/listcommands/README | 8 ++- plugins/listcommands/functions.php | 109 +++++++++++++++++++++++++++-- plugins/listcommands/setup.php | 11 +++ 4 files changed, 126 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index c605b579..ddfa7529 100644 --- a/ChangeLog +++ b/ChangeLog @@ -172,6 +172,9 @@ Version 1.5.2 - CVS - Add warning about magic_quotes_* in configtest. - Unify accepted versions for imap_server_type and set_defaults (#1629722). - Improve attachment temp file creation. + - Add ability for listcommands plugin to show post and reply links for + user-configured non-RFC 2369-compliant lists; admin must enable by + configuring plugin. Version 1.5.1 (branched on 2006-02-12) -------------------------------------- diff --git a/plugins/listcommands/README b/plugins/listcommands/README index c407be72..88851d9a 100644 --- a/plugins/listcommands/README +++ b/plugins/listcommands/README @@ -22,11 +22,17 @@ The information in these headers is used to generate an extra menuline on messages containing one or more of these headers to help users taking advantage of the features offered. +For mailing list subscriptions to non-RFC-compliant lists, the administrator +may allow users to manage a list of mailing list addresses for which they want +to show a "reply to list" link when replying to messages on such lists. + Installation ============ -Go to the main directory, run configure and add the plugin. +Go to the main directory, run configure and add the plugin. In order to enable +optional features such as user management of subscriptions to non-RFC-compliant +lists, copy config_sample.php to config.php and edit that file as desired. Acknowledgements diff --git a/plugins/listcommands/functions.php b/plugins/listcommands/functions.php index d617cee0..c51c615f 100644 --- a/plugins/listcommands/functions.php +++ b/plugins/listcommands/functions.php @@ -15,11 +15,59 @@ * @subpackage listcommands */ +/** + * Get current list of subscribed non-RFC-compliant mailing lists for logged-in user + * + * @return array The list of mailing list addresses, keyed by integer index + */ +function get_non_rfc_lists() { + global $username, $data_dir; + $lists = getPref($data_dir, $username, 'non_rfc_lists', array()); + $new_lists = array(); + if (!empty($lists)) { + $lists = explode(':', $lists); + foreach ($lists as $list) { + list($index, $list_addr) = explode('_', $list); + if ((!empty($index) || $index === '0') && !empty($list_addr)) + $new_lists[$index] = $list_addr; + } + } + $lists = $new_lists; + sort($lists); + return $lists; +} + +/** + * Show mailing list management option section on options page + */ +function plugin_listcommands_optpage_register_block_do() +{ + + global $optpage_blocks, $listcommands_allow_non_rfc_list_management; + + // only allow management of non-RFC lists if admin deems necessary + // + @include_once(SM_PATH . 'plugins/listcommands/config.php'); + if (!$listcommands_allow_non_rfc_list_management) + return; + + $optpage_blocks[] = array( + 'name' => _("Mailing Lists"), + 'url' => '../plugins/listcommands/options.php', + 'desc' => _("Manage the (non-RFC-compliant) mailing lists that you are subscribed to for the purpose of providing one-click list replies when responding to list messages."), + 'js' => false + ); + +} + /** * internal function that builds mailing list links */ function plugin_listcommands_menu_do() { - global $passed_id, $passed_ent_id, $color, $mailbox, $message, $startMessage, $oTemplate; + global $passed_id, $passed_ent_id, $color, $mailbox, $message, + $startMessage, $oTemplate, $listcommands_allow_non_rfc_list_management; + + @include_once(SM_PATH . 'plugins/listcommands/config.php'); /** * Array of commands we can deal with from the header. The Reply option @@ -50,7 +98,7 @@ function plugin_listcommands_menu_do() { } $url .= 'send_to=' . str_replace('?','&', $act); - $links[] = makeComposeLink($url, $fieldsdescr[$cmd]); + $links[$cmd] = makeComposeLink($url, $fieldsdescr[$cmd]); if ($cmd == 'post') { if (!isset($mailbox)) @@ -60,13 +108,66 @@ function plugin_listcommands_menu_do() { (isset($passed_ent_id)?'&passed_ent_id='.$passed_ent_id:''); $url .= '&smaction=reply'; - $links[] = makeComposeLink($url, $fieldsdescr['reply']); + $links['reply'] = makeComposeLink($url, $fieldsdescr['reply']); } } else if ($proto == 'href') { - $links[] = create_hyperlink($act, $fieldsdescr[$cmd], '_blank'); + $links[$cmd] = create_hyperlink($act, $fieldsdescr[$cmd], '_blank'); + } + } + + + // allow non-rfc reply link if admin allows and message is from + // non-rfc list the user has configured + // + if ($listcommands_allow_non_rfc_list_management) { + + $non_rfc_lists = get_non_rfc_lists(); + + $recipients = formatRecipientString($message->rfc822_header->to, "to") . ' ' + . formatRecipientString($message->rfc822_header->cc, "cc") . ' ' + . formatRecipientString($message->rfc822_header->bcc, "bcc"); + + if (!in_array('post', array_keys($links))) { + + foreach ($non_rfc_lists as $non_rfc_list) { + if (preg_match('/(^|,|\s)' . preg_quote($non_rfc_list) . '($|,|\s)/', $recipients)) { + $url = 'src/compose.php?' + . (isset($startMessage)?'startMessage='.$startMessage.'&':'') + . 'send_to=' . str_replace('?','&', $non_rfc_list); + + $links['post'] = makeComposeLink($url, $fieldsdescr['post']); + + break; + } + } + } + + if (!in_array('reply', array_keys($links))) { + + foreach ($non_rfc_lists as $non_rfc_list) { + if (preg_match('/(^|,|\s)' . preg_quote($non_rfc_list) . '($|,|\s)/', $recipients)) { + if (!isset($mailbox)) + $mailbox = 'INBOX'; + $url = 'src/compose.php?' + . (isset($startMessage)?'startMessage='.$startMessage.'&':'') + . 'send_to=' . str_replace('?','&', $non_rfc_list) + . '&passed_id='.$passed_id + . '&mailbox='.urlencode($mailbox) + . (isset($passed_ent_id)?'&passed_ent_id='.$passed_ent_id:'') + . '&smaction=reply'; + + $links['reply'] = makeComposeLink($url, $fieldsdescr['reply']); + + break; + } + } + + } + } + if (count($links) > 0) { $oTemplate->assign('links', $links); $output = $oTemplate->fetch('plugins/listcommands/read_body_header.tpl'); diff --git a/plugins/listcommands/setup.php b/plugins/listcommands/setup.php index 18dc40ca..50b3add1 100644 --- a/plugins/listcommands/setup.php +++ b/plugins/listcommands/setup.php @@ -22,6 +22,8 @@ function squirrelmail_plugin_init_listcommands () { global $squirrelmail_plugin_hooks; $squirrelmail_plugin_hooks['template_construct_read_headers.tpl']['listcommands'] = 'plugin_listcommands_menu'; + $squirrelmail_plugin_hooks['optpage_register_block']['listcommands'] = 'plugin_listcommands_optpage_register_block'; + } /** @@ -31,3 +33,12 @@ function plugin_listcommands_menu() { include_once(SM_PATH . 'plugins/listcommands/functions.php'); return plugin_listcommands_menu_do(); } + + +/** + * Show mailing list management option section on options page + */ +function plugin_listcommands_optpage_register_block() { + include_once(SM_PATH . 'plugins/listcommands/functions.php'); + plugin_listcommands_optpage_register_block_do(); +} -- 2.25.1