Blame view

php/classes/UserMgr.php 25.2 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
297
298
	// 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
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);
9140bdbd   Myriam Bouchemit   for proxy amdates...
568

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

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

13a84f26   Benjamin Renard   Call WS init duri...
588
589
590
591
592
593
594
		$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...
595
		if (file_exists($this->userdir.'newLogin')) {
ab5aab56   Elena.Budnik   delete not needed...
596
			touch($this->userdir.'lastLogin', filemtime($this->userdir.'newLogin'));
d471cf49   Elena.Budnik   format; IMPEX in ...
597
		}
ab5aab56   Elena.Budnik   delete not needed...
598
		else {
d471cf49   Elena.Budnik   format; IMPEX in ...
599
			touch($this->userdir.'lastLogin', time() - 5*86400); // last 5 days
ab5aab56   Elena.Budnik   delete not needed...
600
		}
d471cf49   Elena.Budnik   format; IMPEX in ...
601
602
603
604
		
		// if new info exists it will be shown to : 
		// public => to all
		// special => to group members
b6e4778f   Elena.Budnik   if isGuest - no o...
605
		if (file_exists($this->userdir.'newInfo')) {                
0323cf9d   Elena.Budnik   new info
606
			$amdaInfo = new AmdaNews($this->user);
0323cf9d   Elena.Budnik   new info
607
608
609
610
			$info = $this->getUserInfo($this->user);
			$status = $amdaInfo->makeInfo($info['group']); 

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

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

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

d471cf49   Elena.Budnik   format; IMPEX in ...
626
627
		//TODO sessionID = user + WSname
		$sessionID = $this->user;
a21497cc   Elena.Budnik   redmine #5645
628
629
630
631
632
633
		
		/*
		* Special settings are defined in the generic_data/SpecialSettings/Settings.xml
		*/
		$this->setSpecialSettings(); 
		
d471cf49   Elena.Budnik   format; IMPEX in ...
634
		/*
55e11e13   Elena.Budnik   new global AMDAUP...
635
		* Special groups are defined in the generic_data/SpecialSettings/Groups.xml
d471cf49   Elena.Budnik   format; IMPEX in ...
636
		*/
aa2786b4   Benjamin Renard   Opimization aroun...
637
		if (isset($this->userGrps)) {
175ca164   Elena.Budnik   bad commit of Use...
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
		//	$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 ...
656
				}
175ca164   Elena.Budnik   bad commit of Use...
657
658
659
660
661
662
663
				// 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 ...
664
			}
d471cf49   Elena.Budnik   format; IMPEX in ...
665
666
667
		}
		return $sessionID;
	}
16035364   Benjamin Renard   First commit
668

175ca164   Elena.Budnik   bad commit of Use...
669
670
	protected function makeLocalTree()
	{
3afe4f59   Benjamin Renard   Add datasets time...
671
672
		$this->loadDatasetsTimeRestriction();

aa2786b4   Benjamin Renard   Opimization aroun...
673
674
675
		$this->loadUserGrps();

		if (file_exists(USERWSDIR.'LocalParams.xml')) {
3afe4f59   Benjamin Renard   Add datasets time...
676
			if (file_exists(USERWSDIR.'userGrpsChecksum') && file_exists(USERWSDIR.'datasetsTimeRestrictionCheckSum')) {
aa2786b4   Benjamin Renard   Opimization aroun...
677
				$lastGrpsChecksum = file_get_contents(USERWSDIR.'userGrpsChecksum');
3afe4f59   Benjamin Renard   Add datasets time...
678
679
				$lastDatasetsTimeRestrictionCheckSum = file_get_contents(USERWSDIR.'datasetsTimeRestrictionCheckSum');
				if (($lastGrpsChecksum == $this->userGrpsCheckSum) && ($lastDatasetsTimeRestrictionCheckSum == $this->datasetsTimeRestrictionCheckSum)) {
aa2786b4   Benjamin Renard   Opimization aroun...
680
681
682
683
684
685
686
687
688
					//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...
689

99ae8744   Benjamin Renard   Use config variab...
690
		if (!copy(LocalData.'/LocalParams.xml', USERWSDIR.'LocalParams.xml'))
aa2786b4   Benjamin Renard   Opimization aroun...
691
692
693
				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...
694
695
		//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...
696
				
3afe4f59   Benjamin Renard   Add datasets time...
697
		$result = $this->updateTreeForGrpsAndTimeRestrictions(USERWSDIR.'LocalParams.xml');
aa2786b4   Benjamin Renard   Opimization aroun...
698
699
700
701
702

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

		return TRUE;
175ca164   Elena.Budnik   bad commit of Use...
703
704
	}
	
3afe4f59   Benjamin Renard   Add datasets time...
705
	protected function updateTreeForGrpsAndTimeRestrictions($file)
175ca164   Elena.Budnik   bad commit of Use...
706
	{
aa2786b4   Benjamin Renard   Opimization aroun...
707
708
709
		if (!isset($this->userGrps))
			return TRUE;

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

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

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

2c7f2cb6   Benjamin Renard   Remove old log fi...
768
	public function  getWsSize($delete_log_files = FALSE) 
d471cf49   Elena.Budnik   format; IMPEX in ...
769
770
771
	{
		$dirsToCheck = array(USERDATADIR, USERTTDIR, USERWORKINGDIR);
		$wsSize = 0;
2c7f2cb6   Benjamin Renard   Remove old log fi...
772
773
774
775
776
777
778
779
780
		if ($delete_log_files) {
			$files_to_delete = array(
				'example.log',
				'cmd_output',
			);
		}
		else {
			$files_to_delete = array();
		}
d471cf49   Elena.Budnik   format; IMPEX in ...
781
		foreach ($dirsToCheck as $dir) 
2c7f2cb6   Benjamin Renard   Remove old log fi...
782
			if (is_dir($dir)) $wsSize += $this->dirSize($dir, $files_to_delete);
9140bdbd   Myriam Bouchemit   for proxy amdates...
783

d471cf49   Elena.Budnik   format; IMPEX in ...
784
785
786
		return $wsSize;
	}
	
c5ef1a5d   Elena.Budnik   ereg => preg_match
787
    // http://www.ilovejackdaniels.com/php/email-address-validation/ 
d471cf49   Elena.Budnik   format; IMPEX in ...
788
789
790
	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
791
		 if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) 
d471cf49   Elena.Budnik   format; IMPEX in ...
792
793
794
795
		{
		// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
			return false;
		}
c5ef1a5d   Elena.Budnik   ereg => preg_match
796
		
d471cf49   Elena.Budnik   format; IMPEX in ...
797
798
799
800
801
		// 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
802
			 if (!preg_match("@^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$@", $local_array[$i])) {
d471cf49   Elena.Budnik   format; IMPEX in ...
803
804
805
				return false;
			}
		}
16035364   Benjamin Renard   First commit
806

c5ef1a5d   Elena.Budnik   ereg => preg_match
807
		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 ...
808
809
810
811
812
813
			$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
814
				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 ...
815
816
817
818
819
820
821
					return false;
				}
			}
		}
		return true;
	}         
}
16035364   Benjamin Renard   First commit
822
?>