LDAP Verzeichnis per PHP in XML an Cisco Telefone senden

So nun sieht mein code so aus.
PHP:
<?php
header("Content-type: text/xml");
header("Connection: close");

$lv_server="localhost";
$lv_basedn="cn=manager,dc=MEINEdomain,dc=org";
$upasswd = "---";
$lv_url="http://192.168.0.1/asterisk/ldap.php";
$lt_fieldname=array ("homephone", "mobile", "telephonenumber");
$lt_fielddesc=array ("Privat", "Handy", "Firma");
$suchwert = (isset($_GET['suchwert']))?$_GET['suchwert']:null;
  if (!$suchwert) {
//      if (!isset($_GET['suchwert'])) {
//      if (!isset($_GET[!$suchwert])) {
//if($suchwert==null){
        print ("<CiscoIPPhoneInput>\n");
        print ("<Title>LDAP Suche</Title>\n");
        print ("<Prompt>Bitte Suchbegriff eingeben !</Prompt>\n");
        print ("<URL>".$lv_url."</URL>\n");
        print ("<InputItem>\n");
        print ("<DisplayName>Suche nach</DisplayName>\n");
        print ("<QueryStringParam>suchwert</QueryStringParam>\n");
        print ("<DefaultValue />\n");
        print ("<InputFlags>L</InputFlags>\n");
        print ("</InputItem>\n");
        print ("</CiscoIPPhoneInput>\n");

        } else {
        if (!isset($entry)) {
//      if (!isset($_GET['suchwert'])) {
        print ("<CiscoIPPhoneMenu>\n");
        print ("<Title>Suchergebnis</Title>\n");
        print ("<Prompt>Bitte auswaeln !</Prompt>\n");
        $ds=ldap_connect($lv_server);

                if ($ds) {

        $r=ldap_bind($ds);
        $sr=ldap_search($ds, $lv_basedn, $upasswd, "sn=$suchwert*");
        $info=ldap_get_entries($ds, $sr);
         for ($i=0; $i<$info["count"]; $i++) {

         print ("<MenuItem>\n");
         print ("<Name>".$info[$i]["cn"][0]."</Name>\n");
         print ("<URL>".$lv_url."?entry=$i&amp;suchwert=$suchwert*</URL>\n");
         print ("</MenuItem>\n"); }
         ldap_close($ds); }

        print ("</CiscoIPPhoneMenu>\n");
  // } else {

        print ("<CiscoIPPhoneDirectory>\n");
        print ("<Prompt>Bitte auswaeln !</Prompt>\n");
    $ds=ldap_connect($lv_server);

      if ($ds) {
      $r=ldap_bind($ds);
     $sr=ldap_search($ds, $lv_basedn, $upasswd, "sn=$suchwert");
     $info=ldap_get_entries($ds, $sr);

        print ("<Title>".$info[$entry]["cn"][0]."</Title>\n");
     for ($j=0; $j<sizeof($lt_fieldname); $j++) {
     for ($i=0; $i<sizeof($info[$entry][$lt_fieldname[$j]])-1; $i++) {

    print ("<DirectoryEntry>");
    print ("<Name>".$lt_fielddesc[$j]."</Name>");
    print ("<Telephone>".$info[$entry][$lt_fieldname[$j]][$i]."#</Telephone>\n");
    print ("</DirectoryEntry>"); }
             }
    ldap_close($ds); }
     print ("</CiscoIPPhoneDirectory>\n");

         }
    }
?>
Doch auch das bringt nur zum XML Fehler.
 
Ruf doch das Ding mal aus einem normalen Browser auf und paste den Quelltext der dann vom Webserver geliefert wird.
 
einfacher aufruf:
PHP:
<CiscoIPPhoneInput>
<Title>LDAP Suche</Title>
<Prompt>Bitte Suchbegriff eingeben !</Prompt>
<URL>http://192.168.0.1/asterisk/ldap.php</URL>
<InputItem>
<DisplayName>Suche nach</DisplayName>
<QueryStringParam>suchwert</QueryStringParam>
<DefaultValue />
<InputFlags>L</InputFlags>
</InputItem>
</CiscoIPPhoneInput>

aufruf mit ...?suchwert=gugug
huch man siehe da:

