1. <?php
  2. /*
  3. UserSpice 4
  4. An Open Source PHP User Management System
  5. by the UserSpice Team at http://UserSpice.com
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation, either version 3 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. ?>
  18. <?php require_once '../users/init.php'; ?>
  19. <?php require_once $abs_us_root.$us_url_root.'users/includes/header.php'; ?>
  20. <?php require_once $abs_us_root.$us_url_root.'users/includes/navigation.php'; ?>
  21. <?php if (!securePage($_SERVER['PHP_SELF'])){die();} ?>
  22. <?php
  23. $validation = new Validate();
  24. //PHP Goes Here!
  25. $query = $db->query("SELECT * FROM email");
  26. $results = $query->first();
  27. $act = $results->email_act;
  28. $errors = [];
  29. $successes = [];
  30. $userId = Input::get('id');
  31. $email = $db->query("SELECT * FROM email")->first();
  32. //Check if selected user exists
  33. if(!userIdExists($userId)){
  34. Redirect::to('admin_users.php?err=That user does not exist.'); die();
  35. }
  36. $userdetails = fetchUserDetails(NULL, NULL, $userId); //Fetch user details
  37. //Forms posted
  38. if(!empty($_POST)) {
  39. $token = $_POST['csrf'];
  40. if(!Token::check($token)){
  41. die('Token doesn\'t match!');
  42. }else {
  43. if(!empty($_POST['delete'])){
  44. $deletions = $_POST['delete'];
  45. if ($deletion_count = deleteUsers($deletions)){
  46. Redirect::to('admin_users.php?msg='.lang("ACCOUNT_DELETIONS_SUCCESSFUL", array($deletion_count)));
  47. }
  48. else {
  49. $errors[] = lang("SQL_ERROR");
  50. }
  51. }
  52. else
  53. {
  54. //Update display name
  55. if ($userdetails->username != $_POST['username']){
  56. $displayname = Input::get("username");
  57. $fields=array('username'=>$displayname);
  58. $validation->check($_POST,array(
  59. 'username' => array(
  60. 'display' => 'Username',
  61. 'required' => true,
  62. 'unique_update' => 'users,'.$userId,
  63. 'min' => 1,
  64. 'max' => 25
  65. )
  66. ));
  67. if($validation->passed()){
  68. $db->update('users',$userId,$fields);
  69. $successes[] = "Username Updated";
  70. }else{
  71. }
  72. }
  73. //Update first name
  74. if ($userdetails->fname != $_POST['fname']){
  75. $fname = Input::get("fname");
  76. $fields=array('fname'=>$fname);
  77. $validation->check($_POST,array(
  78. 'fname' => array(
  79. 'display' => 'First Name',
  80. 'required' => true,
  81. 'min' => 1,
  82. 'max' => 25
  83. )
  84. ));
  85. if($validation->passed()){
  86. $db->update('users',$userId,$fields);
  87. $successes[] = "First Name Updated";
  88. }else{
  89. ?><div id="form-errors">
  90. <?=$validation->display_errors();?></div>
  91. <?php
  92. }
  93. }
  94. //Update last name
  95. if ($userdetails->lname != $_POST['lname']){
  96. $lname = Input::get("lname");
  97. $fields=array('lname'=>$lname);
  98. $validation->check($_POST,array(
  99. 'lname' => array(
  100. 'display' => 'Last Name',
  101. 'required' => true,
  102. 'min' => 1,
  103. 'max' => 25
  104. )
  105. ));
  106. if($validation->passed()){
  107. $db->update('users',$userId,$fields);
  108. $successes[] = "Last Name Updated";
  109. }else{
  110. ?><div id="form-errors">
  111. <?=$validation->display_errors();?></div>
  112. <?php
  113. }
  114. }
  115. if(!empty($_POST['password'])) {
  116. $validation->check($_POST,array(
  117. 'password' => array(
  118. 'display' => 'New Password',
  119. 'required' => true,
  120. 'min' => $settings->min_pw,
  121. 'max' => $settings->max_pw,
  122. ),
  123. 'confirm' => array(
  124. 'display' => 'Confirm New Password',
  125. 'required' => true,
  126. 'matches' => 'password',
  127. ),
  128. ));
  129. if (empty($errors)) {
  130. //process
  131. $new_password_hash = password_hash(Input::get('password', true), PASSWORD_BCRYPT, array('cost' => 12));
  132. $user->update(array('password' => $new_password_hash,),$userId);
  133. $successes[]='Password updated.';
  134. }
  135. }
  136. if(isset($_POST['sendPwReset'])) {
  137. $params = array(
  138. 'username' => $userdetails->username,
  139. 'sitename' => $settings->site_name,
  140. 'fname' => $userdetails->fname,
  141. 'email' => rawurlencode($userdetails->email),
  142. 'vericode' => $userdetails->vericode,
  143. );
  144. $to = rawurlencode($userdetails->email);
  145. $subject = 'Password Reset';
  146. $body = email_body('_email_adminPwReset.php',$params);
  147. email($to,$subject,$body);
  148. $successes[] = "Password reset sent.";
  149. }
  150. //Block User
  151. if ($userdetails->permissions != $_POST['active']){
  152. $active = Input::get("active");
  153. $fields=array('permissions'=>$active);
  154. $db->update('users',$userId,$fields);
  155. $successes[] = "Set user access to $active.";
  156. }
  157. //Force PW User
  158. if ($userdetails->force_pr != $_POST['force_pr']){
  159. $force_pr = Input::get("force_pr");
  160. $fields=array('force_pr'=>$force_pr);
  161. $db->update('users',$userId,$fields);
  162. $successes[] = "Set force_pr to $force_pr.";
  163. }
  164. //Update email
  165. if ($userdetails->email != $_POST['email']){
  166. $email = Input::get("email");
  167. $fields=array('email'=>$email);
  168. $validation->check($_POST,array(
  169. 'email' => array(
  170. 'display' => 'Email',
  171. 'required' => true,
  172. 'valid_email' => true,
  173. 'unique_update' => 'users,'.$userId,
  174. 'min' => 3,
  175. 'max' => 75
  176. )
  177. ));
  178. if($validation->passed()){
  179. $db->update('users',$userId,$fields);
  180. $successes[] = "Email Updated";
  181. }else{
  182. ?><div id="form-errors">
  183. <?=$validation->display_errors();?></div>
  184. <?php
  185. }
  186. }
  187. //Update validation
  188. if($email->email_act==1) {
  189. $email_verified = Input::get("email_verified");
  190. if (isset($email_verified) AND $email_verified == '1'){
  191. if ($userdetails->email_verified == 0){
  192. if (updateUser('email_verified', $userId, 1)){
  193. $successes[] = "Verification Updated";
  194. }else{
  195. $errors[] = lang("SQL_ERROR");
  196. }
  197. }
  198. }elseif ($userdetails->email_verified == 1){
  199. if (updateUser('email_verified', $userId, 0)){
  200. $successes[] = "Verification Updated";
  201. }else{
  202. $errors[] = lang("SQL_ERROR");
  203. }
  204. } }
  205. //Toggle protected setting
  206. if(in_array($user->data()->id,$master_account)) {
  207. $protected = Input::get("protected");
  208. if (isset($protected) AND $protected == '1'){
  209. if ($userdetails->protected == 0){
  210. if (updateUser('protected', $userId, 1)){
  211. $successes[] = lang("USER_PROTECTION", array("now"));
  212. }else{
  213. $errors[] = lang("SQL_ERROR");
  214. }
  215. }
  216. }elseif ($userdetails->protected == 1){
  217. if (updateUser('protected', $userId, 0)){
  218. $successes[] = lang("USER_PROTECTION", array("no longer"));
  219. }else{
  220. $errors[] = lang("SQL_ERROR");
  221. }
  222. } }
  223. //Toggle msg_exempt setting
  224. $msg_exempt = Input::get("msg_exempt");
  225. if (isset($msg_exempt) AND $msg_exempt == '1'){
  226. if ($userdetails->msg_exempt == 0){
  227. if (updateUser('msg_exempt', $userId, 1)){
  228. $successes[] = lang("USER_MESSAGE_EXEMPT", array("now"));
  229. }else{
  230. $errors[] = lang("SQL_ERROR");
  231. }
  232. }
  233. }elseif ($userdetails->msg_exempt == 1){
  234. if (updateUser('msg_exempt', $userId, 0)){
  235. $successes[] = lang("USER_MESSAGE_EXEMPT", array("no longer"));
  236. }else{
  237. $errors[] = lang("SQL_ERROR");
  238. }
  239. }
  240. //Toggle dev_user setting
  241. $dev_user = Input::get("dev_user");
  242. if (isset($dev_user) AND $dev_user == '1'){
  243. if ($userdetails->dev_user == 0){
  244. if (updateUser('dev_user', $userId, 1)){
  245. $successes[] = lang("USER_DEV_OPTION", array("now"));
  246. }else{
  247. $errors[] = lang("SQL_ERROR");
  248. }
  249. }
  250. }elseif ($userdetails->dev_user == 1){
  251. if (updateUser('dev_user', $userId, 0)){
  252. $successes[] = lang("USER_DEV_OPTION", array("no longer"));
  253. }else{
  254. $errors[] = lang("SQL_ERROR");
  255. }
  256. }
  257. //Remove permission level
  258. if(!empty($_POST['removePermission'])){
  259. $remove = $_POST['removePermission'];
  260. if ($deletion_count = removePermission($remove, $userId)){
  261. $successes[] = lang("ACCOUNT_PERMISSION_REMOVED", array ($deletion_count));
  262. }
  263. else {
  264. $errors[] = lang("SQL_ERROR");
  265. }
  266. }
  267. if(!empty($_POST['addPermission'])){
  268. $add = $_POST['addPermission'];
  269. if ($addition_count = addPermission($add, $userId,'user')){
  270. $successes[] = lang("ACCOUNT_PERMISSION_ADDED", array ($addition_count));
  271. }
  272. else {
  273. $errors[] = lang("SQL_ERROR");
  274. }
  275. }
  276. }
  277. $userdetails = fetchUserDetails(NULL, NULL, $userId);
  278. } }
  279. $userPermission = fetchUserPermissions($userId);
  280. $currentuserPermission = fetchUserPermissions($user->data()->id);
  281. $permissionData = fetchAllPermissions();
  282. $grav = get_gravatar(strtolower(trim($userdetails->email)));
  283. $useravatar = '<img src="'.$grav.'" class="img-responsive img-thumbnail" alt="">';
  284. if((!in_array($user->data()->id, $master_account) && in_array($userId, $master_account) || !in_array($user->data()->id, $master_account) && $userdetails->protected==1) && $userId != $user->data()->id) $protectedprof = 1;
  285. else $protectedprof = 0;
  286. ?>
  287. <div id="page-wrapper">
  288. <div class="container">
  289. <?=resultBlock($errors,$successes);?>
  290. <?=$validation->display_errors();?>
  291. <div class="row">
  292. <div class="col-xs-12 col-sm-2"><!--left col-->
  293. <?php echo $useravatar;?>
  294. </div><!--/col-2-->
  295. <div class="col-xs-12 col-sm-10">
  296. <form class="form" id='adminUser' name='adminUser' action='admin_user.php?id=<?=$userId?>' method='post'>
  297. <h3><?=$userdetails->fname?> <?=$userdetails->lname?> - <?=$userdetails->username?></h3>
  298. <div class="panel panel-default">
  299. <div class="panel-heading">User ID: <?=$userdetails->id?><?php if($act==1) {?> - <?php if($userdetails->email_verified==1) {?> Email Verified <input type="hidden" name="email_verified" value="1" /><?php } elseif($userdetails->email_verified==0) {?> Email Unverified - <input type="checkbox" name="email_verified" value="1" /> Verify<?php } else {?>Error: No Validation<?php } } ?> <?php if($protectedprof==1) {?><p class="pull-right">PROTECTED PROFILE - EDIT DISABLED</p><?php } ?> <?php if(in_array($user->data()->id, $master_account)) {?><p class="pull-right"><input type="checkbox" name="protected" value="1" <?php if($userdetails->protected==1){?>checked<?php } ?>/> Protected Account</p><?php } ?></div>
  300. <div class="panel-body">
  301. <label>Joined: </label> <?=$userdetails->join_date?><br/>
  302. <label>Last Login: </label> <?php if($userdetails->last_login != 0) { echo $userdetails->last_login; } else {?> <i>Never</i> <?php }?><br/>
  303. <label>Username:</label>
  304. <input class='form-control' type='text' name='username' value='<?=$userdetails->username?>' />
  305. <label>Email:</label>
  306. <input class='form-control' type='text' name='email' value='<?=$userdetails->email?>' />
  307. <label>First Name:</label>
  308. <input class='form-control' type='text' name='fname' value='<?=$userdetails->fname?>' />
  309. <label>Last Name:</label>
  310. <input class='form-control' type='text' name='lname' value='<?=$userdetails->lname?>' />
  311. </div>
  312. </div>
  313. <div class="panel panel-default">
  314. <div class="panel-heading">Functions <?php if($protectedprof==1) {?><p class="pull-right">PROTECTED PROFILE - EDIT DISABLED</p><?php } ?></div>
  315. <div class="panel-body">
  316. <center>
  317. <div class="btn-group"><button type="button" class="btn btn-warning" data-toggle="modal" data-target="#password">Update Password</button></div>
  318. <div class="btn-group"><button type="button" class="btn btn-info" data-toggle="modal" data-target="#systems">System Settings</button></div>
  319. <div class="btn-group"><button type="button" class="btn btn-primary" data-toggle="modal" data-target="#permissions">Permission Settings</button></div>
  320. <div class="btn-group"><button type="button" class="btn btn-default" data-toggle="modal" data-target="#misc">Misc Settings</button></div>
  321. </center>
  322. </div>
  323. </div>
  324. <div id="password" class="modal fade" role="dialog">
  325. <div class="modal-dialog">
  326. <!-- Modal content-->
  327. <div class="modal-content">
  328. <div class="modal-header">
  329. <button type="button" class="close" data-dismiss="modal">&times;</button>
  330. <h4 class="modal-title">Update Password</h4>
  331. </div>
  332. <div class="modal-body">
  333. <div class="form-group">
  334. <label>New Password (<?=$settings->min_pw?> char min, <?=$settings->max_pw?> max.)</label>
  335. <input class='form-control' type='password' name='password' <?php if((!in_array($user->data()->id, $master_account) && in_array($userId, $master_account) || !in_array($user->data()->id, $master_account) && $userdetails->protected==1) && $userId != $user->data()->id) {?>disabled<?php } ?>/>
  336. </div>
  337. <div class="form-group">
  338. <label>Confirm Password</label>
  339. <input class='form-control' type='password' name='confirm' <?php if((!in_array($user->data()->id, $master_account) && in_array($userId, $master_account) || !in_array($user->data()->id, $master_account) && $userdetails->protected==1) && $userId != $user->data()->id) {?>disabled<?php } ?>/>
  340. </div>
  341. <label><input type="checkbox" name="sendPwReset" id="sendPwReset" /> Send Reset Email?</label>
  342. </div>
  343. <div class="modal-footer">
  344. <div class="btn-group"><input class='btn btn-primary' type='submit' value='Update' class='submit' /></div>
  345. <div class="btn-group"><button type="button" class="btn btn-default" data-dismiss="modal">Close</button></div>
  346. </div>
  347. </div>
  348. </div>
  349. </div>
  350. <div id="systems" class="modal fade" role="dialog">
  351. <div class="modal-dialog">
  352. <!-- Modal content-->
  353. <div class="modal-content">
  354. <div class="modal-header">
  355. <button type="button" class="close" data-dismiss="modal">&times;</button>
  356. <h4 class="modal-title">System Settings</h4>
  357. </div>
  358. <div class="modal-body">
  359. <?php //Your system content here - form is already included ?>
  360. </div>
  361. <div class="modal-footer">
  362. <div class="btn-group"><input class='btn btn-primary' type='submit' value='Update' class='submit' /></div>
  363. <div class="btn-group"><button type="button" class="btn btn-default" data-dismiss="modal">Close</button></div>
  364. </div>
  365. </div>
  366. </div>
  367. </div>
  368. <div id="permissions" class="modal fade" role="dialog">
  369. <div class="modal-dialog">
  370. <!-- Modal content-->
  371. <div class="modal-content">
  372. <div class="modal-header">
  373. <button type="button" class="close" data-dismiss="modal">&times;</button>
  374. <h4 class="modal-title">Permission Settings</h4>
  375. </div>
  376. <div class="modal-body">
  377. <div class="panel panel-default">
  378. <div class="panel-heading">Remove These Permission(s): <?php if($protectedprof==1) {?><p class="pull-right">PROTECTED PROFILE - EDIT DISABLED</p><?php } ?></div>
  379. <div class="panel-body">
  380. <?php
  381. //NEW List of permission levels user is apart of
  382. $perm_ids = [];
  383. foreach($userPermission as $perm){
  384. $perm_ids[] = $perm->permission_id;
  385. }
  386. $currentperm_ids = [];
  387. foreach($currentuserPermission as $currentperm){
  388. $currentperm_ids[] = $currentperm->permission_id;
  389. }
  390. foreach ($permissionData as $v1){
  391. if(in_array($v1->id,$perm_ids)){ ?>
  392. <input type='checkbox' name='removePermission[]' id='removePermission[]' value='<?=$v1->id;?>' <?php if(!in_array($v1->id,$currentperm_ids)){ ?>disabled<?php } ?> /> <?=$v1->name;?>
  393. <?php
  394. }
  395. }
  396. ?>
  397. </div>
  398. </div>
  399. <div class="panel panel-default">
  400. <div class="panel-heading">Add These Permission(s): <?php if($protectedprof==1) {?><p class="pull-right">PROTECTED PROFILE - EDIT DISABLED</p><?php } ?></div>
  401. <div class="panel-body">
  402. <?php
  403. foreach ($permissionData as $v1){
  404. if(!in_array($v1->id,$perm_ids)){ ?>
  405. <input type='checkbox' name='addPermission[]' id='addPermission[]' value='<?=$v1->id;?>' <?php if(!in_array($v1->id,$currentperm_ids)){ ?>disabled<?php } ?>/> <?=$v1->name;?>
  406. <?php
  407. }
  408. }
  409. ?>
  410. </div>
  411. </div>
  412. </div>
  413. <div class="modal-footer">
  414. <div class="btn-group"><input class='btn btn-primary' type='submit' value='Update' class='submit' /></div>
  415. <div class="btn-group"><button type="button" class="btn btn-default" data-dismiss="modal">Close</button></div>
  416. </div>
  417. </div>
  418. </div>
  419. </div>
  420. <div id="misc" class="modal fade" role="dialog">
  421. <div class="modal-dialog">
  422. <!-- Modal content-->
  423. <div class="modal-content">
  424. <div class="modal-header">
  425. <button type="button" class="close" data-dismiss="modal">&times;</button>
  426. <h4 class="modal-title">Misc Settings</h4>
  427. </div>
  428. <div class="modal-body">
  429. <div class="form-group">
  430. <label>Exempt Messages?</label>
  431. <input type="checkbox" name="msg_exempt" value="1" <?php if($userdetails->msg_exempt==1){?>checked<?php } ?>/> <br />
  432. <label>Dev User?</label>
  433. <input type="checkbox" name="dev_user" value="1" <?php if($userdetails->dev_user==1){?>checked<?php } ?>/> <br />
  434. <br /><label> Block?:</label>
  435. <select name="active" class="form-control">
  436. <option value="1" <?php if ($userdetails->permissions==1){echo "selected='selected'";} else { if(!checkMenu(2,$user->data()->id)){ ?>disabled<?php }} ?>>No</option>
  437. <option value="0" <?php if ($userdetails->permissions==0){echo "selected='selected'";} else { if(!checkMenu(2,$user->data()->id)){ ?>disabled<?php }} ?>>Yes</option>
  438. </select>
  439. <label> Force Password Reset?:</label>
  440. <select name="force_pr" class="form-control">
  441. <option <?php if ($userdetails->force_pr==0){echo "selected='selected'";} ?> value="0">No</option>
  442. <option <?php if ($userdetails->force_pr==1){echo "selected='selected'";} ?>value="1">Yes</option>
  443. </select>
  444. <br /><label>Delete this User?</label>
  445. <input type='checkbox' name='delete[<?php echo "$userId"; ?>]' id='delete[<? echo "$userId"; ?>]' value='<?php echo "$userId"; ?>' <?php if (!checkMenu(2,$user->data()->id) || $userId == 1){ ?>disabled<?php } ?>>
  446. </div>
  447. <div class="modal-footer">
  448. <div class="btn-group"><input class='btn btn-primary' type='submit' value='Update' class='submit' /></div>
  449. <div class="btn-group"><button type="button" class="btn btn-default" data-dismiss="modal">Close</button></div>
  450. </div>
  451. </div>
  452. </div>
  453. </div>
  454. </div>
  455. <input type="hidden" name="csrf" value="<?=Token::generate();?>" />
  456. <div class="pull-right">
  457. <div class="btn-group"><input class='btn btn-primary' type='submit' value='Update' class='submit' /></div>
  458. <div class="btn-group"><a class='btn btn-warning' href="admin_users.php">Cancel</a></div><br /><Br />
  459. </div>
  460. </form>
  461. </div><!--/col-9-->
  462. </div><!--/row-->
  463. </div>
  464. </div>
  465. <?php require_once $abs_us_root.$us_url_root.'users/includes/page_footer.php'; // the final html footer copyright row + the external js calls ?>
  466. <!-- Place any per-page javascript here -->
  467. <script src="js/jwerty.js"></script>
  468. <script>
  469. jwerty.key('esc', function () {
  470. $('.modal').modal('hide');
  471. });
  472. </script>
  473. <?php if($protectedprof==1) {?>
  474. <script>$('#adminUser').find('input:enabled, select:enabled, textarea:enabled').attr('disabled', 'disabled');</script>
  475. <?php } ?>
  476. <?php require_once $abs_us_root.$us_url_root.'users/includes/html_footer.php'; // currently just the closing /body and /html ?>