Blame view

php/classes/UserMgr.php 25.6 KB
16035364   Benjamin Renard   First commit
1
2
3
<?php
/**
 * @class UserMgr
aa94fd24   elena   Merge with last svn
4
 * @version $Id: UserMgr.php 2926 2015-06-01 14:01:53Z elena $
16035364   Benjamin Renard   First commit
5
6
7
8
9
10
11
12
13
14
15
 * 
 */

/*
define('DATAPATH', USERPATH.'WS/');
define('REQPATH',USERPATH.'REQ/');
define('RESDIRNAME',USERPATH.'RES/');
define('TTPATH', USERPATH.'TT/');
define('JOBPATH', USERPATH.'jobs/');
*/

d471cf49   Elena.Budnik   format; IMPEX in ...
16
17
18
19
20
21
22
23
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');	
175ca164   Elena.Budnik   bad commit of Use...
24
	protected $userGrps;
aa2786b4   Benjamin Renard   Opimization aroun...
25
	protected $userGrpsCheckSum; //use to know if there is a modification in user groups
d471cf49   Elena.Budnik   format; IMPEX in ...
26
	protected $amdaClient; //client to dd webservice
82193dd4   Elena.Budnik   update RemotePara...
27
	protected $paramMgr, $baseExtXml;
3afe4f59   Benjamin Renard   Add datasets time...
28
29
	protected $datasetsTimeRestriction;
	protected $datasetsTimeRestrictionCheckSum;
d471cf49   Elena.Budnik   format; IMPEX in ...
30
31
	
	public $isFirst = false;
c3976709   Elena.Budnik   rm 7589 + clean u...
32
	public $isOldWS = false;
d471cf49   Elena.Budnik   format; IMPEX in ...
33
34
	public $isNewInfo = false;
	public $isSpecialInfo = null;
b6e4778f   Elena.Budnik   if isGuest - no o...
35
	public $isGuest = false;
d471cf49   Elena.Budnik   format; IMPEX in ...
36

e57cb025   Benjamin Renard   Fix most of error...
37
	function __construct($username = NULL, $password = NULL, $sessionID = NULL) 