PHP:
CiscoIPPhoneMenu>
<Title>Suchergebnis</Title>
<Prompt>Bitte auswaeln !</Prompt>
<br />
<b>Warning</b>:  ldap_bind() [<a href='function.ldap-bind'>function.ldap-bind</a>]: Unable to bind to server: Protocol error in <b>/srv/www/asterisk/ldap.php</b> on line <b>38</b><br />
</CiscoIPPhoneMenu>
<CiscoIPPhoneDirectory>

<Prompt>Bitte auswaeln !</Prompt>
<br />
<b>Warning</b>:  ldap_bind() [<a href='function.ldap-bind'>function.ldap-bind</a>]: Unable to bind to server: Protocol error in <b>/srv/www/asterisk/ldap.php</b> on line <b>57</b><br />
<br />
<b>Warning</b>:  ldap_search() [<a href='function.ldap-search'>function.ldap-search</a>]: Expected Array as last element in <b>/srv/www/asterisk/ldap.php</b> on line <b>58</b><br />

<br />
<b>Warning</b>:  ldap_get_entries(): supplied argument is not a valid ldap result resource in <b>/srv/www/asterisk/ldap.php</b> on line <b>59</b><br />
<Title></Title>
</CiscoIPPhoneDirectory>
nur wie bringt mich das jetzt weiter ?
 
Schönen Dank für den Tipp mit dem Seitenquelltext, betateilchen.
ich hab meinen sladp jetzt auch die Protokollversion 2 erlaubt und bin damit schon ein ganzes Stück weiter.
Aufgesetzt hab ich den Slapd nach Anleitung von :
http://www.debianhowto.de/doku.php/de:howtos:sarge:openldap?s=slapd
PHP:
<?php
header("Content-type: text/xml");
header("Connection: close");

$lv_server= "localhost";
$lv_basedn= "DC=domain,DC=org";
$lv_basenn= "cn=manager,dc=domain,dc=org";
$pass="---";
$lv_url="http://192.168.0.1/asterisk/ldap.php";
$lt_fieldname=array ("homePhone", "mobile", "telephoneNumber");
$lt_fielddesc=array ("Privat", "Handy", "Firma");
$suchwert = (isset($_GET['suchwert']))?$_GET['suchwert']:null;
//print $suchwert;
  if (!$suchwert) {
        print ("<CiscoIPPhoneInput>\n");
        print ("<Title>LDAP Suche</Title>\n");
        print ("<Prompt>Bitte Suchbegriff eingeben !</Prompt>\n");
        print ("<URL>".$lv_url."</URL>\n");
        print ("<InputItem>\n");
        print ("<DisplayName>Suche nach</DisplayName>\n");
        print ("<QueryStringParam>suchwert</QueryStringParam>\n");
        print ("<DefaultValue />\n");
        print ("<InputFlags>L</InputFlags>\n");
        print ("</InputItem>\n");
        print ("</CiscoIPPhoneInput>\n");

        } else {
        if (!isset($entry)) {
                print ("<CiscoIPPhoneMenu>\n");
                print ("<Title>Suchergebnis</Title>\n");
                print ("<Prompt>Bitte auswaehln !</Prompt>\n");
                $ds=ldap_connect($lv_server);
                if ($ds) {
                        $r=ldap_bind($ds, $lv_basenn, $pass);
                        $sr=ldap_search($ds, $lv_basedn, "sn=$suchwert*");
                        $info=ldap_get_entries($ds, $sr);
                        for ($i=0; $i<$info["count"]; $i++) {
                                print ("<MenuItem>\n");
                                print ("<Name>".$info[$i]["cn"][0]."</Name>\n");
                                print ("<URL>".$lv_url."?entry=$i&amp;suchwert=$suchwert*</URL>\n");
                                print ("</MenuItem>\n");
                        }
                        ldap_close($ds);
                }
                print ("</CiscoIPPhoneMenu>\n");
                } else {
                       print ("<CiscoIPPhoneDirectory>\n");
                        print ("<Prompt>Bitte auswaehln !</Prompt>\n");
                        $ds=ldap_connect($lv_server);
                        if ($ds) {
                                $r=ldap_bind($ds, $lv_basenn, $pass);
                                $sr=ldap_search($ds, $lv_basedn, "sn=$suchwert");
                                $info=ldap_get_entries($ds, $sr);
                                print ("<Title>".$info[$entry]["cn"][0]."</Title>\n");
                                for ($j=0; $j<sizeof($lt_fieldname); $j++) {
                                        for ($i=0; $i<sizeof($info[$entry][$lt_fieldname[$j]])-1; $i++) {
                                        print ("<DirectoryEntry>");
                                        print ("<Name>".$lt_fielddesc[$j]."</Name>");
                                        print ("<Telephone>".$info[$entry][$lt_fieldname[$j]][$i]."#</Telephone>\n");
                                        print ("</DirectoryEntry>");
                                        }
                                }
                                ldap_close($ds);
                        }
                print ("</CiscoIPPhoneDirectory>\n");
                }
        }
