Fork of FusionPBX but with LDAP kinda working
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.

434 lines
50 KiB

2 years ago
  1. <?php
  2. /*
  3. FusionPBX
  4. Version: MPL 1.1
  5. The contents of this file are subject to the Mozilla Public License Version
  6. 1.1 (the "License"); you may not use this file except in compliance with
  7. the License. You may obtain a copy of the License at
  8. http://www.mozilla.org/MPL/
  9. Software distributed under the License is distributed on an "AS IS" basis,
  10. WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11. for the specific language governing rights and limitations under the
  12. License.
  13. The Original Code is FusionPBX
  14. The Initial Developer of the Original Code is
  15. Mark J Crane <markjcrane@fusionpbx.com>
  16. Portions created by the Initial Developer are Copyright (C) 2008-2020
  17. the Initial Developer. All Rights Reserved.
  18. Contributor(s):
  19. Mark J Crane <markjcrane@fusionpbx.com>
  20. */
  21. //add multi-lingual support
  22. $language = new text;
  23. $text = $language->get(null,'core/user_settings');
  24. //get action, if any
  25. if (isset($_REQUEST['action'])) {
  26. $action = $_REQUEST['action'];
  27. }
  28. //retrieve parse reset key
  29. if ($action == 'define') {
  30. $key = $_GET['key'];
  31. $key_part = explode('|', decrypt($_SESSION['login']['password_reset_key']['text'], $key));
  32. $username = $key_part[0];
  33. $domain_uuid = $key_part[1];
  34. $password_submitted = $key_part[2];
  35. //get current salt, see if same as submitted salt
  36. $sql = "select password from v_users ";
  37. $sql .= "where domain_uuid = :domain_uuid ";
  38. $sql .= "and username = :username ";
  39. $parameters['domain_uuid'] = $domain_uuid;
  40. $parameters['username'] = $username;
  41. $database = new database;
  42. $password_current = $database->select($sql, $parameters, 'column');
  43. unset($sql, $parameters);
  44. //set flag
  45. if ($username != '' && $password_submitted == $password_current) {
  46. $password_reset = true;
  47. $_SESSION['valid_username'] = $username;
  48. $_SESSION['valid_domain'] = $domain_uuid;
  49. }
  50. else {
  51. header("Location: /login.php");
  52. exit;
  53. }
  54. }
  55. //send password reset link
  56. if ($action == 'request') {
  57. if (valid_email($_REQUEST['email'])) {
  58. $email = $_REQUEST['email'];
  59. //see if email exists
  60. $sql = "select ";
  61. $sql .= "user_uuid, ";
  62. $sql .= "username, ";
  63. $sql .= "password, ";
  64. $sql .= "domain_uuid ";
  65. $sql .= "from ";
  66. $sql .= "v_users ";
  67. $sql .= "where user_email = :email ";
  68. $parameters['email'] = $email;
  69. $database = new database;
  70. $results = $database->select($sql, $parameters, 'all');
  71. unset($sql, $parameters);
  72. //check for duplicates
  73. if (is_array($results) && @sizeof($results) != 0) {
  74. if (@sizeof($results) == 1) {
  75. $result = $results[0];
  76. if ($result['username'] != '') {
  77. //generate reset link email and body variables
  78. $domain_uuid = $result['domain_uuid'];
  79. if ($_SESSION['login']['password_reset_domain']['text'] != '') {
  80. $domain_name = $_SESSION['login']['password_reset_domain']['text'];
  81. }
  82. else {
  83. foreach ($_SESSION['domains'] as $uuid => $domain) {
  84. if (strtolower($domain['domain_name']) == strtolower($_SERVER['HTTP_HOST'])) {
  85. $domain_name = $_SERVER['HTTP_HOST'];
  86. break;
  87. }
  88. }
  89. $domain_name = $domain_name ? $domain_name : $_SESSION['domains'][$domain_uuid]['domain_name'];
  90. }
  91. $key = encrypt($_SESSION['login']['password_reset_key']['text'], $result['username'].'|'.$result['domain_uuid'].'|'.$result['password']);
  92. $reset_link = "https://".$domain_name.PROJECT_PATH."/login.php?action=define&key=".urlencode($key);
  93. $reset_button = email_button(strtoupper($text['label-reset_password']), $reset_link, ($_SESSION['theme']['button_background_color_email']['text'] ? $_SESSION['theme']['button_background_color_email']['text'] : '#2e82d0'), ($_SESSION['theme']['button_text_color_email']['text'] ? $_SESSION['theme']['button_text_color_email']['text'] : '#ffffff'));
  94. $logo_full = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAABGCAYAAADl5IkzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NjAzQjkyMEYxMzA5MTFFNEJCMEVBNTk1RkYzM0FEMjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NjAzQjkyMTAxMzA5MTFFNEJCMEVBNTk1RkYzM0FEMjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MDNCOTIwRDEzMDkxMUU0QkIwRUE1OTVGRjMzQUQyNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2MDNCOTIwRTEzMDkxMUU0QkIwRUE1OTVGRjMzQUQyNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PufA528AAFJVSURBVHja7H0HnBRV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
  95. $logo_shield = 'data:image/png;base64,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';
  96. //get user language code, if exists
  97. $sql = "select user_setting_value from v_user_settings ";
  98. $sql .= "where user_uuid = :user_uuid ";
  99. $sql .= "and domain_uuid = :domain_uuid ";
  100. $sql .= "and user_setting_category = 'domain' ";
  101. $sql .= "and user_setting_subcategory = 'language' ";
  102. $sql .= "and user_setting_name = 'code' ";
  103. $parameters['user_uuid'] = $result['user_uuid'];
  104. $parameters['domain_uuid'] = $domain_uuid;
  105. $database = new database;
  106. $row = $database->select($sql, $parameters, 'row');
  107. if (is_array($row) && @sizeof($row) != 0) {
  108. $user_language_code = $row['user_setting_value'];
  109. }
  110. unset($sql, $parameters, $row);
  111. //get email template from db
  112. $sql = "select template_subject, template_body from v_email_templates ";
  113. $sql .= "where template_language = :template_language ";
  114. $sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
  115. $sql .= "and template_category = 'password_reset' ";
  116. $sql .= "and template_subcategory = 'default' ";
  117. $sql .= "and template_type = 'html' ";
  118. $sql .= "and template_enabled = 'true' ";
  119. $parameters['template_language'] = $user_language_code ? $user_language_code : $_SESSION['domain']['language']['code'];
  120. $parameters['domain_uuid'] = $domain_uuid;
  121. $database = new database;
  122. $row = $database->select($sql, $parameters, 'row');
  123. if (is_array($row)) {
  124. $email_subject = $row['template_subject'];
  125. $email_body = $row['template_body'];
  126. }
  127. unset($sql, $parameters, $row);
  128. //replace variables in email body
  129. $email_body = str_replace('${reset_link}', $reset_link, $email_body);
  130. $email_body = str_replace('${reset_button}', $reset_button, $email_body);
  131. $email_body = str_replace('${logo_full}', $logo_full, $email_body);
  132. $email_body = str_replace('${logo_shield}', $logo_shield, $email_body);
  133. $email_body = str_replace('${domain}', $domain_name, $email_body);
  134. //send reset link
  135. if (send_email($email, $email_subject, $email_body, $eml_error)) {
  136. //email sent
  137. message::add($text['message-reset_link_sent'], 'positive', 2500);
  138. }
  139. else {
  140. //email failed
  141. message::add($eml_error, 'negative', 5000);
  142. }
  143. }
  144. else {
  145. //not found
  146. message::add($text['message-invalid_email'], 'negative', 5000);
  147. }
  148. }
  149. else {
  150. //matched multiple users
  151. message::add($text['message-email_assigned_mutliple_users'], 'negative', 5000);
  152. }
  153. }
  154. else {
  155. //not found
  156. message::add($text['message-invalid_email'], 'negative', 5000);
  157. }
  158. }
  159. else {
  160. //invalid email
  161. message::add($text['message-invalid_email'], 'negative', 5000);
  162. }
  163. }
  164. //reset password
  165. if ($action == 'reset') {
  166. $username = trim($_REQUEST['username']);
  167. $password_new = trim($_REQUEST['password_new']);
  168. $password_repeat = trim($_REQUEST['password_repeat']);
  169. //if not requiring usernames to be of email format, strip off @domain as the valid domain for the reset is already being provided in the where clause below
  170. if ($_SESSION['users']['username_format']['text'] != 'email') {
  171. $username = substr_count($username, '@') != 0 ? explode('@', $username)[0] : $username;
  172. }
  173. if ($username !== '' &&
  174. $username === $_SESSION['valid_username'] &&
  175. $password_new !== '' &&
  176. $password_repeat !== '' &&
  177. $password_new === $password_repeat
  178. ) {
  179. if (!check_password_strength($password_new, $text, 'user')) {
  180. $password_reset = true;
  181. }
  182. else {
  183. $salt = uuid();
  184. $sql = "update v_users set ";
  185. $sql .= "password = :password, ";
  186. $sql .= "salt = :salt ";
  187. $sql .= "where domain_uuid = :domain_uuid ";
  188. $sql .= "and username = :username ";
  189. $parameters['domain_uuid'] = $_SESSION['valid_domain'];
  190. $parameters['password'] = md5($salt.$password_new);
  191. $parameters['salt'] = $salt;
  192. $parameters['username'] = $username;
  193. $database = new database;
  194. $database->execute($sql, $parameters);
  195. unset($sql, $parameters);
  196. message::add($text['message-password_reset'], 'positive', 2500);
  197. unset($_SESSION['valid_username'], $_SESSION['valid_domain']);
  198. header('Location: //'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
  199. exit;
  200. }
  201. }
  202. else {
  203. //not found
  204. message::add($text['message-invalid_username_mismatch_passwords'], 'negative', 5000);
  205. $password_reset = true;
  206. }
  207. }
  208. //get the http values and set as variables
  209. $msg = isset($_GET["msg"]) ? $_GET["msg"] : null;
  210. //set variable if not set
  211. if (!isset($_SESSION['login']['domain_name_visible']['boolean'])) { $_SESSION['login']['domain_name_visible']['boolean'] = null; }
  212. //santize the login destination url and set a default value
  213. if (isset($_SESSION['login']['destination']['url'])) {
  214. $destination_path = parse_url($_SESSION['login']['destination']['url'])['path'];
  215. $destination_query = parse_url($_SESSION['login']['destination']['url'])['query'];
  216. $destination_path = preg_replace('#[^a-zA-Z0-9_\-\./]#', '', $destination_path);
  217. $destination_query = preg_replace('#[^a-zA-Z0-9_\-\./&=]#', '', $destination_query);
  218. $_SESSION['login']['destination']['url'] = (strlen($destination_query) > 0) ? $destination_path.'?'.$destination_query : $destination_path;
  219. }
  220. else {
  221. $_SESSION['login']['destination']['url'] = PROJECT_PATH."/core/dashboard/";
  222. }
  223. if (strlen($_REQUEST['path']) > 0) {
  224. $_SESSION['redirect_path'] = $_REQUEST['path'];
  225. }
  226. //add the header
  227. $document['title'] = $text['title-login'];
  228. include "resources/header.php";
  229. //show the content
  230. echo "<script>";
  231. echo " var speed = 350;";
  232. echo " function toggle_password_reset(hide_id, show_id, focus_id) {";
  233. echo " if (focus_id == undefined) { focus_id = ''; }";
  234. echo " $('#'+hide_id).slideToggle(speed, function() {";
  235. echo " $('#'+show_id).slideToggle(speed, function() {";
  236. echo " if (focus_id != '') {";
  237. echo " $('#'+focus_id).trigger('focus');";
  238. echo " }";
  239. echo " });";
  240. echo " });";
  241. echo " }";
  242. echo "</script>";
  243. echo "<br />\n";
  244. if (!$password_reset) {
  245. //create token
  246. $object = new token;
  247. $token = $object->create('login');
  248. echo "<div id='login_form'>\n";
  249. echo "<form name='login' method='post' action='".$_SESSION['login']['destination']['url']."'>\n";
  250. echo "<input type='text' class='txt login' style='text-align: center; min-width: 200px; width: 200px; margin-bottom: 8px;' name='username' id='username' placeholder=\"".$text['label-username']."\"><br />\n";
  251. echo "<input type='password' class='txt login' style='text-align: center; min-width: 200px; width: 200px; margin-bottom: 8px;' name='password' placeholder=\"".$text['label-password']."\"><br />\n";
  252. if ($_SESSION['login']['domain_name_visible']['boolean'] == "true") {
  253. if (count($_SESSION['login']['domain_name']) > 0) {
  254. $click_change_color = ($_SESSION['theme']['login_input_text_color']['text'] != '') ? $_SESSION['theme']['login_input_text_color']['text'] : (($_SESSION['theme']['input_text_color']['text'] != '') ? $_SESSION['theme']['input_text_color']['text'] : '#000000');
  255. $placeholder_color = ($_SESSION['theme']['login_input_text_placeholder_color']['text'] != '') ? 'color: '.$_SESSION['theme']['login_input_text_placeholder_color']['text'].';' : 'color: #999999;';
  256. echo "<select name='domain_name' class='txt login' style='".$placeholder_color." width: 200px; text-align: center; text-align-last: center; margin-bottom: 8px;' onclick=\"this.style.color='".$click_change_color."';\" onchange=\"this.style.color='".$click_change_color."';\">\n";
  257. echo " <option value='' disabled selected hidden>".$text['label-domain']."</option>\n";
  258. sort($_SESSION['login']['domain_name']);
  259. foreach ($_SESSION['login']['domain_name'] as &$row) {
  260. echo " <option value='".escape($row)."'>".escape($row)."</option>\n";
  261. }
  262. echo "</select><br />\n";
  263. }
  264. else {
  265. echo "<input type='text' name='domain_name' class='txt login' style='text-align: center; min-width: 200px; width: 200px; margin-bottom: 8px;' placeholder=\"".$text['label-domain']."\"><br />\n";
  266. }
  267. }
  268. echo "<input type='submit' id='btn_login' class='btn' style='width: 100px; margin-top: 15px;' value='".$text['button-login']."'>\n";
  269. if (
  270. function_exists('openssl_encrypt') &&
  271. $_SESSION['login']['password_reset_key']['text'] != '' &&
  272. $_SESSION['email']['smtp_host']['text'] != ''
  273. ) {
  274. echo "<br><br><a class='login_link' onclick=\"toggle_password_reset('login_form','request_form','email');\">".$text['label-reset_password']."</a>";
  275. }
  276. echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
  277. echo "</form>";
  278. echo "<script>$('#username').trigger('focus');</script>";
  279. echo "</div>";
  280. echo "<div id='request_form' style='display: none;'>\n";
  281. echo "<form name='request' method='post'>\n";
  282. echo "<input type='hidden' name='action' value='request'>\n";
  283. echo "<input type='text' class='txt login' style='text-align: center; min-width: 200px; width: 200px; margin-bottom: 8px;' name='email' id='email' placeholder=\"".$text['label-email_address']."\"><br />\n";
  284. echo "<input type='submit' id='btn_reset' class='btn' style='width: 100px; margin-top: 15px;' value='".$text['button-reset']."'>\n";
  285. echo "<br><br><a class='login_link' onclick=\"toggle_password_reset('request_form','login_form','username');\">".$text['label-cancel']."</a>";
  286. echo "</form>";
  287. echo "</div>";
  288. }
  289. else {
  290. echo "<script>\n";
  291. echo " function compare_passwords() {\n";
  292. echo " if (document.getElementById('password') === document.activeElement || document.getElementById('password_confirm') === document.activeElement) {\n";
  293. echo " if ($('#password').val() != '' || $('#password_confirm').val() != '') {\n";
  294. echo " if ($('#password').val() != $('#password_confirm').val()) {\n";
  295. echo " $('#password').removeClass('formfld_highlight_good');\n";
  296. echo " $('#password_confirm').removeClass('formfld_highlight_good');\n";
  297. echo " $('#password').addClass('formfld_highlight_bad');\n";
  298. echo " $('#password_confirm').addClass('formfld_highlight_bad');\n";
  299. echo " }\n";
  300. echo " else {\n";
  301. echo " $('#password').removeClass('formfld_highlight_bad');\n";
  302. echo " $('#password_confirm').removeClass('formfld_highlight_bad');\n";
  303. echo " $('#password').addClass('formfld_highlight_good');\n";
  304. echo " $('#password_confirm').addClass('formfld_highlight_good');\n";
  305. echo " }\n";
  306. echo " }\n";
  307. echo " }\n";
  308. echo " else {\n";
  309. echo " $('#password').removeClass('formfld_highlight_bad');\n";
  310. echo " $('#password_confirm').removeClass('formfld_highlight_bad');\n";
  311. echo " $('#password').removeClass('formfld_highlight_good');\n";
  312. echo " $('#password_confirm').removeClass('formfld_highlight_good');\n";
  313. echo " }\n";
  314. echo " }\n";
  315. $setting['length'] = $_SESSION['users']['password_length']['numeric'];
  316. $setting['number'] = ($_SESSION['users']['password_number']['boolean'] == 'true') ? true : false;
  317. $setting['lowercase'] = ($_SESSION['users']['password_lowercase']['boolean'] == 'true') ? true : false;
  318. $setting['uppercase'] = ($_SESSION['users']['password_uppercase']['boolean'] == 'true') ? true : false;
  319. $setting['special'] = ($_SESSION['users']['password_special']['boolean'] == 'true') ? true : false;
  320. echo " function check_password_strength(pwd) {\n";
  321. echo " if ($('#password').val() != '' || $('#password_confirm').val() != '') {\n";
  322. echo " var msg_errors = [];\n";
  323. if (is_numeric($setting['length']) && $setting['length'] != 0) {
  324. echo " var re = /.{".$setting['length'].",}/;\n"; //length
  325. echo " if (!re.test(pwd)) { msg_errors.push('".$setting['length']."+ ".$text['label-characters']."'); }\n";
  326. }
  327. if ($setting['number']) {
  328. echo " var re = /(?=.*[\d])/;\n"; //number
  329. echo " if (!re.test(pwd)) { msg_errors.push('1+ ".$text['label-numbers']."'); }\n";
  330. }
  331. if ($setting['lowercase']) {
  332. echo " var re = /(?=.*[a-z])/;\n"; //lowercase
  333. echo " if (!re.test(pwd)) { msg_errors.push('1+ ".$text['label-lowercase_letters']."'); }\n";
  334. }
  335. if ($setting['uppercase']) {
  336. echo " var re = /(?=.*[A-Z])/;\n"; //uppercase
  337. echo " if (!re.test(pwd)) { msg_errors.push('1+ ".$text['label-uppercase_letters']."'); }\n";
  338. }
  339. if ($setting['special']) {
  340. echo " var re = /(?=.*[\W])/;\n"; //special
  341. echo " if (!re.test(pwd)) { msg_errors.push('1+ ".$text['label-special_characters']."'); }\n";
  342. }
  343. echo " if (msg_errors.length > 0) {\n";
  344. echo " var msg = '".$text['message-password_requirements'].": ' + msg_errors.join(', ');\n";
  345. echo " display_message(msg, 'negative', '6000');\n";
  346. echo " return false;\n";
  347. echo " }\n";
  348. echo " else {\n";
  349. echo " return true;\n";
  350. echo " }\n";
  351. echo " }\n";
  352. echo " else {\n";
  353. echo " return true;\n";
  354. echo " }\n";
  355. echo " }\n";
  356. echo " function show_strenth_meter() {\n";
  357. echo " $('#pwstrength_progress').slideDown();\n";
  358. echo " }\n";
  359. echo "</script>\n";
  360. echo "<span id='reset_form'>\n";
  361. echo "<form name='reset' id='frm' method='post'>\n";
  362. echo "<input type='hidden' name='action' value='reset'>\n";
  363. echo "<input type='text' class='txt login' style='text-align: center; min-width: 200px; width: 200px; margin-bottom: 8px;' name='username' id='username' placeholder=\"".$text['label-username']."\"><br />\n";
  364. echo "<input type='password' class='txt login' style='text-align: center; min-width: 200px; width: 200px; margin-bottom: 4px;' name='password_new' id='password' autocomplete='off' placeholder=\"".$text['label-new_password']."\" onkeypress='show_strenth_meter();' onfocus='compare_passwords();' onkeyup='compare_passwords();' onblur='compare_passwords();'><br />\n";
  365. echo "<div id='pwstrength_progress' class='pwstrength_progress pwstrength_progress_password_reset'></div>";
  366. echo "<input type='password' class='txt login' style='text-align: center; min-width: 200px; width: 200px; margin-top: 4px; margin-bottom: 8px;' name='password_repeat' id='password_confirm' autocomplete='off' placeholder=\"".$text['label-repeat_password']."\" onfocus='compare_passwords();' onkeyup='compare_passwords();' onblur='compare_passwords();'><br />\n";
  367. echo "<input type='button' class='btn' style='width: 100px; margin-top: 15px;' value='".$text['button-save']."' onclick=\"if (check_password_strength(document.getElementById('password').value)) { submit_form(); }\">\n";
  368. echo "<br><br><a class='login_link' onclick=\"document.location.href='login.php';\">".$text['label-cancel']."</a>";
  369. echo "</form>";
  370. echo "<script>\n";
  371. echo " $('#username').trigger('focus');\n";
  372. // convert password fields to text
  373. echo " function submit_form() {\n";
  374. echo " hide_password_fields();\n";
  375. echo " $('form#frm').submit();\n";
  376. echo " }\n";
  377. echo "</script>\n";
  378. echo "</span>";
  379. }
  380. //add the footer
  381. $login_page = true;
  382. include "resources/footer.php";
  383. ?>