'WS', 'USERREQDIR' => 'REQ', 'USERDATADIR' => 'DATA',
'USERWORKINGDIR' =>'RES', 'USERTTDIR' => 'TT', 'USERJOBDIR' => 'JOBS',
'USERTEMPDIR' => 'TEMP');
protected $userGrps;
protected $amdaClient; //client to dd webservice
protected $paramMgr, $baseExtXml;
public $isFirst = false;
public $isOldWS = true;
public $isNewInfo = false;
public $isSpecialInfo = null;
function __construct($username = NULL, $password = NULL, $sessionID = NULL)
{
// 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']);
}
}
else if (isset($username))
$this->user = trim($username);
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;
//TODO if AmdaClient is needed ?
$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' || $realIP == '10.10.135.119') { // proxy amdatest et openam; amdadev
$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()
{
// array("success" => TRUE,
// "login" => $login,
// "name" => ($theUser->length > 0) ? $theUser->item(0)->getAttribute("name") : "undefined",
// "first_name" => ($theUser->length > 0) ? $theUser->item(0)->getAttribute("first_name") : "undefined",
// "group" => $this->getUserMemberGroups($login),
// "email" => ($theUser->length > 0) ? $theUser->item(0)->getAttribute("email") : "undefined",
// "date" => ($theUser->length > 0) ? $theUser->item(0)->getAttribute("date") : "undefined",
// "news" => ($theUser->length > 0) ? $theUser->item(0)->getAttribute("news") : "0");
$info = $this->amdaClient->getUserInfo($this->user);
$wsSize = intval($this->getWsSize()/1024./1024.);
$quota = intval($this->getSpecialSettings()/1024./1024.);
$info['total'] = $quota;
$info['available'] = $quota - $wsSize;
$info['used'] = $wsSize;
return $info;
}
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;
}
protected function getUserGrps()
{
$info = $this->amdaClient->getUserInfo($this->user);
if (empty($info['group']))
return null;
else
return explode(',',$info['group']);
}
/*
* 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;
$specialGrpNode = null;
foreach ($this->userGrps as $grp) {
$specialGrpNode = $specialGrps->getElementById($grp);
if ($specialGrpNode) break;
}
return $specialGrpNode;
}
public function getSpecialSettings()
{
$userSettings = new DomDocument("1.0");
if (!file_exists(specialSettingsXml) || !$userSettings->load(specialSettingsXml)) {
return DISK_QUOTA_standard;
}
$theUser = $userSettings->getElementById($this->user);
if (!$theUser) {
return DISK_QUOTA_standard;
}
$settings = $theUser->getElementsByTagName("setting");
if ($settings->length == 0) {
return DISK_QUOTA_standard;
}
foreach ($settings as $setting) {
if ($setting->getAttribute("name") == 'DISK_QUOTA')
return $setting->getAttribute("value");
}
}
public function setSpecialSettings()
{
$userSettings = new DomDocument("1.0");
if (!file_exists(specialSettingsXml) || !$userSettings->load(specialSettingsXml)) {
define("DISK_QUOTA", DISK_QUOTA_standard);
return;
}
$theUser = $userSettings->getElementById($this->user);
if (!$theUser) {
define("DISK_QUOTA", DISK_QUOTA_standard);
return;
}
$settings = $theUser->getElementsByTagName("setting");
if ($settings->length == 0) {
define("DISK_QUOTA", DISK_QUOTA_standard);
return;
}
foreach ($settings as $setting) {
$key = $setting->getAttribute("name");
$value = $setting->getAttribute("value");
$isSetting = $setting->hasAttribute("isSetting");
if ($isSetting) {
ini_set("$key",$value);
}
else {
// Attention !!! CONSTANT cannot be redefined
define("$key",$value);
}
}
}
/*
* make remote data tree from list of distant bases if it doezn't exist$center->monitor()
*/
protected function makeRemoteTree()
{
// unlink(USERWSDIR.'RemoteParams.xml');
$this->paramMgr = new RemoteParamManager();
$init_res = $this->paramMgr->init();
$this->baseExtXml = new DomDocument("1.0");
if ($init_res['success']) { // USERWSDIR.'RemoteParams.xml' exists
// check/change access rights
$basesWS = $this->paramMgr->xmlDom->getElementsByTagName('dataCenter'); // RemoteParams.xml
$delete = new UserDeleteObsolete();
$basesWsId = array();
$basesToAdd = array();
if ($basesWS->length > 0) {
foreach ($basesWS as $base) {
$basesWsId[] = $base->getAttribute('xml:id');
}
foreach ($this->paramMgr->Bases as $baseNew) {
if (!in_array($baseNew, $basesWsId)) {
$basesToAdd[] = $baseNew;
}
}
foreach ($basesWS as $base)
{
$baseId = $base->getAttribute('xml:id');
if (!$this->baseExtXml->load(RemoteData.$baseId.'/base.xml'))
{
$base->setAttribute("desc","ATTENTION!!! This DataCenter DOES NOT EXIST ANY MORE!!! Remove it from your tree");
$base->setAttribute('obsolete', true);
error_log('NO '.RemoteData.$baseId.'/base.xml',1,email);
continue;
}
if ($base->hasAttribute('addable')) {
// keep this base tree
// error_log($baseId,1,email);
}
else {
// totally rewrite
if ($base->hasAttribute('isSimulation')) {
$centerNode = $this->makeSimulationBase($baseId);
$center = new $baseId();
$centerNode->setAttribute('available', $center->monitor());
}
else {
$center = new $baseId();
$centerNode = $center->makeCenterNode($this->paramMgr->xmlDom);
$centerNode->setAttribute('available', TRUE);
}
$centerNode->setAttribute('name', $base->getAttribute('name'));
$centerNode->setAttribute('desc', $base->getAttribute('desc'));
$base->parentNode->removeChild($base);
$this->paramMgr->xmlDom->documentElement->appendChild($centerNode);
}
if ($baseId !== "FMI_GUMICS") {
// Update Info on External Data Sets in RemoteTree.xml
$dataSets = $base->getElementsByTagName("dataset");
if ($dataSets->length > 0) {
foreach ($dataSets as $dataSet) {
$dataSetID = $dataSet->getAttribute("xml:id");
$origDataSet = $this->baseExtXml->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 EXIST ANY MORE !!! Remove it from your tree");
$dataSet->setAttribute('obsolete', true);
}
}
}
}
}
// New Bases to add
if (count($basesToAdd) > 0) {
foreach ($basesToAdd as $baseToAdd) {
$centerNode = $this->makeNewBase($baseToAdd);
$this->paramMgr->xmlDom->documentElement->appendChild($centerNode);
}
}
return $this->paramMgr->xmlDom->save($this->paramMgr->xmlName);
}
}
else if ($init_res['err'] == "RemoteParams file error") { // new RemoteParams.xml
$this->paramMgr->xmlDom->formatOutput = true;
$this->paramMgr->xmlDom->preserveWhiteSpace = false;
$BASE = $this->paramMgr->xmlDom->createElement('dataRoot');
$BASE->setAttribute('xml:id','myRemoteData-treeRootNode');
foreach ($this->paramMgr->Bases as $baseId)
{
$centerNode = $this->makeNewBase($baseId);
$BASE->appendChild($centerNode);
}
$this->paramMgr->xmlDom->appendChild($BASE);
return $this->paramMgr->xmlDom->save($this->paramMgr->xmlName);
}
}
protected function makeNewBase($baseId)
{
// 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 (!@$this->baseExtXml->load(RemoteData.$baseId.'/base.xml')) continue;
$base = $this->paramMgr->basesDom->getElementById($baseId);
if ($base->hasAttribute('default'))
{
if ($base->hasAttribute('isSimulation')) {
$centerNode = $this->makeSimulationBase($baseId);
$center = new $baseId();
$centerNode->setAttribute('available',$center->monitor());
}
/*
* Some small & well known data centers are included by default:
* Each VI structure and VI (dataset) description at DDBASE for them should exist
*/
else
{
$center = new $baseId();
$centerNode = $center->makeCenterNode($this->paramMgr->xmlDom);
$centerNode->setAttribute('available', TRUE);
}
$centerNode->setAttribute('name', $base->getAttribute('name'));
$centerNode->setAttribute('desc', $base->getAttribute('desc'));
if ($base->hasAttribute('addable')) {
$centerNode->setAttribute('addable', TRUE);
}
}
else
{
$centerNode = $this->paramMgr->xmlDom->importNode($base, true);
$centerNode->setAttribute('available', TRUE);
}
return $centerNode;
}
protected function makeSimulationBase($baseId)
{
$centerNode = $this->paramMgr->xmlDom->importNode($this->baseExtXml->getElementById($baseId), true);
$datasets = $centerNode->getElementsByTagName('dataset');
foreach ($datasets as $dataset)
{
$infoFileName = $this->paramMgr->getInfoName($dataset->getAttribute('name'));
$this->paramMgr->localInfo = RemoteData.$baseId.'/'.$infoFileName;
if (!@file_exists($this->paramMgr->localInfo)) continue;
$params = $dataset->getElementsByTagName('parameter');
$this->paramMgr->remoteViId = $dataset->getAttribute('name');
foreach ($params as $param)
{
$this->paramMgr->paramId = $param->getAttribute('name');
$paramGlobalId = $param->getAttribute('xml:id');
$this->paramMgr->paramXML = RemoteData.'PARAMS/'.$paramGlobalId.'.xml';
if (!@file_exists($this->paramMgr->paramXML)) continue;
if (!$this->paramMgr->paramDom)
$this->paramMgr->paramDom = new DomDocument("1.0");
$this->paramMgr->paramDom->load($this->paramMgr->paramXML);
if (!$this->paramMgr->makeComponents($param)) continue;
}
}
return $centerNode;
}
protected function processGuestLogin()
{
if (!$this->check_email_address($_POST['password']))
{
die('Invalid e-mail address. Please, try once more.
');
}
$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('Sorry, all guest accounts are currently in use. Please, try to login in 30 min.
');
}
$this->user = $user;
$this->passwd = "guest";
}
/*****************************************************************
* PUBLIC FUNCTIONS
*****************************************************************/
// migration from old to new AMDA
public function convertWS()
{
$convert = new UserWsTransfer($this->user);
$res = $convert->checkWS();
if (!$res['success']) return $res;
$res = $convert->transferMyData();
$msg = $res['msg'];
$res = $convert->transferDerived();
$msg .= $res['msg'];
$res = $convert->transferTimeTables();
$msg .= $res['msg'];
$res = $convert->transferConditions();
$msg .= $res['msg'];
// $res = $convert->transferRequests();
// $msg .= $res['msg'];
$res = $convert->transferFilters();
$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."/";
}
else if (isset($this->user)) {
$this->userdir = USERPATH."/".$this->user."/";
}
$usrdir = $this->userdir;
define ("USERDIR", "$usrdir/");
foreach ($this->userDirs as $key => $val) {
$dir = $usrdir.$val;
define("$key","$dir/");
}
}
public function ddCheckUser()
{
$this->IP = $this->getIPclient();
$cmdCheckUser = "DDCheckUser ".$this->IP." ".$this->user." 1> /dev/null 2> /dev/null";
system($cmdCheckUser, $res);
return $res;
}
public function ddLogin()
{
$this->IP = $this->getIPclient();
$loginCommd = "DDHtmlLogin ".$this->user." ".$this->passwd." ".$this->IP;
system($loginCommd, $res);
return $res;
}
public function init()
{
if ($this->ddLogin() != 0)
die('