?>

Womit jetzt auch die Useranmeldung am slapd klappt.
Gebe ich nun als Suchwert einen Buchstaben über das Telefon ein,
werden mir aus dem LDAP alle dazugehörigen Namen angezeigt.
Wähle ich dann einen Eintrag davon aus, erhalte ich wieder nur eine leereseite und keine anrufbare Telefonnummer. :confused:
 
Zuletzt bearbeitet:
@rasselbande:

und hast Du's geschafft ? Ich bin von PHP nicht so begeistert, habe meine Loesung daher in python implementiert und die XML-Objekte als Klassen definiert.

Ist schon laenger her, das ich PHP programmiert habe - kann es sein, dass "$entry" nicht gesetzt wird ?
 
Hi McRip,

danke der Nachfrage.
Ich hab von Chaos eine andere aber auch auf PHP basierende Variante bekommen. Dieses Script pass ich grad mühsam an meine Bedürfnisse an.
Sobald ich alles zusammen hab ( ich möchte auch noch ein agi für asterisk, so wie du es aus dem MySQL Code kennst ), Poste ich es hier mal.
Grad bin ich dabei und bau betateilchens Suchfunktion in den Code von Chaos ein.... (ach wenn ich doch bloss PHP verstehen würde :confused: )
 
@rasselbande

das ist eigendlich nicht schwer. für die Suche würde ich eine eigene seite nehmen.
suchwert - aus dem script von betateilchen dürfte meinem sn/cn entsprechen
 
So nun die Zusammenfassung :
als erstes habe ich einen LDAP-Server nach Anleitung von :
http://www.debianhowto.de/doku.php/de:howtos:sarge:openldap
aufgesetzt.
Einen Webserver mit PHP4 hatte ich schon.
Nun habe ich zwei Scripte auf dem Webserver, dass erste ist die Abfrage nach dem Suchbegriff. Hierfür hab ich auf Anregung von Chaos2000, den ersten Teil von betateilchens Code benutzt (Danke betateilchen).

ldap.php
PHP:
<?php
header("Content-type: text/xml");
header("Connection: close");
$lv_url = "http://192.168.0.1/asterisk/ldap2.php";
        print ("<CiscoIPPhoneInput>\n");
        print ("<Title>LDAP Suche</Title>\n");
        print ("<Prompt>Bitte Suchbegriff eingeben !</Prompt>\n");
        print ("<URL>".$lv_url."</URL>\n");
        print ("<InputItem>\n");
        print ("<DisplayName>Suche nach</DisplayName>\n");
        print ("<QueryStringParam>suchwert</QueryStringParam>\n");
        print ("<DefaultValue />\n");
        print ("<InputFlags>L</InputFlags>\n");
        print ("</InputItem>\n");
        print ("</CiscoIPPhoneInput>\n");

?>
In dem Code erfolgt die Abfrage nach einem (oder mehreren) Buchstaben die dann per GET an das zweite Script überbergeben wird.

Nun das zweite Script (Danke Chaos2000) :

ldap2.php
PHP:
<?php

##########################################
# Config section

$Server = "http://MeinWebserver/Pfad";

$ldaphost = "localhost";
$ldapport = "389";
$binddn = "CN=LDAPUser,DC=domain,DC=org"; 
$bind = "dc=domain,dc=org";
$upasswd = "MeinLDAPPasswort";
$lv_url="http://MeinWebserver/Pfad/ldap2.php";

$ldapSortAttributes = array('cn');
##########################################
#



# Set content type
header("Content-Type: text/xml");
header("Connection: close");


$ds = ldap_connect($ldaphost, $localport) or die("Could not connect to $ldaphost");
if (!$ds) {
        exit();
}
else{
        ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
        $ldapbind = ldap_bind($ds, $binddn, $upasswd) or die("Could not bind to $ldaphost");
}



