Login   Register  
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: 2009-07-13 08:20
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