d471cf49   Elena.Budnik   format; IMPEX in ...
38
	{	 
9140bdbd   Myriam Bouchemit   for proxy amdates...
39
      // if magic quotes is on, stripslashes
175ca164   Elena.Budnik   bad commit of Use...
40
		if(get_magic_quotes_gpc()) {
d471cf49   Elena.Budnik   format; IMPEX in ...
41
			$in = array(&$_GET, &$_POST, &$_COOKIE);
175ca164   Elena.Budnik   bad commit of Use...
42
43
44
			while(list($k,$v) = each($in)) {
				foreach($v as $key => $val) {
					if(!is_array($val)) {
d471cf49   Elena.Budnik   format; IMPEX in ...
45
46
47
48
49
50
51
						$in[$k][$key] = stripslashes($val);
						continue;
					}
					$in[] =& $in[$k][$key];
				}
			}
			unset($in);
16035364   Benjamin Renard   First commit
52
		}
16035364   Benjamin Renard   First commit
53
     
175ca164   Elena.Budnik   bad commit of Use...
54
		if (isset($_POST['username'])) {
d471cf49   Elena.Budnik   format; IMPEX in ...
55
			// Process Guest Login
175ca164   Elena.Budnik   bad commit of Use...
56
			if (strcasecmp(trim($_POST['username']),"guest") == 0) {
d471cf49   Elena.Budnik   format; IMPEX in ...
57
				$this->processGuestLogin();
b6e4778f   Elena.Budnik   if isGuest - no o...
58
				$this->isGuest = true;
d471cf49   Elena.Budnik   format; IMPEX in ...
59
			}
175ca164   Elena.Budnik   bad commit of Use...
60
			else {
d471cf49   Elena.Budnik   format; IMPEX in ...
61
62
63
64
65
66
				$this->user = trim($_POST['username']);
			}
		}
		else if (isset($username))
			$this->user = trim($username);

175ca164   Elena.Budnik   bad commit of Use...
67
		if (!isset($this->passwd)) {
d471cf49   Elena.Budnik   format; IMPEX in ...
68
69
70
71
72
			if (isset($_POST['password'])) 
					$this->passwd = $_POST['password'];
			else if (isset($password))
					$this->passwd = $password;
		}
9140bdbd   Myriam Bouchemit   for proxy amdates...
73

d471cf49   Elena.Budnik   format; IMPEX in ...
74
75
76
77
		if (isset($_GET['sessionID'])) 
			$this->user = $_GET['sessionID'];
		else if (isset($sessionID))
			$this->user = $sessionID;
175ca164   Elena.Budnik   bad commit of Use...
78
79
		//TODO if AmdaClient is needed ?
		$this->amdaClient = new AmdaClient();
d471cf49   Elena.Budnik   format; IMPEX in ...
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
	}

	//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'))  
		{       
175ca164   Elena.Budnik   bad commit of Use...
96
97
98
			$realIP = getenv('REMOTE_ADDR'); 
			
			if ($realIP == '10.10.131.1' || $realIP == '10.10.135.119') { // proxy amdatest et openam; amdadev
d471cf49   Elena.Budnik   format; IMPEX in ...
99
100
101
102
103
104
105
106
107
108
109
110
				$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;
	}
9140bdbd   Myriam Bouchemit   for proxy amdates...
111
      
d471cf49   Elena.Budnik   format; IMPEX in ...
112
113
	public function getUserInfo()
	{
175ca164   Elena.Budnik   bad commit of Use...
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
	// 	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;
d471cf49   Elena.Budnik   format; IMPEX in ...
130
	}
9140bdbd   Myriam Bouchemit   for proxy amdates...
131

d471cf49   Elena.Budnik   format; IMPEX in ...
132
133
134
	public function createDir() 
	{ 
		if (!mkdir($this->userdir, 0755, true)) return false;
9140bdbd   Myriam Bouchemit   for proxy amdates...
135

175ca164   Elena.Budnik   bad commit of Use...
136
		foreach ($this->userDirs as $key => $val) {
d471cf49   Elena.Budnik   format; IMPEX in ...
137
138
139
140
			if (!mkdir($this->userdir.$val.'/', 0755, true)) return false;
		}
		return true;
	}
175ca164   Elena.Budnik   bad commit of Use...
141
	
aa2786b4   Benjamin Renard   Opimization aroun...
142
	protected function loadUserGrps() 
175ca164   Elena.Budnik   bad commit of Use...
143
	{
aa2786b4   Benjamin Renard   Opimization aroun...
144
145
146
		if (isset($this->userGrps)) {
			return;
		}
175ca164   Elena.Budnik   bad commit of Use...
147
		$info = $this->amdaClient->getUserInfo($this->user); 
aa2786b4   Benjamin Renard   Opimization aroun...
148
149
150
151
152
153

		$this->userGrpsCheckSum = '';
		if (!empty($info['group'])) {
			$this->userGrpsCheckSum = md5($info['group']);
			$this->userGrps = explode(',',$info['group']);
		}
175ca164   Elena.Budnik   bad commit of Use...
154
	}
16035364   Benjamin Renard   First commit
155

3afe4f59   Benjamin Renard   Add datasets time...
156
157
158
159
160
161
162
163
	protected function loadDatasetsTimeRestriction()
	{
		if (isset($this->datasetsTimeRestriction)) {
			return;
		}
		$restrictionFilePath = datasetsTimeRestrictionJson;
		if (file_exists($restrictionFilePath)) {
			// Re-use the cache file if it's not older than 3600s.
e2a002b9   Benjamin Renard   Save parsed timeR...
164
			if (abs(time() - filemtime($restrictionFilePath)) < 3600) {
3afe4f59   Benjamin Renard   Add datasets time...
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
				$fileContent = file_get_contents($restrictionFilePath);
				if (!empty($fileContent)) {
					$this->datasetsTimeRestriction = json_decode($fileContent, TRUE);
					if (isset($this->datasetsTimeRestriction) && ($this->datasetsTimeRestriction !== FALSE)) {
						$this->datasetsTimeRestrictionCheckSum = md5($fileContent);
						return;
					}
				}
			}
		}

		$this->datasetsTimeRestrictionCheckSum = '';
		$this->datasetsTimeRestriction = $this->amdaClient->getDatasetsWithTimeRestriction();

		if ($this->datasetsTimeRestriction !== FALSE) {
e2a002b9   Benjamin Renard   Save parsed timeR...
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
			foreach ($this->datasetsTimeRestriction as &$datasetTimeRestriction) {
				$timeRestriction = $datasetTimeRestriction['restriction'];
				//Parse time restriction
				$n = sscanf($timeRestriction, "%04d-%02d-%02d", $yy, $mm, $dd);
				if ($n != 3) {
					$n = sscanf($timeRestriction, "%d", $ndays);
					if ($n != 1) {
						//Cannot parse the time restriction
						$timeRestriction = '';
					}
					else {
						$timeRestriction = date("Y-m-d", strtotime("-$ndays days"))."T23:59:59.999Z";
					}
				}
				else {
					$timeRestriction .= "T23:59:59.999Z";
				}
				$datasetTimeRestriction['restriction'] = $timeRestriction;
			}
3afe4f59   Benjamin Renard   Add datasets time...
199
200
201
202
203
204
			$content = json_encode($this->datasetsTimeRestriction);
			$this->datasetsTimeRestrictionCheckSum = md5($content);
			file_put_contents($restrictionFilePath, $content);
		}
	}

175ca164   Elena.Budnik   bad commit of Use...
205
206
207
208
	/*
	* Check if special groups with settings exist and user is from these groups
	* Take the first group from user list
	*/
d471cf49   Elena.Budnik   format; IMPEX in ...
209
210
	protected function isSpecialGroup() 
	{
aa2786b4   Benjamin Renard   Opimization aroun...
211
212
213
		if (!isset($this->userGrps))
			return NULL;

d471cf49   Elena.Budnik   format; IMPEX in ...
214
		$specialGrps = new DomDocument("1.0");
16035364   Benjamin Renard   First commit
215

d471cf49   Elena.Budnik   format; IMPEX in ...
216
		if (!($specialGrps->load(specialGrpsXml))) return null; 
16035364   Benjamin Renard   First commit
217

d471cf49   Elena.Budnik   format; IMPEX in ...
218
219
		$specialGrpNode = null;

175ca164   Elena.Budnik   bad commit of Use...
220
		foreach ($this->userGrps as $grp) {
d471cf49   Elena.Budnik   format; IMPEX in ...
221
222
223
224
225
226
			$specialGrpNode = $specialGrps->getElementById($grp); 
			if ($specialGrpNode) break;                            
		}
		
		return $specialGrpNode;
	}
7baca0ef   Elena.Budnik   user special sett...
227
  
175ca164   Elena.Budnik   bad commit of Use...
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
	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");                   
		}	 
		
	}
	
