]> git.sur5r.net Git - contagged/blobdiff - ajax.php
Merge pull request #15 from cweiske/master
[contagged] / ajax.php
index 75da75ae44c7b33acaf73300056aae65e0a8190f..580e262ed413b2214b67e70283805f7eb156150b 100644 (file)
--- a/ajax.php
+++ b/ajax.php
@@ -1,15 +1,27 @@
-<?
-require_once('init.php');
+<?php
+require_once('inc/init.php');
 ldap_login();
 
-header('Content-Type: text/html; charset=utf-8');
+if ($conf['userlogreq'] && !isset($_SESSION['ldapab']['username'])){
+  header("HTTP/1.1 401 Access Denied");
+  echo '<h1>Access Denied</h1>';
+  exit();
+}
+
+
+$FIELD = preg_replace('/entry\[/','',$_REQUEST['field']);
+$FIELD = preg_replace('/\W+/','',$FIELD);
 
-if($_REQUEST['taglookup']){
-  ajax_taglookup($_REQUEST['taglookup']);
-}elseif($_REQUEST['addnote']){
-  ajax_addnote($_REQUEST['addnote'],$_REQUEST['note']);
-}elseif($_REQUEST['settags']){
-  ajax_settags($_REQUEST['settags'],$_REQUEST['tags']);
+if($_REQUEST['dn'] && $_REQUEST['addnote']){
+  ajax_addnote($_REQUEST['dn'],$_REQUEST['addnote']);
+}elseif($_REQUEST['dn'] && $_REQUEST['settags']){
+  ajax_settags($_REQUEST['dn'],$_REQUEST['settags']);
+}elseif($_REQUEST['dn'] && $_REQUEST['loadtags']){
+  ajax_loadtags($_REQUEST['dn'],$_REQUEST['loadtags']);
+}elseif($FIELD == 'marker'||$FIELD == 'markers'){
+  ajax_taglookup($_REQUEST['value']);
+}else{
+  ajax_lookup($FIELD,$_REQUEST['value']);
 }
 
 /**
@@ -18,37 +30,44 @@ if($_REQUEST['taglookup']){
 function ajax_addnote($dn,$note){
   global $conf;
   global $LDAP_CON;
+  global $FIELDS;
+
+  header('Content-Type: text/html; charset=utf-8');
 
   // fetch the existing note
-  $result = ldap_search($LDAP_CON,$dn,'(objectClass=inetOrgPerson)',array('description'));
+  $result = ldap_search($LDAP_CON,$dn,'(objectClass=inetOrgPerson)',array($FIELDS['note']));
   if(ldap_count_entries($LDAP_CON,$result)){
     $result = ldap_get_binentries($LDAP_CON, $result);
   }
-  $note = $note."\n\n".$result[0]['description'][0];
+  $note = $note."\n\n".$result[0][$FIELDS['note']][0];
   $note = preg_replace("!\n\n\n+!","\n\n",$note);
 
-  $entry['description'] = $note;
+  $entry[$FIELDS['note']] = $note;
   ldap_modify($LDAP_CON,$dn,$entry);
 
 
-  require_once(dirname(__FILE__).'/smarty/plugins/modifier.noteparser.php');
+  require_once(dirname(__FILE__).'/inc/smarty/plugins/modifier.noteparser.php');
   print smarty_modifier_noteparser($note);
 }
 
 /**
- * Sett tags for a contact
+ * Set tags for a contact
  */
 function ajax_settags($dn,$tags){
   global $conf;
   global $LDAP_CON;
-  if(!$conf[extended]) return;
+  global $FIELDS;
+  if(!$FIELDS['_marker']) return;
+
+  header('Content-Type: text/html; charset=utf-8');
 
   $tags = explode(',',$tags);
   $tags = array_map('trim',$tags);
   $tags = array_unique($tags);
+  $tags = array_diff($tags, array('')); //strip empty ones
 
-  $entry['marker'] = $tags;
-  ldap_modify($LDAP_CON,$dn,$entry);
+  $entry[$FIELDS['_marker']] = $tags;
+  ldap_mod_replace($LDAP_CON,$dn,$entry);
 
   foreach ($tags as $tag){
     print '<a href="index.php?marker=';
@@ -59,25 +78,56 @@ function ajax_settags($dn,$tags){
   }
 }
 
+/**
+ * Load current tags of an entry
+ */
+function ajax_loadtags($dn,$type='plain'){
+  global $conf;
+  global $LDAP_CON;
+  global $FIELDS;
+  if(!$FIELDS['_marker']) return;
+
+  header('Content-Type: text/html; charset=utf-8');
+
+  $sr = ldap_search($LDAP_CON,$dn,'(objectClass=inetOrgPerson)',array($FIELDS['_marker']));
+  if(!ldap_count_entries($LDAP_CON,$sr)) return false;
+  $result = ldap_get_binentries($LDAP_CON, $sr);
+  $entry  = $result[0];
+
+  if($type == 'plain'){
+    echo join(', ',(array) $entry[$FIELDS['_marker']]);
+  }else{
+    foreach ((array) $entry[$FIELDS['_marker']] as $tag){
+      echo '<a href="index.php?marker=';
+      echo rawurlencode($tag);
+      echo '" class="tag">';
+      echo htmlspecialchars($tag);
+      echo '</a> ';
+    }
+  }
+}
+
 /**
  * Find all tags (markers) starting with the given
  * string
  */
 function ajax_taglookup($tag){
+  header('Content-Type: text/xml; charset=utf-8');
   global $conf;
   global $LDAP_CON;
-  if(!$conf[extended]) return;
+  global $FIELDS;
+  if(!$FIELDS['_marker']) return;
 
   $search = ldap_filterescape($tag);
-  $filter = "(&(objectClass=contactPerson)(marker=$search*))";
-  $result = ldap_queryabooks($filter,'marker');
+  $filter = "(&(objectClass=inetOrgPerson)(".$FIELDS['_marker']."=$search*))";
+  $result = ldap_queryabooks($filter,$FIELDS['_marker']);
 
   if(!count($result)) return;
 
   $tags = array();
   foreach ($result as $entry){
-    if(count($entry['marker'])){
-      foreach($entry['marker'] as $marker){
+    if(count($entry[$FIELDS['_marker']])){
+      foreach($entry[$FIELDS['_marker']] as $marker){
         if(preg_match('/^'.preg_quote($tag,'/').'/i',$marker)){
           array_push($tags, strtolower($marker));
         }
@@ -88,11 +138,53 @@ function ajax_taglookup($tag){
   $tags = array_unique($tags);
   sort($tags,SORT_STRING);
 
-  print '<ul>';
+  echo '<?xml version="1.0"?>'.NL;
+  echo '<ajaxresponse>'.NL;
   foreach($tags as $out){
-    print '<li>'.htmlspecialchars($out).'</li>';
+    echo '<item>'.NL;
+    echo '<value>'.htmlspecialchars($out).'</value>'.NL;
+    echo '<text>'.htmlspecialchars($out).'</text>'.NL;
+    echo '</item>'.NL;
   }
-  print '</ul>';
+  echo '</ajaxresponse>'.NL;
+}
+
+/**
+ * Do a simple lookup in any simple field
+ */
+function ajax_lookup($field,$search){
+    header('Content-Type: text/xml; charset=utf-8');
+    global $conf;
+    global $LDAP_CON;
+    global $FIELDS;
+
+    if(!$FIELDS[$field]) return;
+    $field = $FIELDS[$field];
+
+    $search = ldap_filterescape($search);
+    $filter = "(&(objectClass=inetOrgPerson)($field=$search*))";
+    $result = ldap_queryabooks($filter,$field);
+    if(!count($result)) return;
+
+    $items = array();
+    foreach ($result as $entry){
+        if(isset($entry[$field]) && !empty($entry[$field])){
+            $items[] = $entry[$field][0];
+        }
+    }
+
+    $items = array_unique($items);
+    sort($items,SORT_STRING);
+
+    echo '<?xml version="1.0"?>'.NL;
+    echo '<ajaxresponse>'.NL;
+    foreach($items as $out){
+        echo '<item>'.NL;
+        echo '<value>'.htmlspecialchars($out).'</value>'.NL;
+        echo '<text>'.htmlspecialchars($out).'</text>'.NL;
+        echo '</item>'.NL;
+    }
+    echo '</ajaxresponse>'.NL;
 }
 
 ?>