profiles.inc.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <?php defined('BX_DOL') or defined('BX_DOL_INSTALL') or die('hack attempt');
  2. /**
  3. * Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
  4. * CC-BY License - http://creativecommons.org/licenses/by/3.0/
  5. *
  6. * @defgroup DolphinCore Dolphin Core
  7. * @{
  8. */
  9. /**
  10. * @return corrently logged in profile id
  11. */
  12. function bx_get_logged_profile_id ()
  13. {
  14. bx_import('BxDolProfile');
  15. $o = BxDolProfile::getInstance();
  16. return $o ? $o->id() : false;
  17. }
  18. /**
  19. * @return true if user is logged in
  20. */
  21. function isLogged()
  22. {
  23. return getLoggedId() != 0;
  24. }
  25. /**
  26. * @return logged in account id
  27. */
  28. function getLoggedId()
  29. {
  30. return isset($_COOKIE['memberID']) && (!empty($GLOBALS['logged']['member']) || !empty($GLOBALS['logged']['admin'])) ? (int)$_COOKIE['memberID'] : 0;
  31. }
  32. /**
  33. * @return logged in account password
  34. */
  35. function getLoggedPassword()
  36. {
  37. return isset($_COOKIE['memberPassword']) && ($GLOBALS['logged']['member'] || $GLOBALS['logged']['admin']) ? $_COOKIE['memberPassword'] : '';
  38. }
  39. /**
  40. * It checks if account role is member.
  41. */
  42. function isMember($iId = 0)
  43. {
  44. return isRole(BX_DOL_ROLE_MEMBER, $iId);
  45. }
  46. if (!function_exists("isAdmin")) {
  47. /**
  48. * @return true if account is admin
  49. */
  50. function isAdmin($iId = 0)
  51. {
  52. if (!$iId && isset($GLOBALS['logged']['admin']) && $GLOBALS['logged']['admin']) // easier check for currently logged in user
  53. return true;
  54. return isRole(BX_DOL_ROLE_ADMIN, $iId);
  55. }
  56. }
  57. /**
  58. * Check user role
  59. * @param $iRole role to check user for
  60. * @param $iId optional account id, if it isn't specified then curently logged in account is used
  61. * @return true if user is in the provided role
  62. */
  63. function isRole($iRole, $iId = 0)
  64. {
  65. if (!(int)$iId)
  66. $iId = getLoggedId();
  67. bx_import('BxDolAccount');
  68. $oAccount = BxDolAccount::getInstance($iId);
  69. if (!$oAccount)
  70. return false;
  71. $aAccountInfo = $oAccount->getInfo();
  72. if (!$aAccountInfo)
  73. return false;
  74. if (!((int)$aAccountInfo['role'] & $iRole))
  75. return false;
  76. return true;
  77. }
  78. /**
  79. * Login user by setting necessary cookies
  80. * @param $iId account id
  81. * @return false if id isn't correct or array of user info if user was logged in
  82. */
  83. function bx_login($iId, $bRememberMe = false)
  84. {
  85. bx_import('BxDolAccountQuery');
  86. $oAccountQuery = BxDolAccountQuery::getInstance();
  87. $sPassword = $oAccountQuery->getPassword($iId);
  88. if (!$sPassword)
  89. return false;
  90. $aUrl = parse_url(BX_DOL_URL_ROOT);
  91. $sPath = isset($aUrl['path']) && !empty($aUrl['path']) ? $aUrl['path'] : '/';
  92. $sHost = '';
  93. $iCookieTime = $bRememberMe ? time() + 24*60*60*30 : 0;
  94. setcookie("memberID", $iId, $iCookieTime, $sPath, $sHost);
  95. $_COOKIE['memberID'] = $iId;
  96. setcookie("memberPassword", $sPassword, $iCookieTime, $sPath, $sHost, false, true /* http only */);
  97. $_COOKIE['memberPassword'] = $sPassword;
  98. bx_import('BxDolSession');
  99. BxDolSession::getInstance()->setUserId($iId);
  100. $oAccountQuery->updateLoggedIn($iId);
  101. bx_alert('account', 'login', $iId);
  102. return $oAccountQuery->getInfoById($iId);
  103. }
  104. /**
  105. * Logout user by removing cookies
  106. */
  107. function bx_logout($bNotify = true)
  108. {
  109. if ($bNotify && isMember())
  110. bx_alert('account', 'logout', (int)$_COOKIE['memberID']);
  111. $aUrl = parse_url(BX_DOL_URL_ROOT);
  112. $sPath = isset($aUrl['path']) && !empty($aUrl['path']) ? $aUrl['path'] : '/';
  113. setcookie('memberID', '', time() - 96 * 3600, $sPath);
  114. setcookie('memberPassword', '', time() - 96 * 3600, $sPath);
  115. unset($_COOKIE['memberID']);
  116. unset($_COOKIE['memberPassword']);
  117. bx_import('BxDolSession');
  118. BxDolSession::getInstance()->destroy();
  119. }
  120. /**
  121. * Check if user is logged in (necessary cookies are present) and set some global variables
  122. */
  123. function check_logged()
  124. {
  125. $aAccTypes = array(
  126. BX_DOL_ROLE_ADMIN => 'admin',
  127. BX_DOL_ROLE_MEMBER => 'member'
  128. );
  129. $sID = isset($_COOKIE['memberID']) ? bx_process_input($_COOKIE['memberID']) : false;
  130. $sPassword = isset($_COOKIE['memberPassword']) ? bx_process_input($_COOKIE['memberPassword']) : false;
  131. $bLogged = false;
  132. foreach ($aAccTypes as $iRole => $sValue) {
  133. if ($GLOBALS['logged'][$sValue] = ($sID && !bx_check_login($sID, $sPassword, $iRole))) {
  134. $bLogged = true;
  135. break;
  136. }
  137. }
  138. if ((isset($_COOKIE['memberID']) || isset($_COOKIE['memberPassword'])) && !$bLogged)
  139. bx_logout(false);
  140. }
  141. /**
  142. * Check unencrypted password
  143. * @return empty string on success or error string on error
  144. */
  145. function bx_check_password($sLogin, $sPassword, $iRole = BX_DOL_ROLE_MEMBER)
  146. {
  147. bx_import('BxDolAccount');
  148. $oAccount = BxDolAccount::getInstance($sLogin);
  149. if (!$oAccount) {
  150. bx_import('BxDolLanguages');
  151. return _t("_sys_txt_login_error");
  152. }
  153. $aAccountInfo = $oAccount->getInfo();
  154. $sPassCheck = encryptUserPwd($sPassword, $aAccountInfo['salt']);
  155. if ($sErrorMsg = bx_check_login($aAccountInfo['id'], $sPassCheck, $iRole))
  156. return $sErrorMsg;
  157. // Admin can always login even if he is blocked/banned/suspended/etc
  158. if (isAdmin($aAccountInfo['id']))
  159. return '';
  160. $sErrorMsg = '';
  161. bx_alert('account', 'check_login', $aAccountInfo['id'], false, array('error_msg' => &$sErrorMsg));
  162. return $sErrorMsg;
  163. }
  164. /**
  165. * Check encrypted password (ex., from Cookie)
  166. * @return empty string on success or error string on error
  167. */
  168. function bx_check_login($iID, $sPassword, $iRole = BX_DOL_ROLE_MEMBER)
  169. {
  170. bx_import('BxDolAccount');
  171. $oAccount = BxDolAccount::getInstance((int)$iID);
  172. // If no such account available
  173. if (!$oAccount) {
  174. bx_import('BxDolLanguages');
  175. return _t("_sys_txt_login_error");
  176. }
  177. $aAccountInfo = $oAccount->getInfo();
  178. // If password is incorrect
  179. if (strcmp($aAccountInfo['password'], $sPassword) != 0) {
  180. bx_import('BxDolLanguages');
  181. return _t("_sys_txt_login_error");
  182. }
  183. // If wrong account role
  184. if (!((int)$aAccountInfo['role'] & $iRole)) {
  185. bx_import('BxDolLanguages');
  186. return _t("_sys_txt_login_invalid_role");
  187. }
  188. return '';
  189. }
  190. /**
  191. * Declare that content is require user authoriztion and display login form if user isn't logged in
  192. * @param $bStudio require webmaster authorization
  193. */
  194. function bx_require_authentication ($bStudio = false)
  195. {
  196. $iRole = BX_DOL_ROLE_MEMBER;
  197. if ($bStudio)
  198. $iRole = BX_DOL_ROLE_ADMIN;
  199. $sID = isset($_COOKIE['memberID']) ? bx_process_input($_COOKIE['memberID']) : false;
  200. $sPassword = isset($_COOKIE['memberPassword']) ? bx_process_input($_COOKIE['memberPassword']) : false;
  201. if (bx_check_login($sID, $sPassword, $iRole)) {
  202. bx_login_form($bStudio);
  203. }
  204. check_logged();
  205. }
  206. /**
  207. * Display login form and exit
  208. * @param $bStudio display login form for studio
  209. * @param $bAjaxMode login form displayed via AJAX
  210. */
  211. function bx_login_form($bStudio = false, $bAjaxMode = false)
  212. {
  213. if ($bStudio == 1) {
  214. bx_import("BxTemplStudioFunctions");
  215. BxTemplStudioFunctions::getInstance()->getLoginForm();
  216. exit;
  217. }
  218. $sFormCode = BxDolService::call('system', 'login_form', array(), 'TemplServiceLogin');
  219. if ($bAjaxMode) {
  220. echo $GLOBALS['oFunctions']->transBox('', $sFormCode, false, true);
  221. exit;
  222. }
  223. BxDolTemplate::getInstance()->setPageNameIndex (BX_PAGE_DEFAULT);
  224. BxDolTemplate::getInstance()->setPageHeader (getParam('site_title') . ' ' . _t("_Member Login"));
  225. BxDolTemplate::getInstance()->setPageContent ('page_main_code', DesignBoxContent(_t("_Member Login"), $sFormCode, BX_DB_PADDING_DEF));
  226. BxDolTemplate::getInstance()->getPageCode();
  227. exit;
  228. }
  229. check_logged();
  230. /** @} */