/engine/lib/user_settings.php

https://github.com/wangaiying/elgg4ysu · PHP · 352 lines · 236 code · 38 blank · 78 comment · 69 complexity · 532cc5b0e50749d8f96d24e0a95a8140 MD5 · raw file

  1. <?php
  2. /**
  3. * Elgg user settings functions.
  4. * Functions for adding and manipulating options on the user settings panel.
  5. *
  6. * @package Elgg.Core
  7. * @subpackage Settings.User
  8. */
  9. /**
  10. * Saves user settings.
  11. *
  12. * @todo this assumes settings are coming in on a GET/POST request
  13. *
  14. * @note This is a handler for the 'usersettings:save', 'user' plugin hook
  15. *
  16. * @return void
  17. * @access private
  18. */
  19. function users_settings_save() {
  20. elgg_set_user_language();
  21. elgg_set_user_password();
  22. elgg_set_user_default_access();
  23. elgg_set_user_name();
  24. elgg_set_user_email();
  25. }
  26. /**
  27. * Set a user's password
  28. *
  29. * @return bool
  30. * @since 1.8.0
  31. * @access private
  32. */
  33. function elgg_set_user_password() {
  34. $current_password = get_input('current_password');
  35. $password = get_input('password');
  36. $password2 = get_input('password2');
  37. $user_guid = get_input('guid');
  38. if (!$user_guid) {
  39. $user = elgg_get_logged_in_user_entity();
  40. } else {
  41. $user = get_entity($user_guid);
  42. }
  43. if ($user && $password) {
  44. // let admin user change anyone's password without knowing it except his own.
  45. if (!elgg_is_admin_logged_in() || elgg_is_admin_logged_in() && $user->guid == elgg_get_logged_in_user_guid()) {
  46. $credentials = array(
  47. 'username' => $user->username,
  48. 'password' => $current_password
  49. );
  50. try {
  51. pam_auth_userpass($credentials);
  52. } catch (LoginException $e) {
  53. register_error(elgg_echo('LoginException:ChangePasswordFailure'));
  54. return false;
  55. }
  56. }
  57. try {
  58. $result = validate_password($password);
  59. } catch (RegistrationException $e) {
  60. register_error($e->getMessage());
  61. return false;
  62. }
  63. if ($result) {
  64. if ($password == $password2) {
  65. $user->salt = generate_random_cleartext_password(); // Reset the salt
  66. $user->password = generate_user_password($user, $password);
  67. if ($user->save()) {
  68. system_message(elgg_echo('user:password:success'));
  69. return true;
  70. } else {
  71. register_error(elgg_echo('user:password:fail'));
  72. }
  73. } else {
  74. register_error(elgg_echo('user:password:fail:notsame'));
  75. }
  76. } else {
  77. register_error(elgg_echo('user:password:fail:tooshort'));
  78. }
  79. } else {
  80. // no change
  81. return null;
  82. }
  83. return false;
  84. }
  85. /**
  86. * Set a user's display name
  87. *
  88. * @return bool
  89. * @since 1.8.0
  90. * @access private
  91. */
  92. function elgg_set_user_name() {
  93. $name = strip_tags(get_input('name'));
  94. $user_id = get_input('guid');
  95. if (!$user_id) {
  96. $user = elgg_get_logged_in_user_entity();
  97. } else {
  98. $user = get_entity($user_id);
  99. }
  100. if (elgg_strlen($name) > 50) {
  101. register_error(elgg_echo('user:name:fail'));
  102. return false;
  103. }
  104. if (($user) && ($user->canEdit()) && ($name)) {
  105. if ($name != $user->name) {
  106. $user->name = $name;
  107. if ($user->save()) {
  108. system_message(elgg_echo('user:name:success'));
  109. return true;
  110. } else {
  111. register_error(elgg_echo('user:name:fail'));
  112. }
  113. } else {
  114. // no change
  115. return null;
  116. }
  117. } else {
  118. register_error(elgg_echo('user:name:fail'));
  119. }
  120. return false;
  121. }
  122. /**
  123. * Set a user's language
  124. *
  125. * @return bool
  126. * @since 1.8.0
  127. * @access private
  128. */
  129. function elgg_set_user_language() {
  130. $language = get_input('language');
  131. $user_id = get_input('guid');
  132. if (!$user_id) {
  133. $user = elgg_get_logged_in_user_entity();
  134. } else {
  135. $user = get_entity($user_id);
  136. }
  137. if (($user) && ($language)) {
  138. if (strcmp($language, $user->language) != 0) {
  139. $user->language = $language;
  140. if ($user->save()) {
  141. system_message(elgg_echo('user:language:success'));
  142. return true;
  143. } else {
  144. register_error(elgg_echo('user:language:fail'));
  145. }
  146. } else {
  147. // no change
  148. return null;
  149. }
  150. } else {
  151. register_error(elgg_echo('user:language:fail'));
  152. }
  153. return false;
  154. }
  155. /**
  156. * Set a user's email address
  157. *
  158. * @return bool
  159. * @since 1.8.0
  160. * @access private
  161. */
  162. function elgg_set_user_email() {
  163. $email = get_input('email');
  164. $user_id = get_input('guid');
  165. if (!$user_id) {
  166. $user = elgg_get_logged_in_user_entity();
  167. } else {
  168. $user = get_entity($user_id);
  169. }
  170. if (!is_email_address($email)) {
  171. register_error(elgg_echo('email:save:fail'));
  172. return false;
  173. }
  174. if ($user) {
  175. if (strcmp($email, $user->email) != 0) {
  176. if (!get_user_by_email($email)) {
  177. if ($user->email != $email) {
  178. $user->email = $email;
  179. if ($user->save()) {
  180. system_message(elgg_echo('email:save:success'));
  181. return true;
  182. } else {
  183. register_error(elgg_echo('email:save:fail'));
  184. }
  185. }
  186. } else {
  187. register_error(elgg_echo('registration:dupeemail'));
  188. }
  189. } else {
  190. // no change
  191. return null;
  192. }
  193. } else {
  194. register_error(elgg_echo('email:save:fail'));
  195. }
  196. return false;
  197. }
  198. /**
  199. * Set a user's default access level
  200. *
  201. * @return bool
  202. * @since 1.8.0
  203. * @access private
  204. */
  205. function elgg_set_user_default_access() {
  206. if (!elgg_get_config('allow_user_default_access')) {
  207. return false;
  208. }
  209. $default_access = get_input('default_access');
  210. $user_id = get_input('guid');
  211. if (!$user_id) {
  212. $user = elgg_get_logged_in_user_entity();
  213. } else {
  214. $user = get_entity($user_id);
  215. }
  216. if ($user) {
  217. $current_default_access = $user->getPrivateSetting('elgg_default_access');
  218. if ($default_access !== $current_default_access) {
  219. if ($user->setPrivateSetting('elgg_default_access', $default_access)) {
  220. system_message(elgg_echo('user:default_access:success'));
  221. return true;
  222. } else {
  223. register_error(elgg_echo('user:default_access:fail'));
  224. }
  225. } else {
  226. // no change
  227. return null;
  228. }
  229. } else {
  230. register_error(elgg_echo('user:default_access:fail'));
  231. }
  232. return false;
  233. }
  234. /**
  235. * Set up the menu for user settings
  236. *
  237. * @return void
  238. * @access private
  239. */
  240. function usersettings_pagesetup() {
  241. if (elgg_get_context() == "settings" && elgg_get_logged_in_user_guid()) {
  242. $user = elgg_get_logged_in_user_entity();
  243. $params = array(
  244. 'name' => '1_account',
  245. 'text' => elgg_echo('usersettings:user:opt:linktext'),
  246. 'href' => "settings/user/{$user->username}",
  247. );
  248. elgg_register_menu_item('page', $params);
  249. $params = array(
  250. 'name' => '1_plugins',
  251. 'text' => elgg_echo('usersettings:plugins:opt:linktext'),
  252. 'href' => "settings/plugins/{$user->username}",
  253. );
  254. elgg_register_menu_item('page', $params);
  255. $params = array(
  256. 'name' => '1_statistics',
  257. 'text' => elgg_echo('usersettings:statistics:opt:linktext'),
  258. 'href' => "settings/statistics/{$user->username}",
  259. );
  260. elgg_register_menu_item('page', $params);
  261. }
  262. }
  263. /**
  264. * Page handler for user settings
  265. *
  266. * @param array $page Pages array
  267. *
  268. * @return bool
  269. * @access private
  270. */
  271. function usersettings_page_handler($page) {
  272. global $CONFIG;
  273. if (!isset($page[0])) {
  274. $page[0] = 'user';
  275. }
  276. if (isset($page[1])) {
  277. $user = get_user_by_username($page[1]);
  278. elgg_set_page_owner_guid($user->guid);
  279. } else {
  280. $user = elgg_get_logged_in_user_guid();
  281. elgg_set_page_owner_guid($user->guid);
  282. }
  283. elgg_push_breadcrumb(elgg_echo('settings'), "settings/user/$user->username");
  284. switch ($page[0]) {
  285. case 'statistics':
  286. elgg_push_breadcrumb(elgg_echo('usersettings:statistics:opt:linktext'));
  287. $path = $CONFIG->path . "pages/settings/statistics.php";
  288. break;
  289. case 'plugins':
  290. elgg_push_breadcrumb(elgg_echo('usersettings:plugins:opt:linktext'));
  291. $path = $CONFIG->path . "pages/settings/tools.php";
  292. break;
  293. case 'user':
  294. $path = $CONFIG->path . "pages/settings/account.php";
  295. break;
  296. }
  297. if (isset($path)) {
  298. require $path;
  299. return true;
  300. }
  301. }
  302. /**
  303. * Initialize the user settings library
  304. *
  305. * @return void
  306. * @access private
  307. */
  308. function usersettings_init() {
  309. elgg_register_page_handler('settings', 'usersettings_page_handler');
  310. elgg_register_plugin_hook_handler('usersettings:save', 'user', 'users_settings_save');
  311. elgg_register_action("usersettings/save");
  312. }
  313. elgg_register_event_handler('init', 'system', 'usersettings_init');
  314. elgg_register_event_handler('pagesetup', 'system', 'usersettings_pagesetup');