ILIAS  release_5-0 Revision 5.0.0-1144-gc4397b1f870
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.svg'));
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:' . ilUtil::prepareFormOutput($this->settings->get('admin_email')) . '">' . ilUtil::prepareFormOutput($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.ilMail.php';
281 require_once 'Services/Mail/classes/class.ilMimeMail.php';
282 require_once 'include/inc.pwassist_session_handler.php';
283
284 // Check if we need to create a new session
285 $pwassist_session = db_pwassist_session_find($userObj->getId());
286 if(
287 count($pwassist_session) == 0 ||
288 $pwassist_session['expires'] < time() ||
289 true // comment by mjansen: wtf? :-)
290 )
291 {
292 // Create a new session id
293 // #9700 - this didn't do anything before?!
294 // db_set_save_handler();
295 session_start();
296 $pwassist_session['pwassist_id'] = db_pwassist_create_id();
297 session_destroy();
299 $pwassist_session['pwassist_id'],
300 3600,
301 $userObj->getId()
302 );
303 }
304 $protocol = $this->https->isDetected() ? 'https://' : 'http://';
305 // Compose the mail
306 $server_url = $protocol . $_SERVER['HTTP_HOST'] . substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')) . '/';
307 // XXX - Werner Randelshofer - Insert code here to dynamically get the
308 // the delimiter. For URL's that are sent by e-mail to a user,
309 // it is best to use semicolons as parameter delimiter
310 $delimiter = '&';
311 $pwassist_url = $protocol . $_SERVER['HTTP_HOST']
312 . str_replace('ilias.php', 'pwassist.php', $_SERVER['PHP_SELF'])
313 . '?client_id=' . $this->ilias->getClientId()
314 . $delimiter . 'lang=' . $this->lng->getLangKey()
315 . $delimiter . 'key=' . $pwassist_session['pwassist_id'];
316 $alternative_pwassist_url = $protocol . $_SERVER['HTTP_HOST']
317 . str_replace('ilias.php', 'pwassist.php', $_SERVER['PHP_SELF'])
318 . '?client_id=' . $this->ilias->getClientId()
319 . $delimiter . 'lang=' . $this->lng->getLangKey()
320 . $delimiter . 'key=' . $pwassist_session['pwassist_id'];
321
322 $contact_address = ilMail::getIliasMailerAddress();
323
324 $mm = new ilMimeMail();
325 $mm->Subject($this->lng->txt('pwassist_mail_subject'));
326 $mm->From($contact_address);
327 $mm->To($userObj->getEmail());
328 $mm->Body
329 (
330 str_replace
331 (
332 array("\\n", "\\t"),
333 array("\n", "\t"),
334 sprintf
335 (
336 $this->lng->txt('pwassist_mail_body'),
337 $pwassist_url,
338 $server_url,
339 $_SERVER['REMOTE_ADDR'],
340 $userObj->getLogin(),
341 'mailto:' . $contact_address,
342 $alternative_pwassist_url
343 )
344 )
345 );
346 $mm->Send();
347 }
348
353 protected function getAssignPasswordForm($pwassist_id)
354 {
355 require_once 'Services/Form/classes/class.ilPropertyFormGUI.php';
356 $form = new ilPropertyFormGUI();
357
358 $form->setFormAction($this->ctrl->getFormAction($this, 'submitAssignPasswordForm'));
359 $form->setTarget('_parent');
360
361 $username = new ilTextInputGUI($this->lng->txt('username'), 'username');
362 $username->setRequired(true);
363 $form->addItem($username);
364
365 $password = new ilPasswordInputGUI($this->lng->txt('password'), 'password');
366 $password->setRequired(true);
367 $form->addItem($password);
368
369 $key = new ilHiddenInputGUI('key');
370 $key->setValue($pwassist_id);
371 $form->addItem($key);
372
373 $form->addCommandButton('submitAssignPasswordForm', $this->lng->txt('submit'));
374
375 return $form;
376 }
377
390 public function showAssignPasswordForm(ilPropertyFormGUI $form = null, $pwassist_id = '')
391 {
392 require_once 'include/inc.pwassist_session_handler.php';
393 require_once 'Services/Language/classes/class.ilLanguage.php';
394
395 // Retrieve form data
396 if(!$pwassist_id)
397 {
398 $pwassist_id = $_GET['key'];
399 }
400
401 // Retrieve the session, and check if it is valid
402 $pwassist_session = db_pwassist_session_read($pwassist_id);
403 if(
404 count($pwassist_session) == 0 ||
405 $pwassist_session['expires'] < time()
406 )
407 {
408 $this->showAssistanceForm(null, $this->lng->txt('pwassist_session_expired'));
409 }
410 else
411 {
412 ilStartUpGUI::initStartUpTemplate('tpl.pwassist_assignpassword.html', true);
413 $this->tpl->setVariable('IMG_PAGEHEADLINE', ilUtil::getImagePath('icon_auth.svg'));
414 $this->tpl->setVariable('TXT_PAGEHEADLINE', $this->lng->txt('password_assistance'));
415
416 $this->tpl->setVariable('TXT_ENTER_USERNAME_AND_NEW_PASSWORD', $this->lng->txt('pwassist_enter_username_and_new_password'));
417
418 if(!$form)
419 {
420 $form = $this->getAssignPasswordForm($pwassist_id);
421 }
422 $this->tpl->setVariable('FORM', $form->getHTML());
423 $this->tpl->show();
424 }
425 }
426
443 public function submitAssignPasswordForm()
444 {
445
446 require_once 'include/inc.pwassist_session_handler.php';
447
448 // We need to fetch this before form instantiation
449 $pwassist_id = ilUtil::stripSlashes($_POST['key']);
450
451 $form = $this->getAssignPasswordForm($pwassist_id);
452 if(!$form->checkInput())
453 {
454 $form->setValuesByPost();
455 $this->showAssistanceForm($form);
456 return;
457 }
458
459 $username = $form->getInput('username');
460 $password = $form->getInput('password');
461 $pwassist_id = $form->getInput('key');
462
463 // Retrieve the session
464 $pwassist_session = db_pwassist_session_read($pwassist_id);
465
466 if(
467 count($pwassist_session) == 0 ||
468 $pwassist_session['expires'] < time()
469 )
470 {
471 ilUtil::sendFailure(str_replace("\\n", '', $this->lng->txt('pwassist_session_expired')));
472 $form->setValuesByPost();
473 $this->showAssistanceForm($form);
474 return;
475 }
476 else
477 {
478 $is_successful = true;
479 $message = '';
480
481 $userObj = new ilObjUser($pwassist_session['user_id']);
482 if($userObj == null)
483 {
484 $message = $this->lng->txt('user_does_not_exist');
485 $is_successful = false;
486 }
487
488 // check if the username entered by the user matches the
489 // one of the user object.
490 if($is_successful && strcasecmp($userObj->getLogin(), $username) != 0)
491 {
492 $message = $this->lng->txt('pwassist_login_not_match');
493 $is_successful = false;
494 }
495
496 $error_lng_var = '';
497 if(!ilUtil::isPasswordValidForUserContext($password, $userObj, $error_lng_var))
498 {
499 $message = $this->lng->txt($error_lng_var);
500 $is_successful = false;
501 }
502
503 // End of validation
504 // If the validation was successful, we change the password of the
505 // user.
506 // ------------------
507 if($is_successful)
508 {
509 $is_successful = $userObj->resetPassword($password, $password);
510 if(!$is_successful)
511 {
512 $message = $this->lng->txt('passwd_invalid');
513 }
514 }
515
516 // If we are successful so far, we update the user object.
517 // ------------------
518 if($is_successful)
519 {
520 $userObj->update();
521 }
522
523 // If we are successful, we destroy the password assistance
524 // session and redirect to the login page.
525 // Else we display the form again along with an error message.
526 // ------------------
527 if($is_successful)
528 {
529 db_pwassist_session_destroy($pwassist_id);
530 $this->showMessageForm(sprintf($this->lng->txt('pwassist_password_assigned'), $username));
531 }
532 else
533 {
534 ilUtil::sendFailure(str_replace("\\n", '', $message));
535 $form->setValuesByPost();
536 $this->showAssignPasswordForm($form, $pwassist_id);
537 }
538 }
539 }
540
544 protected function getUsernameAssistanceForm()
545 {
546 require_once 'Services/Form/classes/class.ilPropertyFormGUI.php';
547 $form = new ilPropertyFormGUI();
548
549 $form->setFormAction($this->ctrl->getFormAction($this, 'submitUsernameAssistanceForm'));
550 $form->setTarget('_parent');
551
552 $email = new ilTextInputGUI($this->lng->txt('email'), 'email');
553 $email->setRequired(true);
554 $form->addItem($email);
555
556 $form->addCommandButton('submitUsernameAssistanceForm', $this->lng->txt('submit'));
557
558 return $form;
559 }
560
571 public function showUsernameAssistanceForm(ilPropertyFormGUI $form = null)
572 {
573 ilStartUpGUI::initStartUpTemplate('tpl.pwassist_username_assistance.html', true);
574 $this->tpl->setVariable('IMG_PAGEHEADLINE', ilUtil::getImagePath('icon_auth.svg'));
575 $this->tpl->setVariable('TXT_PAGEHEADLINE', $this->lng->txt('password_assistance'));
576
577 $this->tpl->setVariable
578 (
579 'TXT_ENTER_USERNAME_AND_EMAIL',
580 str_replace
581 (
582 "\\n", '<br />',
583 sprintf
584 (
585 $this->lng->txt('pwassist_enter_email'),
586 '<a href="mailto:' . ilUtil::prepareFormOutput($this->settings->get('admin_email')) . '">' . ilUtil::prepareFormOutput($this->settings->get('admin_email')) . '</a>'
587 )
588 )
589 );
590
591 if(!$form)
592 {
593 $form = $this->getUsernameAssistanceForm();
594 }
595 $this->tpl->setVariable('FORM', $form->getHTML());
596 $this->tpl->show();
597 }
598
611 {
612 require_once 'Services/User/classes/class.ilObjUser.php';
613 require_once 'Services/Utilities/classes/class.ilUtil.php';
614
615 $form = $this->getUsernameAssistanceForm();
616 if(!$form->checkInput())
617 {
618 $form->setValuesByPost();
619 $this->showUsernameAssistanceForm($form);
620 return;
621 }
622
623 // Retrieve form data
624 $email = $form->getInput('email');
625
626 // Retrieve a user object with matching user name and email address.
627 $logins = ilObjUser::_getUserIdsByEmail($email);
628
629 // No matching user object found?
630 // Show the password assistance form again, and display an error message.
631 if(!is_array($logins) || count($logins) < 1)
632 {
633 ilUtil::sendFailure(str_replace("\\n", '', $this->lng->txt('pwassist_invalid_email')));
634 $form->setValuesByPost();
635 $this->showUsernameAssistanceForm($form);
636 }
637 else
638 {
639 // Matching user object found?
640 // Check if the user is permitted to use the password assistance function,
641 // and then send a password assistance mail to the email address.
642
643 // FIXME: Extend this if-statement to check whether the user
644 // has the permission to use the password assistance function.
645 // The anonymous user and users who are system administrators are
646 // not allowed to use this feature
647 /* if ($rbacreview->isAssigned($userObj->getID, ANONYMOUS_ROLE_ID)
648 || $rbacreview->isAssigned($userObj->getID, SYSTEM_ROLE_ID)
649 )
650 {
651 $this->showAssistanceForm
652 (
653 $lng->txt("pwassist_not_permitted"),
654 $username,
655 $email
656 );
657 }
658 else */
659 {
660 $this->sendUsernameAssistanceMail($email, $logins);
661 $this->showMessageForm(sprintf($this->lng->txt('pwassist_mail_sent'), $email));
662 }
663 }
664 }
665
678 public function sendUsernameAssistanceMail($email, array $logins)
679 {
680 require_once 'Services/Mail/classes/class.ilMailbox.php';
681 require_once 'Services/Mail/classes/class.ilMail.php';
682 require_once 'Services/Mail/classes/class.ilMimeMail.php';
683 require_once 'include/inc.pwassist_session_handler.php';
684
685 $protocol = $this->https->isDetected() ? 'https://' : 'http://';
686
687 $server_url = $protocol . $_SERVER['HTTP_HOST'] . substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')) . '/';
688 $login_url = $server_url . 'pwassist.php' . '?client_id=' . $this->ilias->getClientId() . '&lang=' . $this->lng->getLangKey();
689 $contact_address = ilMail::getIliasMailerAddress();
690
691 $mm = new ilMimeMail();
692 $mm->Subject($this->lng->txt('pwassist_mail_subject'));
693 $mm->From($contact_address);
694 $mm->To($email);
695 $mm->Body
696 (
697 str_replace
698 (
699 array("\\n", "\\t"),
700 array("\n", "\t"),
701 sprintf
702 (
703 $this->lng->txt('pwassist_username_mail_body'),
704 join($logins, ",\n"),
705 $server_url,
706 $_SERVER['REMOTE_ADDR'],
707 $email,
708 'mailto:' . $contact_address,
709 $login_url
710 )
711 )
712 );
713 $mm->Send();
714 }
715
720 public function showMessageForm($text)
721 {
722 ilStartUpGUI::initStartUpTemplate('tpl.pwassist_message.html', true);
723 $this->tpl->setVariable('TXT_PAGEHEADLINE', $this->lng->txt('password_assistance'));
724 $this->tpl->setVariable('IMG_PAGEHEADLINE', ilUtil::getImagePath('icon_auth.svg'));
725
726 $this->tpl->setVariable('TXT_TEXT', str_replace("\\n", '<br />', $text));
727 $this->tpl->show();
728 }
729}
$_GET["client_id"]
const AUTH_LOCAL
This class represents a hidden form property in a property form.
language handling
static getIliasMailerAddress()
Builds an email address used for system notifications.
this class encapsulates the PHP mail() function.
getEmail()
get email address @access public
getUserIdByLogin($a_login)
_getUserIdsByEmail($a_email)
STATIC METHOD get all user_ids of an email address.
getLogin()
get login / username @access public
getId()
get object id @access public
Password assistance facility for users who have forgotten their password or for users for whom no pas...
showAssistanceForm(ilPropertyFormGUI $form=null)
sendUsernameAssistanceMail($email, array $logins)
Creates (or reuses) a password assistance session, and sends a password assistance mail to the specif...
submitUsernameAssistanceForm()
Reads the submitted data from the password assistance form.
showUsernameAssistanceForm(ilPropertyFormGUI $form=null)
Shows the password assistance form.
submitAssistanceForm()
Reads the submitted data from the password assistance form.
sendPasswordAssistanceMail(ilObjUser $userObj)
Creates (or reuses) a password assistance session, and sends a password assistance mail to the specif...
showAssignPasswordForm(ilPropertyFormGUI $form=null, $pwassist_id='')
Assign password form.
submitAssignPasswordForm()
Reads the submitted data from the password assistance form.
showMessageForm($text)
This form is used to show a message to the user.
This class represents a password property in a property form.
This class represents a property form user interface.
This class represents a text property in a property form.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
static isPasswordValidForUserContext($clear_text_password, $user, &$error_language_variable=null)
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms @access public
$_POST['username']
Definition: cron.php:12
< 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']
global $ilCtrl
Definition: ilias.php:18
db_pwassist_session_destroy($pwassist_id)
destroy session
db_pwassist_session_find($user_id)
db_pwassist_session_write($pwassist_id, $maxlifetime, $user_id)
Writes serialized session data to the database.
db_pwassist_session_read($pwassist_id)
redirection script todo: (a better solution should control the processing via a xml file)
global $ilSetting
Definition: privfeed.php:40
$cmd
Definition: sahs_server.php:35