7baca0ef   Elena.Budnik   user special sett...
253
	public function setSpecialSettings() 
e57cb025   Benjamin Renard   Fix most of error...
254
	{	
7baca0ef   Elena.Budnik   user special sett...
255
256
		$userSettings = new DomDocument("1.0");

e57cb025   Benjamin Renard   Fix most of error...
257
		if (!file_exists(specialSettingsXml) || !$userSettings->load(specialSettingsXml)) {
7baca0ef   Elena.Budnik   user special sett...
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
			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) {                            
175ca164   Elena.Budnik   bad commit of Use...
274
275
276
277
278
279
280
281
282
283
284
			$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);                    
			}           
		} 		
7baca0ef   Elena.Budnik   user special sett...
285
	}
d471cf49   Elena.Budnik   format; IMPEX in ...
286

82193dd4   Elena.Budnik   update RemotePara...
287
288
289
290
	/*
	*  make remote data tree from list of distant bases if it doezn't exist$center->monitor()
	*/ 
	protected function makeRemoteTree() 
d471cf49   Elena.Budnik   format; IMPEX in ...
291
	{  
82193dd4   Elena.Budnik   update RemotePara...
292
293
294
295
296
	// unlink(USERWSDIR.'RemoteParams.xml');
		$this->paramMgr = new RemoteParamManager();
		$init_res = $this->paramMgr->init();
  
		$this->baseExtXml = new DomDocument("1.0");
01bb61f8   Benjamin Renard   Remove guest id w...
297
	
82193dd4   Elena.Budnik   update RemotePara...
298
		if ($init_res['success']) { // USERWSDIR.'RemoteParams.xml' exists
d471cf49   Elena.Budnik   format; IMPEX in ...
299
			// check/change access rights
82193dd4   Elena.Budnik   update RemotePara...
300
			$basesWS = $this->paramMgr->xmlDom->getElementsByTagName('dataCenter');  // RemoteParams.xml
d471cf49   Elena.Budnik   format; IMPEX in ...
301
			$delete = new UserDeleteObsolete();
82193dd4   Elena.Budnik   update RemotePara...
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
			
			$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) 
d471cf49   Elena.Budnik   format; IMPEX in ...
319
320
				{
					$baseId = $base->getAttribute('xml:id');
aa2786b4   Benjamin Renard   Opimization aroun...
321
322
323
324
325
326
327
					$lastModif = $base->getAttribute('lastModif');
					if (!empty($lastModif)) {
						$lastModif = intval($lastModif);
						if (($lastModif > 0) && ((time() - $lastModif) < REMOTE_PARAMS_UPDATE_DELAY)) {
							continue;
						} 
					}
82193dd4   Elena.Budnik   update RemotePara...
328
329
330
331
332
333
334
335
					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;
					}
9b6c46d9   Elena.Budnik   THEMIS Remote center
336
					
82193dd4   Elena.Budnik   update RemotePara...
337
					if ($base->hasAttribute('addable')) {
aa2786b4   Benjamin Renard   Opimization aroun...
338
						$base->setAttribute('lastModif', time());
7c76261d   Elena.Budnik   check if makecent...
339
					  //   keep this base tree 
82193dd4   Elena.Budnik   update RemotePara...
340
341
342
343
344
					  //	 error_log($baseId,1,email);
					}
					else {
						// totally rewrite
						if ($base->hasAttribute('isSimulation')) {
d675a6e8   Hacene SI HADJ MOHAND   Fix UserMgr
345
							$centerNode = $this->makeSimulationBase($baseId);
82193dd4   Elena.Budnik   update RemotePara...
346
							$center = new $baseId();
d675a6e8   Hacene SI HADJ MOHAND   Fix UserMgr
347
							$centerNode->setAttribute('available', $center->monitor());
d471cf49   Elena.Budnik   format; IMPEX in ...
348
						}
82193dd4   Elena.Budnik   update RemotePara...
349
350
						else {
							$center = new $baseId();
7c76261d   Elena.Budnik   check if makecent...
351
352
353
354
355
356
357
							if (method_exists($center, 'makeCenterNode'))
								$centerNode = $center->makeCenterNode($this->paramMgr->xmlDom);
							else { 
								// keep this base tree 
								error_log("Attention : $baseId has no makeCenterNode method", 1, email);
								continue;
							}
82193dd4   Elena.Budnik   update RemotePara...
358
							$centerNode->setAttribute('available', TRUE);
d471cf49   Elena.Budnik   format; IMPEX in ...
359
						}
82193dd4   Elena.Budnik   update RemotePara...
360
361
362
						
						$centerNode->setAttribute('name', $base->getAttribute('name'));
						$centerNode->setAttribute('desc', $base->getAttribute('desc'));
aa2786b4   Benjamin Renard   Opimization aroun...
363
364
						$centerNode->setAttribute('lastModif', time());
						
82193dd4   Elena.Budnik   update RemotePara...
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
						
						$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);
								}
							}
						}                
