Subversion Repositories ALCASAR

Compare Revisions

Problem with comparison.

Ignore whitespace Rev HEAD → Rev 775

/web/acc/admin/lib/alcasar/freeradius/configreader.php
0,0 → 1,423
<?php
/*
TODO :
- reprendre toutes les expressions régulières [ à contrôler]
- prise en compte de tous les types de commentaires
- prise en compte d'une valeurs multiligne
- suppressions plus rigoureuse des quote et double cote. (FAIT)
- correction de quelques bugs
- prise en charge de la lecture de section "nommée" (etc: ldap toto {...} )[fait à tester]
 
-> pas de setter pour le configreader
 
*/
/**
* Page contenant les classes <b>confItem</b>, <b>pairItem</b>, <b>sectionItem</b> et <b>configReader</b>.
* Ces classes permettent de parser des fichiers de configuration du même format
* que ceux utilisés par freeradius.
*/
 
/*
The file consists of configuration items (variable = value pairs), sections, and comments.
*/
 
/**
* Classe abstraite <b>confItem</b>.
*
* @name confItem
* @author steweb57
* @version 0.1.0
*/
Abstract class confItem
{
/**
* Variable contenant le type d'item (pair ou section)
* @var string
*/
protected $_type = null;
/**
* Variable contenant le nom de l'item
* @var string
*/
protected $_name = null;
/**
* Variable contenant le nom de la section
* @var string
*/
/**
* Variable contenant le nom de l'instance de l'item
* @var string
*/
protected $_instanceName = null;
/**
protected $_parent = null;
/**
* Tableau contenant les parametres (items)
* @var array
*/
protected $_items = array();
/**
* Return the parent confItem
*
* @name getParent()()
* @return confItem
*/
public function getParent(){
return $this->_parent;
}
/**
* return the type of the confItem
*
* @name getType()
* @return string
*/
public function getType(){
return $this->_type;
}
public function getAll(){
return $this->_items;
}
/**
* return the name of the confItem
*
* @name getName()
* @return string
*/
public function getName(){
return $this->_name;
}
/**
* return the instance name of the confItem
*
* @name getInstanceName()
* @return string
*/
public function getInstanceName(){
return $this->_instanceName;
}
/**
*
* Return the specified atribute
*
* @name __get()
* @param string $attr
* @return mixed (confitem object or string)
*/
public function __get($attr) {
$resp=array();
foreach ($this->_items as $item){
if (is_object($item)){
if ($item->getName() === $attr){
$resp[] = $item;
}
} else {
if (array_key_exists($attr, $this->_items))
$resp[] = $this->_items[$attr];
}
}
if (count($resp)===1){
return $resp[0];
} else {
return $resp;// si vide, on répond par un array vide ou par false?
}
}
/**
* Converte the object to a string
*
* @name __toString()
* @return string
*/
public function __toString() {
return $this->_name;
}
}
 
/**
* Classe <b>pairItem</b>.
*
* @name pairItem
* @author steweb57
* @version 0.1.0
*/
class pairItem extends confItem
{
protected $_type = 'pair';
protected $_name = '';
/**
* Constructeur
*
* <p>création de l'instance de la classe</p>
*
* @name pairItem::__construct()
* @param string $attr, $value
* @return void
*/
public function __construct($attr,$value) {
$this->_items[$attr] = $value;
$this->_name = $attr;
}
/**
* Converte the object to a string
*
* @name __toString()
* @return string
*/
public function __toString() {
return $this->_items[$this->_name];// ? afficher le nom de la variable ou sa valeur?
}
/**
* Get a pair value
*
* @name getPair()
* @param string $pairName
* @return string
*/
public function getPair($pairName = null){
if ($pairName!==null){
if (array_key_exists($pairName, $this->_items))
return $this->_items[$pairName];
} else {
return $this->_items;
}
}
}
 
