ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.ilAuthContainerECS.php
Go to the documentation of this file.
1 <?php
2 /*
3  +-----------------------------------------------------------------------------+
4  | ILIAS open source |
5  +-----------------------------------------------------------------------------+
6  | Copyright (c) 1998-2006 ILIAS open source, University of Cologne |
7  | |
8  | This program is free software; you can redistribute it and/or |
9  | modify it under the terms of the GNU General Public License |
10  | as published by the Free Software Foundation; either version 2 |
11  | of the License, or (at your option) any later version. |
12  | |
13  | This program is distributed in the hope that it will be useful, |
14  | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16  | GNU General Public License for more details. |
17  | |
18  | You should have received a copy of the GNU General Public License |
19  | along with this program; if not, write to the Free Software |
20  | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21  +-----------------------------------------------------------------------------+
22 */
23 
24 include_once('Auth/Container.php');
25 
35 {
36  protected $mid = null;
37  protected $abreviation = null;
38 
39  protected $currentServer = null;
40  protected $servers = null;
41 
42  protected $log;
43 
51  public function __construct($a_params = array())
52  {
53  parent::__construct($a_params);
54 
55  $this->initECSServices();
56 
57  $this->log = $GLOBALS['ilLog'];
58  }
59 
67  public function getAbreviation()
68  {
69  return $this->abreviation;
70  }
71 
77  public function getMID()
78  {
79  return $this->mid;
80  }
81 
82  public function setMID($a_mid)
83  {
84  $this->mid = $a_mid;
85  }
86 
91  public function setCurrentServer(ilECSSetting $server = null)
92  {
93  $this->currentServer = $server;
94  }
95 
100  public function getCurrentServer()
101  {
102  return $this->currentServer;
103  }
104 
109  public function getServerSettings()
110  {
111  return $this->servers;
112  }
113 
119  public function fetchData($a_username,$a_pass)
120  {
121  global $ilLog;
122 
123  $ilLog->write(__METHOD__.': Starting ECS authentication.');
124 
125  if(!$this->getServerSettings()->activeServerExists())
126  {
127  $GLOBALS['ilLog']->write(__METHOD__.': no active ecs server found. Aborting');
128  return false;
129  }
130 
131  // Iterate through all active ecs instances
132  include_once './Services/WebServices/ECS/classes/class.ilECSServerSettings.php';
133  foreach($this->getServerSettings()->getServers() as $server)
134  {
135  $this->setCurrentServer($server);
136  if($this->validateHash())
137  {
138  return true;
139  }
140  }
141  $GLOBALS['ilLog']->write(__METHOD__.': Could not validate ecs hash for any server');
142  return false;
143 
144  }
145 
146 
155  public function validateHash()
156  {
157  global $ilLog;
158 
159  // fetch hash
160  if(isset($_GET['ecs_hash']) and strlen($_GET['ecs_hash']))
161  {
162  $hash = $_GET['ecs_hash'];
163  }
164  if(isset($_GET['ecs_hash_url']))
165  {
166  $hashurl = urldecode($_GET['ecs_hash_url']);
167  $hash = basename(parse_url($hashurl,PHP_URL_PATH));
168  //$hash = urldecode($_GET['ecs_hash_url']);
169  }
170 
171  $GLOBALS['ilLog']->write(__METHOD__.': Using ecs hash '. $hash);
172 
173  // Check if hash is valid ...
174  try
175  {
176  include_once('./Services/WebServices/ECS/classes/class.ilECSConnector.php');
177  $connector = new ilECSConnector($this->getCurrentServer());
178  $res = $connector->getAuth($hash);
179  $auths = $res->getResult();
180 
181  $GLOBALS['ilLog']->write(__METHOD__.': Auths: '.print_r($auths,TRUE));
182 
183  if($auths->pid)
184  {
185  try
186  {
187  include_once './Services/WebServices/ECS/classes/class.ilECSCommunityReader.php';
189  $part = $reader->getParticipantByMID($auths->pid);
190 
191  if(is_object($part) and is_object($part->getOrganisation()))
192  {
193  $this->abreviation = $part->getOrganisation()->getAbbreviation();
194  }
195  else
196  {
197  $this->abreviation = $auths->abbr;
198  }
199  }
200  catch(Exception $e)
201  {
202  $ilLog->write(__METHOD__.': Authentication failed with message: '.$e->getMessage());
203  return false;
204  }
205  }
206  else
207  {
208  $this->abreviation = $auths->abbr;
209  }
210 
211  $ilLog->write(__METHOD__.': Got abr: '.$this->abreviation);
212  }
213  catch(ilECSConnectorException $e)
214  {
215  $ilLog->write(__METHOD__.': Authentication failed with message: '.$e->getMessage());
216  return false;
217  }
218 
219  // read current mid
220  try
221  {
222  include_once('./Services/WebServices/ECS/classes/class.ilECSConnector.php');
223  $connector = new ilECSConnector($this->getCurrentServer());
224  $details = $connector->getAuth($hash,TRUE);
225 
226  $GLOBALS['ilLog']->write(__METHOD__.': '.print_r($details,TRUE));
227  $GLOBALS['ilLog']->write(__METHOD__.': Token created for mid '. $details->getFirstSender());
228 
229  $this->setMID($details->getFirstSender());
230  }
231  catch(ilECSConnectorException $e)
232  {
233  $ilLog->write(__METHOD__.': Receiving mid failed with message: '.$e->getMessage());
234  return false;
235  }
236  return TRUE;
237  }
238 
244  public function loginObserver($a_username, $a_auth)
245  {
246  include_once('./Services/WebServices/ECS/classes/class.ilECSUser.php');
247 
248  $user = new ilECSUser($_GET);
249 
250  if(!$usr_id = ilObject::_lookupObjIdByImportId($user->getImportId()))
251  {
252  $username = $this->createUser($user);
253  }
254  else
255  {
256  $username = $this->updateUser($user,$usr_id);
257  }
258 
259  // set user imported
260  include_once './Services/WebServices/ECS/classes/class.ilECSImport.php';
261  $import = new ilECSImport($this->getCurrentServer()->getServerId(), $usr_id);
262  $import->save();
263 
264  // Store remote user data
265  include_once './Services/WebServices/ECS/classes/class.ilECSRemoteUser.php';
266  $remote = new ilECSRemoteUser();
267  $remote->setServerId($this->getCurrentServer()->getServerId());
268  $remote->setMid($this->getMID());
269  $remote->setRemoteUserId($user->getImportId());
270  $remote->setUserId(ilObjUser::_lookupId($username));
271 
272  $GLOBALS['ilLog']->write(__METHOD__.': Current username '.$username);
273 
274  if(!$remote->exists())
275  {
276  $remote->create();
277  }
278 
279  $a_auth->setAuth($username);
280  $this->log->write(__METHOD__.': Login succesesful');
281  return true;
282  }
283 
289  public function failedLoginObserver()
290  {
291  $this->log->write(__METHOD__.': Login failed');
292  return false;
293  }
294 
295 
296 
302  protected function createUser(ilECSUser $user)
303  {
304  global $ilClientIniFile, $ilSetting, $rbacadmin, $ilLog;
305 
306  $userObj = new ilObjUser();
307 
308  include_once('./Services/Authentication/classes/class.ilAuthUtils.php');
309  $local_user = ilAuthUtils::_generateLogin($this->getAbreviation() . '_' . $user->getLogin());
310 
311  $newUser["login"] = $local_user;
312  $newUser["firstname"] = $user->getFirstname();
313  $newUser["lastname"] = $user->getLastname();
314  $newUser['email'] = $user->getEmail();
315  $newUser['institution'] = $user->getInstitution();
316 
317  // set "plain md5" password (= no valid password)
318  $newUser["passwd"] = "";
319  $newUser["passwd_type"] = IL_PASSWD_CRYPTED;
320 
321  $newUser["auth_mode"] = "ecs";
322  $newUser["profile_incomplete"] = 0;
323 
324  // system data
325  $userObj->assignData($newUser);
326  $userObj->setTitle($userObj->getFullname());
327  $userObj->setDescription($userObj->getEmail());
328 
329  // set user language to system language
330  $userObj->setLanguage($ilSetting->get("language"));
331 
332  // Time limit
333  $userObj->setTimeLimitOwner(7);
334  $userObj->setTimeLimitUnlimited(0);
335  $userObj->setTimeLimitFrom(time() - 5);
336  $userObj->setTimeLimitUntil(time() + $ilClientIniFile->readVariable("session", "expire"));
337 
338  #$now = new ilDateTime(time(), IL_CAL_UNIX);
339  #$userObj->setAgreeDate($now->get(IL_CAL_DATETIME));
340 
341  // Create user in DB
342  $userObj->setOwner(6);
343  $userObj->create();
344  $userObj->setActive(1);
345  $userObj->updateOwner();
346  $userObj->saveAsNew();
347  $userObj->writePrefs();
348 
349  if($global_role = $this->getCurrentServer()->getGlobalRole())
350  {
351  $rbacadmin->assignUser($this->getCurrentServer()->getGlobalRole(), $userObj->getId(), true);
352  }
353  ilObject::_writeImportId($userObj->getId(), $user->getImportId());
354 
355  $ilLog->write(__METHOD__ . ': Created new remote user with usr_id: ' . $user->getImportId());
356 
357  // Send Mail
358  #$this->sendNotification($userObj);
359  $this->resetMailOptions($userObj->getId());
360 
361  return $userObj->getLogin();
362  }
363 
369  protected function updateUser(ilECSUser $user,$a_local_user_id)
370  {
371  global $ilClientIniFile,$ilLog,$rbacadmin;
372 
373  $user_obj = new ilObjUser($a_local_user_id);
374  $user_obj->setFirstname($user->getFirstname());
375  $user_obj->setLastname($user->getLastname());
376  $user_obj->setEmail($user->getEmail());
377  $user_obj->setInstitution($user->getInstitution());
378  $user_obj->setActive(true);
379 
380  $until = $user_obj->getTimeLimitUntil();
381 
382  if($until < (time() + $ilClientIniFile->readVariable('session','expire')))
383  {
384  $user_obj->setTimeLimitFrom(time() - 60);
385  $user_obj->setTimeLimitUntil(time() + $ilClientIniFile->readVariable("session","expire"));
386  }
387  $user_obj->update();
388  $user_obj->refreshLogin();
389 
390  if($global_role = $this->getCurrentServer()->getGlobalRole())
391  {
392  $rbacadmin->assignUser(
393  $this->getCurrentServer()->getGlobalRole(),
394  $user_obj->getId(),
395  true
396  );
397  }
398 
399  $this->resetMailOptions($a_local_user_id);
400 
401  $ilLog->write(__METHOD__.': Finished update of remote user with usr_id: '.$user->getImportId());
402  return $user_obj->getLogin();
403  }
404 
409  protected function resetMailOptions($a_usr_id)
410  {
411  include_once './Services/Mail/classes/class.ilMailOptions.php';
412  $options = new ilMailOptions($a_usr_id);
413  $options->updateOptions(
414  $options->getSignature(),
415  $options->getLinebreak(),
417  $options->getCronjobNotification()
418  );
419  }
420 
421 
428  private function initECSServices()
429  {
430  include_once './Services/WebServices/ECS/classes/class.ilECSServerSettings.php';
431  $this->servers = ilECSServerSettings::getInstance();
432  }
433 
441  private function sendNotification($user_obj)
442  {
443  if(!count($this->getCurrentServer()->getUserRecipients()))
444  {
445  return true;
446  }
447 
448  include_once('./Services/Language/classes/class.ilLanguageFactory.php');
449  include_once './Services/Language/classes/class.ilLanguage.php';
451  $GLOBALS['lng'] = $lang;
452  $GLOBALS['ilUser'] = $user_obj;
453  $lang->loadLanguageModule('ecs');
454 
455  include_once('./Services/Mail/classes/class.ilMail.php');
456  $mail = new ilMail(6);
457  $mail->enableSoap(false);
458  $subject = $lang->txt('ecs_new_user_subject');
459 
460  // build body
461  $body = $lang->txt('ecs_new_user_body')."\n\n";
462  $body .= $lang->txt('ecs_new_user_profile')."\n\n";
463  $body .= $user_obj->getProfileAsString($lang)."\n\n";
465 
466  $mail->sendMail(
467  $this->getCurrentServer()->getUserRecipientsAsString(),
468  "",
469  "",
470  $subject,
471  $body,
472  array(),
473  array("normal")
474  );
475  }
476 }
477 ?>