PHP Classes
elePHPant
Icontem

File: ldif2array.class.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of tobozo  >  LDIF 2 Array  >  ldif2array.class.php  >  Download  
File: ldif2array.class.php
Role: Class source
Content type: text/plain
Description: Class source
Class: LDIF 2 Array
Parse LDIF data into arrays
Author: By
Last change: Wojciech Sznapka sent a patch :

When entry has more than one value with same key, which represents an array, then it isn't taken into consideration. For instance:

dn: uid=info,o=bar,dc=foo
uid: info
givenName: info
sn: info
mailQuotaSize: 0
objectClass: baseObject
objectClass: inetOrgPerson
objectClass: qmailUser

parser would return objectClass = qmailUser. I'm attaching patch to
resolve this problem, it's GPL so feel free with using it :-)

Best regards
Wojtek Sznapka

131c131,139
< $this->entries[$k1][$i]=$arr[1];
---
> // handling arrays in ldap entry
> if (isset($this->entries[$k1][$i])) {
> if (!is_array($this->entries[$k1][$i])) {
> $this->entries[$k1][$i]=array($this->entries[$k1][$i]);
> }
> $this->entries[$k1][$i][]=$arr[1];
> } else {
> $this->entries[$k1][$i]=$arr[1];
> }
147c155
Date: 6 years ago
Size: 4,249 bytes
 

Contents

Class file image Download
<?php
/**
* Class to read LDIF data
* @author tobozo <tobozo at phpsecure dot info>
* @contributor Vladimir Struchkov <great_boba at yahoo dot com>
* @contributor Wojciech Sznapka <wojciech at sznapka dot pl>
* @copyleft (l) 2006-2009 tobozo
* @package ldif2Array
* @version 1.3
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @date 2006-12-13
*/

class ldif2array {

   
/**
    * stores file name
    * @type string
    */
   
var $file;

   
/**
    * store data
    * @type string
    */
   
var $rawdata;

   
/**
    * store entries
    * @type array
    */
   
var $entries = array();


   
//== constructor ====================================================================
   
function ldif2array(/*string*/$file='', /*bool*/$process=false) {
     
$this->file = $file;
      if(
$process) {
       
$this->makeArray();
      }
    }


   
/**
    * returns the array of LDIF entries
    * @return array
    */
   
function getArray() {
      return
$this->entries;
    }


   
/**
    * Sanity check before building the array, returns false if error
    * @return bool
    */
   
function makeArray() {
       if(
$this->file=='') {
         if(
$this->rawdata=='') {
           echo
"No filename specified, aborting";
           return
false;
         }
       } else {
         if(!
file_exists($this->file)) {
           echo
"File $this->file does not exist, aborting";
           return
false;
         } else {
          
$this->rawdata = file_get_contents($this->file);
         }
       }

       if(
$this->rawdata=='') {
         echo
"No data in file, aborting";
         return
false;
       }

      
$this->parse2array();
       return
true;

       if(!
$this->splitEntries()) {
         echo
"Could not extract data from this file, aborting";
         return
false;
       }
      
$this->splitBlocks();
      
sort($this->entries);
       return
true;
    }


   
/**
    * Build the array in two passes
    * @return void
    */
   
function parse2array() {
       
/**
        * Thanks to Vladimir Struchkov <great_boba yahoo com> for providing the
        * code to extract base64 encoded values
        */

       
$arr1=explode("\n",str_replace("\r",'',$this->rawdata));
       
$i=$j=0;
       
$arr2=array();

       
/* First pass, rawdata is splitted into raw blocks */
       
foreach($arr1 as $v) {
            if (
trim($v)=='') {
                ++
$i;
               
$j=0;
            } else {
               
$arr2[$i][$j++]=$v;
            }
        }

       
/* Second pass, raw blocks are updated with their name/value pairs */
       
foreach($arr2 as $k1=>$v1) {
           
$i=0;
           
$decode=false;
            foreach(
$v1 as $v2) {
                if (
ereg('::',$v2)) { // base64 encoded, chunk start
                   
$decode=true;
                   
$arr=explode(':',str_replace('::',':',$v2));
                   
$i=$arr[0];
                   
$this->entries[$k1][$i]=base64_decode($arr[1]);
                } elseif (
ereg(':',$v2)) {
                   
$decode=false;
                   
$arr=explode(':',$v2);
                   
$count=count($arr);
                    if (
$count!=2)
                        for(
$i=$count-1;$i>1;--$i)
                           
$arr[$i-1].=':'.$arr[$i];
                   
$i=$arr[0];

                   
// handling arrays in ldap entry
                   
if (isset($this->entries[$k1][$i])) {
                      if (!
is_array($this->entries[$k1][$i])) {
                       
$this->entries[$k1][$i]=array($this->entries[$k1][$i]);
                      }
                     
$this->entries[$k1][$i][]=$arr[1];
                    } else {
                     
$this->entries[$k1][$i]=$arr[1];
                    }
                } else {
                    if (
$decode) { // base64 encoded, next chunk
                       
$this->entries[$k1][$i].=base64_decode($v2);
                    } else {
                       
$this->entries[$k1][$i]=$v2;
                    }
                }
            }
        }
    }



};
// end class