- Ajout d'un fichier core.php s'occupant des inclusions minimum pour le lancement de toutes les mécaniques

-> Déplacement des définitions des constantes de chemins et 
     de gettext dans ce fichier
  -> Déplacement des ini_set() dans ce fichier
- LSdebug :
  -> La variable d'activation devient la constante LSdebug
  -> Le tableau de stockages des messages s'appel maintenant
     LSdebug_fieds
- LSconfig : Ajout d'une classe gérant la configuration du
  projet qui servira d'abstraction à la configuration
- LSsession :
  -> Suppresion de la méthode loadConfig() et ajout de la 
     méthode startLSconfig()
  -> Ajout de la méthode startLStemplate()
  -> Ajout du commentaire à la méthode getTopDn()
  -> La méthode vérifie l'existance de la classe portant le nom
     du type d'objet avant de lancer le chargement
  -> Utilisation LSconfig pour l'accès à la configuration
This commit is contained in:
Benjamin Renard 2009-03-25 12:26:32 +00:00
parent 713cccedb1
commit 3bcfd6e39f
12 changed files with 246 additions and 103 deletions

View file

@ -172,7 +172,7 @@ define('LS_IMAGES_DIR', 'images/'.LS_THEME);
define('LS_CSS_DIR', 'css/'.LS_THEME);
//Debug
$GLOBALS['LSdebug']['active'] = true;
define('LSdebug',true);
// Logs
$GLOBALS['LSlog']['filename'] = 'tmp/LS.log';
@ -183,16 +183,6 @@ define('NB_LSOBJECT_LIST_SELECT',11);
define('MAX_SEND_FILE_SIZE',2000000);
// Définitions des dossiers d'inclusions
define('LS_CONF_DIR','conf/');
define('LS_OBJECTS_DIR', LS_CONF_DIR . 'LSobjects/');
define('LS_INCLUDE_DIR','includes/');
define('LS_CLASS_DIR', LS_INCLUDE_DIR .'class/');
define('LS_LIB_DIR', LS_INCLUDE_DIR .'libs/');
define('LS_ADDONS_DIR', LS_INCLUDE_DIR .'addons/');
define('LS_JS_DIR', LS_INCLUDE_DIR .'js/');
define('LS_TMP_DIR', 'tmp/');
// Javascript
$GLOBALS['defaultJSscipts']=array(
@ -202,13 +192,4 @@ $GLOBALS['defaultJSscipts']=array(
'LSdefault.js'
);
// PHP values
ini_set( 'magic_quotes_gpc', 'off' );
ini_set( 'magic_quotes_sybase', 'off' );
ini_set( 'magic_quotes_runtime', 'off' );
// Locale
define('LS_TEXT_DOMAIN', 'ldapsaisie');
define('LS_I18N_DIR', 'lang');
?>

46
trunk/core.php Normal file
View file

@ -0,0 +1,46 @@
<?php
/*******************************************************************************
* Copyright (C) 2007 Easter-eggs
* http://ldapsaisie.labs.libre-entreprise.org
*
* Author: See AUTHORS file in top-level directory.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* 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.
******************************************************************************/
// PHP values
ini_set( 'magic_quotes_gpc', 'off' );
ini_set( 'magic_quotes_sybase', 'off' );
ini_set( 'magic_quotes_runtime', 'off' );
// Définitions des dossiers d'inclusions
define('LS_CONF_DIR','conf/');
define('LS_OBJECTS_DIR', LS_CONF_DIR . 'LSobjects/');
define('LS_INCLUDE_DIR','includes/');
define('LS_CLASS_DIR', LS_INCLUDE_DIR .'class/');
define('LS_LIB_DIR', LS_INCLUDE_DIR .'libs/');
define('LS_ADDONS_DIR', LS_INCLUDE_DIR .'addons/');
define('LS_JS_DIR', LS_INCLUDE_DIR .'js/');
define('LS_TMP_DIR', 'tmp/');
// Locale
define('LS_TEXT_DOMAIN', 'ldapsaisie');
define('LS_I18N_DIR', 'lang');
require_once LS_INCLUDE_DIR.'functions.php';
require_once LS_CLASS_DIR.'class.LSsession.php';
?>

View file

@ -20,7 +20,7 @@
******************************************************************************/
require_once 'includes/class/class.LSsession.php';
require_once 'core.php';
if(LSsession :: startLSsession()) {

View file

@ -0,0 +1,95 @@
<?php
/*******************************************************************************
* Copyright (C) 2007 Easter-eggs
* http://ldapsaisie.labs.libre-entreprise.org
*
* Author: See AUTHORS file in top-level directory.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* 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.
******************************************************************************/
/**
* Object LSconfig
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*/
class LSconfig {
// Configuration Data
private static $data=array();
/**
* Lancement de LSconfig
*
* Chargement initiale des données de configuration à partir des fichiers en
* config.*.php du dossier LS_CONF_DIR
*
* @retval boolean True si tout s'est bien passé, False sinon
**/
public static function start() {
if (loadDir(LS_CONF_DIR, '^config\..*\.php$')) {
if (is_array($GLOBALS['LSconfig'])) {
self :: $data = $GLOBALS['LSconfig'];
self :: $data['LSaddons'] = $GLOBALS['LSaddons'];
return true;
}
}
return;
}
/**
* Récupération d'une valeur
*
* @param[in] $var string Le nom de valeur à récupérer (Exemple : cacheSearch)
*
* @retval mixed La valeur de la variable, ou false si son nom n'est parsable
**/
public static function get($var) {
$vars=explode('.',$var);
if(is_array($vars)) {
$data=self :: $data;
foreach ($vars as $v) {
$data=$data[$v];
}
return $data;
}
return;
}
/**
* Définition d'une valeur
*
* @param[in] $var string Le nom de valeur à définir
* @param[in] $val mixed La valeur de la variable
*
* @retval boolean True si tout s'est bien passé, False sinon
**/
public static function set($var,$val) {
$vars=explode('.',$var);
if(is_array($vars)) {
$code='self :: $data';
foreach ($vars as $v) {
$code.='["'.$v.'"]';
}
$code.='=$val;';
return (eval($code)===NULL);
}
return;
}
}
?>

View file

@ -20,9 +20,6 @@
******************************************************************************/
define('LS_DEFAULT_CONF_DIR','conf');
require_once 'includes/functions.php';
/**
* Gestion des sessions
*
@ -95,7 +92,7 @@ class LSsession {
if (!file_exists($file)) {
return;
}
if ($GLOBALS['LSdebug']['active']) {
if (LSdebug) {
return include_once($file);
}
else {
@ -105,48 +102,60 @@ class LSsession {
}
/**
* Chargement de la configuration
*
* Chargement des fichiers de configuration et création de l'objet Smarty.
* Lancement de LSconfig
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval true si tout c'est bien passé, false sinon
*/
private static function loadConfig() {
if (loadDir(LS_DEFAULT_CONF_DIR, '^config\..*\.php$')) {
if ( self :: includeFile($GLOBALS['LSconfig']['Smarty']) ) {
$GLOBALS['Smarty'] = new Smarty();
$GLOBALS['Smarty'] -> template_dir = LS_TEMPLATES_DIR;
$GLOBALS['Smarty'] -> compile_dir = LS_TMP_DIR;
if ($GLOBALS['LSdebug']['active']) {
$GLOBALS['Smarty'] -> caching = 0;
// cache files are always regenerated
$GLOBALS['Smarty'] -> force_compile = TRUE;
// recompile template if it is changed
$GLOBALS['Smarty'] -> compile_check = TRUE;
}
$GLOBALS['Smarty'] -> assign('LS_CSS_DIR',LS_CSS_DIR);
$GLOBALS['Smarty'] -> assign('LS_IMAGES_DIR',LS_IMAGES_DIR);
self :: addJSconfigParam('LS_IMAGES_DIR',LS_IMAGES_DIR);
private static function startLSconfig() {
if (self :: loadLSclass('LSconfig')) {
if (LSconfig :: start()) {
return true;
}
else {
die("ERROR : Can't load Smarty.");
return;
}
die("ERROR : Can't load configuration files.");
return;
}
/**
* Lancement et initialisation de Smarty
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval true si tout c'est bien passé, false sinon
*/
private static function startLStemplate() {
if ( self :: includeFile(LSconfig :: get('Smarty')) ) {
$GLOBALS['Smarty'] = new Smarty();
$GLOBALS['Smarty'] -> template_dir = LS_TEMPLATES_DIR;
$GLOBALS['Smarty'] -> compile_dir = LS_TMP_DIR;
if (LSdebug) {
$GLOBALS['Smarty'] -> caching = 0;
// cache files are always regenerated
$GLOBALS['Smarty'] -> force_compile = TRUE;
// recompile template if it is changed
$GLOBALS['Smarty'] -> compile_check = TRUE;
}
$GLOBALS['Smarty'] -> assign('LS_CSS_DIR',LS_CSS_DIR);
$GLOBALS['Smarty'] -> assign('LS_IMAGES_DIR',LS_IMAGES_DIR);
self :: addJSconfigParam('LS_IMAGES_DIR',LS_IMAGES_DIR);
return true;
}
else {
die("ERROR : Can't load configuration files.");
return;
}
die("ERROR : Can't load Smarty.");
return;
}
/**
* Retourne le topDn de la session
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval string le topDn de la session
*/
public static function getTopDn() {
return self :: $topDn;
}
@ -194,6 +203,9 @@ class LSsession {
* @retval boolean true si le chargement a réussi, false sinon.
*/
public static function loadLSobject($object) {
if(class_exists($object)) {
return true;
}
$error = 0;
self :: loadLSclass('LSldapObject');
if (!self :: loadLSclass($object,'LSobjects')) {
@ -202,6 +214,11 @@ class LSsession {
if (!self :: includeFile( LS_OBJECTS_DIR . 'config.LSobjects.'.$object.'.php' )) {
$error = 1;
}
else {
if (!LSconfig :: set("LSobjects.$object",$GLOBALS['LSobjects'][$object])) {
$error = 1;
}
}
if ($error) {
LSerror :: addErrorCode('LSsession_04',$object);
return;
@ -239,12 +256,13 @@ class LSsession {
* @retval boolean true si le chargement a réussi, false sinon.
*/
public static function loadLSaddons() {
if(!is_array($GLOBALS['LSaddons']['loads'])) {
$conf=LSconfig :: get('LSaddons.loads');
if(!is_array($conf)) {
LSerror :: addErrorCode('LSsession_01',"LSaddons['loads']");
return;
}
foreach ($GLOBALS['LSaddons']['loads'] as $addon) {
foreach ($conf as $addon) {
self :: loadLSaddon($addon);
}
return true;
@ -266,7 +284,7 @@ class LSsession {
$lang = self :: $ldapServer['lang'];
}
else {
$lang = $GLOBALS['LSconfig']['lang'];
$lang = LSconfig :: get('lang');
}
if (isset($_REQUEST['encoding'])) {
@ -279,7 +297,7 @@ class LSsession {
$encoding = self :: $ldapServer['encoding'];
}
else {
$encoding = $GLOBALS['LSconfig']['encoding'];
$encoding = LSconfig :: get('encoding');
}
$_SESSION['LSlang']=$lang;
@ -360,9 +378,12 @@ class LSsession {
* @retval boolean True si l'initialisation à réussi, false sinon.
*/
public static function initialize() {
if (!self :: loadConfig()) {
if (!self :: startLSconfig()) {
return;
}
self :: startLStemplate();
session_start();
self :: setLocale();
@ -773,9 +794,10 @@ class LSsession {
* @retval boolean True sinon false.
*/
public static function setLdapServer($id) {
if ( isset($GLOBALS['LSconfig']['ldap_servers'][$id]) ) {
$conf = LSconfig :: get("ldap_servers.$id");
if ( is_array($conf) ) {
self :: $ldapServerId = $id;
self :: $ldapServer=$GLOBALS['LSconfig']['ldap_servers'][$id];
self :: $ldapServer = $conf;
self :: setLocale();
return true;
}
@ -791,7 +813,7 @@ class LSsession {
*/
public static function LSldapConnect() {
if (self :: $ldapServer) {
self :: includeFile($GLOBALS['LSconfig']['NetLDAP2']);
self :: includeFile(LSconfig :: get('NetLDAP2'));
if (!self :: loadLSclass('LSldap')) {
return;
}
@ -964,13 +986,13 @@ class LSsession {
else {
$GLOBALS['Smarty'] -> assign('loginform_action',$_SERVER['REQUEST_URI']);
}
if (count($GLOBALS['LSconfig']['ldap_servers'])==1) {
if (count(LSconfig :: get('ldap_servers'))==1) {
$GLOBALS['Smarty'] -> assign('loginform_ldapserver_style','style="display: none"');
}
$GLOBALS['Smarty'] -> assign('loginform_label_ldapserver',_('LDAP server'));
$ldapservers_name=array();
$ldapservers_index=array();
foreach($GLOBALS['LSconfig']['ldap_servers'] as $id => $infos) {
foreach(LSconfig :: get('ldap_servers') as $id => $infos) {
$ldapservers_index[]=$id;
$ldapservers_name[]=__($infos['name']);
}
@ -1002,14 +1024,14 @@ class LSsession {
$GLOBALS['Smarty'] -> assign('pagetitle',_('Recovery of your credentials'));
$GLOBALS['Smarty'] -> assign('recoverpasswordform_action','index.php?LSsession_recoverPassword');
if (count($GLOBALS['LSconfig']['ldap_servers'])==1) {
if (count(LSconfig :: get('ldap_servers'))==1) {
$GLOBALS['Smarty'] -> assign('recoverpasswordform_ldapserver_style','style="display: none"');
}
$GLOBALS['Smarty'] -> assign('recoverpasswordform_label_ldapserver',_('LDAP server'));
$ldapservers_name=array();
$ldapservers_index=array();
foreach($GLOBALS['LSconfig']['ldap_servers'] as $id => $infos) {
foreach(LSconfig :: get('ldap_servers') as $id => $infos) {
$ldapservers_index[]=$id;
$ldapservers_name[]=$infos['name'];
}
@ -1127,15 +1149,12 @@ class LSsession {
$JSscript_txt.="<script src='".$script['path'].$script['file']."' type='text/javascript'></script>\n";
}
$KAconf = LSconfig :: get('keepLSsessionActive');
if (
(
(!isset(self :: $ldapServer['keepLSsessionActive']))
&&
(
(!isset($GLOBALS['LSconfig']['keepLSsessionActive']))
||
($GLOBALS['LSconfig']['keepLSsessionActive'])
)
(!($KAconf === false))
)
||
(self :: $ldapServer['keepLSsessionActive'])
@ -1145,7 +1164,7 @@ class LSsession {
$GLOBALS['Smarty'] -> assign('LSjsConfig',json_encode(self :: $_JSconfigParams));
if ($GLOBALS['LSdebug']['active']) {
if (LSdebug) {
$JSscript_txt.="<script type='text/javascript'>LSdebug_active = 1;</script>\n";
}
else {
@ -1397,7 +1416,7 @@ class LSsession {
foreach($objectConf['LSobjects'] as $type) {
if (self :: loadLSobject($type)) {
if (self :: canAccess($type)) {
$access[$type] = $GLOBALS['LSobjects'][$type]['label'];
$access[$type] = LSconfig :: get('LSobjects.'.$type.'.label');
}
}
}
@ -1418,7 +1437,7 @@ class LSsession {
foreach($config['LSobjects'] as $objectType) {
if (self :: loadLSobject($objectType)) {
if (self :: canAccess($objectType)) {
$access[$objectType] = $GLOBALS['LSobjects'][$objectType]['label'];
$access[$objectType] = LSconfig :: get('LSobjects.'.$objectType.'.label');
}
}
}
@ -1434,7 +1453,7 @@ class LSsession {
foreach(self :: $ldapServer['LSaccess'] as $objectType) {
if (self :: loadLSobject($objectType)) {
if (self :: canAccess($objectType)) {
$access[$objectType] = $GLOBALS['LSobjects'][$objectType]['label'];
$access[$objectType] = LSconfig :: get('LSobjects.'.$objectType.'.label');
}
}
}
@ -1529,22 +1548,22 @@ class LSsession {
}
}
else {
$objectdn=$GLOBALS['LSobjects'][$LSobject]['container_dn'].','.self :: $topDn;
$objectdn=LSconfig :: get('LSobjects.'.$LSobject.'.container_dn').','.self :: $topDn;
$whoami = self :: whoami($objectdn);
}
// Pour un attribut particulier
if ($attr) {
if ($attr=='rdn') {
$attr=$GLOBALS['LSobjects'][$LSobject]['rdn'];
$attr=LSconfig :: get('LSobjects.'.$LSobject.'.rdn');
}
if (!isset($GLOBALS['LSobjects'][$LSobject]['attrs'][$attr])) {
if (!is_array(LSconfig :: get('LSobjects.'.$LSobject.'.attrs.'.$attr))) {
return;
}
$r = 'n';
foreach($whoami as $who) {
$nr = $GLOBALS['LSobjects'][$LSobject]['attrs'][$attr]['rights'][$who];
$nr = LSconfig :: get('LSobjects.'.$LSobject.'.attrs.'.$attr.'.rights.'.$who);
if($nr == 'w') {
$r = 'w';
}
@ -1570,10 +1589,11 @@ class LSsession {
}
// Pour un attribut quelconque
if (is_array($GLOBALS['LSobjects'][$LSobject]['attrs'])) {
$attrs_conf=LSconfig :: get('LSobjects.'.$LSobject.'.attrs');
if (is_array($attrs_conf)) {
if (($right=='r')||($right=='w')) {
foreach($whoami as $who) {
foreach ($GLOBALS['LSobjects'][$LSobject]['attrs'] as $attr_name => $attr_config) {
foreach ($attrs_conf as $attr_name => $attr_config) {
if ($attr_config['rights'][$who]==$right) {
return true;
}
@ -1582,7 +1602,7 @@ class LSsession {
}
else {
foreach($whoami as $who) {
foreach ($GLOBALS['LSobjects'][$LSobject]['attrs'] as $attr_name => $attr_config) {
foreach ($attrs_conf as $attr_name => $attr_config) {
if ( ($attr_config['rights'][$who]=='r') || ($attr_config['rights'][$who]=='w') ) {
return true;
}
@ -1640,14 +1660,15 @@ class LSsession {
* @retval boolean True si l'utilisateur a accès, false sinon
*/
public static function relationCanAccess($dn,$LSobject,$relationName,$right=NULL) {
if (!isset($GLOBALS['LSobjects'][$LSobject]['LSrelation'][$relationName]))
$relConf=LSconfig :: get('LSobjects.'.$LSobject.'.LSrelation.'.$relationName);
if (!is_array($relConf))
return;
$whoami = self :: whoami($dn);
if (($right=='w') || ($right=='r')) {
$r = 'n';
foreach($whoami as $who) {
$nr = $GLOBALS['LSobjects'][$LSobject]['LSrelation'][$relationName]['rights'][$who];
$nr = $relConf['rights'][$who];
if($nr == 'w') {
$r = 'w';
}
@ -1664,7 +1685,7 @@ class LSsession {
}
else {
foreach($whoami as $who) {
if (($GLOBALS['LSobjects'][$LSobject]['LSrelation'][$relationName]['rights'][$who] == 'w') || ($GLOBALS['LSobjects'][$LSobject]['LSrelation'][$relationName]['rights'][$who] == 'r')) {
if (($relConf['rights'][$who] == 'w') || ($relConf['rights'][$who] == 'r')) {
return true;
}
}
@ -1774,7 +1795,7 @@ class LSsession {
* @retval boolean True si le cache des droits est activé, false sinon.
*/
public static function cacheLSprofiles() {
return ( ($GLOBALS['LSconfig']['cacheLSprofiles']) || (self :: $ldapServer['cacheLSprofiles']) );
return ( (LSconfig :: get('cacheLSprofiles')) || (self :: $ldapServer['cacheLSprofiles']) );
}
/**
@ -1785,7 +1806,7 @@ class LSsession {
* @retval boolean True si le cache des subDn est activé, false sinon.
*/
public static function cacheSudDn() {
return (($GLOBALS['LSconfig']['cacheSubDn']) || (self :: $ldapServer['cacheSubDn']));
return ( (LSconfig :: get('cacheSubDn')) || (self :: $ldapServer['cacheSubDn']));
}
/**
@ -1796,7 +1817,7 @@ class LSsession {
* @retval boolean True si le cache des recherches est activé, false sinon.
*/
public static function cacheSearch() {
return (($GLOBALS['LSconfig']['cacheSearch']) || (self :: $ldapServer['cacheSearch']));
return ( (LSconfig :: get('cacheSearch')) || (self :: $ldapServer['cacheSearch']));
}
/**

View file

@ -188,29 +188,29 @@ function return_data($data) {
return $data;
}
$GLOBALS['LSdebug']['fields']=array();
$GLOBALS['LSdebug_fields']=array();
function LSdebug($data,$dump=false) {
if ($dump) {
ob_start();
var_dump($data);
$GLOBALS['LSdebug']['fields'][]=ob_get_contents();
$GLOBALS['LSdebug_fields'][]=ob_get_contents();
ob_end_clean();
}
else {
if (is_array($data)||is_object($data)) {
$GLOBALS['LSdebug']['fields'][]=$data;
$GLOBALS['LSdebug_fields'][]=$data;
}
else {
$GLOBALS['LSdebug']['fields'][]="[$data]";
$GLOBALS['LSdebug_fields'][]="[$data]";
}
}
return true;
}
function LSdebug_print($return=false) {
if (( $GLOBALS['LSdebug']['fields'] ) && ( $GLOBALS['LSdebug']['active'] )) {
if (( $GLOBALS['LSdebug_fields'] ) && (LSdebug)) {
$txt='<ul>';
foreach($GLOBALS['LSdebug']['fields'] as $debug) {
foreach($GLOBALS['LSdebug_fields'] as $debug) {
if (is_array($debug)||is_object($debug)) {
$txt.='<li><pre>'.print_r($debug,true).'</pre></li>';
}
@ -228,9 +228,9 @@ function LSdebug_print($return=false) {
}
function LSdebugDefined() {
if (!$GLOBALS['LSdebug']['active'])
if (!LSdebug)
return;
return (!empty($GLOBALS['LSdebug']['fields']));
return (!empty($GLOBALS['LSdebug_fields']));
}
/**

View file

@ -20,7 +20,7 @@
******************************************************************************/
require_once 'includes/class/class.LSsession.php';
require_once 'core.php';
if(LSsession :: startLSsession()) {

View file

@ -1,6 +1,6 @@
<?php
require_once 'includes/class/class.LSsession.php';
require_once 'core.php';
if (!isset($_REQUEST['noLSsession'])) {
if ( !LSsession :: startLSsession() ) {

View file

@ -20,7 +20,7 @@
******************************************************************************/
require_once 'includes/class/class.LSsession.php';
require_once 'core.php';
if(LSsession :: startLSsession()) {

View file

@ -20,7 +20,7 @@
******************************************************************************/
require_once 'includes/class/class.LSsession.php';
require_once 'core.php';
if(LSsession :: startLSsession()) {

View file

@ -20,7 +20,7 @@
******************************************************************************/
require_once 'includes/class/class.LSsession.php';
require_once 'core.php';
if(LSsession :: startLSsession()) {
if (isset($_REQUEST['LSobject'])) {

View file

@ -20,7 +20,7 @@
******************************************************************************/
require_once 'includes/class/class.LSsession.php';
require_once 'core.php';
if(LSsession :: startLSsession()) {
if (isset($_REQUEST['LSobject'])) {