diff --git a/php/classes/UserMgr.php b/php/classes/UserMgr.php index 2e608e9..4de0e08 100644 --- a/php/classes/UserMgr.php +++ b/php/classes/UserMgr.php @@ -13,674 +13,748 @@ define('TTPATH', USERPATH.'TT/'); define('JOBPATH', USERPATH.'jobs/'); */ -class UserMgr -{ - public $user, $IP, $userdir; - protected $passwd; - protected $sessionID; - protected $userDirs = array('USERWSDIR' => 'WS', 'USERREQDIR' => 'REQ', 'USERDATADIR' => 'DATA', - 'USERWORKINGDIR' =>'RES', 'USERTTDIR' => 'TT', 'USERJOBDIR' => 'JOBS', - 'USERTEMPDIR' => 'TEMP'); - protected $userMissions; - protected $amdaClient; //client to dd webservice - - public $isFirst = false; - public $isNewInfo = false; - public $isSpecialInfo = null; - - function __construct($username,$password,$sessionID) - { - // if magic quotes is on, stripslashes - if(get_magic_quotes_gpc()) - { - $in = array(&$_GET, &$_POST, &$_COOKIE); - while(list($k,$v) = each($in)) - { - foreach($v as $key => $val) - { - if(!is_array($val)) - { - $in[$k][$key] = stripslashes($val); - continue; - } - $in[] =& $in[$k][$key]; - } - } - unset($in); - } - - if (isset($_POST['username'])) - { - // Process Guest Login - if (strcasecmp(trim($_POST['username']),"guest") == 0) - { - $this->processGuestLogin(); - } - else - { - $this->user = trim($_POST['username']); - } - } - elseif (isset($username)) - $this->user = trim($username); - - //TODO crypt / decrypt - if (!isset($this->passwd)) - { - if (isset($_POST['password'])) - $this->passwd = $_POST['password']; - else if (isset($password)) - $this->passwd = $password; - } + class UserMgr { - if (isset($_GET['sessionID'])) - $this->user = $_GET['sessionID']; - elseif (isset($sessionID)) - $this->user = $sessionID; - - $this->amdaClient = new AmdaClient(); - } - //TODO if needed?? set session ID - protected function setID() {} - - - public function getIPclient() - { - /* - REMOTE_ADDR is the only really reliable information, - as it is transmitted to you by your web server that - is handling the request. It can be theoretically - falsified as well, but that is much, much harder - than spoofing a header value, and an entirely different class of attack. - */ - if (getenv('REMOTE_ADDR')) - { - $realIP = getenv('REMOTE_ADDR'); - } - else - { - //get local IP - $command="hostname -i"; - $realIP = exec($command); + public $user, $IP, $userdir; + protected $passwd; + protected $sessionID; + protected $userDirs = array('USERWSDIR' => 'WS', 'USERREQDIR' => 'REQ', 'USERDATADIR' => 'DATA', + 'USERWORKINGDIR' =>'RES', 'USERTTDIR' => 'TT', 'USERJOBDIR' => 'JOBS', + 'USERTEMPDIR' => 'TEMP'); + protected $userMissions; + protected $amdaClient; //client to dd webservice + + public $isFirst = false; + public $isNewInfo = false; + public $isSpecialInfo = null; + + function __construct($username,$password,$sessionID) { + + // if magic quotes is on, stripslashes + if(get_magic_quotes_gpc()){ + $in = array(&$_GET, &$_POST, &$_COOKIE); + while(list($k,$v) = each($in)){ + foreach($v as $key => $val){ + if(!is_array($val)){ + $in[$k][$key] = stripslashes($val); + continue; } - return $realIP; + $in[] =& $in[$k][$key]; + } + } + unset($in); } - public function getUserInfo() - { - return $this->amdaClient->getUserInfo($this->user); - } - - /* - * Get Available Missions for a User (groups restriction) - */ - protected function getAvailableMissionsByUser() - { - $res = $this->amdaClient->getUserAvailableMissions($this->user); - - if (!$res['success']) - return array('local' => array(), 'external' => array()); - - return array('local' => $res['local'], 'external' => $res['external']); - } - - public function createDir() - { - if (!mkdir($this->userdir, 0755, true)) - return false; + if (isset($_POST['username'])) { + // Process Guest Login + if (strcasecmp(trim($_POST['username']),"guest") == 0) { + $this->processGuestLogin(); + } + else { + $this->user = trim($_POST['username']); + } + } + else if (isset($username)) + $this->user = trim($username); + + //TODO crypt / decrypt + if (!isset($this->passwd)) { + if (isset($_POST['password'])) + $this->passwd = $_POST['password']; + else if (isset($password)) + $this->passwd = $password; + } + + if (isset($_GET['sessionID'])) + $this->user = $_GET['sessionID']; + else if (isset($sessionID)) + $this->user = $sessionID; + $this->amdaClient = new AmdaClient(); + } + + //TODO if needed?? set session ID + protected function setID() { + + + } + + + public function getIPclient(){ + + /* + REMOTE_ADDR is the only really reliable information, + as it is transmitted to you by your web server that + is handling the request. It can be theoretically + falsified as well, but that is much, much harder + than spoofing a header value, and an entirely different class of attack. +*/ + if (getenv('REMOTE_ADDR')) { + $realIP = getenv('REMOTE_ADDR'); + if ($realIP == '10.10.131.1') { // proxy amdatest et openam + $allIPs = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']); + $realIP = count($allIPs) > 1 ? trim($allIPs[0]) : $_SERVER['HTTP_X_FORWARDED_FOR']; + } + } + else { + //get local IP + $command="hostname -i"; + $realIP = exec($command); + } + return $realIP; + } + + + public function getUserInfo() + { + return $this->amdaClient->getUserInfo($this->user); + } - foreach ($this->userDirs as $key => $val) - { - if (!mkdir($this->userdir.$val.'/', 0755, true)) - return false; - } - - return true; +/* +* Get Available Missions for a User (groups restriction) +*/ + protected function getAvailableMissionsByUser() + { + $res = $this->amdaClient->getUserAvailableMissions($this->user); + + if (!$res['success']) + return array('local' => array(), 'external' => array()); + return array('local' => $res['local'], 'external' => $res['external']); + } + + public function createDir() + { + if (!mkdir($this->userdir, 0755, true)) return false; + + foreach ($this->userDirs as $key => $val) { + if (!mkdir($this->userdir.$val.'/', 0755, true)) return false; + } + return true; } - /* - * Check if special groups with settings exist and user is from these groups - * Take the first group from user list - */ - protected function isSpecialGroup() - { - $specialGrps = new DomDocument("1.0"); +/* +* Check if special groups with settings exist and user is from these groups +* Take the first group from user list +*/ + protected function isSpecialGroup() { + + $specialGrps = new DomDocument("1.0"); + + if (!($specialGrps->load(specialGrpsXml))) + return null; - if (!($specialGrps->load(specialGrpsXml))) - return null; + $info = $this->amdaClient->getUserInfo($this->user); + + $userGrps = explode(',',$info['group']); - $info = $this->amdaClient->getUserInfo($this->user); + $specialGrpNode = null; - $userGrps = explode(',',$info['group']); + foreach ($userGrps as $grp) { + $specialGrpNode = $specialGrps->getElementById($grp); + if ($specialGrpNode) break; + } + + return $specialGrpNode; + } + +/* +* Totally replace IMPEX staff in user remote tree +*/ + protected function updateImpex() + { + $myRemoteBases = new DomDocument("1.0"); + + if (!$myRemoteBases->load(USERWSDIR.'RemoteParams.xml')) + return false; - $specialGrpNode = null; + $myBases = $myRemoteBases->getElementsByTagName('dataCenter'); - foreach ($userGrps as $grp) - { - $specialGrpNode = $specialGrps->getElementById($grp); - if ($specialGrpNode) break; - } - return $specialGrpNode; - } - - /* - * Totally replace IMPEX staff in user remote tree - */ - protected function updateImpex() - { - $myRemoteBases = new DomDocument("1.0"); - - if (!$myRemoteBases->load(USERWSDIR.'RemoteParams.xml')) return false; - - $myBases = $myRemoteBases->getElementsByTagName('dataCenter'); - - if ($myBases->length < 1) return false; - - // Delete all impex staff at first - $i = $myBases->length - 1; - - while ($i > -1) - { - $base = $myBases->item($i); - $id = $base->getAttribute('xml:id'); - - if ($id == 'FMI_GUMICS') - { - $simuRemoteBases = new DomDocument("1.0"); - $simuRemoteBases->load(USERWSDIR.'RemoteParams.xml'); - - $gumicsNode = $simuRemoteBases->getElementById('FMI_GUMICS'); - if ($gumicsNode != NULL) - $gumicsRuns = $gumicsNode->getElementsByTagName('runID'); - } - - if (($base->hasAttribute('isSimulation')) || $id == "CLWeb") - { - $base->parentNode->removeChild($base); - } - $i--; - } - - $remoteBases = new DomDocument("1.0"); - if (!$remoteBases->load(RemoteData.'Bases.xml')) return false; - $bases = $remoteBases->getElementsByTagName('dataCenter'); - - if ($bases->length < 1) return false; - - $myRootElement = $myRemoteBases->documentElement; - - // and add impex - foreach ($bases as $base) - { - //TODO && $id != 'FMI_GUMICS' or ! hasAttribute('isAddable') - if ($base->hasAttribute('isSimulation')) - { - $baseId = $base->getAttribute('xml:id'); - $baseXml = new DomDocument("1.0"); - // no data base description ; skip this data base - if (!file_exists(RemoteData.$baseId.'/base.xml')) continue; - - // can't read base.xml ; skip this data base - if (!$baseXml->load(RemoteData.$baseId.'/base.xml')) continue; - - $myBase = $myRemoteBases->importNode($baseXml->getElementById($baseId), true); - $myBase->setAttribute('name', $base->getAttribute('name')); - $myBase->setAttribute('desc', $base->getAttribute('desc')); - - if ($baseId == "FMI_GUMICS") - { - $gumicsSimuReg = $myRemoteBases->getElementById('FMI_GUMICS_Earth_Magnetosphere'); - - if (($gumicsSimuReg != NULL)&& ($gumicsRuns->length > 0)) - { - for($c = 0; $c < $gumicsRuns->length; $c++) - { - $node = $gumicsRuns->item($c); - $node = $myRemoteBases->importNode($node, true); - $gumicsSimuReg->appendChild($node); - } - } - } - $myRootElement->appendChild($myBase); - } - } + if ($myBases->length < 1) + return false; + // Delete all impex staff at first + $i = $myBases->length - 1; + + while ($i > -1) { + $base = $myBases->item($i); + $id = $base->getAttribute('xml:id'); + + if ($id == 'FMI_GUMICS'){ + $simuRemoteBases = new DomDocument("1.0"); + $simuRemoteBases->load(USERWSDIR.'RemoteParams.xml'); + + $gumicsNode = $simuRemoteBases->getElementById('FMI_GUMICS'); + if ($gumicsNode != NULL) + $gumicsRuns = $gumicsNode->getElementsByTagName('runID'); + } + + + + if (($base->hasAttribute('isSimulation')) || $id == "CLWeb") { + $base->parentNode->removeChild($base); + } + $i--; + } + + $remoteBases = new DomDocument("1.0"); + if (!$remoteBases->load(RemoteData.'Bases.xml')) + return false; + $bases = $remoteBases->getElementsByTagName('dataCenter'); + + if ($bases->length < 1) + return false; + + $myRootElement = $myRemoteBases->documentElement; + + // and add impex + foreach ($bases as $base) { + //TODO && $id != 'FMI_GUMICS' or ! hasAttribute('isAddable') + if ($base->hasAttribute('group') && + $base->getAttribute('group') == 'IMPEX') { + + $baseId = $base->getAttribute('xml:id'); + $baseXml = new DomDocument("1.0"); + // no data base description ; skip this data base + if (!file_exists(RemoteData.$baseId.'/base.xml')) continue; + + // can't read base.xml ; skip this data base + if (!$baseXml->load(RemoteData.$baseId.'/base.xml')) continue; + + $myBase = $myRemoteBases->importNode($baseXml->getElementById($baseId), true); + $myBase->setAttribute('name', $base->getAttribute('name')); + $myBase->setAttribute('desc', $base->getAttribute('desc')); + + if ($baseId == "FMI_GUMICS"){ + $gumicsSimuReg = $myRemoteBases->getElementById('FMI_GUMICS_Earth_Magnetosphere'); + + if (($gumicsSimuReg != NULL)&& ($gumicsRuns->length > 0)){ + for($c = 0; $c < $gumicsRuns->length; $c++){ + $node = $gumicsRuns->item($c); + $node = $myRemoteBases->importNode($node, true); + $gumicsSimuReg->appendChild($node); + } + } + } + + + $myRootElement->appendChild($myBase); + } + } - return $myRemoteBases->save(USERWSDIR.'RemoteParams.xml'); - } - - /* - * make remote data tree from list of distant bases if it doezn't exist - */ - protected function makeRemoteTree() - { - $remoteBases = new DomDocument("1.0"); - $availableMis = $this->userMissions['external']; + return $myRemoteBases->save(USERWSDIR.'RemoteParams.xml'); + + } + + /* + * make local data tree from list of missions + */ + protected function makeLocalTree() + { + if (file_exists(DATAPATH.'rank.json')) + $cmpArr = json_decode(file_get_contents(DATAPATH.'rank.json'), true); + else + $cmpArr = null; + + $localMissions = new DomDocument("1.0"); + $localMissions->load(LocalData.'Missions.xml'); + + $xp = new domxpath($localMissions); + $bases = $xp->query("//MissionID[@status='required']"); + + $piBase = new DomDocument("1.0"); + $piBase->formatOutput = true; + $piBase->preserveWhiteSpace = false; + + $localDom = new DomDocument("1.0"); + $BASE = $localDom->createElement('dataRoot'); + $Amda = $localDom->createElement('dataCenter'); + $Amda_name = new DomAttr('name', 'AMDA'); + $Amda->appendChild($Amda_name); + $Amda_desc = new DomAttr('desc', 'AMDA_Internal_Data_Base'); + $Amda->appendChild($Amda_desc); + + $availableMis = $this->userMissions['local']; + + foreach ($bases as $base) { + $xml = LocalData.'DD_'.$base->nodeValue.'.xml'; + $notAvailable = (array_search($base->nodeValue,$availableMis) === FALSE); + if (file_exists($xml)){ + if (!$piBase->load($xml)) + error_log($base->nodeValue,1,email); + $vi = $piBase->getElementsByTagName("mission"); + if ($vi->length > 0) for ($i = 0; $i < $vi->length; $i++){ + $nodeNew = $localDom->importNode($vi->item($i),true); + $nodeNew->setAttribute('available',!$notAvailable); + // set rank by target name if file rank.json exists + if (is_array($cmpArr)) { + $targets = $vi->item($i)->getElementsByTagName('target'); + if ($targets->length > 0) { + // First target is the main one + $target = $targets->item(0); + $index = $cmpArr[$target->nodeValue]; + if ($index) + $nodeNew->setAttribute('rank',$index); + else $nodeNew->setAttribute('rank', 999); + } + } + $Amda->appendChild($nodeNew); + } + } + } + + if ($Amda->hasChildNodes()) $BASE->appendChild($Amda); + $localDom->appendChild($BASE); + + // set access rights at all levels + $xpLoc = new domxpath($localDom); + // get all nodes with 'group' attribute (restricted) + $restrictedTags = $xpLoc->query("//*[@group]"); + + if ($restrictedTags->length > 0) { + $info = $this->amdaClient->getUserInfo($this->user); + $userGrps = explode(',',preg_replace('/\s+/', '',$info['group'])); + + foreach ($restrictedTags as $restriction) { + $group = $restriction->getAttribute('group'); + $available = in_array($group,$userGrps); + // special restrictions + if (!$available && $restriction->getAttribute('restriction')) { + $restriction_type = $restriction->getAttribute('restriction'); + // time restriction + if ($restriction_type == 'time') { + $id_restr = $restriction->getAttribute('xml:id'); + $restrictions = $this->amdaClient->getTimeRestriction(str_replace(":","_",$id_restr)); + if ($restrictions) { + $restriction->setAttribute('restricted', $restrictions['days']); + $dataStop = $restriction->getElementsByTagName('dataStop'); + if ($dataStop->length > 0) { + $globalStop = explode("T", $restrictions['globalstop']); + $dataStop->item(0)->nodeValue = str_replace("-", "/", $globalStop[0]); + } + } + } + // absolute restriction: remove node + else { + $restriction->parentNode->removeChild($restriction); + } + } + else { + // general restriction: disable node + $restriction->setAttribute('restricted', !$available); + } + } + } + + $xsl = new DomDocument("1.0"); + $xsl->load(XMLPATH.'dd2tree.xsl'); + + $xslt = new XSLTProcessor(); + $xslt->importStylesheet($xsl); + + $piBase->loadXML($xslt->transformToXML($localDom)); + + $piBase->save(USERWSDIR.'LocalParams.xml'); + } + +/* + * make remote data tree from list of distant bases if it doezn't exist + */ + protected function makeRemoteTree() { + + $remoteBases = new DomDocument("1.0"); + $availableMis = $this->userMissions['external']; - if (file_exists(USERWSDIR.'RemoteParams.xml')) - { - // replace IMPEX nodes - $status = $this->updateImpex(); - if (!$status) error_log('IMPEX Remote Base can not be updated',1,email); - // check/change access rights - $remoteBases->load(USERWSDIR.'RemoteParams.xml'); - $bases = $remoteBases->getElementsByTagName('dataCenter'); - $delete = new UserDeleteObsolete(); - if ($bases->length > 0) - { - foreach ($bases as $base) - { - $baseId = $base->getAttribute('xml:id'); - $notAvailable = (array_search($baseId,$availableMis) === FALSE); - $base->setAttribute('available',!$notAvailable); + if (file_exists(USERWSDIR.'RemoteParams.xml')) + { + // replace IMPEX nodes + $status = $this->updateImpex(); + if (!$status) error_log('IMPEX Remote Base can not be updated',1,email); + // check/change access rights + $remoteBases->load(USERWSDIR.'RemoteParams.xml'); + $bases = $remoteBases->getElementsByTagName('dataCenter'); + $delete = new UserDeleteObsolete(); + if ($bases->length > 0) + foreach ($bases as $base) { + $baseId = $base->getAttribute('xml:id'); + $notAvailable = (array_search($baseId,$availableMis) === FALSE); + $base->setAttribute('available',!$notAvailable); - if ($base->getAttribute('isSimulation')) continue; + if ($base->getAttribute('isSimulation')) continue; - // Update Info on External Data Sets in UserTree.xml for everything except IMPEX - $dataSets = $base->getElementsByTagName("dataset"); - if ($dataSets->length > 0) - { - $baseExtDom = new DomDocument("1.0"); - if (!$baseExtDom->load(RemoteData.$baseId.'/base.xml')) - { - $base->setAttribute("desc","ATTENTION!!! This Base set DOES NOT ANY MORE EXIST!!! Remove it from your tree"); - $base->setAttribute('obsolete', true); - error_log('NO '.RemoteData.$baseId.'/base.xml',1,email); - continue; - } - foreach ($dataSets as $dataSet) - { - $dataSetID = $dataSet->getAttribute("xml:id"); - $origDataSet = $baseExtDom->getElementById($dataSetID); - if ($origDataSet != null) - { - $desc = $origDataSet->getAttribute("desc"); - if ($desc != null) $dataSet->setAttribute("desc", $desc); - } - else - { - $delete->setVI($dataSet->getAttribute('name')); - $res = $delete->deleteDerived(); - $res = $delete->deleteConditions(); - $res = $delete->deleteRequests(); - $res = $delete->deleteAliases(); - $dataSet->setAttribute("desc","ATTENTION!!! This data set DOES NOT ANY MORE EXIST!!! Remove it from your tree"); - $dataSet->setAttribute('obsolete', true); - } - } - } - } - } - return $remoteBases->save(USERWSDIR.'RemoteParams.xml'); - } + // Update Info on External Data Sets in UserTree.xml for everything except IMPEX + $dataSets = $base->getElementsByTagName("dataset"); + if ($dataSets->length > 0) { + $baseExtDom = new DomDocument("1.0"); + if (!$baseExtDom->load(RemoteData.$baseId.'/base.xml')) { + $base->setAttribute("desc","ATTENTION!!! This Base set DOES NOT ANY MORE EXIST!!! Remove it from your tree"); + $base->setAttribute('obsolete', true); + error_log('NO '.RemoteData.$baseId.'/base.xml',1,email); + continue; + } + foreach ($dataSets as $dataSet) { + $dataSetID = $dataSet->getAttribute("xml:id"); + $origDataSet = $baseExtDom->getElementById($dataSetID); + if ($origDataSet != null) { + $desc = $origDataSet->getAttribute("desc"); + if ($desc != null) $dataSet->setAttribute("desc", $desc); + } + else { + $delete->setVI($dataSet->getAttribute('name')); + $res = $delete->deleteDerived(); + $res = $delete->deleteConditions(); + $res = $delete->deleteRequests(); + $res = $delete->deleteAliases(); + $dataSet->setAttribute("desc","ATTENTION!!! This data set DOES NOT ANY MORE EXIST!!! Remove it from your tree"); + $dataSet->setAttribute('obsolete', true); + } + } + } + } + + return $remoteBases->save(USERWSDIR.'RemoteParams.xml'); + } - $remoteBases->load(RemoteData.'Bases.xml'); - $bases = $remoteBases->getElementsByTagName('dataCenter'); + $remoteBases->load(RemoteData.'Bases.xml'); + $bases = $remoteBases->getElementsByTagName('dataCenter'); - if ($bases->length == 0) return 'NO REMOTE BASES'; + if ($bases->length == 0) return 'NO REMOTE BASES'; - $paramMgr = new ParamMgr(); - $paramMgr->xmlDom = new DomDocument("1.0"); - $paramMgr->xmlDom->formatOutput = true; - $paramMgr->xmlDom->preserveWhiteSpace = false; + $paramMgr = new ParamMgr(); + $paramMgr->xmlDom = new DomDocument("1.0"); + $paramMgr->xmlDom->formatOutput = true; + $paramMgr->xmlDom->preserveWhiteSpace = false; - $BASE = $paramMgr->xmlDom->createElement('dataRoot'); - $BASE->setAttribute('xml:id','myRemoteData-treeRootNode'); + $BASE = $paramMgr->xmlDom->createElement('dataRoot'); + $BASE->setAttribute('xml:id','myRemoteData-treeRootNode'); - $baseXml = new DomDocument("1.0"); + $baseXml = new DomDocument("1.0"); - foreach ($bases as $base) - { - $toInclude = $base->hasAttribute('default'); - $baseId = $base->getAttribute('xml:id'); - $paramMgr->baseId = $baseId; - - $notAvailable = (array_search($baseId,$availableMis) === FALSE); + foreach ($bases as $base) { + + $toInclude = $base->hasAttribute('default'); + $baseId = $base->getAttribute('xml:id'); + $paramMgr->baseId = $baseId; + + $notAvailable = (array_search($baseId,$availableMis) === FALSE); - // no data base description ; skip this data base - if (!file_exists(RemoteData.$baseId.'/base.xml')) continue; + // no data base description ; skip this data base + if (!file_exists(RemoteData.$baseId.'/base.xml')) continue; - // can't read base.xml ; skip this data base - if (!$baseXml->load(RemoteData.$baseId.'/base.xml')) continue; - - // Some small & well known data centers are included by default: - // Each VI structure and VI (dataset) description at DD Server for them should exist - if ($toInclude) - { - $center = $paramMgr->xmlDom->importNode($baseXml->getElementById($baseId), true); - $datasets = $center->getElementsByTagName('dataset'); - - foreach ($datasets as $dataset) - { - // THEMIS => pseudo remote center; everything is predefined - if ($baseId === 'THEMIS') - { - $params = $dataset->getElementsByTagName('parameter'); - foreach ($params as $param) - $paramMgr->makeThemisComponents($param); - } - else - { - $infoFileName = $paramMgr->getInfoName($dataset->getAttribute('name')); - $paramMgr->localInfo = RemoteData.$baseId.'/'.$infoFileName; - - if (!file_exists($paramMgr->localInfo)) continue; - - $params = $dataset->getElementsByTagName('parameter'); - $paramMgr->remoteViId = $dataset->getAttribute('name'); - foreach ($params as $param) - { - $paramMgr->paramId = $param->getAttribute('name'); - $paramGlobalId = $param->getAttribute('xml:id'); - $paramMgr->paramXML = RemoteData.'PARAMS/'.$paramGlobalId.'.xml'; - - if (!file_exists($paramMgr->paramXML)) continue; - if (!$paramMgr->paramDom) - $paramMgr->paramDom = new DomDocument("1.0"); - - $paramMgr->paramDom->load($paramMgr->paramXML); - - if (!$paramMgr->makeComponents($param)) continue; - } - } + // can't read base.xml ; skip this data base + if (!$baseXml->load(RemoteData.$baseId.'/base.xml')) continue; + + // Some small & well known data centers are included by default: + // Each VI structure and VI (dataset) description at DD Server for them should exist + if ($toInclude) { + + $center = $paramMgr->xmlDom->importNode($baseXml->getElementById($baseId), true); + $datasets = $center->getElementsByTagName('dataset'); + + foreach ($datasets as $dataset){ + // THEMIS => pseudo remote center; everything is predefined + if ($baseId === 'THEMIS') { + $params = $dataset->getElementsByTagName('parameter'); + foreach ($params as $param) + $paramMgr->makeThemisComponents($param); + } + else { + $infoFileName = $paramMgr->getInfoName($dataset->getAttribute('name')); + $paramMgr->localInfo = RemoteData.$baseId.'/'.$infoFileName; + + if (!file_exists($paramMgr->localInfo)) continue; + + $params = $dataset->getElementsByTagName('parameter'); + $paramMgr->remoteViId = $dataset->getAttribute('name'); + foreach ($params as $param) { + $paramMgr->paramId = $param->getAttribute('name'); + $paramGlobalId = $param->getAttribute('xml:id'); + $paramMgr->paramXML = RemoteData.'PARAMS/'.$paramGlobalId.'.xml'; + + if (!file_exists($paramMgr->paramXML)) continue; + if (!$paramMgr->paramDom) + $paramMgr->paramDom = new DomDocument("1.0"); + + $paramMgr->paramDom->load($paramMgr->paramXML); + + if (!$paramMgr->makeComponents($param)) continue; } - } - else - { - $center = $paramMgr->xmlDom->importNode($base, true); - } - - $center->setAttribute('name', $base->getAttribute('name')); - $center->setAttribute('desc', $base->getAttribute('desc')); - $center->setAttribute('available',!$notAvailable); - $BASE->appendChild($center); + } + } + } + else { + $center = $paramMgr->xmlDom->importNode($base, true); + } + + $center->setAttribute('name', $base->getAttribute('name')); + $center->setAttribute('desc', $base->getAttribute('desc')); + $center->setAttribute('available',!$notAvailable); + $BASE->appendChild($center); - } - $paramMgr->xmlDom->appendChild($BASE); + } + $paramMgr->xmlDom->appendChild($BASE); - return $paramMgr->xmlDom->save(USERWSDIR.'RemoteParams.xml'); - } - - protected function processGuestLogin() - { - if (!$this->check_email_address($_POST['password'])) - { - die('<a href="index.html"><h3>Invalid e-mail address. Please, try once more.</h3></a>'); - } - - $passwd = $_POST['password']; - $IP = $this->getIPclient(); - $Guest = new Guest($IP,$passwd); - // email and IP in guests.login - $Guest->registerGuest(); - $Guest->checkGuestTimes(); - $user = $Guest->addGuest(); - - if ($user == "allGuestLoginsInUse") - { - die('<a href="index.html"><h3>Sorry, all guest accounts are currently in use. Please, try to login in 30 min.</h3></a>'); - } - - $this->user = $user; - $this->passwd = "guest"; - } + return $paramMgr->xmlDom->save(USERWSDIR.'RemoteParams.xml'); + + } + + protected function processGuestLogin() { + + if (!$this->check_email_address($_POST['password'])) { + die('<a href="index.html"><h3>Invalid e-mail address. Please, try once more.</h3></a>'); + } + + $passwd = $_POST['password']; + $IP = $this->getIPclient(); + $Guest = new Guest($IP,$passwd); + // email and IP in guests.login + $Guest->registerGuest(); + $Guest->checkGuestTimes(); + $user = $Guest->addGuest(); + + if ($user == "allGuestLoginsInUse") { + die('<a href="index.html"><h3>Sorry, all guest accounts are currently in use. Please, try to login in 30 min.</h3></a>'); + + } + $this->user = $user; + $this->passwd = "guest"; + + } /***************************************************************** * PUBLIC FUNCTIONS *****************************************************************/ - // migration from old to new AMDA - public function convertWS() - { + // migration from old to new AMDA + public function convertWS() { - $convert = new UserWsTransfer($this->user); + $convert = new UserWsTransfer($this->user); - $res = $convert->checkWS(); - if (!$res['success']) return $res; + $res = $convert->checkWS(); + if (!$res['success']) return $res; - $res = $convert->transferDerived(); - $msg = $res['msg']; + $res = $convert->transferDerived(); + $msg = $res['msg']; - $res = $convert->transferTimeTables(); - $msg .= $res['msg']; + $res = $convert->transferTimeTables(); + $msg .= $res['msg']; - $res = $convert->transferConditions(); - $msg .= $res['msg']; + $res = $convert->transferConditions(); + $msg .= $res['msg']; - $res = $convert->transferRequests(); - $msg .= $res['msg']; + $res = $convert->transferRequests(); + $msg .= $res['msg']; - $res = $convert->transferMyData(); - $msg .= $res['msg']; + $res = $convert->transferMyData(); + $msg .= $res['msg']; - error_log('Transfer workspace from old AMDA for '.$this->user, 1, 'amda@irap.omp.eu'); - return array('success' => true, 'msg' => $msg); - } - - public function setPath() - { - if (isset($_GET['sessionID'])) - { - $this->user = $_GET['sessionID']; - $this->userdir = USERPATH."/".$this->user."/"; - } - // for testing purposes - elseif (defined('TRANSFERUSER')) - { - $this->userdir = BASE_PATH."test/".TRANSFERUSER."/"; - } - elseif (isset($this->user)) - { - $this->userdir = USERPATH."/".$this->user."/"; - } + error_log('Transfer workspace from old AMDA for '.$this->user, 1, 'amda@irap.omp.eu'); + return array('success' => true, 'msg' => $msg); + } - $usrdir = $this->userdir; + public function setPath() { + + if (isset($_GET['sessionID'])) { + $this->user = $_GET['sessionID']; + $this->userdir = USERPATH."/".$this->user."/"; + } + // for testing purposes + else if (defined('TRANSFERUSER')) { + $this->userdir = BASE_PATH."test/".TRANSFERUSER."/"; + } + else if (isset($this->user)) { + $this->userdir = USERPATH."/".$this->user."/"; + } + + $usrdir = $this->userdir; + + define ("USERDIR", "$usrdir/"); - define ("USERDIR", "$usrdir/"); + foreach ($this->userDirs as $key => $val) { + $dir = $usrdir.$val; + define("$key","$dir/"); + } + } - foreach ($this->userDirs as $key => $val) - { - $dir = $usrdir.$val; - define("$key","$dir/"); - } - } + public function ddCheckUser() { - public function ddCheckUser() - { $this->IP = $this->getIPclient(); $cmdCheckUser = DDBIN."DDCheckUser ".$this->IP." ".$this->user." 1> /dev/null 2> /dev/null"; system($cmdCheckUser, $res); return $res; - } + } - public function ddLogin() - { - $this->IP = $this->getIPclient(); + public function ddLogin() { - $loginCommd = DDBIN."DDHtmlLogin ".$this->user." ".$this->passwd." ".$this->IP; - system($loginCommd, $res); + $this->IP = $this->getIPclient(); - return $res; - } + $loginCommd = DDBIN."DDHtmlLogin ".$this->user." ".$this->passwd." ".$this->IP; + system($loginCommd, $res); + + return $res; + } - public function init() - { - if ($this->ddLogin() != 0) - { - die('<h2>You are trying to log in as '.$this->user.'<br/> Please check that you entered a valid password</h2>'); - } - $this->userdir = USERPATH."/".$this->user."/"; - - if (!is_dir($this->userdir)) - { - if (!$this->createDir()) - { - die("Login for ".$this->user." failed: Can't create WS dirs"); - } - $this->isFirst = true; - } + public function init() { - if (file_exists($this->userdir.'newLogin')) - { - copy($this->userdir.'newLogin',$this->userdir.'lastLogin'); - $dt = filemtime($this->userdir.'newLogin'); - touch($this->userdir.'lastLogin', $dt); - } - else - { - touch($this->userdir.'lastLogin', time() - 5*86400); // last 5 days - } - // if new info exists it will be shown to : - // public => to all - // special => to group members - if (file_exists($this->userdir.'newInfo')) - { - $amdaInfo = new AmdaNews($this->user); - // if status = 0 - it is special info to group members only - // else to all - $info = $this->getUserInfo($this->user); - $status = $amdaInfo->makeInfo($info['group']); - - if ($status) $this->isNewInfo = true; - unlink($this->userdir.'newInfo'); - } - - touch($this->userdir.'newLogin'); - - $this->setPath(); - - $this->userMissions = $this->getAvailableMissionsByUser(); + if ($this->ddLogin() != 0) + die('<h2>You are trying to log in as '.$this->user.'<br/> Please check that you entered a valid password</h2>'); + + $this->userdir = USERPATH."/".$this->user."/"; + + if (!is_dir($this->userdir)) + { + if (!$this->createDir()) { + die("Login for ".$this->user." failed: Can't create WS dirs"); + } + $this->isFirst = true; + } + + if (file_exists($this->userdir.'newLogin')) { + copy($this->userdir.'newLogin',$this->userdir.'lastLogin'); + $dt = filemtime($this->userdir.'newLogin'); + touch($this->userdir.'lastLogin', $dt); + } + else + touch($this->userdir.'lastLogin', time() - 5*86400); // last 5 days + + // if new info exists it will be shown to : + // public => to all + // special => to group members + if (file_exists($this->userdir.'newInfo')) + { + $amdaInfo = new AmdaNews($this->user); + // if status = 0 - it is special info to group members only + // else to all + $info = $this->getUserInfo($this->user); + $status = $amdaInfo->makeInfo($info['group']); + + if ($status) $this->isNewInfo = true; + + unlink($this->userdir.'newInfo'); + } + touch($this->userdir.'newLogin'); + + $this->setPath(); - /* - * LocalData tree is generated from SPASE Registry - */ - if (!file_exists(USERWSDIR.'LocalParams.xml')) - symlink(DATAPATH.'/LocalParams.xml', USERWSDIR.'LocalParams.xml'); + $this->userMissions = $this->getAvailableMissionsByUser(); + + //$this->makeLocalTree(); + if (!file_exists(USERWSDIR.'LocalParams.xml')) + symlink(DATAPATH.'/LocalParams.xml', USERWSDIR.'LocalParams.xml'); - $ok = $this->makeRemoteTree(); + $ok = $this->makeRemoteTree(); + + if (!file_exists(USERWORKINGDIR.'DD_Request.res')) + copy(Plot.'DD_Request.res',USERWORKINGDIR.'DD_Request.res'); - if (!file_exists(USERWSDIR.'Request.xml')) - $reqMgr = new RequestMgr(); + if (!file_exists(USERWSDIR.'Request.xml')) + $reqMgr = new RequestMgr(); - if (!file_exists(USERWSDIR.'Tt.xml')) - $ttMgr = new TimeTableMgr(); + if (!file_exists(USERWSDIR.'Tt.xml')) + $ttMgr = new TimeTableMgr(); - if (!file_exists(USERWSDIR.'Alias.xml')) - $ttMgr = new AliasMgr(); + if (!file_exists(USERWSDIR.'Alias.xml')) + $ttMgr = new AliasMgr(); - //TODO sessionID = user + WSname - $sessionID = $this->user; + //TODO sessionID = user + WSname + $sessionID = $this->user; - /* - * Special groups are defined in the generoc_data/SpecialSettings/Groups.xml - */ - $specialGroup = $this->isSpecialGroup(); + /* + * Special groups are defined in the generoc_data/SpecialSettings/Groups.xml + */ + $specialGroup = $this->isSpecialGroup(); - // Special Info for special groups - if ($specialGroup) - { - // Special Settings for special groups - first visit just copying - if ($this->isFirst) - { - $grp = $specialGroup->getAttribute('xml:id'); - $tags = $specialGroup->getElementsByTagName('folder'); - - foreach ($tags as $tag) - { - $folder = $tag->getAttribute('name'); - foreach (glob(SpecialSettingsDir.$grp."/".$folder."/*") as $file) - { - copy($file, $this->userdir.$folder."/".basename($file)); - } - } - // mark to show help information - touch($this->userdir."$grp"."Help"); - } - // add requests - else {} - - $grpName = $specialGroup->getAttribute('xml:id'); - $helpName = "$grpName"."Help"; + // Special Info for special groups + if ($specialGroup) { + // Special Settings for special groups - first visit just copying + if ($this->isFirst) { + $grp = $specialGroup->getAttribute('xml:id'); + $tags = $specialGroup->getElementsByTagName('folder'); + + foreach ($tags as $tag) { + $folder = $tag->getAttribute('name'); + foreach (glob(SpecialSettingsDir.$grp."/".$folder."/*") as $file) { + copy($file, $this->userdir.$folder."/".basename($file)); + } + } + // mark to show help information + touch($this->userdir."$grp"."Help"); + } + // add requests + else { + + + } + $grpName = $specialGroup->getAttribute('xml:id'); + $helpName = "$grpName"."Help"; - if (file_exists(HELPPATH.$helpName) && file_exists($this->userdir.$helpName)) - { - $this->isSpecialInfo = $helpName; - } - } - return $sessionID; - } + if (file_exists(HELPPATH.$helpName) && file_exists($this->userdir.$helpName)) + $this->isSpecialInfo = $helpName; - public function dirSize($dir) { - - $handle = opendir($dir); - - while ($file = readdir($handle)) - { - if ($file != '..' && $file != '.' && !is_dir($dir.'/'.$file)) - { - $mas += filesize($dir.'/'.$file); - } - elseif (is_dir($dir.'/'.$file) && $file != '..' && $file != '.') - { - $mas += $this->dirSize($dir.'/'.$file); - } - } - return $mas; - } - - public function getWsSize() - { - $dirsToCheck = array(USERDATADIR, USERTTDIR, USERWORKINGDIR); - $wsSize = 0; - - foreach ($dirsToCheck as $dir) - { - if (is_dir($dir)) - $wsSize += $this->dirSize($dir); - } - return $wsSize; - } - - /* - * http://www.ilovejackdaniels.com/php/email-address-validation/ - */ - public function check_email_address($email) { - - // First, we check that there's one @ symbol, and that the lengths are right - if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) - { - // Email invalid because wrong number of characters in one section, or wrong number of @ symbols. - return false; - } + } - // Split it into sections to make life easier - $email_array = explode("@", $email); - $local_array = explode(".", $email_array[0]); - for ($i = 0; $i < sizeof($local_array); $i++) - { - if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) { - return false; - } - } + return $sessionID; + } + + public function dirSize($dir) { + + $handle = opendir($dir); + + while ($file = readdir($handle)) { + if ($file != '..' && $file != '.' && !is_dir($dir.'/'.$file)) { + $mas += filesize($dir.'/'.$file); + } else if (is_dir($dir.'/'.$file) && $file != '..' && $file != '.') { + $mas += $this->dirSize($dir.'/'.$file); + } + } + return $mas; + } + + + public function getWsSize() { + + $dirsToCheck = array(USERDATADIR, USERTTDIR, USERWORKINGDIR); + $wsSize = 0; + foreach ($dirsToCheck as $dir) + if (is_dir($dir)) $wsSize += $this->dirSize($dir); + + return $wsSize; + } + + public function check_email_address($email) { + //http://www.ilovejackdaniels.com/php/email-address-validation/ + + // First, we check that there's one @ symbol, and that the lengths are right + if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) { + // Email invalid because wrong number of characters in one section, or wrong number of @ symbols. + return false; + } + + // Split it into sections to make life easier + $email_array = explode("@", $email); + $local_array = explode(".", $email_array[0]); + for ($i = 0; $i < sizeof($local_array); $i++) { + if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) { + return false; + } + } + + if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name + $domain_array = explode(".", $email_array[1]); + if (sizeof($domain_array) < 2) { + return false; // Not enough parts to domain + } + for ($i = 0; $i < sizeof($domain_array); $i++) { + if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) { + return false; + } + } + } + return true; + } + + + } - if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) - { // Check if domain is IP. If not, it should be valid domain name - $domain_array = explode(".", $email_array[1]); - if (sizeof($domain_array) < 2) - { - return false; // Not enough parts to domain - } - for ($i = 0; $i < sizeof($domain_array); $i++) - { - if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) { - return false; - } - } - } - return true; - } -} ?> -- libgit2 0.21.2