ILIAS  release_4-3 Revision
 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 
86  public function setCurrentServer(ilECSSetting $server = null)
87  {
88  $this->currentServer = $server;
89  }
90 
95  public function getCurrentServer()
96  {
97  return $this->currentServer;
98  }
99 
104  public function getServerSettings()
105  {
106  return $this->servers;
107  }
108 
114  public function fetchData($a_username,$a_pass)
115  {
116  global $ilLog;
117 
118  $ilLog->write(__METHOD__.': Starting ECS authentication.');
119 
120  if(!$this->getServerSettings()->activeServerExists())
121  {
122  $GLOBALS['ilLog']->write(__METHOD__.': no active ecs server found. Aborting');
123  return false;
124  }
125 
126  // Iterate through all active ecs instances
127  include_once './Services/WebServices/ECS/classes/class.ilECSServerSettings.php';
128  foreach($this->getServerSettings()->getServers() as $server)
129  {
130  $this->setCurrentServer($server);
131  if($this->validateHash())
132  {
133  return true;
134  }
135  }
136  $GLOBALS['ilLog']->write(__METHOD__.': Could not validate ecs hash for any server');
137  return false;
138 
139  }
140 
141 
150  public function validateHash()
151  {
152  global $ilLog;
153 
154  // fetch hash
155  if(isset($_GET['ecs_hash']) and strlen($_GET['ecs_hash']))
156  {
157  $hash = $_GET['ecs_hash'];
158  }
159  if(isset($_GET['ecs_hash_url']))
160  {
161  $hashurl = urldecode($_GET['ecs_hash_url']);
162  $hash = basename(parse_url($hashurl,PHP_URL_PATH));
163  //$hash = urldecode($_GET['ecs_hash_url']);
164  }
165 
166  $GLOBALS['ilLog']->write(__METHOD__.': Using ecs hash '. $hash);
167 
168  // Check if hash is valid ...
169  try
170  {
171  include_once('./Services/WebServices/ECS/classes/class.ilECSConnector.php');
172  $connector = new ilECSConnector($this->getCurrentServer());
173  $res = $connector->getAuth($hash);
174  $auths = $res->getResult();
175  $this->abreviation = $auths->abbr;
176  $ilLog->write(__METHOD__.': Got abr: '.$this->abreviation);
177  return true;
178  }
179  catch(ilECSConnectorException $e)
180  {
181  $ilLog->write(__METHOD__.': Authentication failed with message: '.$e->getMessage());
182  return false;
183  }
184  }
185 
191  public function loginObserver($a_username, $a_auth)
192  {
193  include_once('./Services/WebServices/ECS/classes/class.ilECSUser.php');
194 
195  $user = new ilECSUser($_GET);
196 
197  if(!$usr_id = ilObject::_lookupObjIdByImportId($user->getImportId()))
198  {
199  $username = $this->createUser($user);
200  }
201  else
202  {
203  $username = $this->updateUser($user,$usr_id);
204  }
205 
206  // set user imported
207  include_once './Services/WebServices/ECS/classes/class.ilECSImport.php';
208  $import = new ilECSImport($this->getCurrentServer()->getServerId(), $usr_id);
209  $import->save();
210 
211  $a_auth->setAuth($username);
212  $this->log->write(__METHOD__.': Login succesesful');
213  return true;
214  }
215 
221  public function failedLoginObserver()
222  {
223  $this->log->write(__METHOD__.': Login failed');
224  return false;
225  }
226 
227 
228 
234  protected function createUser(ilECSUser $user)
235  {
236  global $ilClientIniFile, $ilSetting, $rbacadmin, $ilLog;
237 
238  $userObj = new ilObjUser();
239 
240  include_once('./Services/Authentication/classes/class.ilAuthUtils.php');
241  $local_user = ilAuthUtils::_generateLogin($this->getAbreviation() . '_' . $user->getLogin());
242 
243  $newUser["login"] = $local_user;
244  $newUser["firstname"] = $user->getFirstname();
245  $newUser["lastname"] = $user->getLastname();
246  $newUser['email'] = $user->getEmail();
247  $newUser['institution'] = $user->getInstitution();
248 
249  // set "plain md5" password (= no valid password)
250  $newUser["passwd"] = "";
251  $newUser["passwd_type"] = IL_PASSWD_MD5;
252 
253  $newUser["auth_mode"] = "ecs";
254  $newUser["profile_incomplete"] = 0;
255 
256  // system data
257  $userObj->assignData($newUser);
258  $userObj->setTitle($userObj->getFullname());
259  $userObj->setDescription($userObj->getEmail());
260 
261  // set user language to system language
262  $userObj->setLanguage($ilSetting->get("language"));
263 
264  // Time limit
265  $userObj->setTimeLimitOwner(7);
266  $userObj->setTimeLimitUnlimited(0);
267  $userObj->setTimeLimitFrom(time() - 5);
268  $userObj->setTimeLimitUntil(time() + $ilClientIniFile->readVariable("session", "expire"));
269 
270  $now = new ilDateTime(time(), IL_CAL_UNIX);
271  $userObj->setAgreeDate($now->get(IL_CAL_DATETIME));
272 
273  // Create user in DB
274  $userObj->setOwner(6);
275  $userObj->create();
276  $userObj->setActive(1);
277  $userObj->updateOwner();
278  $userObj->saveAsNew();
279  $userObj->writePrefs();
280 
281  if($global_role = $this->getCurrentServer()->getGlobalRole())
282  {
283  $rbacadmin->assignUser($this->getCurrentServer()->getGlobalRole(), $userObj->getId(), true);
284  }
285  ilObject::_writeImportId($userObj->getId(), $user->getImportId());
286 
287  $ilLog->write(__METHOD__ . ': Created new remote user with usr_id: ' . $user->getImportId());
288 
289  // Send Mail
290  #$this->sendNotification($userObj);
291 
292  return $userObj->getLogin();
293  }
294 
300  protected function updateUser(ilECSUser $user,$a_local_user_id)
301  {
302  global $ilClientIniFile,$ilLog,$rbacadmin;
303 
304  $user_obj = new ilObjUser($a_local_user_id);
305  $user_obj->setFirstname($user->getFirstname());
306  $user_obj->setLastname($user->getLastname());
307  $user_obj->setEmail($user->getEmail());
308  $user_obj->setInstitution($user->getInstitution());
309  $user_obj->setActive(true);
310 
311  $until = $user_obj->getTimeLimitUntil();
312  $user_obj->setTimeLimitFrom(time() - 5);
313 
314  if($until < (time() + $ilClientIniFile->readVariable('session','expire')))
315  {
316  $user_obj->setTimeLimitUntil(time() + $ilClientIniFile->readVariable("session","expire"));
317  }
318  $user_obj->update();
319  $user_obj->refreshLogin();
320 
321  if($global_role = $this->getCurrentServer()->getGlobalRole())
322  {
323  $rbacadmin->assignUser(
324  $this->getCurrentServer()->getGlobalRole(),
325  $user_obj->getId(),
326  true
327  );
328  }
329 
330  $ilLog->write(__METHOD__.': Finished update of remote user with usr_id: '.$user->getImportId());
331  return $user_obj->getLogin();
332  }
333 
334 
341  private function initECSServices()
342  {
343  include_once './Services/WebServices/ECS/classes/class.ilECSServerSettings.php';
344  $this->servers = ilECSServerSettings::getInstance();
345  }
346 
354  private function sendNotification($user_obj)
355  {
356  if(!count($this->getCurrentServer()->getUserRecipients()))
357  {
358  return true;
359  }
360 
361  include_once('./Services/Language/classes/class.ilLanguageFactory.php');
362  include_once './Services/Language/classes/class.ilLanguage.php';
364  $GLOBALS['lng'] = $lang;
365  $GLOBALS['ilUser'] = $user_obj;
366  $lang->loadLanguageModule('ecs');
367 
368  include_once('./Services/Mail/classes/class.ilMail.php');
369  $mail = new ilMail(6);
370  $mail->enableSoap(false);
371  $subject = $lang->txt('ecs_new_user_subject');
372 
373  // build body
374  $body = $lang->txt('ecs_new_user_body')."\n\n";
375  $body .= $lang->txt('ecs_new_user_profile')."\n\n";
376  $body .= $user_obj->getProfileAsString($lang)."\n\n";
378 
379  $mail->sendMail(
380  $this->getCurrentServer()->getUserRecipientsAsString(),
381  "",
382  "",
383  $subject,
384  $body,
385  array(),
386  array("normal")
387  );
388  }
389 }
390 ?>