Source for file addressbook.php

Documentation is available at addressbook.php

  1. <?php
  2.  
  3. /**
  4.  * addressbook.php
  5.  *
  6.  * Manage personal address book.
  7.  *
  8.  * @copyright &copy; 1999-2006 The SquirrelMail Project Team
  9.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  10.  * @version $Id: addressbook.php,v 1.58.2.26 2006/10/07 11:58:42 tokul Exp $
  11.  * @package squirrelmail
  12.  * @subpackage addressbook
  13.  */
  14.  
  15. /**
  16.  * Path for SquirrelMail required files.
  17.  * @ignore
  18.  */
  19. define('SM_PATH','../');
  20.  
  21. /** SquirrelMail required files. */
  22. require_once(SM_PATH 'include/validate.php');
  23. require_once(SM_PATH 'functions/global.php');
  24. require_once(SM_PATH 'functions/display_messages.php');
  25. require_once(SM_PATH 'functions/addressbook.php');
  26. require_once(SM_PATH 'functions/strings.php');
  27. require_once(SM_PATH 'functions/html.php');
  28. require_once(SM_PATH 'functions/forms.php');
  29.  
  30. /** lets get the global vars we may need */
  31. sqgetGlobalVar('key',       $key,           SQ_COOKIE);
  32.  
  33. sqgetGlobalVar('username',  $username,      SQ_SESSION);
  34. sqgetGlobalVar('onetimepad',$onetimepad,    SQ_SESSION);
  35. sqgetGlobalVar('base_uri',  $base_uri,      SQ_SESSION);
  36. sqgetGlobalVar('delimiter'$delimiter,     SQ_SESSION);
  37.  
  38. /* From the address form */
  39. sqgetGlobalVar('addaddr',   $addaddr,   SQ_POST);
  40. sqgetGlobalVar('editaddr',  $editaddr,  SQ_POST);
  41. sqgetGlobalVar('deladdr',   $deladdr,   SQ_POST);
  42. sqgetGlobalVar('sel',       $sel,       SQ_POST);
  43. sqgetGlobalVar('oldnick',   $oldnick,   SQ_POST);
  44. sqgetGlobalVar('backend',   $backend,   SQ_POST);
  45. sqgetGlobalVar('doedit',    $doedit,    SQ_POST);
  46.  
  47. /* Get sorting order */
  48. $abook_sort_order get_abook_sort();
  49.  
  50. /**
  51.  * Make an input field
  52.  * @param string $label 
  53.  * @param string $field 
  54.  * @param string $name 
  55.  * @param string $size 
  56.  * @param array $values 
  57.  * @param string $add 
  58.  */
  59. function addressbook_inp_field($label$field$name$size$values$add{
  60.     global $color;
  61.     $value isset($values[$field]$values[$field'');
  62.  
  63.     $td_str addInput($name.'['.$field.']'$value$size)
  64.         . $add ;
  65.  
  66.     return html_tag'tr' ,
  67.             html_tag'td'$label ':''right'$color[4].
  68.             html_tag'td'$td_str'left'$color[4])
  69.             )
  70.         . "\n";
  71. }
  72.  
  73. /**
  74.  * Output form to add and modify address data
  75.  */
  76. function address_form($name$submittext$values array()) {
  77.     global $color$squirrelmail_language;
  78.  
  79.     if ($squirrelmail_language == 'ja_JP'{
  80.         echo html_tag'table',
  81.                 addressbook_inp_field(_("Nickname"),     'nickname'$name15$values,
  82.                     ' <small>' _("Must be unique"'</small>'.
  83.                 addressbook_inp_field(_("E-mail address"),  'email'$name45$values''.
  84.                 addressbook_inp_field(_("Last name"),    'lastname'$name45$values''.
  85.                 addressbook_inp_field(_("First name"),  'firstname'$name45$values''.
  86.                 addressbook_inp_field(_("Additional info")'label'$name45$values''.
  87.                 list_writable_backends($name.
  88.                 html_tag'tr',
  89.                     html_tag'td',
  90.                         addSubmit($submittext$name.'[SUBMIT]'),
  91.                         'center'$color[4]'colspan="2"')
  92.                     )
  93.                 'center''''border="0" cellpadding="1" width="90%"'."\n";
  94.     else {
  95.         echo html_tag'table',
  96.                 addressbook_inp_field(_("Nickname"),     'nickname'$name15$values,
  97.                     ' <small>' _("Must be unique"'</small>'.
  98.                 addressbook_inp_field(_("E-mail address"),  'email'$name45$values''.
  99.                 addressbook_inp_field(_("First name"),  'firstname'$name45$values''.
  100.                 addressbook_inp_field(_("Last name"),    'lastname'$name45$values''.
  101.                 addressbook_inp_field(_("Additional info")'label'$name45$values''.
  102.                 list_writable_backends($name.
  103.                 html_tag'tr',
  104.                     html_tag'td',
  105.                         addSubmit($submittext$name.'[SUBMIT]',
  106.                         'center'$color[4]'colspan="2"')
  107.                     )
  108.                 'center''''border="0" cellpadding="1" width="90%"'."\n";
  109.     }
  110. }
  111.  
  112.  
  113. /**
  114.  * Provides list of writeable backends.
  115.  * Works only when address is added ($name='addaddr')
  116.  * @param string $name name of form
  117.  * @return string html formated backend field (select or hidden)
  118.  */
  119. function list_writable_backends($name{
  120.     global $color$abook;
  121.     if $name != 'addaddr' return}
  122.     $writeable_abook 1;
  123.     if $abook->numbackends {
  124.         $backends $abook->get_backend_list();
  125.         $writeable_abooks=array();
  126.         while (list($undef,$veach($backends)) {
  127.             if ($v->writeable{
  128.                 // add each backend to array
  129.                 $writeable_abooks[$v->bnum]=$v->sname;
  130.                 // save backend number
  131.                 $writeable_abook=$v->bnum;
  132.             }
  133.         }
  134.         if (count($writeable_abooks)>1{
  135.             // we have more than one writeable backend
  136.             $ret=addSelect('backend',$writeable_abooks,null,true);
  137.             return html_tag'tr',
  138.                              html_tag'td'_("Add to:"),'right'$color[4.
  139.                              html_tag'td'$ret'left'$color[4)) "\n";
  140.         }
  141.     }
  142.     // Only one backend exists or is writeable.
  143.     return html_tag'tr',
  144.                      html_tag'td',
  145.                                addHidden('backend'$writeable_abook),
  146.                                'center'$color[4]'colspan="2"')) "\n";
  147. }
  148.  
  149. /* Create page header before addressbook_init in order to  display error messages correctly. */
  150. displayPageHeader($color'None');
  151.  
  152. /* Open addressbook, with error messages on but without LDAP (the *
  153.  * second "true"). Don't need LDAP here anyway                    */
  154. $abook addressbook_init(truetrue);
  155. if($abook->localbackend == 0{
  156.             _("No personal address book is defined. Contact administrator."),
  157.             $color);
  158.     exit();
  159. }
  160.  
  161. $defdata   array();
  162. $formerror '';
  163. $abortform false;
  164. $showaddrlist true;
  165. $defselected  array();
  166. $form_url 'addressbook.php';
  167.  
  168.  
  169. /* Handle user's actions */
  170. if(sqgetGlobalVar('REQUEST_METHOD'$req_methodSQ_SERVER&& $req_method == 'POST'{
  171.  
  172.     /************************************************
  173.      * Add new address                                *
  174.      **************************************************/
  175.  
  176.     if (isset($addaddr)) {
  177.         if (isset($backend)) {
  178.             $r $abook->add($addaddr$backend);
  179.         else {
  180.             $r $abook->add($addaddr$abook->localbackend);
  181.         }
  182.  
  183.         /* Handle error messages */
  184.         if (!$r{
  185.             /* Remove backend name from error string */
  186.             $errstr $abook->error;
  187.             $errstr ereg_replace('^\[.*\] *'''$errstr);
  188.  
  189.             $formerror $errstr;
  190.             $showaddrlist false;
  191.             $defdata $addaddr;
  192.         }
  193.     else {
  194.  
  195.         /**********************************************
  196.          * Delete address(es)                           *
  197.          ************************************************/
  198.  
  199.         if ((!empty($deladdr)) && sizeof($sel0{
  200.             $orig_sel $sel;
  201.             sort($sel);
  202.  
  203.             /* The selected addresses are identidied by "backend:nickname". *
  204.              * Sort the list and process one backend at the time            */
  205.             $prevback  = -1;
  206.             $subsel    array();
  207.             $delfailed false;
  208.  
  209.             for ($i (($i sizeof($sel)) && !$delfailed$i++{
  210.                 list($sbackend$snickexplode(':'$sel[$i]);
  211.  
  212.                 /* When we get to a new backend, process addresses in *
  213.                  * previous one.                                      */
  214.                 if ($prevback != $sbackend && $prevback != -1{
  215.  
  216.                     $r $abook->remove($subsel$prevback);
  217.                     if (!$r{
  218.                         $formerror $abook->error;
  219.                         $i sizeof($sel);
  220.                         $delfailed true;
  221.                         break;
  222.                     }
  223.                     $subsel   array();
  224.                 }
  225.  
  226.                 /* Queue for processing */
  227.                 array_push($subsel$snick);
  228.                 $prevback $sbackend;
  229.             }
  230.  
  231.             if (!$delfailed{
  232.                 $r $abook->remove($subsel$prevback);
  233.                 if (!$r/* Handle errors */
  234.                     $formerror $abook->error;
  235.                     $delfailed true;
  236.                 }
  237.             }
  238.  
  239.             if ($delfailed{
  240.                 $showaddrlist true;
  241.                 $defselected  $orig_sel;
  242.             }
  243.  
  244.         else {
  245.  
  246.             /*********************************************
  247.              * Update/modify address                       *
  248.              ***********************************************/
  249.  
  250.             if (!empty($editaddr)) {
  251.  
  252.                 /* Stage one: Copy data into form */
  253.                 if (isset($sel&& sizeof($sel0{
  254.                     if(sizeof($sel1{
  255.                         $formerror _("You can only edit one address at the time");
  256.                         $showaddrlist true;
  257.                         $defselected $sel;
  258.                     else {
  259.                         $abortform true;
  260.                         list($ebackend$enickexplode(':'$sel[0]);
  261.                         $olddata $abook->lookup($enick$ebackend);
  262.  
  263.                         /* Display the "new address" form */
  264.                         echo addForm($form_url'post').
  265.                             html_tag'table',
  266.                                     html_tag'tr',
  267.                                         html_tag'td',
  268.                                             "\n"'<strong>' _("Update address"'</strong>' ."\n",
  269.                                             'center'$color[0)
  270.                                         ),
  271.                                     'center''''width="100%" ' );
  272.                         address_form("editaddr"_("Update address")$olddata);
  273.                         echo addHidden('oldnick'$olddata['nickname']).
  274.                             addHidden('backend'$olddata['backend']).
  275.                             addHidden('doedit''1').
  276.                             '</form>';
  277.                     }
  278.                 elseif ($doedit == 1{
  279.                     /* Stage two: Write new data */
  280.                     $newdata $editaddr;
  281.                     $r $abook->modify($oldnick$newdata$backend);
  282.  
  283.                     /* Handle error messages */
  284.                     if (!$r{
  285.                         /* Display error */
  286.                         echo html_tag'table',
  287.                                  html_tag'tr',
  288.                                      html_tag'td',
  289.                                                "\n"'<strong><font color="' $color[2.
  290.                                                '">' _("ERROR"': ' htmlspecialchars($abook->error'</font></strong>' ."\n",
  291.                                                'center' )
  292.                                            ),
  293.                                        'center''''width="100%"' );
  294.  
  295.                         /* Display the "new address" form again */
  296.                         echo addForm($form_url'post').
  297.                             html_tag'table',
  298.                                 html_tag'tr',
  299.                                     html_tag'td',
  300.                                               "\n"'<strong>' _("Update address"'</strong>' ."\n",
  301.                                               'center'$color[0)
  302.                                           ),
  303.                                       'center''''width="100%"' );
  304.                         address_form("editaddr"_("Update address")$newdata);
  305.                         echo 
  306.                             addHidden('oldnick'$oldnick).
  307.                             addHidden('backend'$backend).
  308.                             addHidden('doedit',  '1').
  309.                             "\n" '</form>';
  310.                         $abortform true;
  311.                     }
  312.                 else {
  313.                     /**
  314.                      * $editaddr is set, but $sel (address selection in address listing)
  315.                      * and $doedit (address edit form) are not set.
  316.                      * Assume that user clicked on "Edit address" without selecting any address.
  317.                      */
  318.                     $formerror _("Please select address that you want to edit");
  319.                     $showaddrlist true;
  320.                 /* end of edit stage detection */
  321.             /* !empty($editaddr)                  - Update/modify address */
  322.         /* (!empty($deladdr)) && sizeof($sel) > 0 - Delete address(es) */
  323.     /* !empty($addaddr['nickname'])               - Add new address */
  324.  
  325.     // Some times we end output before forms are printed
  326.         if($abortform{
  327.         echo "</body></html>\n";
  328.         exit();
  329.     }
  330. }
  331.  
  332.  
  333. /* =================================================================== *
  334.  * The following is only executed on a GET request, or on a POST when  *
  335.  * a user is added, or when "delete" or "modify" was successful.       *
  336.  * =================================================================== */
  337.  
  338. /* Display error messages */
  339. if (!empty($formerror)) {
  340.     echo html_tag'table',
  341.             html_tag'tr',
  342.                 html_tag'td',
  343.                     "\n"'<br /><strong><font color="' $color[2.
  344.                     '">' _("ERROR"': ' htmlspecialchars($formerror'</font></strong>' ."\n",
  345.                     'center' )
  346.                 ),
  347.             'center''''width="100%"' );
  348. }
  349.  
  350.  
  351. /* Display the address management part */
  352. if ($showaddrlist{
  353.     /* Get and sort address list */
  354.     $alist $abook->list_addr();
  355.     if(!is_array($alist)) {
  356.         $abook->error htmlspecialchars($abook->error);
  357.         plain_error_message($abook->error$color);
  358.         exit;
  359.     }
  360.  
  361.     usort($alist,'alistcmp');
  362.     $prevbackend = -1;
  363.     $headerprinted false;
  364.  
  365.     echo html_tag'p''<a href="#AddAddress">' _("Add address"'</a>''center' "\n";
  366.  
  367.     /* List addresses */
  368.     if (count($alist0{
  369.         echo addForm($form_url'post');
  370.         if ($abook->add_extra_field{
  371.             $abook_fields 6;
  372.         else {
  373.             $abook_fields 5;
  374.         }
  375.         while(list($undef,$roweach($alist)) {
  376.  
  377.             /* New table header for each backend */
  378.             if($prevbackend != $row['backend']{
  379.                 if($prevbackend 0{
  380.                     echo html_tag'table',
  381.                             html_tag'tr',
  382.                                 html_tag'td',
  383.                                     addSubmit(_("Edit selected")'editaddr').
  384.                                     addSubmit(_("Delete selected")'deladdr'),
  385.                                     'center'''"colspan=\"$abook_fields\")
  386.                                 .
  387.                             html_tag'tr',
  388.                                 html_tag'td''&nbsp;<br />''center''''colspan="5"' )
  389.                                 ),
  390.                             'center' );
  391.                 }
  392.  
  393.                 echo html_tag'table',
  394.                         html_tag'tr',
  395.                             html_tag'td'"\n" '<strong>' $row['source''</strong>' "\n"'center'$color[0)
  396.                             ),
  397.                         'center''''width="95%"' ."\n".
  398.                     html_tag'table''''center''''border="0" cellpadding="1" cellspacing="0" width="90%"' .
  399.                     html_tag'tr'"\n" .
  400.                             html_tag'th''&nbsp;''left''''width="1%"' .
  401.                             html_tag'th'_("Nickname"
  402.                                       show_abook_sort_button($abook_sort_order_("sort by nickname")01),
  403.                                       'left''''width="1%"' .
  404.                             html_tag'th'_("Name".
  405.                                       show_abook_sort_button($abook_sort_order_("sort by name")23),
  406.                                       'left''''width="1%"' .
  407.                             html_tag'th'_("E-mail").
  408.                                       show_abook_sort_button($abook_sort_order_("sort by email")45),
  409.                                       'left''''width="1%"' .
  410.                             html_tag'th'_("Info").
  411.                                       show_abook_sort_button($abook_sort_order_("sort by info")67),
  412.                                       'left''''width="1%"' .
  413.                             ($abook->add_extra_field html_tag'th''&nbsp;','left''''width="1%"')''),
  414.                             ''$color[9"\n";
  415.  
  416.                 $line 0;
  417.                 $headerprinted true;
  418.             /* End of header */
  419.  
  420.             $prevbackend $row['backend'];
  421.  
  422.             /* Check if this user is selected */
  423.             $selected in_array($row['backend'':' $row['nickname']$defselected);
  424.  
  425.             /* Print one row, with alternating color */
  426.             if ($line 2{
  427.                 $tr_bgcolor $color[12];
  428.             else {
  429.                 $tr_bgcolor $color[4];
  430.             }
  431.             if ($squirrelmail_language == 'ja_JP'{
  432.                 echo html_tag'tr'''''$tr_bgcolor);
  433.                 if ($abook->backends[$row['backend']]->writeable{
  434.                     echo html_tag'td',
  435.                             '<small>' .
  436.                             addCheckBox('sel[]'$selected$row['backend'].':'.$row['nickname']).
  437.                             '</small>' ,
  438.                             'center''''valign="top" width="1%"' );
  439.                 else {
  440.                     echo html_tag'td',
  441.                             '&nbsp;' ,
  442.                             'center''''valign="top" width="1%"' );
  443.                 }
  444.                 echo html_tag'td''&nbsp;' htmlspecialchars($row['nickname']'&nbsp;''left''''valign="top" width="1%" nowrap' 
  445.                     html_tag'td''&nbsp;' htmlspecialchars($row['lastname']' ' htmlspecialchars($row['firstname']'&nbsp;''left''''valign="top" width="1%" nowrap' .
  446.                     html_tag'td''''left''''valign="top" width="1%" nowrap' '&nbsp;';
  447.             else {
  448.                 echo html_tag'tr'''''$tr_bgcolor);
  449.                 if ($abook->backends[$row['backend']]->writeable{
  450.                     echo html_tag'td',
  451.                             '<small>' .
  452.                             addCheckBox('sel[]'$selected$row['backend'':' $row['nickname']).
  453.                             '</small>' ,
  454.                             'center''''valign="top" width="1%"' );
  455.                 else {
  456.                     echo html_tag'td',
  457.                             '&nbsp;' ,
  458.                             'center''''valign="top" width="1%"' );
  459.                 }
  460.                 echo html_tag'td''&nbsp;' htmlspecialchars($row['nickname']'&nbsp;''left''''valign="top" width="1%" nowrap' .
  461.                     html_tag'td''&nbsp;' htmlspecialchars($row['name']'&nbsp;''left''''valign="top" width="1%" nowrap' .
  462.                     html_tag'td''''left''''valign="top" width="1%" nowrap' '&nbsp;';
  463.             }
  464.             $email $abook->full_address($row);
  465.             echo makeComposeLink('src/compose.php?send_to='.rawurlencode($email),
  466.                     htmlspecialchars($row['email'])).
  467.                 '&nbsp;</td>'."\n".
  468.                 html_tag'td''&nbsp;' htmlspecialchars($row['label']'&nbsp;''left''''valign="top" width="1%"' );
  469.  
  470.             // add extra column if third party backend needs it
  471.                         if ($abook->add_extra_field{
  472.                 echo html_tag'td',
  473.                                '&nbsp;' (isset($row['extra']$row['extra''''&nbsp;',
  474.                                'left''''valign="top" width="1%"' );
  475.             }
  476.  
  477.             echo "</tr>\n";
  478.             $line++;
  479.         }
  480.  
  481.         /* End of list. Close table. */
  482.         if ($headerprinted{
  483.             echo html_tag'tr',
  484.                     html_tag'td',
  485.                         addSubmit(_("Edit selected")'editaddr'.
  486.                         addSubmit(_("Delete selected")'deladdr'),
  487.                         'center'''"colspan=\"$abook_fields\")
  488.                     );
  489.         }
  490.         echo '</table></form>';
  491.     }
  492. /* end of addresslist */
  493.  
  494.  
  495. /* Display the "new address" form */
  496. echo '<a name="AddAddress"></a>' "\n" .
  497.     addForm($form_url'post''f_add').
  498.     html_tag'table',  
  499.         html_tag'tr',
  500.             html_tag'td'"\n"'<strong>' sprintf(_("Add to %s")$abook->localbackendname'</strong>' "\n",
  501.                 'center'$color[0]
  502.                 )
  503.             )
  504.         'center''''width="95%"' ."\n";
  505. address_form('addaddr'_("Add address")$defdata);
  506. echo "</form>\n";
  507.  
  508. /* Add hook for anything that wants on the bottom */
  509. do_hook('addressbook_bottom');
  510. ?>
  511. </body></html>

Documentation generated on Sat, 07 Oct 2006 16:29:51 +0300 by phpDocumentor 1.3.0RC6