PageRenderTime 40ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/users/classes/model/password.php

https://bitbucket.org/sriedel/iccrm-wip
PHP | 191 lines | 145 code | 31 blank | 15 comment | 6 complexity | 88d660e20628649f0fc776fa2de089a2 MD5 | raw file
Possible License(s): MIT
  1. <?php
  2. /**
  3. * @created 01.10.12 - 20:15
  4. * @author stefanriedel
  5. */
  6. namespace Users;
  7. class Model_Password extends Model_User
  8. {
  9. protected static $_table_name = 'users';
  10. public static function validate_confirmed_forget_email()
  11. {
  12. $val = \Validation::forge('password_forget');
  13. $val->add_callable(__CLASS__);
  14. $val->add('username', __('Nutzername/E-Mail'), array(), array('trim', 'strip_tags', 'required'))
  15. ->add_rule('user_exists');
  16. }
  17. public static function change_password(Model_User $user, $password) {
  18. \Auth::instance()->change_password_without_old($password, $user->username);
  19. \Core\Messages::success(__('Sie haben Ihr Passwort erfolgreich geändert.'));
  20. }
  21. public static function validate_new_password() {
  22. $val = \Validation::forge('new_password');
  23. $val->add_callable(__CLASS__);
  24. $val->add('password', __('Passwort'), array(), array(array('required'), array('min_length', 8)));
  25. $val->add('repeat_password', __('Passwort wiederholen'), array(), array('repeat_password'));
  26. if (!$val->run()) {
  27. foreach ($val->error() as $error) {
  28. \Core\Messages::error($error);
  29. }
  30. $ret = false;
  31. } else {
  32. $ret = true;
  33. }
  34. return $ret;
  35. }
  36. public static function _validation_repeat_password($val)
  37. {
  38. \Validation::active()->set_message('repeat_password', __('Die beiden Passwörter stimmen nicht überein.'));
  39. $active = \Validation::active();
  40. $password_value = $active->input('password');
  41. $ret = ($password_value === $val );
  42. return ($ret);
  43. }
  44. public static function validate_password_forget()
  45. {
  46. $val = \Validation::forge('password_forget');
  47. $val->add_callable(__CLASS__);
  48. $val->add('username', __('Nutzername/E-Mail'), array(), array('trim', 'strip_tags', 'required'))
  49. ->add_rule('user_exists');
  50. if (!$val->run()) {
  51. foreach ($val->error() as $error) {
  52. \Core\Messages::error($error);
  53. }
  54. $ret = false;
  55. } else {
  56. $ret = true;
  57. }
  58. return $ret;
  59. }
  60. public static function get_user_by_password_hash($hash)
  61. {
  62. $hash = trim($hash);
  63. $properties = static::$_properties;
  64. $p = array_combine($properties, $properties);
  65. $user = static::query()
  66. ->where_open()
  67. ->or_where('new_password_hash', '=', $hash)
  68. ->where_close()
  69. ->get_one();
  70. return $user ? : false;
  71. }
  72. public static function send_new_password(Model_User $user)
  73. {
  74. try {
  75. $new_password = \Auth::instance()->reset_password($user->username);
  76. } catch (\SimpleUserUpdateException $e) {
  77. throw new \Model_PasswordExceptions(__('Beim aktuallisieren des Benutzers ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. :ex_message', array(':ex_message' => $e->getMessages())));
  78. }
  79. static::send_new_password_mail($user, $new_password);
  80. \Core\Messages::success(__('Ihr neues Passwort, wurde an Ihre hinterlegte E-Mail-Adresse versendet.'));
  81. }
  82. public static function send_new_password_mail(Model_User $user, $new_password)
  83. {
  84. $email = \Email::forge('system');
  85. $email->subject(__('Ihr angefordertes Passwort.'));
  86. $email->to($user->email, $user);
  87. $body = <<<STRING
  88. Hallo :username,
  89. anbei erhalten Sie Ihr neues Passwort. Bitte beachten Sie, dass nach dem nächsten Login, Sie direkt aufgefordert werden ein neues Passwort zu vergeben.
  90. Bitte überspringen Sie aus Sicherheitsgründen diesen Punkt nicht.
  91. Ihr neues Passwort: :password
  92. Beste Grüße
  93. STRING;
  94. $body = __($body, array(':username' => $user->username, ':password' => $new_password));
  95. $email->body($body);
  96. try {
  97. $email->send();
  98. } catch (\EmailValidationFailedException $e) {
  99. throw new \Model_PasswordExceptions(__('Die E-Mail-Adresse ist nicht korrekt: :ex_message', array(':ex_message' => $e->getMessages())));
  100. }
  101. catch (\EmailSendingFailedException $e) {
  102. throw new \Model_PasswordExceptions(__('E-Mail konnte nicht gesendet werden: :ex_message', array(':ex_message' => $e->getMessages())));
  103. }
  104. }
  105. public static function prepare_new_password(Model_User $user)
  106. {
  107. $hasher = new \PHPSecLib\Crypt_Hash();
  108. $hash = base64_encode($hasher->pbkdf2(\Str::random('alnum', 8), \Config::get('auth.salt'), 10000, 32));
  109. \Auth::instance()->update_user(
  110. array(
  111. 'new_password_hash' => $hash,
  112. ),
  113. $user->username
  114. );
  115. static::send_prepare_new_password_mail($user, $hash);
  116. \Core\Messages::success(__('Weitere Informationen wurden an Ihre hinterlegte E-Mail-Adresse gesendet.'));
  117. }
  118. /**
  119. * @param Model_User $user
  120. * @param $hash
  121. * @throws \Model_PasswordExceptions
  122. */
  123. public static function send_prepare_new_password_mail(Model_User $user, $hash)
  124. {
  125. /**
  126. * @todo E-Mail Model bauen, wir verlegen E-Mail Templates ins theme oder in die DB
  127. */
  128. if (empty($user->email)) {
  129. throw new \Model_PasswordExceptions(__('Keine E-Mail Adresse vorhanden.'));
  130. }
  131. $mail = \Email::forge();
  132. $mail->subject(__('Sie haben ein neues Passwort angefordert'));
  133. $mail->to($user->email, $user);
  134. $body = <<<STRING
  135. Hallo :username,
  136. für Ihren Account wurde ein neues Passwort angefordert.
  137. Bitte folgen Sie dem Link: :link, um diese Aktion zu bestätigen. Danach wird Ihnen eine weitere E-Mail mit weiterführenden Informationen zugesandt.
  138. Beste Grüße
  139. STRING;
  140. $body = __($body, array(':username' => $user->username, ':link' => \Uri::create('/users/password/confirmed_email/' . $hash)));
  141. $mail->body($body);
  142. try {
  143. $mail->send();
  144. } catch (\EmailValidationFailedException $e) {
  145. throw new \Model_PasswordExceptions(__('Die E-Mail-Adresse ist nicht korrekt: :ex_message', array(':ex_message' => $e->getMessages())));
  146. }
  147. catch (\EmailSendingFailedException $e) {
  148. throw new \Model_PasswordExceptions(__('E-Mail konnte nicht gesendet werden: :ex_message', array(':ex_message' => $e->getMessages())));
  149. }
  150. }
  151. public static function _validation_user_exists($val)
  152. {
  153. \Validation::active()->set_message('user_exists', __('Nutzername oder E-Mail nicht bekannt.'));
  154. /**
  155. * @todo fixit!! Das ist so schlecht gelöst
  156. */
  157. $ret = Model_User::get_user($val) != false;
  158. return ($ret);
  159. }
  160. }