9b6c46d9   Elena.Budnik   THEMIS Remote center
393
394
					}
				}
82193dd4   Elena.Budnik   update RemotePara...
395
396
397
398
				
				// New Bases to add
				if (count($basesToAdd) > 0) {
					foreach ($basesToAdd as $baseToAdd) { 
c198a068   Elena.Budnik   check if remote b...
399
400
401
						$centerNode = $this->makeNewBase($baseToAdd);  
                        if (isset($centerNode))
                            $this->paramMgr->xmlDom->documentElement->appendChild($centerNode);
82193dd4   Elena.Budnik   update RemotePara...
402
					}
16035364   Benjamin Renard   First commit
403
				}
82193dd4   Elena.Budnik   update RemotePara...
404
405
406
407
408
409
410
411
				
				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;
d675a6e8   Hacene SI HADJ MOHAND   Fix UserMgr
412

82193dd4   Elena.Budnik   update RemotePara...
413
414
415
416
417
418
			$BASE = $this->paramMgr->xmlDom->createElement('dataRoot'); 
			$BASE->setAttribute('xml:id','myRemoteData-treeRootNode');

			foreach ($this->paramMgr->Bases as $baseId) 
			{    
				$centerNode = $this->makeNewBase($baseId);
d675a6e8   Hacene SI HADJ MOHAND   Fix UserMgr
419
420
				if (isset($centerNode))
					$BASE->appendChild($centerNode);  
82193dd4   Elena.Budnik   update RemotePara...
421
			} 
d675a6e8   Hacene SI HADJ MOHAND   Fix UserMgr
422

82193dd4   Elena.Budnik   update RemotePara...
423
			$this->paramMgr->xmlDom->appendChild($BASE);
d675a6e8   Hacene SI HADJ MOHAND   Fix UserMgr
424

82193dd4   Elena.Budnik   update RemotePara...
425
			return $this->paramMgr->xmlDom->save($this->paramMgr->xmlName);
aa2786b4   Benjamin Renard   Opimization aroun...
426
	   }
82193dd4   Elena.Budnik   update RemotePara...
427
428
429
430
431
	}
	
	protected function makeNewBase($baseId)
	{
	// no data base description ; skip this data base  
d675a6e8   Hacene SI HADJ MOHAND   Fix UserMgr
432
		if (!@file_exists(RemoteData.$baseId.'/base.xml')) return NULL;
82193dd4   Elena.Budnik   update RemotePara...
433
434

		// can't read base.xml ; skip this data base
d675a6e8   Hacene SI HADJ MOHAND   Fix UserMgr
435
436
		if (!@$this->baseExtXml->load(RemoteData.$baseId.'/base.xml')) return NULL;

82193dd4   Elena.Budnik   update RemotePara...
437
438
439
440
441
442
443
444
		$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());
d471cf49   Elena.Budnik   format; IMPEX in ...
445
			}
82193dd4   Elena.Budnik   update RemotePara...
446
447
448
449
			/*
			*   Some small & well known data centers are included by default: 
			*   Each VI structure and VI (dataset) description at DDBASE for them should exist
			*/
d471cf49   Elena.Budnik   format; IMPEX in ...
450
451
			else 
			{
82193dd4   Elena.Budnik   update RemotePara...
452
453
454
				$center = new $baseId();				
				$centerNode = $center->makeCenterNode($this->paramMgr->xmlDom);
				$centerNode->setAttribute('available', TRUE);
d471cf49   Elena.Budnik   format; IMPEX in ...
455
			}
82193dd4   Elena.Budnik   update RemotePara...
456
			
9b6c46d9   Elena.Budnik   THEMIS Remote center
457
458
			$centerNode->setAttribute('name', $base->getAttribute('name'));
			$centerNode->setAttribute('desc', $base->getAttribute('desc'));
82193dd4   Elena.Budnik   update RemotePara...
459
460
461
462
463
464
465
466
467
468
469
470
			
			if ($base->hasAttribute('addable')) {
				$centerNode->setAttribute('addable', TRUE);
			}
		}
		else 
		{
			$centerNode = $this->paramMgr->xmlDom->importNode($base, true);
			$centerNode->setAttribute('available', TRUE);
		}

      return $centerNode;