if (($Usersn && $UserGivenname) || isset($_GET['cn']) ) {

        $EmployeeDirectoryListing = "<?xml-stylesheet type=\"text/xsl\" href=\"Directory.xsl\"?>\n";
        $EmployeeDirectoryListing .= "<CiscoIPPhoneDirectory>\n";
        if(isset($_GET['cn'])){
            $filter =  "(cn=".decodeURL($_GET['cn']).")";
        }

        $search = "$bind";
        $sr=ldap_search($ds,$search, $filter);

        foreach($ldapSortAttributes as $eachSortAttributes){

            if(in_array($eachSortAttributes, $ldapSortAttributes)){
                ldap_sort($ds, $sr, $eachSortAttributes);
            }
        }
        $info = ldap_get_entries($ds, $sr);

        $EmployeeDirectoryListing .= "<Title>".$info[0]['givenname'][0]." , ".$info[0]['sn'][0]."</Title>";

        for ($i=0; $i<sizeof($info); $i++) {

                $CellPhone = ereg_replace("[ ()-]+", "", $info[$i]['mobile'][0]);
                $HomePhone = ereg_replace("[ ()-]+", "", $info[$i]['homephone'][0]);
                $WorkPhone = ereg_replace("[ ()-]+", "", $info[$i]['telephonenumber'][0]);

                if ($info[$i]["mobile"]) {
                        for($j=0; $j <= count($info[$i]["mobile"])-2; $j++){
                                $EmployeeDirectoryListing .= "<DirectoryEntry>\n";
                                $EmployeeDirectoryListing .= "<Name>Mobile: ".($j+1)."</Name>\n";
                                $EmployeeDirectoryListing .= "<Telephone type=\"mobile\">$LongDistanceExtension$CellPhone</Telephone>\n";
                                $EmployeeDirectoryListing .= "</DirectoryEntry>\n";
                        }
                }

                if ($info[$i]["homephone"]) {
                        for($j=0; $j <= count($info[$i]["homephone"])-2; $j++){
                                $HomePhone = ereg_replace("[ ()-]+", "", $info[$i]['homephone'][$j]);
                                $EmployeeDirectoryListing .= "<DirectoryEntry>\n";
                                $EmployeeDirectoryListing .= "<Name>Home: ".($j+1)."</Name>\n";
                                $EmployeeDirectoryListing .= "<Telephone type=\"homephone\">$LongDistanceExtension$HomePhone</Telephone>\n";
                                $EmployeeDirectoryListing .= "</DirectoryEntry>\n";
                        }
                }
                if ($info[$i]["telephonenumber"]) {
                        for($j=0; $j <= count($info[$i]["telephonenumber"])-2; $j++){
                                $WorkPhone = ereg_replace("[ ()-]+", "", $info[$i]['telephonenumber'][0]);
                                $EmployeeDirectoryListing .= "<DirectoryEntry>\n";
                                $EmployeeDirectoryListing .= "<Name>Dienst: ".($j+1)."</Name>\n";
                                $EmployeeDirectoryListing .= "<Telephone type=\"telephonenumber\">$LongDistanceExtension$WorkPhone</Telephone>\n";
                                $EmployeeDirectoryListing .= "</DirectoryEntry>\n";
                        }
              }
                if ($info[$i]["mail"]) {
                        for($j=0; $j <= count($info[$i]["mail"])-2; $j++){
                                $EmployeeDirectoryListing .= "<DirectoryEntry>\n";
                                $EmployeeDirectoryListing .= "<Name>Email ".($j+1).":</Name>\n";
                                $EmployeeDirectoryListing .= "<Telephone type=\"mail\">$LongDistanceExtension".$info[$i]["mail"][$j]."</Telephone>\n";
                                $EmployeeDirectoryListing .= "</DirectoryEntry>\n";
                        }
                }
        }

        $EmployeeDirectoryListing .= "</CiscoIPPhoneDirectory>\n";

        echo "$EmployeeDirectoryListing";

} else {

        $CompanyNameList = "";

        $CompanyNameList .= "<CiscoIPPhoneMenu>\n";
        $CompanyNameList .= "<Title>LDAP Routy</Title>\n";
        $CompanyNameList .= "<Prompt>Bitte Auswaehlen</Prompt>\n";

        $query = "dc=anarchist,dc=kicks-ass,dc=org";

        $sr=ldap_search($ds,$query,"(objectClass=inetOrgPerson)(cn='*')");

        foreach($ldapSortAttributes as $eachSortAttributes){
            if(in_array($eachSortAttributes, $ldapSortAttributes)){
                ldap_sort($ds, $sr, $eachSortAttributes);
            }
        }
        if(isset($_GET['suchwert'])){
            $sr=ldap_search($ds,$query, "(&(objectClass=inetOrgPerson)(givenName=".$_GET['suchwert']."*))");
            }
            else{
            $sr=ldap_search($ds,$query, "objectClass=inetOrgPerson");
            }

        # If we are searching by last name the add this filter to the query
        if ($LastName){
        $sr=ldap_search($ds,$query, "(&(objectClass=inetOrgPerson)(cn=*&aps$LastName&aps*))");
        }
//      # Execute the query
        $info = ldap_get_entries($ds, $sr);

        # Count the number of rows returned. This is important because if a full 30 are returned
        # we will display a more option
        $NumberOfRows = $info["count"];

        if ($NumberOfRows >= 30) {
                $NextSetValue = $NextSet+1;
        }

        # Parse through the query and set up the menu items.
        for ($i=0; $i<$info["count"]; $i++) {
                                $CompanyNameList .= "<MenuItem>\n";
                                $CompanyNameList .= "<Name>";
                                $CompanyNameList .= $info[$i]["cn"][0];
                                $CompanyNameList .= "</Name>\n";
                                $CompanyNameList .= "<URL>";
                                $CompanyNameList .= "$Server/ldap2.php?";
                                $CompanyNameList .= "&amp;cn=";
                                $CompanyNameList .= encodeURL($info[$i]["cn"][0]);
                                $CompanyNameList .= "</URL>\n";
                                $CompanyNameList .= "</MenuItem>\n";
            }
         # If we set NextSetValue above then we will display the more option. Which sets NextSet
//      if ($NextSetValue) {
//                     $CompanyNameList .= "<MenuItem>\n";
//                       $CompanyNameList .= "<Name>MORE</Name>\n";
//                       $CompanyNameList .= "<URL>$Server/ldap2.php&amp;NextSet=$NextSetValue</URL>\n";
//                       $CompanyNameList .= "</MenuItem>\n";
// }

        $CompanyNameList .= "</CiscoIPPhoneMenu>";
        echo "$CompanyNameList";
}

