793566f0 |
1 | <?php |
2 | |
3 | /** |
4 | * functions.php |
5 | * |
793566f0 |
6 | * Implementation of RFC 2369 for SquirrelMail. |
7 | * When viewing a message from a mailinglist complying with this RFC, |
8 | * this plugin displays a menu which gives the user a choice of mailinglist |
9 | * commands such as (un)subscribe, help and list archives. |
10 | * |
4b5049de |
11 | * @copyright © 1999-2007 The SquirrelMail Project Team |
4b4abf93 |
12 | * @license http://opensource.org/licenses/gpl-license.php GNU Public License |
793566f0 |
13 | * @version $Id$ |
14 | * @package plugins |
15 | * @subpackage listcommands |
16 | */ |
17 | |
e5f21a91 |
18 | /** |
19 | * Get current list of subscribed non-RFC-compliant mailing lists for logged-in user |
20 | * |
21 | * @return array The list of mailing list addresses, keyed by integer index |
22 | */ |
23 | function get_non_rfc_lists() { |
24 | global $username, $data_dir; |
25 | $lists = getPref($data_dir, $username, 'non_rfc_lists', array()); |
26 | $new_lists = array(); |
27 | if (!empty($lists)) { |
28 | $lists = explode(':', $lists); |
29 | foreach ($lists as $list) { |
30 | list($index, $list_addr) = explode('_', $list); |
31 | if ((!empty($index) || $index === '0') && !empty($list_addr)) |
32 | $new_lists[$index] = $list_addr; |
33 | } |
34 | } |
35 | $lists = $new_lists; |
36 | sort($lists); |
37 | return $lists; |
38 | } |
39 | |
40 | /** |
41 | * Show mailing list management option section on options page |
42 | */ |
43 | function plugin_listcommands_optpage_register_block_do() |
44 | { |
e5f21a91 |
45 | global $optpage_blocks, $listcommands_allow_non_rfc_list_management; |
46 | |
47 | // only allow management of non-RFC lists if admin deems necessary |
48 | // |
49 | @include_once(SM_PATH . 'plugins/listcommands/config.php'); |
50 | if (!$listcommands_allow_non_rfc_list_management) |
51 | return; |
52 | |
53 | $optpage_blocks[] = array( |
54 | 'name' => _("Mailing Lists"), |
55 | 'url' => '../plugins/listcommands/options.php', |
56 | '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."), |
57 | 'js' => false |
58 | ); |
59 | |
60 | } |
61 | |
f4f2d73f |
62 | /** |
63 | * internal function that builds mailing list links |
64 | */ |
793566f0 |
65 | function plugin_listcommands_menu_do() { |
fb0bcfdb |
66 | global $passed_id, $passed_ent_id, $mailbox, $message, |
e5f21a91 |
67 | $startMessage, $oTemplate, $listcommands_allow_non_rfc_list_management; |
68 | |
69 | @include_once(SM_PATH . 'plugins/listcommands/config.php'); |
793566f0 |
70 | |
71 | /** |
72 | * Array of commands we can deal with from the header. The Reply option |
73 | * is added later because we generate it using the Post information. |
74 | */ |
75 | $fieldsdescr = listcommands_fieldsdescr(); |
2e58d6af |
76 | $links = array(); |
793566f0 |
77 | |
78 | foreach ($message->rfc822_header->mlist as $cmd => $actions) { |
79 | |
80 | /* I don't know this action... skip it */ |
81 | if ( !array_key_exists($cmd, $fieldsdescr) ) { |
82 | continue; |
83 | } |
84 | |
85 | /* proto = {mailto,href} */ |
ba17b6c7 |
86 | $aActions = array_keys($actions); |
87 | $proto = array_shift($aActions); |
2253d920 |
88 | $act = array_shift($actions); |
793566f0 |
89 | |
6aef76f3 |
90 | if ($proto == 'mailto') { |
793566f0 |
91 | |
92 | if (($cmd == 'post') || ($cmd == 'owner')) { |
93 | $url = 'src/compose.php?'. |
94 | (isset($startMessage)?'startMessage='.$startMessage.'&':''); |
95 | } else { |
96 | $url = "plugins/listcommands/mailout.php?action=$cmd&"; |
97 | } |
a74103dd |
98 | $url .= 'send_to=' . str_replace('?','&', $act); |
793566f0 |
99 | |
e5f21a91 |
100 | $links[$cmd] = makeComposeLink($url, $fieldsdescr[$cmd]); |
793566f0 |
101 | |
102 | if ($cmd == 'post') { |
103 | if (!isset($mailbox)) |
104 | $mailbox = 'INBOX'; |
105 | $url .= '&passed_id='.$passed_id. |
106 | '&mailbox='.urlencode($mailbox). |
107 | (isset($passed_ent_id)?'&passed_ent_id='.$passed_ent_id:''); |
108 | $url .= '&smaction=reply'; |
109 | |
e5f21a91 |
110 | $links['reply'] = makeComposeLink($url, $fieldsdescr['reply']); |
793566f0 |
111 | } |
112 | } else if ($proto == 'href') { |
e5f21a91 |
113 | $links[$cmd] = create_hyperlink($act, $fieldsdescr[$cmd], '_blank'); |
114 | } |
115 | } |
116 | |
117 | |
118 | // allow non-rfc reply link if admin allows and message is from |
119 | // non-rfc list the user has configured |
120 | // |
121 | if ($listcommands_allow_non_rfc_list_management) { |
122 | |
123 | $non_rfc_lists = get_non_rfc_lists(); |
124 | |
125 | $recipients = formatRecipientString($message->rfc822_header->to, "to") . ' ' |
126 | . formatRecipientString($message->rfc822_header->cc, "cc") . ' ' |
127 | . formatRecipientString($message->rfc822_header->bcc, "bcc"); |
128 | |
129 | if (!in_array('post', array_keys($links))) { |
130 | |
131 | foreach ($non_rfc_lists as $non_rfc_list) { |
b5f6b945 |
132 | if (preg_match('/(^|,|<|\s)' . preg_quote($non_rfc_list) . '($|,|>|\s)/', $recipients)) { |
e5f21a91 |
133 | $url = 'src/compose.php?' |
134 | . (isset($startMessage)?'startMessage='.$startMessage.'&':'') |
135 | . 'send_to=' . str_replace('?','&', $non_rfc_list); |
136 | |
137 | $links['post'] = makeComposeLink($url, $fieldsdescr['post']); |
138 | |
139 | break; |
140 | } |
141 | } |
142 | |
793566f0 |
143 | } |
e5f21a91 |
144 | |
145 | if (!in_array('reply', array_keys($links))) { |
146 | |
147 | foreach ($non_rfc_lists as $non_rfc_list) { |
148 | if (preg_match('/(^|,|\s)' . preg_quote($non_rfc_list) . '($|,|\s)/', $recipients)) { |
149 | if (!isset($mailbox)) |
150 | $mailbox = 'INBOX'; |
151 | $url = 'src/compose.php?' |
152 | . (isset($startMessage)?'startMessage='.$startMessage.'&':'') |
153 | . 'send_to=' . str_replace('?','&', $non_rfc_list) |
154 | . '&passed_id='.$passed_id |
155 | . '&mailbox='.urlencode($mailbox) |
156 | . (isset($passed_ent_id)?'&passed_ent_id='.$passed_ent_id:'') |
157 | . '&smaction=reply'; |
158 | |
159 | $links['reply'] = makeComposeLink($url, $fieldsdescr['reply']); |
160 | |
161 | break; |
162 | } |
163 | } |
164 | |
165 | } |
166 | |
793566f0 |
167 | } |
168 | |
e5f21a91 |
169 | |
2e58d6af |
170 | if (count($links) > 0) { |
857b1ca4 |
171 | $oTemplate->assign('links', $links); |
2e58d6af |
172 | $output = $oTemplate->fetch('plugins/listcommands/read_body_header.tpl'); |
173 | return array('read_body_header' => $output); |
793566f0 |
174 | } |
2e58d6af |
175 | |
793566f0 |
176 | } |
177 | |
178 | /** |
179 | * Returns an array with the actions as translated strings. |
180 | * @return array action as key, translated string as value |
181 | */ |
182 | function listcommands_fieldsdescr() { |
183 | return array('post' => _("Post to List"), |
184 | 'reply' => _("Reply to List"), |
185 | 'subscribe' => _("Subscribe"), |
186 | 'unsubscribe' => _("Unsubscribe"), |
187 | 'archive' => _("List Archives"), |
188 | 'owner' => _("Contact Listowner"), |
189 | 'help' => _("Help")); |
190 | } |
191 | |