d471cf49   Elena.Budnik   format; IMPEX in ...
471
	}
82193dd4   Elena.Budnik   update RemotePara...
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
	
	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");
d471cf49   Elena.Budnik   format; IMPEX in ...
495

82193dd4   Elena.Budnik   update RemotePara...
496
497
498
499
500
501
502
503
504
				$this->paramMgr->paramDom->load($this->paramMgr->paramXML);
				
				if (!$this->paramMgr->makeComponents($param)) continue;
			}
		}
		return $centerNode;
	}
	
	
d471cf49   Elena.Budnik   format; IMPEX in ...
505
506
	protected function processGuestLogin() 
	{
32710720   Elena.Budnik   HomePage draft
507
508
509
510
// 		if (!$this->check_email_address($_POST['password'])) 
// 		{
// 			die('<a href="index.html"><h3>Invalid e-mail address. Please, try once more.</h3></a>');
// 		}
d471cf49   Elena.Budnik   format; IMPEX in ...
511
		
32710720   Elena.Budnik   HomePage draft
512
513
//		$passwd = $_POST['password'];
        $passwd = "public";
d471cf49   Elena.Budnik   format; IMPEX in ...
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
		$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";
	}    
16035364   Benjamin Renard   First commit
529
530
531
532
 
/*****************************************************************
*                           PUBLIC FUNCTIONS
*****************************************************************/
d471cf49   Elena.Budnik   format; IMPEX in ...
533
534
535

	public function setPath() 
	{
175ca164   Elena.Budnik   bad commit of Use...
536
		if (isset($_GET['sessionID'])) {
d471cf49   Elena.Budnik   format; IMPEX in ...
537
538
539
			$this->user = $_GET['sessionID'];
			$this->userdir = USERPATH."/".$this->user."/";                
		}
175ca164   Elena.Budnik   bad commit of Use...
540
		else if (isset($this->user)) {
d471cf49   Elena.Budnik   format; IMPEX in ...
541
542
			$this->userdir = USERPATH."/".$this->user."/";
		}
9140bdbd   Myriam Bouchemit   for proxy amdates...
543

d471cf49   Elena.Budnik   format; IMPEX in ...
544
		$usrdir = $this->userdir;
16035364   Benjamin Renard   First commit
545

d471cf49   Elena.Budnik   format; IMPEX in ...
546
		define ("USERDIR", "$usrdir/");
16035364   Benjamin Renard   First commit
547

175ca164   Elena.Budnik   bad commit of Use...
548
		foreach ($this->userDirs as $key => $val) {
d471cf49   Elena.Budnik   format; IMPEX in ...
549
550
551
552
			$dir = $usrdir.$val;
			define("$key","$dir/");
		} 
	}
16035364   Benjamin Renard   First commit
553

d471cf49   Elena.Budnik   format; IMPEX in ...
554
555
	public function ddCheckUser() 
	{
16035364   Benjamin Renard   First commit
556
		$this->IP = $this->getIPclient();
a22ecd3b   Benjamin Renard   Keep only necessa...
557
		$cmdCheckUser =  "DDCheckUser ".$this->IP." ".$this->user." 1> /dev/null 2> /dev/null";   
16035364   Benjamin Renard   First commit
558
559
		system($cmdCheckUser, $res);
		return $res;
d471cf49   Elena.Budnik   format; IMPEX in ...
560
	}
16035364   Benjamin Renard   First commit
561
  
d471cf49   Elena.Budnik   format; IMPEX in ...
562
563
564
	public function ddLogin() 
	{
		$this->IP = $this->getIPclient();
16035364   Benjamin Renard   First commit
565

a22ecd3b   Benjamin Renard   Keep only necessa...
566
		$loginCommd = "DDHtmlLogin ".$this->user." ".$this->passwd." ".$this->IP;
d471cf49   Elena.Budnik   format; IMPEX in ...
567
		system($loginCommd, $res);
01bb61f8   Benjamin Renard   Remove guest id w...
568
569
570
571
572
573
		
		if ($this->isGuest && ($res != 0)) {
			$guest = new Guest($this->user);
			$guest->deleteGuest();
		} 
		
9140bdbd   Myriam Bouchemit   for proxy amdates...
574

d471cf49   Elena.Budnik   format; IMPEX in ...
575
576
		return $res;
	}
16035364   Benjamin Renard   First commit
577
578
    
          	  	
d471cf49   Elena.Budnik   format; IMPEX in ...
579
	public function init() 
