You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LuticateUsersBusiness.php 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. namespace Luticate\Auth\Business;
  3. use Illuminate\Support\Facades\DB;
  4. use Luticate\Auth\DBO\LuticatePermissions;
  5. use Luticate\Auth\DBO\LuticateUsersLightDbo;
  6. use Luticate\Auth\DBO\LuticateUsersLoginDbo;
  7. use Luticate\Utils\LuBusiness;
  8. use Luticate\Auth\DataAccess\LuticateUsersDataAccess;
  9. use Luticate\Auth\DBO\LuticateUsersDbo;
  10. class LuticateUsersBusiness extends LuBusiness {
  11. const KEY_USER_ID = "user_id";
  12. const KEY_SALT = "salt";
  13. const KEY_DATA = "data";
  14. protected static function getDataAccess()
  15. {
  16. return new LuticateUsersDataAccess();
  17. }
  18. protected static function badPassword()
  19. {
  20. abort(401, "Bad username/password");
  21. }
  22. public static function hashPassword($password)
  23. {
  24. return password_hash($password, PASSWORD_BCRYPT);
  25. }
  26. public static function verifyPassword($password, $hash)
  27. {
  28. return password_verify($password, $hash);
  29. }
  30. public static function getSalt($length = 10)
  31. {
  32. $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  33. $charactersLength = strlen($characters);
  34. $randomString = '';
  35. for ($i = 0; $i < $length; $i++) {
  36. $randomString .= $characters[rand(0, $charactersLength - 1)];
  37. }
  38. return $randomString;
  39. }
  40. /**
  41. * @param $user LuticateUsersDbo
  42. * @param $data mixed
  43. * @return string
  44. */
  45. public static function getToken($user, $data = null)
  46. {
  47. return JwtHelper::encode(array(
  48. self::KEY_USER_ID => $user->getId(),
  49. self::KEY_SALT => $user->getSalt(),
  50. self::KEY_DATA => $data
  51. ));
  52. }
  53. /**
  54. * @param $user_id
  55. * @return LuticateUsersDbo|null
  56. */
  57. public static function checkUserId($user_id)
  58. {
  59. $user = LuticateUsersDataAccess::getById($user_id);
  60. if (is_null($user)) {
  61. self::notFound("User not found");
  62. }
  63. return $user;
  64. }
  65. public static function login($username, $password)
  66. {
  67. $user = LuticateUsersDataAccess::getByUsernameOrEmail($username);
  68. if (is_null($user))
  69. self::badPassword();
  70. if (!self::verifyPassword($password, $user->getPassword()))
  71. self::badPassword();
  72. $user = LuticateUsersLoginDbo::fromUserDbo($user);
  73. $user->setToken(self::getToken($user));
  74. return $user;
  75. }
  76. /**
  77. * @param $user LuticateUsersDbo
  78. * @return bool
  79. */
  80. public static function logout($user)
  81. {
  82. if ($user->getId() != 0) {
  83. $user->setSalt(self::getSalt());
  84. LuticateUsersDataAccess::editById($user->getId(), $user);
  85. }
  86. return true;
  87. }
  88. public static function getAll($page = 0, $perPage = PHP_INT_MAX)
  89. {
  90. $users = self::search($page, $perPage, "username", "ASC");
  91. $usersLight = array();
  92. foreach ($users as $user) {
  93. $usersLight[] = LuticateUsersLightDbo::fromUserDbo($user);
  94. }
  95. return $usersLight;
  96. }
  97. public static function add($username, $email, $password)
  98. {
  99. $hash = self::hashPassword($password);
  100. if (filter_var($username, FILTER_VALIDATE_EMAIL))
  101. self::badInput("Username can not be an email");
  102. if (!filter_var($email, FILTER_VALIDATE_EMAIL))
  103. self::badInput("Invalid email address");
  104. $user = LuticateUsersDataAccess::getByUsernameOrEmail($username);
  105. if (!is_null($user))
  106. self::badInput("Username already exists");
  107. $user = LuticateUsersDataAccess::getByUsernameOrEmail($email);
  108. if (!is_null($user))
  109. self::badInput("Email already used");
  110. $user = new LuticateUsersDbo();
  111. $user->setEmail($email);
  112. $user->setPassword($hash);
  113. $user->setUsername($username);
  114. $user->setSalt(self::getSalt());
  115. DB::beginTransaction();
  116. $user_id = LuticateUsersDataAccess::addId($user);
  117. if (!is_null(LuticateGroupsBusiness::getById(0))) {
  118. LuticateGroupsBusiness::addUser($user_id, 0);
  119. }
  120. DB::commit();
  121. return $user_id;
  122. }
  123. public static function edit($user_id, $email)
  124. {
  125. if ($user_id != 0) {
  126. $user = self::checkUserId($user_id);
  127. $user->setEmail($email);
  128. LuticateUsersDataAccess::editById($user_id, $user);
  129. }
  130. return true;
  131. }
  132. public static function editMe($email, $user)
  133. {
  134. return self::edit($user->getId(), $email);
  135. }
  136. public static function setPassword($user_id, $password)
  137. {
  138. if ($user_id != 0) {
  139. $user = self::checkUserId($user_id);
  140. $user->setPassword(self::hashPassword($password));
  141. $user->setSalt(self::getSalt());
  142. LuticateUsersDataAccess::editById($user_id, $user);
  143. }
  144. return true;
  145. }
  146. public static function setPasswordMe($password, $oldPassword, $user)
  147. {
  148. self::login($user->getUsername(), $oldPassword);
  149. return self::setPassword($user->getId(), $password);
  150. }
  151. public static function del($user_id)
  152. {
  153. parent::deleteById($user_id);
  154. }
  155. }