class sectionItem extends confItem
{
protected $_type = 'section';
protected $_name = '';
 
public function __construct($name, sectionItem &$parent=null, $instanceName = "") {
$this->_parent = $parent;
$this->_name = $name;
$this->_instanceName = $instanceName;
}
public function addSection($name, $instanceName = "") {
$this->_items[] = new sectionItem($name, $this, $instanceName);
return end($this->_items);
}
public function addPair($name, $value) {
$this->_items[] = new pairItem($name, $value);
return end($this->_items);
}
/**
* return the child instance of the confSection
*
* @name getInstance()
* @return string
*/
public function getInstance($instanceName=nill){
if ($instanceName === null)
return false;
$resp = array();
foreach ($this->_items as $item){
if ($item->getType() !== 'section'){
continue;
}
if ($item->getInstanceName() === $instanceName){
$resp[] = $item;
}
}
if (count($resp)===1){
return $resp[0];
} else {
return $resp;
}
}
public function getSectionInstance($sectionName = null, $instanceName=null){
if (($sectionName === null)||($instanceName === null))
return false;
$resp = array();
foreach ($this->_items as $item){
if ($item->getType() !== 'section'){
continue;
}
if (($item->getName() === $sectionName)&&($item->getInstanceName() === $instanceName)){
$resp[] = $item;
}
}
if (count($resp)===1){
return $resp[0];
} else {
return $resp;
}
}
public function getSection($sectionName = null){
$resp = array();
foreach ($this->_items as $item){
if ($item->getType() !== 'section'){
continue;
}
if ($sectionName === null){
$resp[] = $item;
} else {
if ($item->getName() === $sectionName){
$resp[] = $item;
}
}
}
if (count($resp)===1){
return $resp[0];
} else {
return $resp;
}
}
public function getPair($pairName = null){
$resp = array();
foreach ($this->_items as $item){
if ($item->getType() !== 'pair'){
continue;
}
if ($pairName === null){
$resp[] = $item;
} else {
if ($item->getName() === $pairName){
//return $item; //only the first answer
$resp[] = $item;
}
}
}
if (count($resp)===1){
return $resp[0];
} else {
return $resp;
}
}
}
/**
* Classe <b>configReader</b>.
*
* @name configReader
* @author steweb57
* @version 0.1.0
*/
class configReader extends sectionItem
{
private $_file = null;
private $_pt = null;
protected $_name = "root";
/**
* Constructeur
*
* <p>création de l'instance de la classe</p>
*
* @name config_file::__construct()
* @param string $filename
* @return void
*/
public function __construct($filename=null) {
 
if ($filename !== null){
$this->parse($filename);
}
}
/**
* Destructeur
*/
public function __destruct() {
$this->_file = NULL;
}
private function _deleteComment($line){
return $line;
}
public function parse($filename=null){
if ($filename !== null){
// test is_file et file_exist à faire
$this->_file = $filename;
}
if ($this->_file===null) return false;
$fro = fopen( $this->_file, 'r' );
while( $line = fgets( $fro ) )
{
/*
on saute les commentaires
*/
if (preg_match('/^[[:space:]]*#/',$line) || preg_match('/^[[:space:]]*$/',$line))
continue;
//test d'entrée dans une section
//if (preg_match('`^([\s[:print:]]*{[\s[:print:]]*)$`',$line)){//test section
if (preg_match('`^([\sa-zA-Z0-9_-]*{[\s[:print:]]*)$`',$line)){//test section
/*
BUG : filter = "(uid=%{Stripped-User-Name:-%{User-Name}})"
*/
// Nétoyage des commentaires et espaces
$tmp = explode("{", $line, 2);
$line = trim($tmp[0]);
// test here if exist an instance name
$tmpInstanceName = "";
$t = explode(" ", $line, 2);
$tmpSectionName = $t[0];
if (count($t)>1){
$tmpInstanceName = $t[1];
}
// end test of an instance name
if ($this->_pt===null){
$this->addSection($tmpSectionName, $tmpInstanceName);
$this->_pt = end($this->_items);
} else {
$this->_pt = $this->_pt->addSection($tmpSectionName, $tmpInstanceName);
}
}
//recherche fin de section
//elseif (preg_match('`^([\s]*}[\s]*)$`',$line)){//test fin de section
elseif (preg_match('`^([\s]*}[\s[:print:]]*)$`',$line)){//test fin de section
$this->_pt = $this->_pt->getParent();
}
//test de présence d'une pair parametre/valeur
elseif (preg_match('`^([\s[:print:]]*=)`',$line)){ //test pair
$tmpPair = trim($line);
list($pairName, $pairValue) = explode('=', $tmpPair, 2);
$pairName = trim($pairName);
$pairValue = trim($pairValue);
/*
A FAIRE :
- prendre en compte le multi-ligne
*/
$l = strlen($pairValue);
if (strpos($pairValue, "'") === 0){ // valeur entre des quotes
$pairValue = preg_replace("`^[']([[:print:]]*)[']([[:print:]]*)`","$1",$pairValue);
}elseif(strpos($pairValue, '"') === 0){// valeur entre des double-quotes
$pairValue = preg_replace('`^["]([[:print:]]*)["]([[:print:]]*)`','$1',$pairValue);
}else{ // valeur sans quote ou double-quote
//suppression des commentaires (pour un # dans la chaine, alors il faut que la chaine soit entre quote ou double-quote)
$tmp = explode("#", $pairValue, 2);
$pairValue = trim($tmp[0]);
}
if ($this->_pt===null){
$this->addPair($pairName,$pairValue);
} else {
$this->_pt->addPair($pairName,$pairValue);
}
}
//test de présence d'un parametre (c'est traité comme une section mais sans contenu!)
elseif (preg_match('`^([\s[:print:]]*)$`',$line)) { //test value
$tmpItem = trim($line);
if ($this->_pt===null){
$this->addSection($tmpItem);
} else {
$this->_pt->addSection($tmpItem);
}
}
}
fclose( $fro );
$this->_pt=null;
}
}
?>