d675a6e8   Hacene SI HADJ MOHAND   Fix UserMgr
580
	{ 
1f3ee1cd   Benjamin Renard   Improve login pag...
581
582
583
		if ($this->ddLogin() != 0) {
			return FALSE;
		} 
37105924   Elena.Budnik   small nettoyage
584
            
d471cf49   Elena.Budnik   format; IMPEX in ...
585
586
		$this->userdir = USERPATH."/".$this->user."/";

175ca164   Elena.Budnik   bad commit of Use...
587
588
		if (!is_dir($this->userdir)) {           
			if (!$this->createDir()) { 
d471cf49   Elena.Budnik   format; IMPEX in ...
589
590
				die("Login for ".$this->user." failed: Can't create WS dirs");
			}
b6e4778f   Elena.Budnik   if isGuest - no o...
591
			$this->isFirst = true;
d471cf49   Elena.Budnik   format; IMPEX in ...
592
593
		}

13a84f26   Benjamin Renard   Call WS init duri...
594
595
596
597
598
599
600
		$requestManager = new RequestManagerClass();
		try {
			$res = $requestManager->runIHMRequest($this->user, $this->getIPclient(), FunctionTypeEnumClass::USERWSINIT, array());
		} catch (Exception $e) {
			die("Login for ".$this->user." failed: Error in WS dirs - ".$e->getMessage());
		}

175ca164   Elena.Budnik   bad commit of Use...
601
		if (file_exists($this->userdir.'newLogin')) {
ab5aab56   Elena.Budnik   delete not needed...
602
			touch($this->userdir.'lastLogin', filemtime($this->userdir.'newLogin'));
d471cf49   Elena.Budnik   format; IMPEX in ...
603
		}
ab5aab56   Elena.Budnik   delete not needed...
604
		else {
d471cf49   Elena.Budnik   format; IMPEX in ...
605
			touch($this->userdir.'lastLogin', time() - 5*86400); // last 5 days
ab5aab56   Elena.Budnik   delete not needed...
606
		}
d471cf49   Elena.Budnik   format; IMPEX in ...
607
608
609
610
		
		// if new info exists it will be shown to : 
		// public => to all
		// special => to group members
b6e4778f   Elena.Budnik   if isGuest - no o...
611
		if (file_exists($this->userdir.'newInfo')) {                
0323cf9d   Elena.Budnik   new info
612
			$amdaInfo = new AmdaNews($this->user);
0323cf9d   Elena.Budnik   new info
613
614
615
616
			$info = $this->getUserInfo($this->user);
			$status = $amdaInfo->makeInfo($info['group']); 

			if ($status) $this->isNewInfo = true; 
0323cf9d   Elena.Budnik   new info
617
618
			unlink($this->userdir.'newInfo');
		}
d471cf49   Elena.Budnik   format; IMPEX in ...
619
		touch($this->userdir.'newLogin');          
16035364   Benjamin Renard   First commit
620

d471cf49   Elena.Budnik   format; IMPEX in ...
621
		$this->setPath(); 		
175ca164   Elena.Budnik   bad commit of Use...
622
	
175ca164   Elena.Budnik   bad commit of Use...
623
624
		if (!$this->makeLocalTree())
				die("Login for ".$this->user." failed: Can't make LocalParams.xml");;
d675a6e8   Hacene SI HADJ MOHAND   Fix UserMgr
625
626
		
		$ok = $this->makeRemoteTree();	                      		
16035364   Benjamin Renard   First commit
627

638db58d   Benjamin Renard   RequestMgr constr...
628
		/*if (!file_exists(USERWSDIR.'Request.xml')) $reqMgr = new RequestMgr();
d471cf49   Elena.Budnik   format; IMPEX in ...
629
		if (!file_exists(USERWSDIR.'Tt.xml')) $ttMgr = new TimeTableMgr();
638db58d   Benjamin Renard   RequestMgr constr...
630
		if (!file_exists(USERWSDIR.'Alias.xml')) $ttMgr = new AliasMgr();*/
16035364   Benjamin Renard   First commit
631

d471cf49   Elena.Budnik   format; IMPEX in ...
632
633
		//TODO sessionID = user + WSname
		$sessionID = $this->user;
a21497cc   Elena.Budnik   redmine #5645
634
635
636
637
638
639
		
		/*
		* Special settings are defined in the generic_data/SpecialSettings/Settings.xml
		*/
		$this->setSpecialSettings(); 
		
d471cf49   Elena.Budnik   format; IMPEX in ...
640
		/*
55e11e13   Elena.Budnik   new global AMDAUP...
641
		* Special groups are defined in the generic_data/SpecialSettings/Groups.xml
d471cf49   Elena.Budnik   format; IMPEX in ...
642
		*/
aa2786b4   Benjamin Renard   Opimization aroun...
643
		if (isset($this->userGrps)) {
175ca164   Elena.Budnik   bad commit of Use...
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
		//	$specialGroup = $this->isSpecialGroup();
			$specialGroup = false;
			// 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");
d471cf49   Elena.Budnik   format; IMPEX in ...
662
				}
175ca164   Elena.Budnik   bad commit of Use...
663
664
665
666
667
668
669
				// add requests
				else { }
				$grpName = $specialGroup->getAttribute('xml:id');
				$helpName = "$grpName"."Help";
	
				if (file_exists(HELPPATH.$helpName) && file_exists($this->userdir.$helpName))
								$this->isSpecialInfo = $helpName;
d471cf49   Elena.Budnik   format; IMPEX in ...
670
			}
d471cf49   Elena.Budnik   format; IMPEX in ...
671
672
673
		}
		return $sessionID;
	}
16035364   Benjamin Renard   First commit
674

