profiles.inc.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. <?php defined('BX_DOL') or defined('BX_DOL_INSTALL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup UnaCore UNA Core
  7. * @{
  8. */
  9. /**
  10. * @return corrently logged in profile id
  11. */
  12. function bx_get_logged_profile_id ()
  13. {
  14. $o = BxDolProfile::getInstance();
  15. return $o ? $o->id() : false;
  16. }
  17. /**
  18. * @return true if user is logged in
  19. */
  20. function isLogged()
  21. {
  22. return getLoggedId() != 0;
  23. }
  24. /**
  25. * @return logged in account id
  26. */
  27. function getLoggedId()
  28. {
  29. if (getParam('sys_session_auth')) {
  30. return (!empty($GLOBALS['logged']['member']) || !empty($GLOBALS['logged']['admin'])) ? BxDolSession::getInstance()->getUserId() : 0;
  31. }
  32. else {
  33. return isset($_COOKIE['memberID']) && (!empty($GLOBALS['logged']['member']) || !empty($GLOBALS['logged']['admin'])) ? (int)$_COOKIE['memberID'] : 0;
  34. }
  35. }
  36. /**
  37. * @return logged in account password
  38. */
  39. function getLoggedPassword()
  40. {
  41. $oAccount = BxDolAccount::getInstance();
  42. return ($GLOBALS['logged']['member'] || $GLOBALS['logged']['admin']) && $oAccount ? BxDolAccountQuery::getInstance()->getPassword($oAccount->id()) : "";
  43. }
  44. /**
  45. * It checks if account role is member.
  46. */
  47. function isMember($iId = 0)
  48. {
  49. return isRole(BX_DOL_ROLE_MEMBER, $iId);
  50. }
  51. if (!function_exists("isAdmin")) {
  52. /**
  53. * @return true if account is admin
  54. */
  55. function isAdmin($iId = 0)
  56. {
  57. if (!$iId && isset($GLOBALS['logged']['admin']) && $GLOBALS['logged']['admin']) // easier check for currently logged in user
  58. return true;
  59. return isRole(BX_DOL_ROLE_ADMIN, $iId);
  60. }
  61. }
  62. /**
  63. * Check user role
  64. * @param $iRole role to check user for
  65. * @param $iId optional account id, if it isn't specified then curently logged in account is used
  66. * @return true if user is in the provided role
  67. */
  68. function isRole($iRole, $iId = 0)
  69. {
  70. if (!(int)$iId)
  71. $iId = getLoggedId();
  72. $oAccount = BxDolAccount::getInstance($iId);
  73. if (!$oAccount)
  74. return false;
  75. $aAccountInfo = $oAccount->getInfo();
  76. if (!$aAccountInfo)
  77. return false;
  78. if (!((int)$aAccountInfo['role'] & $iRole))
  79. return false;
  80. return true;
  81. }
  82. /**
  83. * Login user by setting necessary cookies
  84. * @param $iId account id
  85. * @param $bRememberMe remember session
  86. * @return false if id isn't correct or array of user info if user was logged in
  87. */
  88. function bx_login($iId, $bRememberMe = false)
  89. {
  90. $oAccountQuery = BxDolAccountQuery::getInstance();
  91. $sPassword = $oAccountQuery->getPassword($iId);
  92. if (!$sPassword)
  93. return false;
  94. if (!getParam('sys_session_auth')) {
  95. $iCookieTime = $bRememberMe ? time() + 60 * getParam('sys_session_lifetime_in_min') : 0;
  96. bx_setcookie("memberID", $iId, $iCookieTime, 'auto');
  97. $_COOKIE['memberID'] = $iId;
  98. bx_setcookie("memberPassword", $sPassword, $iCookieTime, 'auto', '', 'auto', true /* http only */);
  99. $_COOKIE['memberPassword'] = $sPassword;
  100. }
  101. BxDolSession::getInstance()->setUserId($iId);
  102. if (getParam('sys_session_auth'))
  103. BxDolSession::getInstance()->setValue('remember_me', $bRememberMe);
  104. $oAccountQuery->updateLoggedIn($iId);
  105. $oProfileQuery = BxDolProfileQuery::getInstance();
  106. if(($iProfileId = $oProfileQuery->getCurrentProfileByAccount($iId, true)) !== false) {
  107. $aProfileInfo = $oProfileQuery->getInfoById($iProfileId);
  108. if(!empty($aProfileInfo) && is_array($aProfileInfo) && $aProfileInfo['type'] != 'system')
  109. BxDolRecommendation::updateData($iProfileId);
  110. }
  111. bx_alert('account', 'login', $iId);
  112. bx_audit($iId, 'bx_accounts', '_sys_audit_action_account_login', array(
  113. 'content_title' => '',
  114. 'data' => ['display_info' => ['User agent' => (isset($_SERVER["HTTP_USER_AGENT"]) ? $_SERVER["HTTP_USER_AGENT"] : '')]]
  115. ));
  116. return $oAccountQuery->getInfoById($iId);
  117. }
  118. /**
  119. * Logout user by removing cookies
  120. */
  121. function bx_logout($bNotify = true)
  122. {
  123. if (!($iMemberId = BxDolSession::getInstance()->getUserId()))
  124. return;
  125. if ($bNotify && isMember())
  126. bx_alert('account', 'logout', $iMemberId);
  127. bx_audit(
  128. $iMemberId,
  129. 'bx_accounts',
  130. '_sys_audit_action_account_logout',
  131. array('content_title' => '', 'data' => ['display_info' => ['User agent' => (isset($_SERVER["HTTP_USER_AGENT"]) ? $_SERVER["HTTP_USER_AGENT"] : '')]])
  132. );
  133. if (!getParam('sys_session_auth')) {
  134. bx_setcookie('memberID', '', time() - 96 * 3600);
  135. bx_setcookie('memberPassword', '', time() - 96 * 3600, 'auto', '', 'auto', true);
  136. unset($_COOKIE['memberID']);
  137. unset($_COOKIE['memberPassword']);
  138. }
  139. BxDolSession::getInstance()->destroy();
  140. }
  141. /**
  142. * Check if user is logged in (necessary cookies are present) and set some global variables
  143. */
  144. function check_logged()
  145. {
  146. bx_alert('account', 'logged_start', 0);
  147. $aAccTypes = array(
  148. BX_DOL_ROLE_ADMIN => 'admin',
  149. BX_DOL_ROLE_MEMBER => 'member'
  150. );
  151. $bLogged = false;
  152. $bID = false;
  153. $sID = 0;
  154. if (getParam('sys_session_auth')) {
  155. $o = BxDolSession::getInstance();
  156. $sID = $o->getUserId();
  157. if ($sID && $oAccount = BxDolAccount::getInstance((int)$sID)) {
  158. $aAccountInfo = $oAccount->getInfo();
  159. foreach ($aAccTypes as $iRole => $sValue) {
  160. if ($GLOBALS['logged'][$sValue] = ((int)$aAccountInfo['role'] & $iRole)) {
  161. $bLogged = true;
  162. $bID = true;
  163. break;
  164. }
  165. }
  166. }
  167. }
  168. else {
  169. $bID = isset($_COOKIE['memberID']);
  170. $sID = $bID ? bx_process_input($_COOKIE['memberID']) : false;
  171. $bPassword = isset($_COOKIE['memberPassword']);
  172. $sPassword = $bPassword ? bx_process_input($_COOKIE['memberPassword']) : false;
  173. foreach ($aAccTypes as $iRole => $sValue) {
  174. if ($GLOBALS['logged'][$sValue] = ($sID && !bx_check_login($sID, $sPassword, $iRole))) {
  175. BxDolSession::getInstance();
  176. $bLogged = true;
  177. break;
  178. }
  179. }
  180. }
  181. if($bID && $bLogged) {
  182. header("Cache-Control: no-cache, no-store, must-revalidate");
  183. bx_alert('account', 'logged', getLoggedId());
  184. }
  185. if($bID && !$bLogged)
  186. bx_logout(false);
  187. }
  188. /**
  189. * Check unencrypted password
  190. * @return empty string on success or error string on error
  191. */
  192. function bx_check_password($sLogin, $sPassword, $iRole = BX_DOL_ROLE_MEMBER)
  193. {
  194. $oAccount = BxDolAccount::getInstance($sLogin);
  195. if (!$oAccount) {
  196. bx_import('BxDolLanguages');
  197. return _t("_sys_txt_login_error");
  198. }
  199. if ($oAccount->isLocked()){
  200. bx_import('BxDolLanguages');
  201. if (bx_is_api()){
  202. return [strip_tags(_t("_sys_txt_login_locked", bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=forgot-password'))),''), bx_api_get_relative_url(BxDolPermalinks::getInstance()->permalink('page.php?i=forgot-password'))];
  203. }
  204. }
  205. $aAccountInfo = $oAccount->getInfo();
  206. $sPassCheck = encryptUserPwd($sPassword, $aAccountInfo['salt']);
  207. // regenerate password using another encrypt function if necessary
  208. bx_alert('system', 'encrypt_password_after', 0, false, array(
  209. 'info' => $aAccountInfo,
  210. 'pwd' => $sPassword,
  211. 'password' => &$sPassCheck,
  212. ));
  213. if ($sErrorMsg = bx_check_login($aAccountInfo['id'], $sPassCheck, $iRole)){
  214. bx_audit(
  215. $aAccountInfo['id'],
  216. 'bx_accounts',
  217. '_sys_audit_action_account_failed_login_attempt',
  218. array('content_title' => '', 'data' => ['display_info' => ['User agent' => (isset($_SERVER["HTTP_USER_AGENT"]) ? $_SERVER["HTTP_USER_AGENT"] : '')]]),
  219. $aAccountInfo['profile_id']
  220. );
  221. $iMaxLoginAttempts = getParam('sys_account_limit_incorrect_login_attempts');
  222. if ($iMaxLoginAttempts >0){
  223. $oAccountQuery = BxDolAccountQuery::getInstance();
  224. if ($aAccountInfo['login_attempts'] >= $iMaxLoginAttempts){
  225. $oAccountQuery->lockAccount($aAccountInfo['id'], 1);
  226. bx_import('BxDolLanguages');
  227. if (bx_is_api()){
  228. return [strip_tags(_t("_sys_txt_login_locked", bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=forgot-password'))),''), bx_api_get_relative_url(BxDolPermalinks::getInstance()->permalink('page.php?i=forgot-password'))];
  229. }
  230. }
  231. else{
  232. $oAccountQuery->updateAttemptsCounter($aAccountInfo['id']);
  233. }
  234. }
  235. return $sErrorMsg;
  236. }
  237. // Admin can always login even if he is blocked/banned/suspended/etc
  238. if (isAdmin($aAccountInfo['id']))
  239. return '';
  240. $sErrorMsg = '';
  241. bx_alert('account', 'check_login', $aAccountInfo['id'], false, array('error_msg' => &$sErrorMsg));
  242. return $sErrorMsg;
  243. }
  244. /**
  245. * Check encrypted password (ex., from Cookie)
  246. * @return empty string on success or error string on error
  247. */
  248. function bx_check_login($iID, $sPassword, $iRole = BX_DOL_ROLE_MEMBER)
  249. {
  250. $oAccount = BxDolAccount::getInstance((int)$iID);
  251. // If no such account available
  252. if (!$oAccount) {
  253. bx_import('BxDolLanguages');
  254. return _t("_sys_txt_login_error");
  255. }
  256. $aAccountInfo = $oAccount->getInfo();
  257. // If password is incorrect
  258. if (strcmp($aAccountInfo['password'], $sPassword) !== 0) {
  259. bx_import('BxDolLanguages');
  260. return _t("_sys_txt_login_error");
  261. }
  262. // If wrong account role
  263. if (!((int)$aAccountInfo['role'] & $iRole)) {
  264. bx_import('BxDolLanguages');
  265. return _t("_sys_txt_login_invalid_role");
  266. }
  267. return '';
  268. }
  269. /**
  270. * Declare that content is require user authoriztion and display login form if user isn't logged in
  271. * @param $bStudio require webmaster authorization
  272. */
  273. function bx_require_authentication ($bStudio = false, $bAjaxMode = false, $sForceRelocate = '')
  274. {
  275. $iRole = BX_DOL_ROLE_MEMBER;
  276. if ($bStudio)
  277. $iRole = BX_DOL_ROLE_ADMIN;
  278. $sID = 0;
  279. $sPassword = '';
  280. if (getParam('sys_session_auth')) {
  281. $o = BxDolSession::getInstance();
  282. $sID = $o->getUserId();
  283. $sPassword = $sID ? BxDolAccountQuery::getInstance()->getPassword($sID) : '';
  284. }
  285. else {
  286. $sID = isset($_COOKIE['memberID']) ? bx_process_input($_COOKIE['memberID']) : false;
  287. $sPassword = isset($_COOKIE['memberPassword']) ? bx_process_input($_COOKIE['memberPassword']) : false;
  288. }
  289. if (bx_check_login($sID, $sPassword, $iRole)) {
  290. bx_login_form($bStudio, $bAjaxMode, $sForceRelocate);
  291. }
  292. check_logged();
  293. }
  294. /**
  295. * Display login form and exit
  296. * @param $bStudio display login form for studio
  297. * @param $bAjaxMode login form displayed via AJAX
  298. * @param sForceRelocate forece relocate
  299. */
  300. function bx_login_form($bStudio = false, $bAjaxMode = false, $sForceRelocate = '')
  301. {
  302. if ($bStudio == 1) {
  303. BxTemplStudioFunctions::getInstance()->getLoginForm();
  304. exit;
  305. }
  306. $sFormCode = BxDolService::call('system', 'login_form', array('', $sForceRelocate), 'TemplServiceLogin');
  307. if ($bAjaxMode) {
  308. echo $GLOBALS['oFunctions']->transBox('', $sFormCode, false, true);
  309. exit;
  310. }
  311. $oPage = BxDolPage::getObjectInstance('sys_login');
  312. if($oPage)
  313. $oPage->displayPage();
  314. else
  315. BxDolTemplate::getInstance()->displayPageNotFound();
  316. exit;
  317. }
  318. check_logged();
  319. /** @} */