ILIAS  release_4-4 Revision
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilPasswordAssistanceGUI.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
13 {
17  protected $ctrl;
18 
22  protected $lng;
23 
27  protected $rbacreview;
28 
32  protected $tpl;
33 
37  protected $settings;
38 
42  protected $ilias;
43 
47  protected $https;
48 
52  public function __construct()
53  {
64 
65  $this->ctrl = $ilCtrl;
66  $this->lng = $lng;
67  $this->rbacreview = $rbacreview;
68  $this->tpl = $tpl;
69  $this->settings = $ilSetting;
70  $this->ilias = $ilias;
71  $this->https = $https;
72  }
73 
77  public function executeCommand()
78  {
79  // check hack attempts
80  if(!$this->settings->get('password_assistance')) // || AUTH_DEFAULT != AUTH_LOCAL)
81  {
82  if(empty($_SESSION['AccountId']) && $_SESSION['AccountId'] !== false)
83  {
84  $this->ilias->error_obj->raiseError($this->lng->txt('permission_denied'), $this->ilias->error_obj->WARNING);
85  }
86  }
87 
88  // check correct setup
89  if(!$this->settings->get('setup_ok'))
90  {
91  die('Setup is not completed. Please run setup routine again.');
92  }
93 
94  // Change the language, if necessary.
95  // And load the 'pwassist' language module
96  $lang = $_GET['lang'];
97  if($lang != null && $lang != '' && $this->lng->getLangKey() != $lang)
98  {
99  $lng = new ilLanguage($lang);
100  }
101  $this->lng->loadLanguageModule('pwassist');
102 
103  $cmd = $this->ctrl->getCmd();
104  $next_class = $this->ctrl->getNextClass($this);
105 
106  switch($next_class)
107  {
108  default:
109  if($cmd != '')
110  {
111  return $this->$cmd();
112  }
113  else
114  {
115  if(!empty($_GET['key']))
116  {
117  $this->showAssignPasswordForm();
118  }
119  else
120  {
121  $this->showAssistanceForm();
122  }
123  }
124  break;
125  }
126  }
127 
131  protected function getAssistanceForm()
132  {
133  require_once 'Services/Form/classes/class.ilPropertyFormGUI.php';
134  $form = new ilPropertyFormGUI();
135 
136  $form->setFormAction($this->ctrl->getFormAction($this, 'submitAssistanceForm'));
137  $form->setTarget('_parent');
138 
139  $username = new ilTextInputGUI($this->lng->txt('username'), 'username');
140  $username->setRequired(true);
141  $form->addItem($username);
142 
143  $email = new ilTextInputGUI($this->lng->txt('email'), 'email');
144  $email->setRequired(true);
145  $form->addItem($email);
146 
147  $form->addCommandButton('submitAssistanceForm', $this->lng->txt('submit'));
148 
149  return $form;
150  }
151 
155  public function showAssistanceForm(ilPropertyFormGUI $form = null)
156  {
157  ilStartUpGUI::initStartUpTemplate('tpl.pwassist_assistance.html', true);
158  $this->tpl->setVariable('IMG_PAGEHEADLINE', ilUtil::getImagePath('icon_auth_b.png'));
159  $this->tpl->setVariable('TXT_PAGEHEADLINE', $this->lng->txt('password_assistance'));
160 
161  $this->tpl->setVariable
162  (
163  'TXT_ENTER_USERNAME_AND_EMAIL',
164  str_replace
165  (
166  "\\n", '<br />',
167  sprintf
168  (
169  $this->lng->txt('pwassist_enter_username_and_email'),
170  '<a href="mailto:' . $this->settings->get('admin_email') . '">' . $this->settings->get('admin_email') . '</a>'
171  )
172  )
173  );
174 
175  if(!$form)
176  {
177  $form = $this->getAssistanceForm();
178  }
179  $this->tpl->setVariable('FORM', $form->getHTML());
180  $this->tpl->show();
181  }
182 
194  public function submitAssistanceForm()
195  {
196  $form = $this->getAssistanceForm();
197  if(!$form->checkInput())
198  {
199  $form->setValuesByPost();
200  $this->showAssistanceForm($form);
201  return;
202  }
203 
204  $username = $form->getInput('username');
205  $email = $form->getInput('email');
206 
207  $userObj = null;
208  $userid = ilObjUser::getUserIdByLogin($username);
209  $txt_key = 'pwassist_invalid_username_or_email';
210  if($userid != 0)
211  {
212  $userObj = new ilObjUser($userid);
213  if(strcasecmp($userObj->getEmail(), $email) != 0)
214  {
215  $userObj = null;
216  }
217  elseif(!strlen($email))
218  {
219  $userObj = null;
220  $txt_key = 'pwassist_no_email_found';
221  }
222  else if(
223  $userObj->getAuthMode(true) != AUTH_LOCAL ||
224  ($userObj->getAuthMode(true) == AUTH_DEFAULT && AUTH_DEFAULT != AUTH_LOCAL)
225  )
226  {
227  $userObj = null;
228  $txt_key = 'pwassist_invalid_auth_mode';
229  }
230  }
231 
232  // No matching user object found?
233  // Show the password assistance form again, and display an error message.
234  if($userObj == null)
235  {
236  ilUtil::sendFailure(str_replace("\\n", '', $this->lng->txt($txt_key)));
237  $form->setValuesByPost();
238  $this->showAssistanceForm($form);
239  }
240  else
241  {
242  // Matching user object found?
243  // Check if the user is permitted to use the password assistance function,
244  // and then send a password assistance mail to the email address.
245  // FIXME: Extend this if-statement to check whether the user
246  // has the permission to use the password assistance function.
247  // The anonymous user and users who are system administrators are
248  // not allowed to use this feature
249  if(
250  $this->rbacreview->isAssigned($userObj->getId, ANONYMOUS_ROLE_ID) ||
251  $this->rbacreview->isAssigned($userObj->getId, SYSTEM_ROLE_ID)
252  )
253  {
254  ilUtil::sendFailure(str_replace("\\n", '', $this->lng->txt('pwassist_not_permitted')));
255  $form->setValuesByPost();
256  $this->showAssistanceForm($form);
257  }
258  else
259  {
260  $this->sendPasswordAssistanceMail($userObj);
261  $this->showMessageForm(sprintf($this->lng->txt('pwassist_mail_sent'), $email));
262  }
263  }
264  }
265 
277  public function sendPasswordAssistanceMail(ilObjUser $userObj)
278  {
279  require_once 'Services/Mail/classes/class.ilMailbox.php';
280  require_once 'Services/Mail/classes/class.ilMimeMail.php';
281  require_once 'include/inc.pwassist_session_handler.php';
282 
283  // Check if we need to create a new session
284  $pwassist_session = db_pwassist_session_find($userObj->getId());
285  if(
286  count($pwassist_session) == 0 ||
287  $pwassist_session['expires'] < time() ||
288  true // comment by mjansen: wtf? :-)
289  )
290  {
291  // Create a new session id
292  // #9700 - this didn't do anything before?!
293  // db_set_save_handler();
294  session_start();
295  $pwassist_session['pwassist_id'] = db_pwassist_create_id();
296  session_destroy();
298  $pwassist_session['pwassist_id'],
299  3600,
300  $userObj->getId()
301  );
302  }
303  $protocol = $this->https->isDetected() ? 'https://' : 'http://';
304  // Compose the mail
305  $server_url = $protocol . $_SERVER['HTTP_HOST'] . substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')) . '/';
306  // XXX - Werner Randelshofer - Insert code here to dynamically get the
307  // the delimiter. For URL's that are sent by e-mail to a user,
308  // it is best to use semicolons as parameter delimiter
309  $delimiter = '&';
310  $pwassist_url = $protocol . $_SERVER['HTTP_HOST']
311  . str_replace('ilias.php', 'pwassist.php', $_SERVER['PHP_SELF'])
312  . '?client_id=' . $this->ilias->getClientId()
313  . $delimiter . 'lang=' . $this->lng->getLangKey()
314  . $delimiter . 'key=' . $pwassist_session['pwassist_id'];
315  $alternative_pwassist_url = $protocol . $_SERVER['HTTP_HOST']
316  . str_replace('ilias.php', 'pwassist.php', $_SERVER['PHP_SELF'])
317  . '?client_id=' . $this->ilias->getClientId()
318  . $delimiter . 'lang=' . $this->lng->getLangKey()
319  . $delimiter . 'key=' . $pwassist_session['pwassist_id'];
320 
321  $contact_address = $this->settings->get('admin_email');
322 
323  $mm = new ilMimeMail();
324  $mm->Subject($this->lng->txt('pwassist_mail_subject'));
325  $mm->From($contact_address);
326  $mm->To($userObj->getEmail());
327  $mm->Body
328  (
329  str_replace
330  (
331  array("\\n", "\\t"),
332  array("\n", "\t"),
333  sprintf
334  (
335  $this->lng->txt('pwassist_mail_body'),
336  $pwassist_url,
337  $server_url,
338  $_SERVER['REMOTE_ADDR'],
339  $userObj->getLogin(),
340  'mailto:' . $contact_address,
341  $alternative_pwassist_url
342  )
343  )
344  );
345  $mm->Send();
346  }
347 
352  protected function getAssignPasswordForm($pwassist_id)
353  {
354  require_once 'Services/Form/classes/class.ilPropertyFormGUI.php';
355  $form = new ilPropertyFormGUI();
356 
357  $form->setFormAction($this->ctrl->getFormAction($this, 'submitAssignPasswordForm'));
358  $form->setTarget('_parent');
359 
360  $username = new ilTextInputGUI($this->lng->txt('username'), 'username');
361  $username->setRequired(true);
362  $form->addItem($username);
363 
364  $password = new ilPasswordInputGUI($this->lng->txt('password'), 'password');
365  $password->setRequired(true);
366  $form->addItem($password);
367 
368  $key = new ilHiddenInputGUI('key');
369  $key->setValue($pwassist_id);
370  $form->addItem($key);
371 
372  $form->addCommandButton('submitAssignPasswordForm', $this->lng->txt('submit'));
373 
374  return $form;
375  }
376 
389  public function showAssignPasswordForm(ilPropertyFormGUI $form = null, $pwassist_id = '')
390  {
391  require_once 'include/inc.pwassist_session_handler.php';
392  require_once 'Services/Language/classes/class.ilLanguage.php';
393 
394  // Retrieve form data
395  if(!$pwassist_id)
396  {
397  $pwassist_id = $_GET['key'];
398  }
399 
400  // Retrieve the session, and check if it is valid
401  $pwassist_session = db_pwassist_session_read($pwassist_id);
402  if(
403  count($pwassist_session) == 0 ||
404  $pwassist_session['expires'] < time()
405  )
406  {
407  $this->showAssistanceForm(null, $this->lng->txt('pwassist_session_expired'));
408  }
409  else
410  {
411  ilStartUpGUI::initStartUpTemplate('tpl.pwassist_assignpassword.html', true);
412  $this->tpl->setVariable('IMG_PAGEHEADLINE', ilUtil::getImagePath('icon_auth_b.png'));
413  $this->tpl->setVariable('TXT_PAGEHEADLINE', $this->lng->txt('password_assistance'));
414 
415  $this->tpl->setVariable('TXT_ENTER_USERNAME_AND_NEW_PASSWORD', $this->lng->txt('pwassist_enter_username_and_new_password'));
416 
417  if(!$form)
418  {
419  $form = $this->getAssignPasswordForm($pwassist_id);
420  }
421  $this->tpl->setVariable('FORM', $form->getHTML());
422  $this->tpl->show();
423  }
424  }
425 
442  public function submitAssignPasswordForm()
443  {
444 
445  require_once 'include/inc.pwassist_session_handler.php';
446 
447  // We need to fetch this before form instantiation
448  $pwassist_id = ilUtil::stripSlashes($_POST['key']);
449 
450  $form = $this->getAssignPasswordForm($pwassist_id);
451  if(!$form->checkInput())
452  {
453  $form->setValuesByPost();
454  $this->showAssistanceForm($form);
455  return;
456  }
457 
458  $username = $form->getInput('username');
459  $password = $form->getInput('password');
460  $pwassist_id = $form->getInput('key');
461 
462  // Retrieve the session
463  $pwassist_session = db_pwassist_session_read($pwassist_id);
464 
465  if(
466  count($pwassist_session) == 0 ||
467  $pwassist_session['expires'] < time()
468  )
469  {
470  ilUtil::sendFailure(str_replace("\\n", '', $this->lng->txt('pwassist_session_expired')));
471  $form->setValuesByPost();
472  $this->showAssistanceForm($form);
473  return;
474  }
475  else
476  {
477  $is_successful = true;
478  $message = '';
479 
480  $userObj = new ilObjUser($pwassist_session['user_id']);
481  if($userObj == null)
482  {
483  $message = $this->lng->txt('user_does_not_exist');
484  $is_successful = false;
485  }
486 
487  // check if the username entered by the user matches the
488  // one of the user object.
489  if($is_successful && strcasecmp($userObj->getLogin(), $username) != 0)
490  {
491  $message = $this->lng->txt('pwassist_login_not_match');
492  $is_successful = false;
493  }
494 
495  $error_lng_var = '';
496  if(!ilUtil::isPasswordValidForUserContext($password, $userObj, $error_lng_var))
497  {
498  $message = $this->lng->txt($error_lng_var);
499  $is_successful = false;
500  }
501 
502  // End of validation
503  // If the validation was successful, we change the password of the
504  // user.
505  // ------------------
506  if($is_successful)
507  {
508  $is_successful = $userObj->resetPassword($password, $password);
509  if(!$is_successful)
510  {
511  $message = $this->lng->txt('passwd_invalid');
512  }
513  }
514 
515  // If we are successful so far, we update the user object.
516  // ------------------
517  if($is_successful)
518  {
519  $userObj->update();
520  }
521 
522  // If we are successful, we destroy the password assistance
523  // session and redirect to the login page.
524  // Else we display the form again along with an error message.
525  // ------------------
526  if($is_successful)
527  {
528  db_pwassist_session_destroy($pwassist_id);
529  $this->showMessageForm(sprintf($this->lng->txt('pwassist_password_assigned'), $username));
530  }
531  else
532  {
533  ilUtil::sendFailure(str_replace("\\n", '', $message));
534  $form->setValuesByPost();
535  $this->showAssignPasswordForm($form, $pwassist_id);
536  }
537  }
538  }
539 
543  protected function getUsernameAssistanceForm()
544  {
545  require_once 'Services/Form/classes/class.ilPropertyFormGUI.php';
546  $form = new ilPropertyFormGUI();
547 
548  $form->setFormAction($this->ctrl->getFormAction($this, 'submitUsernameAssistanceForm'));
549  $form->setTarget('_parent');
550 
551  $email = new ilTextInputGUI($this->lng->txt('email'), 'email');
552  $email->setRequired(true);
553  $form->addItem($email);
554 
555  $form->addCommandButton('submitUsernameAssistanceForm', $this->lng->txt('submit'));
556 
557  return $form;
558  }
559 
570  public function showUsernameAssistanceForm(ilPropertyFormGUI $form = null)
571  {
572  ilStartUpGUI::initStartUpTemplate('tpl.pwassist_username_assistance.html', true);
573  $this->tpl->setVariable('IMG_PAGEHEADLINE', ilUtil::getImagePath('icon_auth_b.png'));
574  $this->tpl->setVariable('TXT_PAGEHEADLINE', $this->lng->txt('password_assistance'));
575 
576  $this->tpl->setVariable
577  (
578  'TXT_ENTER_USERNAME_AND_EMAIL',
579  str_replace
580  (
581  "\\n", '<br />',
582  sprintf
583  (
584  $this->lng->txt('pwassist_enter_email'),
585  '<a href="mailto:' . $this->settings->get('admin_email') . '">' . $this->settings->get('admin_email') . '</a>'
586  )
587  )
588  );
589 
590  if(!$form)
591  {
592  $form = $this->getUsernameAssistanceForm();
593  }
594  $this->tpl->setVariable('FORM', $form->getHTML());
595  $this->tpl->show();
596  }
597 
610  {
611  require_once 'Services/User/classes/class.ilObjUser.php';
612  require_once 'Services/Utilities/classes/class.ilUtil.php';
613 
614  $form = $this->getUsernameAssistanceForm();
615  if(!$form->checkInput())
616  {
617  $form->setValuesByPost();
618  $this->showUsernameAssistanceForm($form);
619  return;
620  }
621 
622  // Retrieve form data
623  $email = $form->getInput('email');
624 
625  // Retrieve a user object with matching user name and email address.
626  $logins = ilObjUser::_getUserIdsByEmail($email);
627 
628  // No matching user object found?
629  // Show the password assistance form again, and display an error message.
630  if(!is_array($logins) || count($logins) < 1)
631  {
632  ilUtil::sendFailure(str_replace("\\n", '', $this->lng->txt('pwassist_invalid_email')));
633  $form->setValuesByPost();
634  $this->showUsernameAssistanceForm($form);
635  }
636  else
637  {
638  // Matching user object found?
639  // Check if the user is permitted to use the password assistance function,
640  // and then send a password assistance mail to the email address.
641 
642  // FIXME: Extend this if-statement to check whether the user
643  // has the permission to use the password assistance function.
644  // The anonymous user and users who are system administrators are
645  // not allowed to use this feature
646  /* if ($rbacreview->isAssigned($userObj->getID, ANONYMOUS_ROLE_ID)
647  || $rbacreview->isAssigned($userObj->getID, SYSTEM_ROLE_ID)
648  )
649  {
650  $this->showAssistanceForm
651  (
652  $lng->txt("pwassist_not_permitted"),
653  $username,
654  $email
655  );
656  }
657  else */
658  {
659  $this->sendUsernameAssistanceMail($email, $logins);
660  $this->showMessageForm(sprintf($this->lng->txt('pwassist_mail_sent'), $email));
661  }
662  }
663  }
664 
677  public function sendUsernameAssistanceMail($email, array $logins)
678  {
679  require_once 'Services/Mail/classes/class.ilMailbox.php';
680  require_once 'Services/Mail/classes/class.ilMimeMail.php';
681  require_once 'include/inc.pwassist_session_handler.php';
682 
683  $protocol = $this->https->isDetected() ? 'https://' : 'http://';
684 
685  $server_url = $protocol . $_SERVER['HTTP_HOST'] . substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')) . '/';
686  $login_url = $server_url . 'pwassist.php' . '?client_id=' . $this->ilias->getClientId() . '&lang=' . $this->lng->getLangKey();
687  $contact_address = $this->settings->get('admin_email');
688 
689  $mm = new ilMimeMail();
690  $mm->Subject($this->lng->txt('pwassist_mail_subject'));
691  $mm->From($contact_address);
692  $mm->To($email);
693  $mm->Body
694  (
695  str_replace
696  (
697  array("\\n", "\\t"),
698  array("\n", "\t"),
699  sprintf
700  (
701  $this->lng->txt('pwassist_username_mail_body'),
702  join($logins, ",\n"),
703  $server_url,
704  $_SERVER['REMOTE_ADDR'],
705  $email,
706  'mailto:' . $contact_address,
707  $login_url
708  )
709  )
710  );
711  $mm->Send();
712  }
713 
718  public function showMessageForm($text)
719  {
720  ilStartUpGUI::initStartUpTemplate('tpl.pwassist_message.html', true);
721  $this->tpl->setVariable('TXT_PAGEHEADLINE', $this->lng->txt('password_assistance'));
722  $this->tpl->setVariable('IMG_PAGEHEADLINE', ilUtil::getImagePath('icon_auth_b.png'));
723 
724  $this->tpl->setVariable('TXT_TEXT', str_replace("\\n", '<br />', $text));
725  $this->tpl->show();
726  }
727 }
< a tabindex="-1" style="border-style: none;" href="#" title="Refresh Image" onclick="document.getElementById('siimage').src = './securimage_show.php?sid=' + Math.random(); this.blur(); return false">< img src="./images/refresh.png" alt="Reload Image" height="32" width="32" onclick="this.blur()" align="bottom" border="0"/></a >< br/>< strong > Enter Code *if($_SERVER['REQUEST_METHOD']=='POST' &&@ $_POST['do']=='contact') $_SESSION['ctform']['success']
getLogin()
get login / username public
$_POST['username']
Definition: cron.php:12
db_pwassist_session_destroy($pwassist_id)
destroy session
sendPasswordAssistanceMail(ilObjUser $userObj)
Creates (or reuses) a password assistance session, and sends a password assistance mail to the specif...
db_pwassist_session_read($pwassist_id)
This class represents a property form user interface.
$_GET["client_id"]
static isPasswordValidForUserContext($clear_text_password, $user, &$error_language_variable=null)
$cmd
Definition: sahs_server.php:35
getUserIdByLogin($a_login)
global $ilCtrl
Definition: ilias.php:18
showAssignPasswordForm(ilPropertyFormGUI $form=null, $pwassist_id='')
Assign password form.
This class represents a hidden form property in a property form.
getEmail()
get email address public
db_pwassist_session_find($user_id)
this class encapsulates the PHP mail() function.
getId()
get object id public
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
submitUsernameAssistanceForm()
Reads the submitted data from the password assistance form.
This class represents a text property in a property form.
This class represents a password property in a property form.
redirection script todo: (a better solution should control the processing via a xml file) ...
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
const AUTH_LOCAL
showMessageForm($text)
This form is used to show a message to the user.
Password assistance facility for users who have forgotten their password or for users for whom no pas...
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
showAssistanceForm(ilPropertyFormGUI $form=null)
submitAssignPasswordForm()
Reads the submitted data from the password assistance form.
global $ilSetting
Definition: privfeed.php:40
submitAssistanceForm()
Reads the submitted data from the password assistance form.
sendUsernameAssistanceMail($email, array $logins)
Creates (or reuses) a password assistance session, and sends a password assistance mail to the specif...
language handling
db_pwassist_session_write($pwassist_id, $maxlifetime, $user_id)
Writes serialized session data to the database.
setRequired($a_required)
Set Required.
showUsernameAssistanceForm(ilPropertyFormGUI $form=null)
Shows the password assistance form.
_getUserIdsByEmail($a_email)
STATIC METHOD get all user_ids of an email address.