175ca164   Elena.Budnik   bad commit of Use...
675
676
	protected function makeLocalTree()
	{
3afe4f59   Benjamin Renard   Add datasets time...
677
678
		$this->loadDatasetsTimeRestriction();

aa2786b4   Benjamin Renard   Opimization aroun...
679
680
681
		$this->loadUserGrps();

		if (file_exists(USERWSDIR.'LocalParams.xml')) {
3afe4f59   Benjamin Renard   Add datasets time...
682
			if (file_exists(USERWSDIR.'userGrpsChecksum') && file_exists(USERWSDIR.'datasetsTimeRestrictionCheckSum')) {
aa2786b4   Benjamin Renard   Opimization aroun...
683
				$lastGrpsChecksum = file_get_contents(USERWSDIR.'userGrpsChecksum');
3afe4f59   Benjamin Renard   Add datasets time...
684
685
				$lastDatasetsTimeRestrictionCheckSum = file_get_contents(USERWSDIR.'datasetsTimeRestrictionCheckSum');
				if (($lastGrpsChecksum == $this->userGrpsCheckSum) && ($lastDatasetsTimeRestrictionCheckSum == $this->datasetsTimeRestrictionCheckSum)) {
aa2786b4   Benjamin Renard   Opimization aroun...
686
687
688
689
690
691
692
693
694
					//No modification in groups for this user
					if (filemtime(USERWSDIR.'LocalParams.xml') == filemtime(LocalData.'/LocalParams.xml')) {
						//And no modification in LocalParams file => skip makeLocalTree
						return true;
					}
				}
			}
			unlink(USERWSDIR.'LocalParams.xml');
		}
d95e8421   Elena.Budnik   ws transfer : ini...
695

99ae8744   Benjamin Renard   Use config variab...
696
		if (!copy(LocalData.'/LocalParams.xml', USERWSDIR.'LocalParams.xml'))
aa2786b4   Benjamin Renard   Opimization aroun...
697
698
699
				die("Login for ".$this->user." failed: Can't copy LocalParams.xml");
		//Save groups checksum used to generate this user local tree
		file_put_contents(USERWSDIR.'userGrpsChecksum', $this->userGrpsCheckSum);
3afe4f59   Benjamin Renard   Add datasets time...
700
701
		//Save datasets time restrictions used to generate this user local tree
		file_put_contents(USERWSDIR.'datasetsTimeRestrictionCheckSum', $this->datasetsTimeRestrictionCheckSum);
175ca164   Elena.Budnik   bad commit of Use...
702
				
3afe4f59   Benjamin Renard   Add datasets time...
703
		$result = $this->updateTreeForGrpsAndTimeRestrictions(USERWSDIR.'LocalParams.xml');
aa2786b4   Benjamin Renard   Opimization aroun...
704
705
706
707
708

		//Set modif time to the original one
		touch(USERWSDIR.'LocalParams.xml', filemtime(LocalData.'/LocalParams.xml'));

		return TRUE;
175ca164   Elena.Budnik   bad commit of Use...
709
710
	}
	
3afe4f59   Benjamin Renard   Add datasets time...
711
	protected function updateTreeForGrpsAndTimeRestrictions($file)
175ca164   Elena.Budnik   bad commit of Use...
712
	{
175ca164   Elena.Budnik   bad commit of Use...
713
714
715
716
717
718
719
		$xml = new DomDocument("1.0");
		
		if(!$xml->load($file)) 
			die("Login for ".$this->user." failed: Can't load LocalParams.xml");
		
		$xp = new domxpath($xml);                                                                             
	  
81ba8c23   Benjamin Renard   Fix time restrict...
720
721
722
		if (!empty($this->userGrps)) {
			foreach ($this->userGrps as $grp) {
				$nodes = $xp->query("//*[@group='".$grp."']");
175ca164   Elena.Budnik   bad commit of Use...
723
			
81ba8c23   Benjamin Renard   Fix time restrict...
724
725
726
727
728
729
730
				if ($nodes->length > 0)
					foreach ($nodes as $node) {
							$node->removeAttribute('group');
							if ($node->hasAttribute('restriction')) {
								if ($node->getAttribute('restriction') != "plotOnly") {
									$node->removeAttribute('restriction');
								}
f29c5e66   Elena.Budnik   plot only option
731
							}
81ba8c23   Benjamin Renard   Fix time restrict...
732
733
					}
			}
175ca164   Elena.Budnik   bad commit of Use...
734
		}
3afe4f59   Benjamin Renard   Add datasets time...
735
736
737

		if (!empty($this->datasetsTimeRestriction)) {
			foreach ($this->datasetsTimeRestriction as $datasetTimeRestriction) {
a478e892   Benjamin Renard   Apply dataset tim...
738
739
				$dataset_id = str_replace('_','-',$datasetTimeRestriction['vi']);
				$nodes = $xp->query("//dataset[@xml:id='".$dataset_id."' or @PriorID='".$dataset_id."']");
3afe4f59   Benjamin Renard   Add datasets time...
740
741
742
				if ($nodes->length > 0) {
					foreach ($nodes as $node) {
						$timeRestriction = $datasetTimeRestriction['restriction'];
3afe4f59   Benjamin Renard   Add datasets time...
743
744
745
746
747
748
749
						if (!empty($timeRestriction)) {
							$node->setAttribute('timeRestriction', $timeRestriction);
						}
					}
				}
			}
		}
175ca164   Elena.Budnik   bad commit of Use...
750
751
752
753
		
		return $xml->save($file);
	}
	
