DMail Milestone 1.0
Drupal Mail Client
|
00001 <?php 00002 // $Id: 9e0a1681651377a468f85634ecd816d5592e96d7 $ 00003 00009 /* 00010 * Required supporting libraries. 00011 */ 00012 require_once 'lib/imap/imap.lib'; 00013 require_once 'dmail.db.inc'; 00014 00015 /* 00016 * Constants. 00017 */ 00021 define ('DMAIL_DEBUG', FALSE); 00022 00029 define ('DMAIL_NL', mfn_dmail_production_mode() ? NULL : "\r\n"); 00030 00034 define ('DMAIL_ADMIN_ROLE', 'dmail administration'); 00035 00039 define ('DMAIL_ACCESS_ROLE', 'dmail access'); 00040 00044 define ('DMAIL_POST_ROLE', 'dmail post to node'); 00045 00046 // Default settings for the admin/settings/dmail page. 00050 define ('DMAIL_DEFAULT_HOST', 'localhost'); 00051 00055 define ('DMAIL_DEFAULT_PORT', 143); 00056 00060 define ('DMAIL_DEFAULT_INBOX', 'INBOX'); 00061 00065 define ('DMAIL_DEFAULT_TOPLEVEL_FOLDERS', FALSE); 00066 00070 define ('DMAIL_DEFAULT_ITEMS_ORDERBY', 'received'); 00071 00075 define ('DMAIL_DEFAULT_ITEMS_SORTDIR', 'desc'); 00076 00080 define ('DMAIL_DEFAULT_DELIM', '.'); 00081 00085 define ('DMAIL_DEFAULT_SERVICE', 'imap'); 00086 00090 define ('DMAIL_DEFAULT_ENCRYPT', 'none'); 00091 00095 define ('DMAIL_DEFAULT_VALIDATE_CERT', 'no'); 00096 00100 define ('DMAIL_DEFAULT_EXPUNGE', 'no'); 00101 00105 define ('DMAIL_DEFAULT_READONLY', 'no'); 00106 00110 define ('DMAIL_DEFAULT_MOVE_DELETED', 'yes'); 00111 00115 define ('DMAIL_DEFAULT_CHECK_MAIL_FREQ', 60); 00116 00120 define ('DMAIL_DEFAULT_BODY_CHAR_WRAP', 78); 00121 00127 function dmail_init() { 00128 global $user; 00129 drupal_add_js(drupal_get_path('module', 'dmail') . '/dmail.js'); 00130 $settings = array( 00131 'refresh' => array( 00132 'path' => url('user/' . $user->uid . '/email/refresh'), 00133 'refreshNext' => duvar_get('lastRefresh', 0) + duvar_get('safeRefreshThreshold', 600) 00134 ), 00135 ); 00136 drupal_add_js(array('dmail' => $settings), 'setting'); 00137 mfn_dmail_theme_block_init(); 00138 } 00139 00143 function dmail_perm() { 00144 $perms = array( 00145 DMAIL_ADMIN_ROLE, 00146 DMAIL_ACCESS_ROLE, 00147 DMAIL_POST_ROLE, 00148 ); 00149 return $perms; 00150 } 00151 00155 function dmail_menu() { 00156 $items = array( 00157 'admin/dmail/settings' => array( 00158 'title' => 'Mail Client', 00159 'page callback' => 'drupal_get_form', 00160 'page arguments' => array('dmail_settings'), 00161 'access arguments' => array(array(DMAIL_ADMIN_ROLE, 'administer site configuration')), 00162 'file' => 'dmail.admin.inc', 00163 ), 00164 'user/%/email/identities' => array( 00165 'title' => 'Email', 00166 'description' => 'User\'s email', 00167 'page callback' => 'dmail_user_identities', 00168 'page arguments' => array(1), 00169 'access callback' => 'mfn_dmail_access', 00170 'access arguments' => array(1), 00171 'file' => 'dmail.user.inc', 00172 'type' => MENU_LOCAL_TASK, 00173 ), 00174 'user/%/email/identities/view' => array( 00175 'title' => 'Identities', 00176 'description' => 'User\'s identities', 00177 'type' => MENU_DEFAULT_LOCAL_TASK, 00178 'weight' => 0, 00179 ), 00180 'user/%/email/identities/add' => array( 00181 'title' => 'New Identity', 00182 'description' => 'Add a new identity.', 00183 'page callback' => 'dmail_user_identities_add', 00184 'page arguments' => array(1), 00185 'access arguments' => array(DMAIL_ACCESS_ROLE), 00186 'file' => 'dmail.user.inc', 00187 'type' => MENU_LOCAL_TASK, 00188 ), 00189 'user/%/email/settings' => array( 00190 'title' => 'Settings', 00191 'description' => 'Control how your mail client acts', 00192 'page callback' => 'dmail_user_settings', 00193 'page arguments' => array(1), 00194 'access arguments' => array(DMAIL_ACCESS_ROLE), 00195 'file' => 'dmail.settings.inc', 00196 'type' => MENU_LOCAL_TASK, 00197 ), 00198 'user/%/email/signatures' => array( 00199 'title' => 'Signatures', 00200 'description' => 'Create signatures for your mail posts.', 00201 'page callback' => 'dmail_user_signatures', 00202 'access arguments' => array(DMAIL_ACCESS_ROLE), 00203 'file' => 'dmail.signatures.inc', 00204 'type' => MENU_LOCAL_TASK, 00205 'weight' => 10, 00206 ), 00207 'user/%/email/signatures/view' => array( 00208 'title' => 'Signatures', 00209 'description' => 'User\'s identities', 00210 'type' => MENU_DEFAULT_LOCAL_TASK, 00211 'weight' => 0, 00212 ), 00213 'user/%/email/signatures/add' => array( 00214 'title' => 'Add', 00215 'description' => 'Add a new signature.', 00216 'page callback' => 'dmail_user_signatures_add', 00217 'page arguments' => array(1), 00218 'access arguments' => array(DMAIL_ACCESS_ROLE), 00219 'file' => 'dmail.signatures.inc', 00220 'type' => MENU_LOCAL_TASK, 00221 'weight' => 20, 00222 ), 00223 'user/%/email/refresh' => array( 00224 'title' => 'Dmail Refresh', 00225 'description' => 'Refresh the identities mailbox data.', 00226 'page callback' => 'mfn_dmail_refresh', 00227 'access arguments' => array(DMAIL_ACCESS_ROLE), 00228 'file' => 'dmail.user.inc', 00229 'type' => MENU_CALLBACK, 00230 ), 00231 'user/%/email/%' => array( 00232 'title' => 'Dmail Director', 00233 'description' => 'Direct the page output for the dmail module.', 00234 'page callback' => 'mfn_dmail_callback_director', 00235 'access arguments' => array(DMAIL_ACCESS_ROLE), 00236 'file' => 'dmail.user.inc', 00237 'type' => MENU_CALLBACK, 00238 ), 00239 ); 00240 return $items; 00241 } 00242 00246 function dmail_block($op = 'list', $delta = 0, $edit = array()) { 00247 global $user; 00248 if (mfn_dmail_access($user->uid)) { 00249 switch ($op) { 00250 case 'list': { 00251 return array( 00252 'dmail identities' => array( 00253 'info' => t('Email'), 00254 'cache' => BLOCK_NO_CACHE, 00255 'status' => 1, 00256 'region' => 'left', 00257 'roles' => array('dmail user'), 00258 'visibility' => '0', 00259 'pages' => NULL, 00260 ), 00261 ); 00262 } break; 00263 case 'view': { 00264 return array( 00265 'subject' => t('Email'), 00266 'content' => mfn_dmail_block_identities(), 00267 ); 00268 } break; 00269 } 00270 } 00271 } 00272 00276 function dmail_theme() { 00277 return array( 00278 'mfm_dmail_identities' => array( 00279 'arguments' => array('form' => NULL), 00280 ), 00281 'mfm_dmail_display_headers' => array( 00282 'arguments' => array('form' => NULL), 00283 ), 00284 'mfm_dmail_signatures' => array( 00285 'arguments' => array('form' => NULL), 00286 ), 00287 ); 00288 } 00289 00299 function mfn_dmail_is_valid_service($values) { 00300 global $imap; 00301 $user =& $values['user']; 00302 $pass =& $values['pass']; 00303 $host =& $values['host']; 00304 $port =& $values['port']; 00305 $service =& $values['service']; 00306 $inbox =& $values['inbox']; 00307 $delim =& $values['delim']; 00308 $encrypt =& $values['encrypt']; 00309 $validate =& $values['validate_cert']; 00310 $readonly =& $values['readonly']; 00311 $imap = new IMAP($user, $pass, $host, $port, $service, $delim, $encrypt, $validate, $readonly); 00312 $open = $imap->open(); 00313 return is_resource($open); 00314 } 00315 00335 function mfn_dmail_debug($file, $line, $function, $var, $data) { 00336 if (DMAIL_DEBUG) { 00337 watchdog('dmailDebug', "%svar:>%sdata<: %sfile, %dline, %sfunction, ", array('%sfile' => $file, '%dline' => $line, '%sfunction' => $function, '%svar' => $var, '%sdata' => _mfn_dmail_debug_data($data))); 00338 } 00339 } 00340 00344 function _mfn_dmail_debug_data($data) { 00345 if ($data === FALSE) { 00346 return '(bool)FALSE'; 00347 } 00348 elseif ($data === TRUE) { 00349 return '(bool)TRUE'; 00350 } 00351 elseif ($data === NULL) { 00352 return 'NULL'; 00353 } 00354 elseif ($data === '') { 00355 return '(string)EMPTY'; 00356 } 00357 else { 00358 return print_r($data, TRUE); 00359 } 00360 } 00361 00362 function mfn_dmail_datetime($str) { 00363 $utime = strtotime($str); 00364 $cnv = date('Y-m-d H:i:s', $utime); 00365 return $cnv; 00366 } 00367 00375 function mfn_dmail_tablesort_sql($header, $before = '') { 00376 $ts = tablesort_init($header); 00377 if ($ts['sql']) { 00378 // Based on code from db_escape_table(), but this can also contain a dot. 00379 $field = preg_replace('/[^A-Za-z0-9_.]+/', '', $ts['sql']); 00380 00381 // Sort order can only be ASC or DESC. 00382 $sort = drupal_strtoupper($ts['sort']); 00383 $sort = in_array($sort, array('ASC', 'DESC')) ? $sort : ''; 00384 00385 return " ORDER BY $before `$field` $sort"; 00386 } 00387 } 00388 00427 function mfn_dmail_l($link, $title = NULL, $desc = NULL, $attributes = array(), $options = array(), $image = NULL) { 00428 global $user; 00429 if (is_array($link)) { 00430 $args = $link; 00431 $link = ($args['href'] ? $args['href'] : $args['url']); 00432 $title =& $args['title']; 00433 $desc =& $args['description']; 00434 $attributes =& $args['attributes']; 00435 $options =& $args['options']; 00436 $image =& $args['image']; 00437 } 00438 if ($desc && empty($attributes['title'])) { 00439 if (is_array($desc)) { 00440 $data = $desc['data']; 00441 $desc = $desc['description']; 00442 $attributes['title'] = t($desc, $data); 00443 } 00444 else { 00445 $attributes['title'] = t($desc); 00446 } 00447 } 00448 if (empty($options['attributes'])) { 00449 $options['attributes'] = $attributes; 00450 } 00451 if ($image) { 00452 if (is_array($image)) { 00453 $itype =& $image['type']; 00454 $ifile =& $image['file']; 00455 $ipos =& $image['position']; 00456 switch ($itype) { 00457 case 'action': { 00458 $image = "actions/{$ifile}"; 00459 } break; 00460 case 'folder': { 00461 $image = "folders/{$ifile}"; 00462 } break; 00463 case 'mime': { 00464 $image = "mimetypes/{$ifile}"; 00465 } break; 00466 default: { 00467 $image = ($itype) ? "{$itype}/{$ifile}" : $ifile; 00468 } 00469 } 00470 } 00471 $path = dirname(__FILE__) . "/images/{$image}"; 00472 if (file_exists($path)) { 00473 list($width, $height) = getimagesize($path); 00474 $alt = $title; 00475 $title = $attributes['title']; 00476 $path = drupal_get_path('module', 'dmail') . "/images/{$image}"; 00477 $attributes['width'] = $width; 00478 $attributes['height'] = $height; 00479 if ($ipos) { 00480 switch ($ipos) { 00481 case 'prefix': { 00482 $title = theme_image($path, $alt, $title, $attributes, FALSE) . ' ' . $alt; 00483 } break; 00484 } 00485 } 00486 else { 00487 $title = ' ' . theme_image($path, $alt, $title, $attributes, FALSE); 00488 } 00489 $options['html'] = TRUE; 00490 } 00491 } 00492 return l(t($title), $link, $options); 00493 } 00494 00507 function mfn_dmail_access($user_id, $role = DMAIL_ACCESS_ROLE) { 00508 global $user; 00509 return user_access($role) && $user->uid === $user_id; 00510 } 00511 00521 function mfn_dmail_msgid($header) { 00522 return md5($header->from) . md5($header->message_id); 00523 } 00524 00537 function mfn_dmail_check_string($string, $encode_quotes = FALSE) { 00538 $mode = $encode_quotes ? ENT_QUOTES : ENT_NOQUOTES; 00539 return htmlspecialchars($string, $mode, 'UTF-8'); 00540 } 00541 00548 function mfn_dmail_block_identities() { 00549 global $user; 00550 $trees = NULL; 00551 $folders = array(); 00552 00553 $cache = dcache_get(array('active')); 00554 00555 $identities = mfn_dmail_db_identities_select(); 00556 $active_identity = mfn_dmail_get_active_identity(); 00557 $mpath = drupal_get_path('module', 'dmail'); 00558 00559 // Need to fold the System menu into the folders work below. 00560 if ($active_identity->id == 0) { 00561 $fimage = "<img src=\"/{$mpath}/images/folders/settings.png\" width=\"16\" height=\"16\"/>"; 00562 $tree = theme_menu_item(theme_menu_item_link(array('title' => $fimage . t(' Settings'), 'href' => 'user/' . $user->uid . '/email/settings', 'localized_options' => array('html' => TRUE))), FALSE); 00563 $new = mfn_dmail_l(array( 00564 'href' => 'user/' . $user->uid . '/email/signatures/add', 00565 'title' => '(New)', 00566 'image' => array('type' => 'action', 'file' => 'new_signature.png'), 00567 )); 00568 $fimage = "<img src=\"/{$mpath}/images/folders/signatures.png\" width=\"16\" height=\"16\"/>"; 00569 $tree .= theme_menu_item(theme_menu_item_link(array('title' => $fimage . t(' Signatures '), 'href' => 'user/' . $user->uid . '/email/signatures', 'localized_options' => array('html' => TRUE))) . $new, FALSE); 00570 $new = mfn_dmail_l(array( 00571 'href' => 'user/' . $user->uid . '/email/identities/add', 00572 'title' => '(New)', 00573 'image' => array('type' => 'action', 'file' => 'new_identity.png'), 00574 )); 00575 $fimage = "<img src=\"/{$mpath}/images/folders/identity.png\" width=\"16\" height=\"16\" />"; 00576 $tree .= theme_menu_item(theme_menu_item_link(array('title' => $fimage . t(' Identities '), 'href' => 'user/' . $user->uid . '/email/identities', 'localized_options' => array('html' => TRUE))) . $new, FALSE); 00577 $tree = theme_menu_tree($tree); 00578 $fimage = "<img src=\"/{$mpath}/images/folders/system.png\" width=\"16\" height=\"16\"/>"; 00579 $trees .= theme_menu_tree(theme_menu_item(theme_menu_item_link(array('title' => $fimage . t(' System'), 'href' => 'user/' . $user->uid . '/email/identities', 'localized_options' => array('html' => TRUE))), FALSE, $tree)); 00580 } 00581 else { 00582 $fimage = "<img src=\"/{$mpath}/images/folders/system.png\" width=\"16\" height=\"16\"/>"; 00583 $trees .= theme_menu_tree(theme_menu_item(theme_menu_item_link(array('title' => $fimage . t(' System'), 'href' => 'user/' . $user->uid . '/email/identities', 'localized_options' => array('html' => TRUE))), TRUE)); 00584 } 00585 00586 foreach ($identities as $identity) { 00587 if ($identity->id == $active_identity->id) { 00588 $mboxes = mfn_dmail_db_mboxes_select($identity->id); 00589 $folders = array(); 00590 foreach ($mboxes as $mbox) { 00591 $tfolders = explode($identity->delimiter, $mbox->name); 00592 $tlvlmbox = $tfolders[0]; 00593 if ($mbox->name === $tlvlmbox) { 00594 $tlevel = $tlvlmbox; 00595 $tobj = new stdClass; 00596 $tobj->id = $mbox->id; 00597 $tobj->identity_id = $mbox->identity_id; 00598 $tobj->name = $mbox->name; 00599 $tobj->attributes = $mbox->attributes; 00600 $tobj->flags = $mbox->flags; 00601 $tobj->parent = FALSE; 00602 $tobj->is_active_mbox = mfn_dmail_is_active_mbox($mbox); 00603 $tobj->is_active_parent = mfn_dmail_is_active_mbox_parent($mbox); 00604 $tobj->is_active_child = TRUE; 00605 $folders[$tlevel] = $tobj; 00606 } 00607 else { 00608 $tfolders = explode($identity->delimiter, $mbox->name); 00609 $tlvlmbox = $tfolders[0]; 00610 $tlevel = $tlvlmbox; 00611 foreach ($tfolders as $tfolder) { 00612 if ($tfolder === $tlvlmbox) { 00613 $folders[$tlevel]->parent = TRUE; 00614 } 00615 else { 00616 $tlevel .= $identity->delimiter . $tfolder; 00617 } 00618 if (empty($folders[$tlevel])) { 00619 $tobj = new stdClass; 00620 $tobj->id = $mbox->id; 00621 $tobj->identity_id = $mbox->identity_id; 00622 $tobj->name = substr($tlevel, strlen($tlvlmbox) + 1); 00623 $tobj->attributes = $mbox->attributes; 00624 $tobj->flags = $mbox->flags; 00625 $tobj->parent = FALSE; 00626 $tobj->is_active_mbox = mfn_dmail_is_active_mbox($mbox); 00627 $tobj->is_active_parent = mfn_dmail_is_active_mbox_parent($mbox); 00628 $tobj->is_active_child = mfn_dmail_is_active_mbox_child($mbox); 00629 $folders[$tlevel] = $tobj; 00630 } 00631 else { 00632 $folders[$tlevel]->parent = TRUE; 00633 } 00634 } 00635 } 00636 } 00637 mfn_dmail_natksort($folders); 00638 $tree = array(); 00639 foreach ($folders as $key => $folder) { 00640 $tfolders = explode($identity->delimiter, $key); 00641 $tkey = NULL; 00642 $tlevel = 0; 00643 while ($tfolder = array_shift($tfolders)) { 00644 $tkey = ($tkey) ? $tkey . $identity->delimiter . $tfolder : $tfolder; 00645 if ($key != $tkey) { 00646 $folders[$tkey]->parent = TRUE; 00647 } 00648 $folders[$tkey]->level = ++$tlevel; 00649 $folders[$tkey]->name = $tfolder; 00650 } 00651 } 00652 $identity->parent = TRUE; 00653 $identity->level = 0; 00654 mfn_dmail_block_item_link($identity, $tree); 00655 foreach ($folders as $folder) { 00656 mfn_dmail_block_item_link($folder, $tree); 00657 } 00658 $trees .= mfn_dmail_block_items($tree); 00659 } 00660 else { 00661 mfn_dmail_block_trees($identity, $trees); 00662 } 00663 } 00664 return $trees; 00665 } 00666 00670 function mfn_dmail_block_item($obj, &$tree, $treed = FALSE) { 00671 global $user; 00672 if (isset($obj->identity_id)) { 00673 if ($obj->parent) { 00674 $ttree = theme_menu_item( 00675 theme_menu_item_link( 00676 array( 00677 'title' => $obj->name, 00678 'href' => 'user/' . $user->uid . '/email/' . $obj->identity_id . '/mbox/' . $obj->id, 00679 ) 00680 ), 00681 TRUE, 00682 $tree 00683 ); 00684 } 00685 else { 00686 $ttree = theme_menu_item( 00687 theme_menu_item_link( 00688 array( 00689 'title' => $obj->name, 00690 'href' => 'user/' . $user->uid . '/email/' . $obj->identity_id . '/mbox/' . $obj->id, 00691 ) 00692 ), 00693 $obj->parent 00694 ); 00695 $ttree = theme_menu_tree($ttree); 00696 } 00697 $tree .= $ttree; 00698 } 00699 else { 00700 $compose = mfn_dmail_l(array( 00701 'href' => "user/{$user->uid}/email/{$obj->id}/compose", 00702 'title' => ' (Compose)', 00703 'description' => 'Compose new mail to send to people.', 00704 'image' => array( 00705 'type' => 'action', 00706 'file' => 'compose.png', 00707 ), 00708 )); 00709 $ttree = theme_menu_item( 00710 theme_menu_item_link( 00711 array( 00712 'title' => $obj->name, 00713 'href' => 'user/' . $user->uid . '/email/' . $obj->id . '/folders' 00714 ) 00715 ) . $compose, 00716 $treed, 00717 $tree 00718 ); 00719 if ($treed) { 00720 $tree .= $ttree; 00721 } 00722 else { 00723 $tree = $ttree; 00724 } 00725 } 00726 } 00727 00731 function mfn_dmail_block_trees($obj, &$trees, $tree = NULL) { 00732 $treed = TRUE; 00733 if ($tree) { 00734 $tree = theme_menu_tree($tree); 00735 $treed = FALSE; 00736 } 00737 mfn_dmail_block_item($obj, $tree, $treed); 00738 $trees .= theme_menu_tree($tree); 00739 } 00740 00744 function mfn_dmail_block_item_link($obj, &$links) { 00745 global $user; 00746 $tlinks = new stdClass; 00747 if (isset($obj->identity_id)) { 00748 $identity = mfn_dmail_db_identity_select($obj->identity_id); 00749 $mbox = mfn_dmail_db_mbox_select($obj->id); 00750 $isdeletefolder = FALSE; 00751 if ($identity->movedel) { 00752 if (!$identity->toplevel) { 00753 $isdeletefolder = $mbox->name == "{$identity->inbox}{$identity->delimiter}{$identity->deletefolder}"; 00754 } 00755 else { 00756 $isdeletefolder = $mbox->name == $identity->deletefolder; 00757 } 00758 } 00759 $empty = $isdeletefolder 00760 ? mfn_dmail_l(array( 00761 'url' => "user/{$user->uid}/email/{$identity->id}/mbox/{$obj->id}/empty", 00762 'title' => ' (Empty)', 00763 'description' => 'Remove all items from the deleted folder.', 00764 'image' => array( 00765 'file' => 'empty_trash.png', 00766 'type' => 'action', 00767 ), 00768 )) 00769 : NULL; 00770 $tlinks->link = theme_menu_item_link( 00771 array( 00772 'title' => $obj->name, 00773 'href' => 'user/' . $user->uid . '/email/' . $obj->identity_id . '/mbox/' . $obj->id, 00774 ) 00775 ) . $empty; 00776 $tlinks->parent = $obj->parent; 00777 $tlinks->is_active_mbox = $obj->is_active_mbox; 00778 $tlinks->is_active_parent = $obj->is_active_parent; 00779 $tlinks->is_active_child = $obj->is_active_child; 00780 } 00781 else { 00782 $compose = mfn_dmail_l(array( 00783 'url' => "user/{$user->uid}/email/{$obj->id}/compose", 00784 'title' => ' (Compose)', 00785 'description' => 'Compose new mail to send to people.', 00786 'image' => array( 00787 'type' => 'action', 00788 'file' => 'compose.png', 00789 ), 00790 )); 00791 $tlinks->link = theme_menu_item_link( 00792 array( 00793 'title' => $obj->name, 00794 'href' => 'user/' . $user->uid . '/email/' . $obj->id . '/folders', 00795 ) 00796 ) . $compose; 00797 $tlinks->parent = TRUE; 00798 $tlinks->is_active_mbox = FALSE; 00799 $tlinks->is_active_parent = TRUE; 00800 $tlinks->is_active_child = FALSE; 00801 } 00802 $tlinks->level = $obj->level; 00803 $links[] = $tlinks; 00804 } 00805 00809 function mfn_dmail_block_items(&$links) { 00810 $tlink = NULL; 00811 static $last_obj = NULL; 00812 00813 while ($obj = array_shift($links)) { 00814 if ($obj->parent) { 00815 if ($tlink) { 00816 array_unshift($links, $obj); 00817 $return = NULL; 00818 if ($last_obj->is_active_child) { 00819 $return = mfn_dmail_ul_item($tlink, $obj->level); 00820 } 00821 $return .= mfn_dmail_block_items($links); 00822 } 00823 else { 00829 $prefix = NULL; 00830 if ($obj->level < $last_obj->level) { 00831 $prefix = mfn_dmail_ul_item_close($obj->level); 00832 } 00833 $return = $prefix; 00834 if ($obj->is_active_mbox || $obj->is_active_parent || $obj->is_active_child) { 00835 $return .= mfn_dmail_ul_item_open() . mfn_dmail_li_item($obj); 00836 } 00837 $return .= mfn_dmail_block_items($links); 00838 } 00839 $last_obj = $obj; 00840 return $return; 00841 } 00842 else { 00843 $prefix = NULL; 00844 if ($obj->level < $last_obj->level) { 00845 $prefix .= mfn_dmail_ul_item_close($obj->level); 00846 } 00847 if ($obj->is_active_child) { 00848 $tlink .= $prefix . mfn_dmail_li_item($obj); 00849 } 00850 $last_obj = $obj; 00851 } 00852 } 00853 return mfn_dmail_ul_item($tlink); 00854 } 00855 00859 function mfn_dmail_li_item($obj) { 00860 if ($obj->parent || $obj->is_active_mbox || $obj->is_active_parent || $obj->is_active_child) { 00861 $class = $obj->parent ? $obj->is_active_mbox || $obj->is_active_parent ? '"expanded"' : '"collapsed"' : '"leaf"'; 00862 return "<li class=$class>{$obj->link}</li>"; 00863 } 00864 } 00865 00869 function mfn_dmail_ul_item($links, $tolevel = 0) { 00870 return mfn_dmail_ul_item_open() . $links . mfn_dmail_ul_item_close($tolevel); 00871 } 00872 00876 function mfn_dmail_ul_item_open() { 00877 global $dmail_obj; 00878 if (empty($dmail_obj)) { 00879 $dmail_obj = new stdClass; 00880 } 00881 if (empty($dmail_obj->ul)) { 00882 $dmail_obj->ul = new stdClass; 00883 $dmail_obj->ul->level = 0; 00884 } 00885 $spaces = mfn_dmail_spaces($dmail_obj->ul->level - 1); 00886 $dmail_obj->ul->level++; 00887 return DMAIL_NL . $spaces . '<ul class="menu">'; 00888 } 00889 00893 function mfn_dmail_ul_item_close($tolevel = 0) { 00894 global $dmail_obj; 00895 if (empty($dmail_obj)) { 00896 $dmail_obj = new stdClass; 00897 } 00898 if (empty($dmail_obj->ul)) { 00899 $dmail_obj->ul = new stdClass; 00900 $dmail_obj->ul->level = 0; 00901 } 00902 $ret .= NULL; 00903 $endcnt = $dmail_obj->ul->level - $tolevel - 1; 00904 for ($i = 0; $i <= $endcnt; $i++) { 00905 $spaces = mfn_dmail_spaces($dmail_obj->ul->level - 1); 00906 $ret .= DMAIL_NL . $spaces . "</ul>"; 00907 $dmail_obj->ul->level--; 00908 } 00909 return $ret; 00910 } 00911 00915 function mfn_dmail_spaces($spccnt) { 00916 $spaces = NULL; 00917 if (!mfn_dmail_production_mode()) { 00918 for ($i = 0; $i < $spccnt; $i++) { 00919 $spaces .= ' '; 00920 } 00921 } 00922 return $spaces; 00923 } 00924 00931 function mfn_dmail_production_mode() { 00932 return variable_get('dmail_production_mode', FALSE); 00933 } 00934 00938 function mfn_dmail_get_active_identity() { 00939 $cache = dcache_get(array('active')); 00940 return $cache['identity']; 00941 } 00942 00946 function mfn_dmail_set_active_identity($identity) { 00947 $cache = dcache_get(array('active')); 00948 $active_identity =& $cache['identity']; 00949 $active_identity = $identity; 00950 dcache_set(array('active'), $cache); 00951 } 00952 00956 function mfn_dmail_theme_block_init() { 00957 // Using list_theme(), ensure we've enabled for each theme listed. 00958 } 00959 00966 function mfn_dmail_security_check() { 00967 global $user; 00968 if ($user->uid !== arg(1)) { 00969 watchdog('dmail security', t('Invalid access to another users dmail links.')); 00970 drupal_set_message('Only the authenticated user may access his email form.', 'error'); 00971 drupal_goto('/'); 00972 } 00973 } 00974 00980 function mfn_dmail_list_headers($which, $form) { 00981 switch ($which) { 00982 case 'dmail_identities': { 00983 $return[] = theme('table_select_header_cell'); 00984 foreach ($form['dmail']['identity']['list']['header']['#dmail_data'] as $h) { 00985 $return[] = $h; 00986 } 00987 $return[] = t('Operations'); 00988 } break; 00989 case 'dmail_signatures': { 00990 $return[] = theme('table_select_header_cell'); 00991 foreach ($form['dmail']['signature']['list']['header']['#dmail_data'] as $h) { 00992 $return[] = $h; 00993 } 00994 $return[] = t('Operations'); 00995 } break; 00996 } 00997 return $return; 00998 } 00999 01009 function mfn_dmail_natksort(array &$array) { 01010 $keys = array_keys($array); 01011 $ret = natsort($keys); 01012 if ($ret !== FALSE) { 01013 $newarray = array(); 01014 foreach ($keys as $key) { 01015 $newarray[$key] = $array[$key]; 01016 } 01017 $array = $newarray; 01018 } 01019 return $ret; 01020 } 01021 01025 function mfn_dmail_active_mbox($mbox = NULL) { 01026 $cache = dcache_get(array('active')); 01027 $active_identity =& $cache['identity']; 01028 $active_mbox =& $cache['mbox']; 01029 $active_mbox = new stdClass; 01030 if ($mbox) { 01031 $t = explode($active_identity->delimiter, $mbox->name); 01032 $p = NULL; 01033 $active_mbox->id = $mbox->id; 01034 $active_mbox->name = $mbox->name; 01035 $active_mbox->paths = array(); 01036 $level = 0; 01037 $active_mbox->levels = count($t); 01038 foreach ($t as $folder) { 01039 if ($p) { 01040 $p .= $active_identity->delimiter; 01041 } 01042 $p .= $folder; 01043 $active_mbox->folders[$p] = ++$level; 01044 } 01045 } 01046 dcache_set(array('active'), $cache); 01047 return $active_mbox; 01048 } 01049 01053 function mfn_dmail_is_active_mbox_parent($mbox) { 01054 $cache = dcache_get(array('active')); 01055 if (!isset($cache['mbox'])) { 01056 return FALSE; 01057 } 01058 $active_identity =& $cache['identity']; 01059 $active_mbox =& $cache['mbox']; 01060 if (!($pos = strrpos($active_mbox->name, $active_identity->delimiter))) { 01061 $pos = 0; 01062 } 01063 $t = explode($active_identity->delimiter, $mbox->name); 01064 return count($t) < $active_mbox->levels && in_array($mbox->name, array_keys($active_mbox->folders)); 01065 } 01066 01070 function mfn_dmail_is_active_mbox_child($mbox) { 01071 $cache = dcache_get(array('active')); 01072 if (!isset($cache['identity']) || !isset($cache['mbox'])) { 01073 return FALSE; 01074 } 01075 $active_identity =& $cache['identity']; 01076 $active_mbox =& $cache['mbox']; 01077 if (!($pos = strrpos($mbox->name, $active_identity->delimiter))) { 01078 $pos = strlen($mbox->name); 01079 } 01080 $mname = substr($mbox->name, 0, $pos); 01081 return in_array($mname, array_keys($active_mbox->folders)); 01082 } 01083 01087 function mfn_dmail_is_active_mbox($mbox) { 01088 $cache = dcache_get(array('active')); 01089 $active_mbox =& $cache['mbox']; 01090 return $mbox->name == $active_mbox->name; 01091 } 01092 01096 function mfn_dmail_orderby() { 01097 $sort =& $_GET['sort']; 01098 $order =& $_GET['order']; 01099 $page =& $_GET['page']; 01100 $query = NULL; 01101 $amp = NULL; 01102 if ($sort) { 01103 $query .= "sort={$sort}"; 01104 $amp = '&'; 01105 } 01106 else { 01107 $sort = 'desc'; 01108 $order = 'Received'; 01109 return mfn_dmail_orderby(); 01110 } 01111 if ($order) { 01112 $query .= "{$amp}order={$order}"; 01113 $amp = '&'; 01114 } 01115 if ($page) { 01116 $query .= "{$amp}page={$page}"; 01117 $amp = '&'; 01118 } 01119 return array('query' => $query); 01120 } 01121 01125 function mfn_dmail_form_text($type, $field) { 01126 $cache = dcache_get('form texts', DCACHE_DRUPAL); 01127 if ($type === 'desc') { 01128 $type = 'description'; 01129 } 01130 if ($cache && isset($cache[$field][$type])) { 01131 return $cache[$field][$type]; 01132 } 01133 $note = t(' Note this is a default value for the new identities and can be different for each identity.'); 01134 switch ($field) { 01135 case 'default_inbox': { 01136 $cache[$field]['title'] = t('Default inbox'); 01137 $cache[$field]['description'] = mfn_dmail_form_text('description', 'inbox') . $note; 01138 } break; 01139 case 'inbox': { 01140 $cache[$field]['title'] = t('Inbox'); 01141 $cache[$field]['description'] = t('The default new mail delivery mailbox, usually INBOX.'); 01142 } break; 01143 01144 case 'default_check_mail_freq': { 01145 $cache[$field]['title'] = t('Default check mail frequency'); 01146 $cache[$field]['description'] = mfn_dmail_form_text('description', 'check_mail_freq') . $node; 01147 } break; 01148 case 'check_mail_freq': { 01149 $cache[$field]['title'] = t('Check mail frequency'); 01150 $cache[$field]['description'] = t('How ofter should the identity be check for new mail?'); 01151 } break; 01152 01153 case 'default_delimiter': { 01154 $cache[$field]['title'] = t('Default mailbox delimiter'); 01155 $cache[$field]['description'] = mfn_dmail_form_text('description', 'delimiter') . $note; 01156 } break; 01157 case 'delimiter': { 01158 $cache[$field]['title'] = t('Delimiter'); 01159 $cache[$field]['description'] = t('The mailbox delimiter, usually a period (.) or a slash (/).'); 01160 } break; 01161 01162 case 'default_allow_toplevel_folders': { 01163 $cache[$field]['title'] = t('Default allow top level folders'); 01164 $cache[$field]['description'] = mfn_dmail_form_text('description', 'toplevel') . $note; 01165 } break; 01166 case 'toplevel': { 01167 $cache[$field]['title'] = t('Top level folders'); 01168 $cache[$field]['description'] = t('Allow folders to be created as a top level item.'); 01169 } break; 01170 01171 case 'default_items_orderby': { 01172 $cache[$field]['title'] = t('Default order by'); 01173 $cache[$field]['description'] = mfn_dmail_form_text('description', 'orderby') . $note; 01174 } break; 01175 case 'orderby': { 01176 $cache[$field]['title'] = t('Order by'); 01177 $cache[$field]['description'] = t('Which column do you wish the default display of items to order by?'); 01178 } break; 01179 01180 case 'default_items_sortdir': { 01181 $cache[$field]['title'] = t('Default sort direction'); 01182 $cache[$field]['description'] = mfn_dmail_form_text('description', 'sortdir') . $note; 01183 } break; 01184 case 'sortdir': { 01185 $cache[$field]['title'] = t('Sort direction'); 01186 $cache[$field]['description'] = t('Which direction do you wish the order by column to sort.'); 01187 } break; 01188 01189 case 'signature': { 01190 $cache[$field]['title'] = t('Signature'); 01191 $cache[$field]['description'] = t('Which signature do you wish to use for replies, forwards and new mail for this identity?'); 01192 } break; 01193 01194 case 'items_per_page': { 01195 $cache[$field]['title'] = t('Items per page'); 01196 $cache[$field]['description'] = t('How many items in a list to display per page? Note the larger the number the slower the response may become and the more memory the system will require.'); 01197 } break; 01198 01199 case 'body_char_wrap': { 01200 $cache[$field]['title'] = t('Body character wrap'); 01201 $cache[$field]['description'] = t('How many characters do you wish to wrap the email body to?'); 01202 } break; 01203 01204 case 'default_delete_folder': { 01205 $cache[$field]['title'] = t('Default trash folder'); 01206 $cache[$field]['description'] = mfn_dmail_form_text('description', 'delete_folder') . $note; 01207 } break; 01208 case 'delete_folder': { 01209 $cache[$field]['title'] = t('Trash folder'); 01210 $cache[$field]['description'] = t('If you use a delete folder then name it here, otherwise leave it empty.'); 01211 } break; 01212 01213 case 'default_draft_folder': { 01214 $cache[$field]['title'] = t('Default draft folder'); 01215 $cache[$field]['description'] = mfn_dmail_form_text('description', 'draft_folder') . $note; 01216 } break; 01217 case 'draft_folder': { 01218 $cache[$field]['title'] = t('Draft folder'); 01219 $cache[$field]['description'] = t('If you use a draft folder then name it here, otherwise leave it empty.'); 01220 } break; 01221 01222 case 'default_move_deleted': { 01223 $cache[$field]['title'] = t('Default move deleted items to delete folder'); 01224 $cache[$field]['description'] = mfn_dmail_form_text('description', 'move_deleted') . $note; 01225 } break; 01226 case 'move_deleted': { 01227 $cache[$field]['title'] = t('Move deleted items to delete folder'); 01228 $cache[$field]['description'] = t('Should a deleted item be moved to the delete folder?'); 01229 } break; 01230 01231 case 'default_sent_folder': { 01232 $cache[$field]['title'] = t('Default sent folder'); 01233 $cache[$field]['description'] = mfn_dmail_form_text('description', 'sent_folder') . $note; 01234 } break; 01235 case 'sent_folder': { 01236 $cache[$field]['title'] = t('Sent folder'); 01237 $cache[$field]['description'] = t('If you use a sent folder then name it here, otherwise leave it empty.'); 01238 } break; 01239 01240 case 'default_junk_folder': { 01241 $cache[$field]['title'] = t('Default junk folder'); 01242 $cache[$field]['description'] = mfn_dmail_form_text('description', 'junk_folder') . $note; 01243 } break; 01244 case 'junk_folder': { 01245 $cache[$field]['title'] = t('Junk folder'); 01246 $cache[$field]['description'] = t('If you use a junk folder then name it here, otherwise leave it empty.'); 01247 } break; 01248 01249 case 'default_readonly': { 01250 $cache[$field]['title'] = t('Default read only access'); 01251 $cache[$field]['description'] = mfn_dmail_form_text('description', 'readonly') . $desc; 01252 } break; 01253 case 'readonly': { 01254 $cache[$field]['title'] = t('Read only access'); 01255 $cache[$field]['description'] = t('Should the service be accessed in read only mode? Usually this is used for debugging.'); 01256 } break; 01257 01258 default: { 01259 throw new Exception(t('Unknown field: @field', array('@field' => $field))); 01260 } 01261 } 01262 dcache_set('form texts', $cache, DCACHE_DRUPAL); 01263 return $cache[$field][$type]; 01264 } 01265 01269 function mfn_dmail_form_options($field) { 01270 $cache = dcache_get('form options', DCACHE_DRUPAL); 01271 if ($cache && isset($cache[$field])) { 01272 return $cache[$field]; 01273 } 01274 switch ($field) { 01275 case 'orderby': 01276 case 'default_items_orderby': { 01277 $cache[$field] = array( 01278 '##' => t('Message number'), 01279 'received' => t('Received'), 01280 'from' => t('From'), 01281 'subject' => t('Subject'), 01282 ); 01283 } break; 01284 01285 case 'sortdir': 01286 case 'default_items_sortdir': { 01287 $cache[$field] = array( 01288 'asc' => t('Ascending'), 01289 'desc' => t('Descending'), 01290 ); 01291 } break; 01292 01293 case 'check_mail_freq': 01294 case 'default_check_mail_freq': { 01295 $cache[$field] = array( 01296 1 => t('Every minute'), 01297 5 => t('Every 5 minutes'), 01298 10 => t('Every 10 minutes'), 01299 15 => t('Every 15 minutes'), 01300 30 => t('Every 30 minutes'), 01301 60 => t('Every hour'), 01302 120 => t('Every 2 hours'), 01303 240 => t('Every 4 hours'), 01304 360 => t('Every 6 hours'), 01305 480 => t('Every 8 hours'), 01306 720 => t('Every 12 hours'), 01307 1440 => t('Once a day'), 01308 ); 01309 } break; 01310 01311 case 'signature': { 01312 $cache[$field][0] = t('none'); 01313 $signatures = mfn_dmail_db_signatures_select(); 01314 foreach ($signatures as $signature) { 01315 $cache[$field][$signature->id] = $signature->name; 01316 } 01317 } break; 01318 01319 case 'items_per_page': { 01320 $cache[$field] = array( 01321 5 => t('5 items'), 01322 10 => t('10 items'), 01323 15 => t('15 items'), 01324 25 => t('25 items'), 01325 50 => t('50 items'), 01326 100 => t('100 items'), 01327 150 => t('150 items'), 01328 200 => t('200 items'), 01329 ); 01330 } break; 01331 01332 case 'readonly': 01333 case 'default_readonly': 01334 case 'move_deleted': 01335 case 'default_move_deleted': { 01336 $cache[$field] = array('yes' => t('Yes'), 'no' => t('No')); 01337 } break; 01338 01339 default: { 01340 throw new Exception(t('Unknown field: @field', array('@field' => $field))); 01341 } 01342 } 01343 dcache_set('form options', $cache, DCACHE_DRUPAL); 01344 return $cache[$field]; 01345 } 01346 01350 function mfn_dmail_form_default($field) { 01351 $cache = dcache_get('form default', DCACHE_DRUPAL); 01352 if ($cache && isset($cache[$field])) { 01353 return $cache[$field]; 01354 } 01355 switch ($field) { 01356 case 'inbox': 01357 case 'default_inbox': { 01358 $cache[$field] = duvar_get('default_inbox', variable_get('dmail_default_inbox', DMAIL_DEFAULT_INBOX)); 01359 } break; 01360 01361 case 'delimiter': 01362 case 'default_delimiter': { 01363 $cache[$field] = duvar_get('default_delimiter', variable_get('dmail_default_delim', DMAIL_DEFAULT_DELIM)); 01364 } break; 01365 01366 case 'toplevel': 01367 case 'default_allow_toplevel_folders': { 01368 $cache[$field] = duvar_get('default_allow_toplevel_folders', variable_get('dmail_default_toplevel_folders', DMAIL_DEFAULT_TOPLEVEL_FOLDERS)); 01369 } break; 01370 01371 case 'sortdir': 01372 case 'default_items_sortdir': { 01373 $cache[$field] = duvar_get('default_items_sortdir', variable_get('dmail_default_items_sortdir', DMAIL_DEFAULT_ITEMS_SORTDIR)); 01374 } break; 01375 01376 case 'orderby': 01377 case 'default_items_orderby': { 01378 $cache[$field] = duvar_get('default_items_orderby', variable_get('dmail_default_items_orderby', DMAIL_DEFAULT_ITEMS_ORDERBY)); 01379 } break; 01380 01381 case 'check_mail_freq': 01382 case 'default_check_mail_freq': { 01383 $cache[$field] = duvar_get('default_check_mail_freq', variable_get('dmail_default_check_mail_freq', DMAIL_DEFAULT_CHECK_MAIL_FREQ)); 01384 } break; 01385 01386 case 'signature': { 01387 $tmp = duvar_get('default_signature_name', 0); 01388 if ($tmp) { 01389 $tmp = mfn_dmail_db_signature_select($tmp); 01390 if ($tmp === FALSE) { 01391 $tmp = 0; 01392 } 01393 else { 01394 $tmp = $tmp->id; 01395 } 01396 } 01397 $cache[$field] = $tmp; 01398 unset($tmp); 01399 } break; 01400 01401 case 'items_per_page': { 01402 $cache[$field] = duvar_get('items_per_page', 10); 01403 } break; 01404 01405 case 'body_char_wrap': { 01406 $cache[$field] = duvar_get('body_char_wrap', variable_get('dmail_default_body_char_wrap', DMAIL_DEFAULT_BODY_CHAR_WRAP)); 01407 } break; 01408 01409 case 'delete_folder': 01410 case 'default_delete_folder': { 01411 $cache[$field] = duvar_get('default_delete_folder', t('Trash')); 01412 } break; 01413 01414 case 'move_deleted': 01415 case 'default_move_deleted': { 01416 $cache[$field] = duvar_get('default_move_deleted', variable_get('dmail_default_move_deleted', DMAIL_DEFAULT_MOVE_DELETED)); 01417 } break; 01418 01419 case 'draft_folder': 01420 case 'default_draft_folder': { 01421 $cache[$field] = duvar_get('default_draft_folder', t('Drafts')); 01422 } break; 01423 01424 case 'sent_folder': 01425 case 'default_sent_folder': { 01426 $cache[$field] = duvar_get('default_sent_folder', t('Sent')); 01427 } break; 01428 01429 case 'junk_folder': 01430 case 'default_junk_folder': { 01431 $cache[$field] = duvar_get('default_junk_folder', t('Junk')); 01432 } break; 01433 01434 default: { 01435 throw new Exception(t('Unknown field: @field', array('@field' => $field))); 01436 } 01437 } 01438 dcache_set('form default', $cache, DCACHE_DRUPAL); 01439 return $cache[$field]; 01440 } 01441 01450 function mfn_dmail_subject_re($subject) { 01451 $obj = new stdClass; 01452 list($re, $subj) = explode(':', trim($subject)); 01453 if (strtolower($re) === 're') { 01454 $obj->subject = substr($subject, strlen($re) + 1); 01455 $obj->re = TRUE; 01456 } 01457 else { 01458 $obj->subject = $subject; 01459 $obj->re = FALSE; 01460 } 01461 return $obj; 01462 }