<?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
|