2c7f2cb6   Benjamin Renard   Remove old log fi...
754
	public function dirSize($dir, $files_to_delete = array()) 
d471cf49   Elena.Budnik   format; IMPEX in ...
755
756
	{
		$handle = opendir($dir);
e57cb025   Benjamin Renard   Fix most of error...
757
758

		$mas = 0;
175ca164   Elena.Budnik   bad commit of Use...
759
760
		while ($file = readdir($handle)) {
			if ($file != '..' && $file != '.' && !is_dir($dir.'/'.$file)) {
2c7f2cb6   Benjamin Renard   Remove old log fi...
761
762
763
764
				if (in_array($file, $files_to_delete)) {
					unlink($dir.'/'.$file);
					continue;
				}
d471cf49   Elena.Budnik   format; IMPEX in ...
765
766
				$mas += filesize($dir.'/'.$file);
			} 
175ca164   Elena.Budnik   bad commit of Use...
767
			else if (is_dir($dir.'/'.$file) && $file != '..' && $file != '.') {
2c7f2cb6   Benjamin Renard   Remove old log fi...
768
				$mas += $this->dirSize($dir.'/'.$file, $files_to_delete);
d471cf49   Elena.Budnik   format; IMPEX in ...
769
770
771
772
			}
		}
		return $mas;
	} 
9140bdbd   Myriam Bouchemit   for proxy amdates...
773

2c7f2cb6   Benjamin Renard   Remove old log fi...
774
	public function  getWsSize($delete_log_files = FALSE) 
d471cf49   Elena.Budnik   format; IMPEX in ...
775
776
777
	{
		$dirsToCheck = array(USERDATADIR, USERTTDIR, USERWORKINGDIR);
		$wsSize = 0;
2c7f2cb6   Benjamin Renard   Remove old log fi...
778
779
780
781
		if ($delete_log_files) {
			$files_to_delete = array(
				'example.log',
				'cmd_output',
00e83786   Benjamin Renard   Fix
782
783
784
785
786
787
788
789
790
791
				'plotFunction0_data.txt',
				'plotFunction1_data.txt',
				'plotFunction2_data.txt',
				'plotFunction3_data.txt',
				'plotFunction4_data.txt',
				'plotFunction5_data.txt',
				'plotFunction6_data.txt',
				'plotFunction7_data.txt',
				'plotFunction8_data.txt',
				'plotFunction9_data.txt',
2c7f2cb6   Benjamin Renard   Remove old log fi...
792
793
794
795
796
			);
		}
		else {
			$files_to_delete = array();
		}
d471cf49   Elena.Budnik   format; IMPEX in ...
797
		foreach ($dirsToCheck as $dir) 
2c7f2cb6   Benjamin Renard   Remove old log fi...
798
			if (is_dir($dir)) $wsSize += $this->dirSize($dir, $files_to_delete);
9140bdbd   Myriam Bouchemit   for proxy amdates...
799

d471cf49   Elena.Budnik   format; IMPEX in ...
800
801
802
		return $wsSize;
	}
	
c5ef1a5d   Elena.Budnik   ereg => preg_match
803
    // http://www.ilovejackdaniels.com/php/email-address-validation/ 
d471cf49   Elena.Budnik   format; IMPEX in ...
804
805
806
	public function check_email_address($email) 
	{
		// First, we check that there's one @ symbol, and that the lengths are right
c5ef1a5d   Elena.Budnik   ereg => preg_match
807
		 if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) 
d471cf49   Elena.Budnik   format; IMPEX in ...
808
809
810
811
		{
		// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
			return false;
		}
c5ef1a5d   Elena.Budnik   ereg => preg_match
812
		
d471cf49   Elena.Budnik   format; IMPEX in ...
813
814
815
816
817
		// 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++) 
		{
c5ef1a5d   Elena.Budnik   ereg => preg_match
818
			 if (!preg_match("@^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$@", $local_array[$i])) {
d471cf49   Elena.Budnik   format; IMPEX in ...
819
820
821
				return false;
			}
		}
16035364   Benjamin Renard   First commit
822

c5ef1a5d   Elena.Budnik   ereg => preg_match
823
		if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
d471cf49   Elena.Budnik   format; IMPEX in ...
824
825
826
827
828
829
			$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++) 
			{
c5ef1a5d   Elena.Budnik   ereg => preg_match
830
				if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {
d471cf49   Elena.Budnik   format; IMPEX in ...
831
832
833
834
835
836
837
					return false;
				}
			}
		}
		return true;
	}         
}
16035364   Benjamin Renard   First commit
838
?>