2008-06-10 20:29:23 +02:00
< ? php
2009-01-21 15:09:42 +01:00
/* Copyright ( C ) 2008 - 2009 Laurent Destailleur < eldy @ users . sourceforge . net >
2009-04-14 20:54:13 +02:00
* Copyright ( C ) 2005 - 2009 Regis Houssin < regis @ dolibarr . fr >
2008-06-10 20:29:23 +02:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
* or see http :// www . gnu . org /
*/
/**
2008-11-15 22:10:10 +01:00
* \file htdocs / lib / admin . lib . php
* \brief Library of admin functions
* \version $Id $
*/
2008-06-10 20:29:23 +02:00
/**
2009-01-26 22:57:14 +01:00
* \brief Renvoi une version en chaine depuis une version en tableau
* \param versionarray Tableau de version ( vermajeur , vermineur , autre )
* \return string Chaine version
*/
2008-06-10 20:29:23 +02:00
function versiontostring ( $versionarray )
{
2009-05-04 22:57:26 +02:00
$string = '?' ;
if ( isset ( $versionarray [ 0 ])) $string = $versionarray [ 0 ];
if ( isset ( $versionarray [ 1 ])) $string .= '.' . $versionarray [ 1 ];
if ( isset ( $versionarray [ 2 ])) $string .= '.' . $versionarray [ 2 ];
return $string ;
2008-06-10 20:29:23 +02:00
}
/**
2009-08-04 16:36:29 +02:00
* \brief Compare 2 versions
* \param versionarray1 Array of version ( vermajor , verminor , patch )
* \param versionarray2 Array of version ( vermajor , verminor , patch )
2009-08-14 02:30:43 +02:00
* \return int - 4 , - 3 , - 2 , - 1 if versionarray1 < versionarray2 ( value depends on level of difference )
2009-08-04 16:36:29 +02:00
* 0 if =
2009-08-14 02:30:43 +02:00
* 1 , 2 , 3 , 4 if versionarray1 > versionarray2 ( value depends on level of difference )
2009-05-04 22:57:26 +02:00
*/
2008-06-10 20:29:23 +02:00
function versioncompare ( $versionarray1 , $versionarray2 )
{
2009-05-04 22:57:26 +02:00
$ret = 0 ;
2009-08-04 16:36:29 +02:00
$level = 0 ;
2009-08-14 02:30:43 +02:00
while ( $level < max ( sizeof ( $versionarray1 ), sizeof ( $versionarray2 )))
2009-05-04 22:57:26 +02:00
{
2009-08-04 16:36:29 +02:00
$operande1 = isset ( $versionarray1 [ $level ]) ? $versionarray1 [ $level ] : 0 ;
$operande2 = isset ( $versionarray2 [ $level ]) ? $versionarray2 [ $level ] : 0 ;
2009-10-23 12:44:19 +02:00
if ( preg_match ( '/beta|alpha/i' , $operande1 )) $operande1 =- 1 ;
if ( preg_match ( '/beta|alpha/i' , $operande2 )) $operande2 =- 1 ;
2009-08-04 16:36:29 +02:00
$level ++ ;
2009-08-14 02:30:43 +02:00
//print 'level '.$level.' '.$operande1.'-'.$operande2;
2009-08-04 16:36:29 +02:00
if ( $operande1 < $operande2 ) { $ret = - $level ; break ; }
if ( $operande1 > $operande2 ) { $ret = $level ; break ; }
2009-05-04 22:57:26 +02:00
}
2009-08-14 02:30:43 +02:00
//print join('.',$versionarray1).'('.sizeof($versionarray1).') / '.join('.',$versionarray2).'('.sizeof($versionarray2).') => '.$ret;
2009-05-04 22:57:26 +02:00
return $ret ;
2008-02-01 01:09:23 +01:00
}
/**
2009-05-04 22:57:26 +02:00
\brief Return version PHP
\return array Tableau de version ( vermajeur , vermineur , autre )
*/
2008-06-10 20:29:23 +02:00
function versionphparray ()
{
2009-10-20 15:14:44 +02:00
return explode ( '.' , PHP_VERSION );
2008-06-10 20:29:23 +02:00
}
/**
2009-05-04 22:57:26 +02:00
\brief Return version Dolibarr
\return array Tableau de version ( vermajeur , vermineur , autre )
*/
2008-06-10 20:29:23 +02:00
function versiondolibarrarray ()
{
2009-10-20 15:14:44 +02:00
return explode ( '.' , DOL_VERSION );
2008-06-10 20:29:23 +02:00
}
/**
2009-05-04 22:57:26 +02:00
* \brief Launch a sql file
* \param sqlfile Full path to sql file
* \return int <= 0 if KO , > 0 if OK
*/
2008-06-10 20:29:23 +02:00
function run_sql ( $sqlfile , $silent = 1 )
{
global $db , $conf , $langs , $user ;
2009-01-21 15:09:42 +01:00
2009-02-20 23:53:15 +01:00
dol_syslog ( " Admin.lib::run_sql run sql file " . $sqlfile , LOG_DEBUG );
2008-06-10 20:29:23 +02:00
$ok = 0 ;
$error = 0 ;
$i = 0 ;
$buffer = '' ;
$arraysql = Array ();
// Get version of database
$versionarray = $db -> getVersionArray ();
$fp = fopen ( $sqlfile , " r " );
if ( $fp )
{
while ( ! feof ( $fp ))
{
$buf = fgets ( $fp , 4096 );
2009-01-21 15:09:42 +01:00
2008-06-10 20:29:23 +02:00
// Cas special de lignes autorisees pour certaines versions uniquement
2009-10-23 12:44:19 +02:00
if ( preg_match ( '/^--\sV([0-9\.]+)/i' , $buf , $reg ))
2008-06-10 20:29:23 +02:00
{
2009-10-20 15:14:44 +02:00
$versioncommande = explode ( '.' , $reg [ 1 ]);
2008-06-10 20:29:23 +02:00
//print var_dump($versioncommande);
//print var_dump($versionarray);
if ( sizeof ( $versioncommande ) && sizeof ( $versionarray )
2009-05-04 22:57:26 +02:00
&& versioncompare ( $versioncommande , $versionarray ) <= 0 )
2008-06-10 20:29:23 +02:00
{
// Version qualified, delete SQL comments
2009-10-23 12:44:19 +02:00
$buf = preg_replace ( '/^--\sV([0-9\.]+)/i' , '' , $buf );
2008-06-10 20:29:23 +02:00
//print "Ligne $i qualifi?e par version: ".$buf.'<br>';
}
}
2009-01-21 15:09:42 +01:00
2008-06-10 20:29:23 +02:00
// Ajout ligne si non commentaire
2009-10-23 12:44:19 +02:00
if ( ! preg_match ( '/^--/' , $buf )) $buffer .= $buf ;
2008-06-10 20:29:23 +02:00
// print $buf.'<br>';
2009-10-21 18:50:15 +02:00
if ( preg_match ( '/;/' , $buffer ))
2008-06-10 20:29:23 +02:00
{
// Found new request
$arraysql [ $i ] = trim ( $buffer );
$i ++ ;
$buffer = '' ;
}
}
2009-01-21 15:09:42 +01:00
2008-06-10 20:29:23 +02:00
if ( $buffer ) $arraysql [ $i ] = trim ( $buffer );
fclose ( $fp );
}
2008-11-08 15:43:12 +01:00
// Loop on each request to see if there is a __+MAX_table__ key
$listofmaxrowid = array ();
foreach ( $arraysql as $i => $sql )
{
if ( $sql )
{
$newsql = $sql ;
2009-01-21 15:09:42 +01:00
2008-11-08 15:43:12 +01:00
// Replace __+MAX_table__ with max of table
2009-10-21 18:50:15 +02:00
while ( preg_match ( '/__\+MAX_([A-Za-z_]+)__/i' , $newsql , $reg ))
2008-11-08 15:43:12 +01:00
{
$table = $reg [ 1 ];
if ( ! isset ( $listofmaxrowid [ $table ]))
{
$sqlgetrowid = 'SELECT MAX(rowid) as max from ' . $table ;
$resql = $db -> query ( $sqlgetrowid );
if ( $resql )
{
$obj = $db -> fetch_object ( $resql );
$listofmaxrowid [ $table ] = $obj -> max ;
if ( empty ( $listofmaxrowid [ $table ])) $listofmaxrowid [ $table ] = 0 ;
}
else
{
if ( ! $silent ) print '<tr><td valign="top" colspan="2">' ;
if ( ! $silent ) print '<div class="error">' . $langs -> trans ( " Failed to get max rowid for " . $table ) . " </div></td> " ;
if ( ! $silent ) print '</tr>' ;
$error ++ ;
break ;
}
}
$from = '__+MAX_' . $table . '__' ;
$to = '+' . $listofmaxrowid [ $table ];
$newsql = str_replace ( $from , $to , $newsql );
2009-02-20 23:53:15 +01:00
dol_syslog ( 'Admin.lib::run_sql New Request ' . ( $i + 1 ) . ' sql=' . $newsql , LOG_DEBUG );
2009-01-21 15:09:42 +01:00
2008-11-08 15:43:12 +01:00
$arraysql [ $i ] = $newsql ;
}
}
}
// Loop on each request to execute request
2008-06-10 20:29:23 +02:00
$cursorinsert = 0 ;
$listofinsertedrowid = array ();
foreach ( $arraysql as $i => $sql )
{
if ( $sql )
{
$newsql = $sql ;
2009-01-21 15:09:42 +01:00
2008-06-10 20:29:23 +02:00
// Ajout trace sur requete (eventuellement ? commenter si beaucoup de requetes)
if ( ! $silent ) print '<tr><td valign="top">' . $langs -> trans ( " Request " ) . ' ' . ( $i + 1 ) . " sql=' " . $newsql . " '</td></tr> \n " ;
2009-02-20 23:53:15 +01:00
dol_syslog ( 'Admin.lib::run_sql Request ' . ( $i + 1 ) . ' sql=' . $newsql , LOG_DEBUG );
2009-01-21 15:09:42 +01:00
2009-10-23 12:44:19 +02:00
if ( preg_match ( '/insert into ([^\s]+)/i' , $newsql , $reg ))
2009-01-21 15:09:42 +01:00
{
2008-06-10 20:29:23 +02:00
// It's an insert
$cursorinsert ++ ;
}
2009-01-21 15:09:42 +01:00
2008-06-10 20:29:23 +02:00
// Replace __x__ with rowid of insert nb x
2009-10-23 12:44:19 +02:00
while ( preg_match ( '/__([0-9]+)__/' , $newsql , $reg ))
2008-06-10 20:29:23 +02:00
{
$cursor = $reg [ 1 ];
if ( empty ( $listofinsertedrowid [ $cursor ]))
{
if ( ! $silent ) print '<tr><td valign="top" colspan="2">' ;
if ( ! $silent ) print '<div class="error">' . $langs -> trans ( " FileIsNotCorrect " ) . " </div></td> " ;
if ( ! $silent ) print '</tr>' ;
$error ++ ;
break ;
}
$from = '__' . $cursor . '__' ;
$to = $listofinsertedrowid [ $cursor ];
$newsql = str_replace ( $from , $to , $newsql );
2009-02-20 23:53:15 +01:00
dol_syslog ( 'Admin.lib::run_sql New Request ' . ( $i + 1 ) . ' sql=' . $newsql , LOG_DEBUG );
2008-06-10 20:29:23 +02:00
}
2009-08-04 16:36:29 +02:00
2009-05-27 17:56:00 +02:00
// Replace __ENTITY__ with current entity id
2009-10-23 12:44:19 +02:00
while ( preg_match ( '/(__ENTITY__)/i' , $newsql , $reg ))
2009-05-27 17:56:00 +02:00
{
$from = $reg [ 1 ];
$to = $conf -> entity ;
$newsql = str_replace ( $from , $to , $newsql );
dol_syslog ( 'Admin.lib::run_sql New Request ' . ( $i + 1 ) . ' sql=' . $newsql , LOG_DEBUG );
}
2009-01-21 15:09:42 +01:00
2008-06-10 20:29:23 +02:00
$result = $db -> query ( $newsql );
if ( $result )
{
2009-10-21 18:50:15 +02:00
if ( preg_match ( '/insert into ([^\s]+)/i' , $newsql , $reg ))
2009-01-21 15:09:42 +01:00
{
2008-06-10 20:29:23 +02:00
// It's an insert
2009-10-21 18:50:15 +02:00
$table = preg_replace ( '/([^a-zA-Z_]+)/i' , '' , $reg [ 1 ]);
2008-06-10 20:29:23 +02:00
$insertedrowid = $db -> last_insert_id ( $table );
$listofinsertedrowid [ $cursorinsert ] = $insertedrowid ;
2009-02-20 23:53:15 +01:00
dol_syslog ( 'Admin.lib::run_sql Insert nb ' . $cursorinsert . ', done in table ' . $table . ', rowid is ' . $listofinsertedrowid [ $cursorinsert ], LOG_DEBUG );
2008-06-10 20:29:23 +02:00
}
// print '<td align="right">OK</td>';
}
else
{
$errno = $db -> errno ();
2009-01-21 15:09:42 +01:00
2008-06-10 20:29:23 +02:00
$okerror = array ( 'DB_ERROR_TABLE_ALREADY_EXISTS' ,
'DB_ERROR_COLUMN_ALREADY_EXISTS' ,
'DB_ERROR_KEY_NAME_ALREADY_EXISTS' ,
'DB_ERROR_RECORD_ALREADY_EXISTS' ,
'DB_ERROR_NOSUCHTABLE' ,
'DB_ERROR_NOSUCHFIELD' ,
'DB_ERROR_NO_FOREIGN_KEY_TO_DROP' ,
'DB_ERROR_CANNOT_CREATE' , // Qd contrainte deja existante
'DB_ERROR_CANT_DROP_PRIMARY_KEY' ,
'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS'
);
if ( in_array ( $errno , $okerror ))
{
//if (! $silent) print $langs->trans("OK");
}
else
{
if ( ! $silent ) print '<tr><td valign="top" colspan="2">' ;
if ( ! $silent ) print '<div class="error">' . $langs -> trans ( " Error " ) . " " . $db -> errno () . " : " . $newsql . " <br> " . $db -> error () . " </div></td> " ;
if ( ! $silent ) print '</tr>' ;
2009-02-20 23:53:15 +01:00
dol_syslog ( 'Admin.lib::run_sql Request ' . ( $i + 1 ) . " Error " . $db -> errno () . " " . $newsql . " <br> " . $db -> error (), LOG_ERR );
2008-06-10 20:29:23 +02:00
$error ++ ;
}
}
if ( ! $silent ) print '</tr>' ;
}
}
if ( $error == 0 )
{
if ( ! $silent ) print '<tr><td>' . $langs -> trans ( " ProcessMigrateScript " ) . '</td>' ;
if ( ! $silent ) print '<td align="right">' . $langs -> trans ( " OK " ) . '</td></tr>' ;
$ok = 1 ;
}
else
{
if ( ! $silent ) print '<tr><td>' . $langs -> trans ( " ProcessMigrateScript " ) . '</td>' ;
if ( ! $silent ) print '<td align="right"><font class="error">' . $langs -> trans ( " KO " ) . '</font></td></tr>' ;
$ok = 0 ;
}
return $ok ;
}
/**
2009-09-02 00:20:55 +02:00
* \brief Effacement d ' une constante dans la base de donnees
* \sa dolibarr_get_const , dolibarr_sel_const
* \param db Handler d ' acces base
* \param name Nom ou rowid de la constante
* \param entity Multi company id , - 1 for all entities
* \return int < 0 if KO , > 0 if OK
2009-05-04 22:57:26 +02:00
*/
2009-04-27 22:37:50 +02:00
function dolibarr_del_const ( $db , $name , $entity = 1 )
2008-02-01 01:09:23 +01:00
{
global $conf ;
2009-01-21 15:09:42 +01:00
2009-06-27 08:56:41 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " const " ;
2009-06-27 21:21:10 +02:00
$sql .= " WHERE ( " . $db -> decrypt ( 'name' , $conf -> db -> dolibarr_main_db_encryption , $conf -> db -> dolibarr_main_db_cryptkey ) . " = ' " . addslashes ( $name ) . " ' OR rowid = ' " . addslashes ( $name ) . " ') " ;
2009-09-02 00:20:55 +02:00
if ( $entity >= 0 ) $sql .= " AND entity = " . $entity ;
2008-06-10 20:29:23 +02:00
2009-05-04 22:57:26 +02:00
dol_syslog ( " admin.lib::dolibarr_del_const sql= " . $sql );
2008-02-01 01:09:23 +01:00
$resql = $db -> query ( $sql );
if ( $resql )
{
$conf -> global -> $name = '' ;
return 1 ;
}
else
{
2009-09-02 00:20:55 +02:00
$this -> error = $db -> lasterror ();
2008-02-01 01:09:23 +01:00
return - 1 ;
}
}
/**
2009-05-04 22:57:26 +02:00
\brief Recupere une constante depuis la base de donnees .
\sa dolibarr_del_const , dolibarr_set_const
\param db Handler d ' acces base
\param name Nom de la constante
\param entity Multi company id
\return string Valeur de la constante
*/
2009-04-27 22:37:50 +02:00
function dolibarr_get_const ( $db , $name , $entity = 1 )
2008-02-01 01:09:23 +01:00
{
2009-04-19 14:59:30 +02:00
global $conf ;
2009-05-04 22:57:26 +02:00
$value = '' ;
2009-06-27 08:56:41 +02:00
$sql = " SELECT " . $db -> decrypt ( 'value' , $conf -> db -> dolibarr_main_db_encryption , $conf -> db -> dolibarr_main_db_cryptkey ) . " as value " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " const " ;
2009-06-27 21:21:10 +02:00
$sql .= " WHERE " . $db -> decrypt ( 'name' , $conf -> db -> dolibarr_main_db_encryption , $conf -> db -> dolibarr_main_db_cryptkey ) . " = ' " . addslashes ( $name ) . " ' " ;
2009-05-04 22:57:26 +02:00
$sql .= " AND entity = " . $entity ;
dol_syslog ( " admin.lib::dolibarr_get_const sql= " . $sql );
$resql = $db -> query ( $sql );
if ( $resql )
{
$obj = $db -> fetch_object ( $resql );
if ( $obj ) $value = $obj -> value ;
}
return $value ;
2008-02-01 01:09:23 +01:00
}
/**
2009-08-25 17:21:42 +02:00
* \brief Insert a parameter ( key , value ) into database .
2009-05-04 22:57:26 +02:00
* \sa dolibarr_del_const , dolibarr_get_const
2009-08-25 17:21:42 +02:00
* \param db Database handler
* \param name Name of constant
* \param value Value of constant
* \param type Type of constante ( chaine par defaut )
* \param visible Is constant visible in Setup -> Other page ( 0 by default )
2009-05-04 22:57:26 +02:00
* \param note Note on parameter
* \param entity Multi company id
* \return int - 1 if KO , 1 if OK
*/
2009-04-27 22:37:50 +02:00
function dolibarr_set_const ( $db , $name , $value , $type = 'chaine' , $visible = 0 , $note = '' , $entity = 1 )
2008-02-01 01:09:23 +01:00
{
2009-04-14 20:54:13 +02:00
global $conf ;
2009-04-27 22:37:50 +02:00
2009-04-14 20:54:13 +02:00
if ( empty ( $name ))
2009-05-04 22:57:26 +02:00
{
dol_print_error ( " Error: Call to function dolibarr_set_const with wrong parameters " , LOG_ERR );
exit ;
}
2009-04-27 22:37:50 +02:00
2009-05-04 22:57:26 +02:00
$db -> begin ();
2009-04-14 20:54:13 +02:00
2009-05-04 22:57:26 +02:00
//dol_syslog("dolibarr_set_const name=$name, value=$value");
2009-06-27 08:56:41 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " const " ;
2009-06-27 21:21:10 +02:00
$sql .= " WHERE " . $db -> decrypt ( 'name' , $conf -> db -> dolibarr_main_db_encryption , $conf -> db -> dolibarr_main_db_cryptkey ) . " = ' " . addslashes ( $name ) . " ' " ;
2009-05-04 22:57:26 +02:00
$sql .= " AND entity = " . $entity ;
dol_syslog ( " admin.lib::dolibarr_set_const sql= " . $sql , LOG_DEBUG );
2008-02-17 16:20:47 +01:00
$resql = $db -> query ( $sql );
2008-02-01 01:09:23 +01:00
2009-05-04 22:57:26 +02:00
if ( strcmp ( $value , '' )) // true if different. Must work for $value='0' or $value=0
{
$sql = " INSERT INTO llx_const(name,value,type,visible,note,entity) " ;
2009-06-27 21:21:10 +02:00
$sql .= " VALUES ( " ;
2009-09-15 16:17:14 +02:00
$sql .= $db -> encrypt ( $name , $conf -> db -> dolibarr_main_db_encryption , $conf -> db -> dolibarr_main_db_cryptkey , 1 );
$sql .= " , " . $db -> encrypt ( $value , $conf -> db -> dolibarr_main_db_encryption , $conf -> db -> dolibarr_main_db_cryptkey , 1 );
2009-06-27 21:21:10 +02:00
$sql .= " ,' " . $type . " ', " . $visible . " ,' " . addslashes ( $note ) . " ', " . $entity . " ) " ;
2008-06-10 20:29:23 +02:00
2009-02-20 23:53:15 +01:00
dol_syslog ( " admin.lib::dolibarr_set_const sql= " . $sql , LOG_DEBUG );
2009-05-04 22:57:26 +02:00
$resql = $db -> query ( $sql );
}
if ( $resql )
{
$db -> commit ();
$conf -> global -> $name = $value ;
return 1 ;
}
else
{
$error = $db -> lasterror ();
dol_syslog ( " admin.lib::dolibarr_set_const " . $error , LOG_ERR );
$db -> rollback ();
return - 1 ;
}
2008-02-01 01:09:23 +01:00
}
2008-06-10 20:29:23 +02:00
/**
2008-11-26 20:37:25 +01:00
* \brief Define head array for tabs of security setup pages
* \return Array of head
* \version $Id $
*/
2008-06-10 20:29:23 +02:00
function security_prepare_head ()
{
global $langs , $conf , $user ;
$h = 0 ;
$head = array ();
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/perms.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " DefaultRights " );
$head [ $h ][ 2 ] = 'default' ;
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/security.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Passwords " );
$head [ $h ][ 2 ] = 'passwords' ;
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/security_other.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Miscellanous " );
$head [ $h ][ 2 ] = 'misc' ;
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/events.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Audit " );
$head [ $h ][ 2 ] = 'audit' ;
$h ++ ;
2009-01-21 15:09:42 +01:00
2008-06-10 20:29:23 +02:00
return $head ;
}
2008-02-01 01:09:23 +01:00
2009-09-02 00:20:55 +02:00
/**
* Return list of session
* @ return array Array list of sessions
*/
function listOfSessions ()
{
2009-09-15 17:28:32 +02:00
global $conf ;
2009-09-02 00:20:55 +02:00
$arrayofSessions = array ();
2009-09-05 01:42:29 +02:00
$sessPath = ini_get ( " session.save_path " ) . '/' ;
2009-09-02 00:20:55 +02:00
dol_syslog ( 'admin.lib:listOfSessions sessPath=' . $sessPath );
$dh = @ opendir ( $sessPath );
while (( $file = @ readdir ( $dh )) !== false )
{
2009-10-23 12:44:19 +02:00
if ( preg_match ( '/^sess_/i' , $file ) && $file != " . " && $file != " .. " )
2009-09-02 00:20:55 +02:00
{
$fullpath = $sessPath . $file ;
if ( ! @ is_dir ( $fullpath ))
{
$sessValues = file_get_contents ( $fullpath ); // get raw session data
2009-10-25 12:09:03 +01:00
2009-10-23 12:44:19 +02:00
if ( preg_match ( '/dol_login/i' , $sessValues ) && // limit to dolibarr session
2009-10-25 12:09:03 +01:00
preg_match ( '/dol_entity\|s:([0-9]+):"(' . $conf -> entity . ')"/i' , $sessValues ) && // limit to current entity
preg_match ( '/dol_company\|s:([0-9]+):"(' . $conf -> global -> MAIN_INFO_SOCIETE_NOM . ')"/i' , $sessValues )) // limit to company name
2009-09-15 17:28:32 +02:00
{
2009-10-20 15:14:44 +02:00
$tmp = explode ( '_' , $file );
2009-09-15 17:28:32 +02:00
$idsess = $tmp [ 1 ];
2009-10-23 12:44:19 +02:00
$login = preg_match ( '/dol_login\|s:[0-9]+:"([A-Za-z0-9]+)"/i' , $sessValues , $regs );
2009-09-15 18:38:05 +02:00
$arrayofSessions [ $idsess ][ " login " ] = $regs [ 1 ];
2009-09-15 17:28:32 +02:00
$arrayofSessions [ $idsess ][ " age " ] = time () - filectime ( $fullpath );
$arrayofSessions [ $idsess ][ " creation " ] = filectime ( $fullpath );
$arrayofSessions [ $idsess ][ " modification " ] = filemtime ( $fullpath );
$arrayofSessions [ $idsess ][ " raw " ] = $sessValues ;
}
2009-09-02 00:20:55 +02:00
}
}
}
@ closedir ( $dh );
return $arrayofSessions ;
}
/**
* Purge existing sessions
* @ param mysessionid To avoid to try to delete my own session
* @ return int > 0 if OK , < 0 if KO
*/
function purgeSessions ( $mysessionid )
{
2009-09-15 17:37:48 +02:00
global $conf ;
2009-09-02 00:20:55 +02:00
$arrayofSessions = array ();
2009-09-05 01:42:29 +02:00
$sessPath = ini_get ( " session.save_path " ) . " / " ;
2009-09-02 00:20:55 +02:00
dol_syslog ( 'admin.lib:purgeSessions mysessionid=' . $mysessionid . ' sessPath=' . $sessPath );
$error = 0 ;
$dh = @ opendir ( $sessPath );
while (( $file = @ readdir ( $dh )) !== false )
{
if ( $file != " . " && $file != " .. " )
{
$fullpath = $sessPath . $file ;
if ( ! @ is_dir ( $fullpath ))
{
2009-09-15 17:37:48 +02:00
$sessValues = file_get_contents ( $fullpath ); // get raw session data
2009-10-23 12:44:19 +02:00
if ( preg_match ( '/dol_login/i' , $sessValues ) && // limit to dolibarr session
preg_match ( '/dol_entity\|s:([0-9]+):"(' . $conf -> entity . ')"/i' , $sessValues ) && // limit to current entity
preg_match ( '/dol_company\|s:([0-9]+):"(' . $conf -> global -> MAIN_INFO_SOCIETE_NOM . ')"/i' , $sessValues )) // limit to company name
2009-09-02 00:20:55 +02:00
{
2009-10-20 15:14:44 +02:00
$tmp = explode ( '_' , $file );
2009-09-15 17:37:48 +02:00
$idsess = $tmp [ 1 ];
// We remove session if it's not ourself
if ( $idsess != $mysessionid )
{
$res =@ unlink ( $fullpath );
if ( ! $res ) $error ++ ;
}
2009-09-02 00:20:55 +02:00
}
}
}
}
@ closedir ( $dh );
if ( ! $error ) return 1 ;
else return - $error ;
}
2008-01-12 19:00:48 +01:00
?>