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.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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. use Luticate\Utils\LuMultipleDbo;
  11. class LuticateUsersBusiness extends LuBusiness {
  12. const KEY_USER_ID = "user_id";
  13. const KEY_SALT = "salt";
  14. const KEY_DATA = "data";
  15. protected static function getDataAccess()
  16. {
  17. return new LuticateUsersDataAccess();
  18. }
  19. protected static function badPassword()
  20. {
  21. abort(401, "Bad username/password");
  22. }
  23. public static function hashPassword($password)
  24. {
  25. return password_hash($password, PASSWORD_BCRYPT);
  26. }
  27. public static function verifyPassword($password, $hash)
  28. {
  29. return password_verify($password, $hash);
  30. }
  31. public static function getSalt($length = 10)
  32. {
  33. $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  34. $charactersLength = strlen($characters);
  35. $randomString = '';
  36. for ($i = 0; $i < $length; $i++) {
  37. $randomString .= $characters[rand(0, $charactersLength - 1)];
  38. }
  39. return $randomString;
  40. }
  41. /**
  42. * @param $user LuticateUsersDbo
  43. * @param $data mixed
  44. * @return string
  45. */
  46. public static function getToken($user, $data = null)
  47. {
  48. $session_time = LuticateSettingsBusiness::getValue("LU_SESSION_DAYS");
  49. return JwtHelper::encode(array(
  50. self::KEY_USER_ID => $user->getId(),
  51. self::KEY_SALT => $user->getSalt(),
  52. self::KEY_DATA => $data
  53. ), $session_time);
  54. }
  55. /**
  56. * @param $user_id
  57. * @return LuticateUsersDbo|null
  58. */
  59. public static function checkUserId($user_id)
  60. {
  61. $user = LuticateUsersDataAccess::getById($user_id);
  62. if (is_null($user)) {
  63. self::notFound("User not found");
  64. }
  65. return $user;
  66. }
  67. public static function login($username, $password)
  68. {
  69. $user = LuticateUsersDataAccess::getByUsernameOrEmail($username);
  70. if (is_null($user))
  71. self::badPassword();
  72. if (!self::verifyPassword($password, $user->getPassword()))
  73. self::badPassword();
  74. $user = LuticateUsersLoginDbo::fromUserDbo($user);
  75. $user->setToken(self::getToken($user));
  76. return $user;
  77. }
  78. /**
  79. * @param $user LuticateUsersDbo
  80. * @return bool
  81. */
  82. public static function logout($user)
  83. {
  84. if ($user->getId() != 0) {
  85. $user->setSalt(self::getSalt());
  86. LuticateUsersDataAccess::editById($user->getId(), $user);
  87. }
  88. return true;
  89. }
  90. public static function getAllLight($page = 0, $perPage = 2000000000, $query = "")
  91. {
  92. $users = self::getAll($page, $perPage, $query);
  93. return $users->map(function($user)
  94. {
  95. return LuticateUsersLightDbo::fromUserDbo($user);
  96. });
  97. }
  98. public static function getLightById($user_id)
  99. {
  100. $user = self::getById($user_id);
  101. if (is_null($user)) {
  102. self::notFound(self::getResourceName() . " not found");
  103. }
  104. return LuticateUsersLightDbo::fromUserDbo($user);
  105. }
  106. public static function deleteById($id)
  107. {
  108. if ($id != 0) {
  109. $res = static::getDataAccess()->deleteById($id);
  110. if (!$res)
  111. self::notFound(static::getResourceName() . " not found");
  112. }
  113. return true;
  114. }
  115. public static function add($username, $email, $firstname, $lastname, $password)
  116. {
  117. if (strlen($password) < 5) {
  118. self::badInput("Password must have at least 5 characters");
  119. }
  120. $hash = self::hashPassword($password);
  121. if (filter_var($username, FILTER_VALIDATE_EMAIL))
  122. self::badInput("Username can not be an email");
  123. if (!preg_match("/^[A-Za-z0-9\\-_\\.]+$/", $username)) {
  124. self::badInput("Username can only contain letters (A-Z a-z), numbers (0-9), hyphen (-), underscore (_) and dot (.)");
  125. }
  126. if (!filter_var($email, FILTER_VALIDATE_EMAIL))
  127. self::badInput("Invalid email address");
  128. $user = LuticateUsersDataAccess::getByUsernameOrEmail($username);
  129. if (!is_null($user))
  130. self::badInput("Username already exists");
  131. $user = LuticateUsersDataAccess::getByUsernameOrEmail($email);
  132. if (!is_null($user))
  133. self::badInput("Email already used");
  134. $user = new LuticateUsersDbo();
  135. $user->setEmail($email);
  136. $user->setPassword($hash);
  137. $user->setUsername($username);
  138. $user->setFirstname($firstname);
  139. $user->setLastname($lastname);
  140. $user->setSalt(self::getSalt());
  141. return LuticateUsersDataAccess::addId($user);
  142. }
  143. public static function edit($user_id, $firstname, $lastname, $email)
  144. {
  145. $user = self::checkUserId($user_id);
  146. if (!filter_var($email, FILTER_VALIDATE_EMAIL))
  147. self::badInput("Invalid email address");
  148. $user->setEmail($email);
  149. $user->setFirstname($firstname);
  150. $user->setLastname($lastname);
  151. LuticateUsersDataAccess::editById($user_id, $user);
  152. return true;
  153. }
  154. public static function setPassword($user_id, $password)
  155. {
  156. if ($user_id != 0) {
  157. $user = self::checkUserId($user_id);
  158. $user->setPassword(self::hashPassword($password));
  159. $user->setSalt(self::getSalt());
  160. LuticateUsersDataAccess::editById($user_id, $user);
  161. }
  162. return true;
  163. }
  164. public static function setPasswordMe($password, $oldPassword, $user)
  165. {
  166. self::login($user->getUsername(), $oldPassword);
  167. return self::setPassword($user->getId(), $password);
  168. }
  169. }