]> git.sur5r.net Git - contagged/blobdiff - entry.php
Merge pull request #15 from cweiske/master
[contagged] / entry.php
index a8550534f7a76ae47b86bc91c8c3d786e3431239..1e5e7552976de876ee184fccb105b3866df15614 100644 (file)
--- a/entry.php
+++ b/entry.php
-<?
-  require_once('init.php');
-  ldap_login();
-
-  $users = get_users();
-
-  //select template to use
-  if( $_SESSION[ldapab][username] &&
-     ($_REQUEST[mode]=='edit' || $_REQUEST[mode]=='copy')){
-    $template='entry_edit.tpl';
-  }elseif($_REQUEST[mode]=='vcf'){
-    $template='entry_vcf.tpl';
-  }else{
-    $template='entry_show.tpl';
-  }
-
-  $dn = $_REQUEST[dn];
+<?php
+require_once('inc/init.php');
+ldap_login();
+
+if ($conf['userlogreq'] && !isset($_SESSION['ldapab']['username'])){
+  header('Location: login.php');
+  exit();
+}
+
+$users = get_users();
+
+//select template to use
+if (empty($_REQUEST['mode'])) { $_REQUEST['mode']='show'; }
+if( $_SESSION['ldapab']['username'] &&
+   ($_REQUEST['mode']=='edit' || $_REQUEST['mode']=='copy')){
+  $template='entry_edit.tpl';
+}elseif($_REQUEST['mode']=='vcf'){
+  $template='entry_vcf.tpl';
+}elseif($_REQUEST['mode']=='map'){
+  $template='entry_map.tpl';
+}else{
+  $template='entry_show.tpl';
+}
+
+if (empty($_REQUEST['dn'])) {
+  $dn = "";
+}else{
+  $dn = $_REQUEST['dn'];
   #$dn = 'cn=bar foo, ou=contacts, o=cosmocode, c=de';
-
-  //save data if asked for
-  if($_SESSION[ldapab][username] && $_REQUEST[save]){
-    $_REQUEST[entry][jpegPhoto][]=_getUploadData();
-    $dn = _saveData();
+}
+
+//save data if asked for
+if($_SESSION['ldapab']['username'] && !empty($_REQUEST['save']) && $_REQUEST['save']){
+  // prepare special data
+  $_REQUEST['entry']['photo']  = _getUploadData();
+  if($_REQUEST['entry']['markers'])
+    $_REQUEST['entry']['marker'] = explode(',',$_REQUEST['entry']['markers']);
+  unset($_REQUEST['entry']['markers']);
+
+  foreach(array_keys($_REQUEST['entry']) as $field){
+      if($FIELDS['_'.$field]){
+          // entry has to be handled as array -> clean it up (trim, unique, sort)
+          $_REQUEST['entry'][$field] = array_map('trim',$_REQUEST['entry'][$field]);
+          $_REQUEST['entry'][$field] = array_unique($_REQUEST['entry'][$field]);
+          $_REQUEST['entry'][$field] = array_filter($_REQUEST['entry'][$field]);
+          natcasesort($_REQUEST['entry'][$field]);
+      }
   }
+  $dn = _saveData();
+}
 
-  if(empty($dn)){
-    if(!$_REQUEST[mode]=='edit'){
-      $smarty->assign('error','No dn was given');
-      $template = 'error.tpl';
-    }
-  }elseif($_REQUEST[del]){
-    _delEntry($dn);
-  }elseif(!_fetchData($dn)){
-    $smarty->assign('error',"The requested entry '$dn' was not found");
+if(empty($dn)){
+  if(!$_REQUEST['mode']=='edit'){
+    $smarty->assign('error','No dn was given');
     $template = 'error.tpl';
   }
-
-  //prepare templates
-  $smarty->assign('dn',$dn);
-  $smarty->assign('managers',$users);
-  tpl_std();
-  tpl_orgs();
-  tpl_markers();
-  //display templates
-  if($_REQUEST[mode]=='vcf'){
-    $entry = $smarty->get_template_vars('entry');
-    $filename = $entry[givenname].'_'.$entry[name].'.vcf';
-    header("Content-Disposition: attachment; filename=\"$filename\"");
-    header("Content-type: text/x-vcard; name=\"$filename\"");
-    $smarty->display($template);
-  }else{
-    $smarty->display('header.tpl');
-    $smarty->display($template);
-    $smarty->display('footer.tpl');
+}elseif(!empty($_REQUEST['del']) && $_REQUEST['del']){
+  _delEntry($dn);
+}elseif(!_fetchData($dn)){
+  $smarty->assign('error',"The requested entry '$dn' was not found");
+  $template = 'error.tpl';
+}
+
+//prepare templates
+$smarty->assign('dn',$dn);
+$smarty->assign('managers',$users);
+tpl_std();
+//display templates
+if($_REQUEST['mode']=='vcf'){
+  $entry = $smarty->get_template_vars('entry');
+  $filename = $entry['givenname'].'_'.$entry['name'].'.vcf';
+  header("Content-Disposition: attachment; filename=\"$filename\"");
+  header("Content-type: text/x-vcard; name=\"$filename\"; charset=utf-8");
+  $output = $smarty->fetch($template) . "\n";
+  $output = str_replace("\n", "\r\n", $output);
+  echo $output;
+}else{
+  header('Content-Type: text/html; charset=utf-8');
+  $smarty->display($template);
+}
+
+//--------------------------------------------------------------
+
+/**
+ * fetches the Data from the LDAP directory and assigns it to
+ * the global smarty object using tpl_entry()
+ */
+function _fetchData($dn){
+  global $LDAP_CON;
+  global $conf;
+  global $smarty;
+  global $users; //contains the users for manager role
+
+  $sr = @ldap_search($LDAP_CON,$dn,'(objectClass=inetOrgPerson)');
+  tpl_ldaperror();
+  if(!@ldap_count_entries($LDAP_CON,$sr)){
+    return false;
   }
+  $result = ldap_get_binentries($LDAP_CON, $sr);
+  $entry  = $result[0];
 
-  //--------------------------------------------------------------
-
-  /**
-   * fetches the Data from the LDAP directory and assigns it to
-   * the global smarty object using tpl_entry()
-   */
-  function _fetchData($dn){
-    global $LDAP_CON;
-    global $conf;
-    global $smarty;
-    global $users; //contains the users for manager role
-
-    $sr = ldap_search($LDAP_CON,$dn,'(objectClass=inetOrgPerson)');
-    if(!ldap_count_entries($LDAP_CON,$sr)){
-      return false;
-    }
-    $result = ldap_get_binentries($LDAP_CON, $sr);
-    $entry  = $result[0];
-
-    //remove dn from entry when copy
-    if($_REQUEST[mode] == 'copy'){
-      $entry[dn]='';
-    }
+  //remove dn from entry when copy
+  if(!empty($_REQUEST['mode']) && $_REQUEST['mode'] == 'copy'){
+    $entry['dn']='';
+  }
 
-    //assign entry to template:
-    tpl_entry($entry);
+  //assign entry to template:
+  tpl_entry($entry);
 
 /*print '<pre>';
 print_r($entry);
 print '</pre>';*/
 
-    // make username from dn for manager:
-    $smarty->assign('managername',$users[$entry[manager][0]]);
-    return true;
+  // make username from dn for manager:
+  if (empty($entry['manager'])) { $entry['manager']=array(""); }
+  if (empty($users[$entry['manager'][0]])) { $users[$entry['manager'][0]]=''; }
+  $smarty->assign('managername',$users[$entry['manager'][0]]);
+  return true;
+}
+
+/**
+ * saves the data from $_REQUEST['entry'] to the LDAP directory
+ *
+ * returns given or constructed dn
+ */
+function _saveData(){
+  global $LDAP_CON;
+  global $conf;
+  global $FIELDS;
+  global $OCLASSES;
+
+  $entry = $_REQUEST['entry'];
+  $dn    = $_REQUEST['dn'];
+  //construct new dn
+  $new_uid = time().str_pad(mt_rand(0,99999999),8,"0", STR_PAD_LEFT);
+  $newdn   = 'uid='.$new_uid;
+  if (empty($_REQUEST['type'])) { $_REQUEST['type']='public'; }
+  if($_REQUEST['type'] == 'private' && $conf['privatebook']){
+    $newdn .= ','.$conf['privatebook'].','.$_SESSION['ldapab']['binddn'];
+  }else{
+    $newdn .= ','.$conf['publicbook'];
   }
+  $entry['displayname'] = $entry['givenname'].' '.$entry['name'];;
+  $entry = prepare_ldap_entry($entry);
 
-  /**
-   * saves the data from $_REQUEST[entry] to the LDAP directory
-   *
-   * returns given or constructed dn
-   */
-  function _saveData(){
-    global $LDAP_CON;
-    global $conf;
-    $entries = namedentries();
-    $entries['mail']='mail';  //special field mail isn't in entries so we add it here
-    if($conf[extended]){
-      $entries['marker']='marker'; //same for marker inextended schema
-    }
-
-    $entry = $_REQUEST[entry];
-    $dn    = $_REQUEST[dn];
-    //construct new dn
-    $now    = time();
-    $newdn  = 'uid='.$now;
-    if($_REQUEST[type] == 'private'){
-      $newdn .= ', '.$conf[privatebook].', '.$_SESSION[ldapab][binddn];
-    }else{
-      $newdn .= ', '.$conf[publicbook];
-    }
-    $entry[cn]          = $entry[givenname].' '.$entry[name];;
-    $entry = prepare_ldap_entry($entry);
-
-/*print '<pre>';
+/*
+print '<pre>';
 print_r($entry);
-print '</pre>';*/
+print '</pre>';
+*/
 
-    if(empty($dn)){
-      //new entry
-      $entry[uid][] = $now;
-      $r = ldap_add($LDAP_CON,$newdn,$entry);
-      tpl_ldaperror();
-      return $newdn;
-    }else{
-      // in extended mode we have to make sure the right classes are set
-      if($conf[extended]){
-        ldap_store_objectclasses($dn,array('inetOrgPerson','contactPerson'));
-      }
-      //modify entry (touches only our attributes)
-      foreach (array_keys($entries) as $key){
-        if($key == 'dn'){
+  if(empty($dn)){
+    //new entry
+    $entry['uid'][] = $new_uid;
+    $r = @ldap_add($LDAP_CON,$newdn,$entry);
+    tpl_ldaperror();
+    return $newdn;
+  }else{
+    // update the objectClasses
+    ldap_store_objectclasses($dn,$OCLASSES);
+    unset($entry['objectclass']);
+
+    //modify entry attribute by attribute - this ensure we don't delete unknown stuff
+    foreach (array_values($FIELDS) as $key){
+      if($key == 'dn'){
+        continue;
+      }elseif(empty($entry[$key])){
+        // field is empty -> handle deletion (except for photo unless deletion triggered)
+        if (empty($_REQUEST['delphoto'])) { $_REQUEST['delphoto']=0; }
+        if($key == 'jpegPhoto' && !$_REQUEST['delphoto']){
           continue;
-        }elseif(empty($entry[$key])){
-          if($key == 'jpegPhoto' && !$_REQUEST['delphoto']){
-            continue;
-          }
-          unset($del);
-          $del[$key]=array();
-          $r = @ldap_mod_replace($LDAP_CON,$dn,$del);
-          tpl_ldaperror("del $key");
-        }else{
-          unset($add);
-          $add[$key]=$entry[$key];
-          $r = @ldap_mod_replace($LDAP_CON,$dn,$add);
-          tpl_ldaperror("mod $key");
         }
+        unset($del);
+        $del[$key]=array();
+        $r = @ldap_mod_replace($LDAP_CON,$dn,$del);
+        tpl_ldaperror("del $key");
+      }else{
+        unset($add);
+        $add[$key]=$entry[$key];
+        $r = @ldap_mod_replace($LDAP_CON,$dn,$add);
+        tpl_ldaperror("mod $key");
       }
-      return $dn;
     }
-  }
 
-  /**
-   * does as the name says - delete the whole entry
-   */
-  function _delEntry($dn){
-    global $LDAP_CON;
-    if(ldap_full_delete($LDAP_CON,$dn,true)){
-      header("Location: index.php");
-      exit;
+    // special tag handling for Thunderbird
+    if($conf['tbtaghack'] && in_array('contactPerson',$OCLASSES)){
+        for($i=1;$i<5;$i++){
+            if(empty($entry["custom$i"])){
+                // deletion
+                unset($del);
+                $del["custom$i"]=array();
+                $r = @ldap_mod_replace($LDAP_CON,$dn,$del);
+                tpl_ldaperror("del custom$i");
+            }else{
+                // modification
+                unset($add);
+                $add["custom$i"]=$entry["custom$i"];
+                $r = @ldap_mod_replace($LDAP_CON,$dn,$add);
+                tpl_ldaperror("mod custom$i");
+            }
+        }
     }
-  }
 
-  /**
-   * gets the binary data from an uploaded file
-   */
-  function _getUploadData(){
-    $file = $_FILES[photoupload];
-
-    if (is_uploaded_file($file[tmp_name])) {
-      if(preg_match('=image/p?jpe?g=',$file[type])){
-        $fh = fopen($file[tmp_name],'r');
-        $data = fread($fh,$file[size]);
-        fclose($fh);
-        unlink($file[tmp_name]);
-        return $data;
-      }
+
+    return $dn;
+  }
+}
+
+/**
+ * does as the name says - delete the whole entry
+ */
+function _delEntry($dn){
+  global $LDAP_CON;
+  if(ldap_full_delete($LDAP_CON,$dn,true)){
+    header("Location: index.php");
+    exit;
+  }
+}
+
+/**
+ * gets the binary data from an uploaded file
+ */
+function _getUploadData(){
+  global $smarty;
+  global $lang;
+  $file = $_FILES['photoupload'];
+
+  if (is_uploaded_file($file['tmp_name'])) {
+    if(preg_match('=image/p?jpe?g=',$file['type'])){
+      $fh = fopen($file['tmp_name'],'r');
+      $data = fread($fh,$file['size']);
+      fclose($fh);
+      unlink($file['tmp_name']);
+      return $data;
+    } else {
+      $smarty->assign('jpegError',$lang['err_wrongFileType']);
     }
-    return '';
+  } elseif (preg_match('/http:\/\//', $_REQUEST["photo"])) {
+    $fd = fopen($_REQUEST["photo"], "rb");
+    $data = '';
+    while (!feof($fd)) {
+      $data .= fread($fd, 8192);
+    }
+    fclose($fd);
+    return $data;
+  } else {
+    $smarty->assign('jpegError',$lang['err_fileNotUploaded']);
   }
-?>
+  return '';
+}
+