DMail Milestone 1.0
Drupal Mail Client
dmail.module
Go to the documentation of this file.
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 }
All Data Structures Files Functions Variables Enumerations