function encodeURL($arg){
    return urlencode(str_replace(" ","%20", $arg));
}

function decodeURL($arg){
    return urldecode(str_replace("%20"," ", $arg));

}
?>
Hier wird nun zu dem Suchbegriff des ersten Scripts, eine Liste mit Treffern dargestellt. Wurde kein Suchbegriff angegeben, wird eine (komplette) Liste des LDAP angezeigt.

Das abfragen des LDAP bei eingehenden Anrufen und senden des Namen zum Telefon klappt mit "ldapget" recht gut. Es ist es unter :
http://www.mezzo.net/asterisk/
zu finden.
 
Warum man das nun in 2 Skripte aufteilen mußte, wird mir wohl für immer verschlossen bleiben - mein "1-Skript-PHP" funktioniert nach wie vor problemlos :gruebel:
 
Betateilchen, ich hätte deinen Code ja gern benutzt,
doch wie McRip schon bemerkte, fehlt wohl die Zuordnung zu "if (!isset($entry)) {"
oder so. Jedenfalls lief er bei mir nicht.

Und MCRip, nein ich habe noch nie einen Videorecorder "programmiert".
 
Betreibt jemand vone uch zufällig dieses Skript mit einem Microsoft AD Server? Interessant wäre die Kontakte aus dem Outlook somit auch auf dem Telefon sichtbar zu machen.
 
Also das Skript sieht bei mir soweit ganz gut aus. Zumindest im Browser.
Im Telefon bekomme ich die Abfrage nach der "Suche nach", wenn ich dann aber einen Suchbegriff eingetippert habe, bekomme ich ein HTTP (502)
Welches imho "Bad Gateway" bedeutet. Im Browser bekomme ich eine Auswahl angezeigt, weil der Name nicht eindeutig ist.
Muss ich irgendwas umkonfigurieren/ändern ?

__EDIT: Ups, zweite Seite übersehen *rotwerd*
ck84: Was hat denn Outlook mit deinem AD zu tun ? Oder meinst du, wegen eines Exchange ?
 
Kostenlos!

Statistik des Forums

Themen
248,916
Beiträge
2,304,972
Mitglieder
378,628
Neuestes Mitglied
Apfelbaum94