edit_user.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <!-- Begin toolbar -->
  2. <div class="toolbar">
  3. <div class="toolbar-inner">
  4. <div class="toolbar-buttons">
  5. <a class="button button-secondary" id="btn-back" href="/list/user/">
  6. <i class="fas fa-arrow-left icon-blue"></i><?= _("Back") ?>
  7. </a>
  8. <?php
  9. if (($_SESSION['userContext'] === 'admin') && (!isset($_SESSION['look'])) && ($_SESSION['user'] !== $v_username)) {
  10. $ssh_key_url = "/list/key/?user=".htmlentities($user_plain)."&token=".$_SESSION['token']."";
  11. $log_url = "/list/log/?user=".htmlentities($user_plain)."&token=".$_SESSION['token']."";
  12. $keys_url = "/list/access-key/?user=".htmlentities($user_plain)."&token=".$_SESSION['token']."";
  13. } else {
  14. $ssh_key_url = "/list/key/";
  15. $log_url = "/list/log/";
  16. $keys_url = "/list/access-key/";
  17. }
  18. ?>
  19. <a href="<?=$ssh_key_url; ?>" class="button button-secondary" id="btn-create" title="<?= _("Manage SSH keys") ?>">
  20. <i class="fas fa-key icon-orange"></i><?= _("Manage SSH keys") ?>
  21. </a>
  22. <?php if ($_SESSION["userContext"] == "admin" || ($_SESSION["userContext"] !== "admin" && $_SESSION["POLICY_USER_VIEW_LOGS"] !== "no")) { ?>
  23. <a href="<?= $log_url ?>" class="button button-secondary" id="btn-create" title="<?= _("Logs") ?>">
  24. <i class="fas fa-clock-rotate-left icon-maroon"></i><?= _("Logs") ?>
  25. </a>
  26. <?php } ?>
  27. <?php
  28. $api_status = (!empty($_SESSION['API_SYSTEM']) && is_numeric($_SESSION['API_SYSTEM'])) ? $_SESSION['API_SYSTEM'] : 0;
  29. if (($user_plain == 'admin' && $api_status > 0) || ($user_plain != 'admin' && $api_status > 1)) { ?>
  30. <a href="<?=$keys_url; ?>" class="button button-secondary" id="btn-create" title="<?= _("Access Keys") ?>">
  31. <i class="fas fa-key icon-purple"></i><?= _("Access Keys") ?>
  32. </a>
  33. <?php } ?>
  34. </div>
  35. <div class="toolbar-buttons">
  36. <?php if ($_SESSION["user"] == $v_username || isset($_SESSION["look"])) { ?>
  37. <!-- Do not show delete button for currently logged in user-->
  38. <?} else {?>
  39. <a href="/login/?loginas=<?= htmlentities($v_username) ?>&token=<?= $_SESSION["token"] ?>" class="button button-secondary" id="btn-create" title="<?= _("login as") ?>">
  40. <i class="fas fa-right-to-bracket icon-maroon"></i><?= _("login as") ?>
  41. </a>
  42. <a class="data-controls do_delete button button-secondary button-danger">
  43. <i class="do_delete fas fa-circle-xmark icon-red"></i>
  44. <?= _("Delete") ?>
  45. <input type="hidden" name="delete_url" value="/delete/user/?user=<?= htmlentities($v_username) ?>&token=<?= $_SESSION["token"] ?>">
  46. <div class="dialog js-confirm-dialog-delete" title="<?= _("Confirmation") ?>">
  47. <p><?= sprintf(_("DELETE_USER_CONFIRMATION"), htmlentities($v_username)) ?></p>
  48. </div>
  49. </a>
  50. <?php } ?>
  51. <button class="button" type="submit" form="vstobjects">
  52. <i class="fas fa-floppy-disk icon-purple"></i><?= _("Save") ?>
  53. </button>
  54. </div>
  55. </div>
  56. </div>
  57. <!-- End toolbar -->
  58. <div class="container animate__animated animate__fadeIn">
  59. <form
  60. x-data="{
  61. loginDisabled: <?= $v_login_disabled === "yes" ? "true" : "false" ?>,
  62. useIpAllowList: <?= $v_login_use_iplist === "yes" ? "true" : "false" ?>,
  63. showAdvanced: false,
  64. }"
  65. id="vstobjects"
  66. method="post"
  67. name="v_edit_user"
  68. class="<?= $v_status ?>"
  69. >
  70. <input type="hidden" name="token" value="<?= $_SESSION["token"] ?>">
  71. <input type="hidden" name="save" value="save">
  72. <div class="form-container">
  73. <h1 class="form-title"><?= _("Editing User") ?></h1>
  74. <?php show_alert_message($_SESSION); ?>
  75. <div class="u-mb10">
  76. <label for="v_user" class="form-label"><?= _("Username") ?></label>
  77. <input type="text" class="form-control" name="v_user" id="v_user" value="<?= htmlentities(trim($v_username, "'")) ?>" disabled>
  78. <input type="hidden" name="v_username" value="<?= htmlentities(trim($v_username, "'")) ?>">
  79. </div>
  80. <div class="u-mb10">
  81. <label for="v_name" class="form-label"><?= _("Contact") ?></label>
  82. <input type="text" class="form-control" name="v_name" id="v_name" value="<?=htmlentities(trim($v_name, "'"))?>" <?php if (($_SESSION['userContext'] !=='admin' ) && ($_SESSION['POLICY_USER_EDIT_DETAILS'] !=='yes' )) { echo 'disabled' ; }?> >
  83. <?php if (($_SESSION['userContext'] !== 'admin') && ($_SESSION['POLICY_USER_EDIT_DETAILS'] !== 'yes')) {?>
  84. <input type="hidden" name="v_name" value="<?=htmlentities(trim($v_name, "'"))?>">
  85. <?php } ?>
  86. </div>
  87. <div class="u-mb10">
  88. <label for="v_email" class="form-label"><?= _("Email") ?></label>
  89. <input type="email" class="form-control" name="v_email" id="v_email" value="<?=htmlentities(trim($v_email, "'"))?>" <?php if (($_SESSION['userContext'] !=='admin' ) && ($_SESSION['POLICY_USER_EDIT_DETAILS'] !=='yes' )) { echo 'disabled' ; }?>>
  90. <?php if (($_SESSION['userContext'] !== 'admin') && ($_SESSION['POLICY_USER_EDIT_DETAILS'] !== 'yes')) {?>
  91. <input type="hidden" name="v_email" value="<?=htmlentities(trim($v_email, "'"))?>">
  92. <?php } ?>
  93. </div>
  94. <div class="u-mb10">
  95. <label for="v_password" class="form-label">
  96. <?= _("Password") ?>
  97. <a href="javascript:applyRandomPassword();" title="<?= _("generate") ?>" class="u-ml5"><i class="fas fa-arrows-rotate icon-green"></i></a>
  98. </label>
  99. <div class="u-pos-relative u-mb10">
  100. <input type="text" class="form-control js-password-input" name="v_password" id="v_password" value="<?= htmlentities(trim($v_password, "'")) ?>">
  101. <meter max="4" class="password-meter"></meter>
  102. </div>
  103. </div>
  104. <div id="password-details" class="u-mb20">
  105. <p class="u-mb10"><?= _("Your password must have at least") ?>:</p>
  106. <ul class="u-list-bulleted u-mb10">
  107. <li><?= _("8 characters long") ?></li>
  108. <li><?= _("1 uppercase & 1 lowercase character") ?></li>
  109. <li><?= _("1 number") ?></li>
  110. </ul>
  111. <?php if ($_SESSION["userContext"] === "admin") { ?>
  112. <div class="form-check">
  113. <input x-model="loginDisabled" class="form-check-input" type="checkbox" name="v_login_disabled" id="v_login_disabled">
  114. <label for="v_login_disabled">
  115. <?= _("Do not allow user to log in to Control Panel") ?>
  116. </label>
  117. </div>
  118. <?php } ?>
  119. <div x-cloak x-show="loginDisabled" id="password-options">
  120. <div class="form-check u-mt15">
  121. <input class="form-check-input" type="checkbox" name="v_twofa" id="v_twofa" <?php if(!empty($v_twofa)) echo 'checked' ?>>
  122. <label for="v_twofa">
  123. <?= _("Enable 2FA") ?>
  124. </label>
  125. </div>
  126. <?php if (!empty($v_twofa)) { ?>
  127. <p class="u-mb10"><?= _("2FA Reset Code:") . " " . $v_twofa ?></p>
  128. <p class="u-mb10"><?= _("Please scan the code below in your 2FA application:") ?></p>
  129. <div><img class="qr-code" src="<?= htmlentities($v_qrcode) ?>" alt=""></div>
  130. <?php } ?>
  131. </div>
  132. <div x-cloak x-show="loginDisabled" id="password-options-ip">
  133. <div class="form-check">
  134. <input x-model="useIpAllowList" class="form-check-input" type="checkbox" name="v_login_use_iplist" id="v_login_use_iplist">
  135. <label for="v_login_use_iplist">
  136. <?= _("Use IP address allow list for login attempts") ?>
  137. </label>
  138. </div>
  139. </div>
  140. <div x-cloak x-show="useIpAllowList" id="ip-allowlist" class="u-mt10">
  141. <input type="text" class="form-control" name="v_login_allowed_ips" value="<?= htmlentities(trim($v_login_allowed_ips, "'")) ?>" placeholder="<?= _("Example: 127.0.0.1,192.168.1.100") ?>">
  142. </div>
  143. </div>
  144. <div class="u-mb10">
  145. <label for="v_language" class="form-label"><?= _("Language") ?></label>
  146. <select class="form-select" name="v_language" id="v_language">
  147. <?php
  148. foreach ($languages as $key => $value) {
  149. echo "\n\t\t\t\t\t\t\t\t\t<option value=\"".$key."\"";
  150. $skey = "'".$key."'";
  151. if (( $key == $v_language ) || ( $skey == $v_language)){
  152. echo 'selected' ;
  153. }
  154. if (( $key == detect_user_language() ) && (empty($v_language))){
  155. echo 'selected' ;
  156. }
  157. echo ">".htmlentities($value)."</option>\n";
  158. }
  159. ?>
  160. </select>
  161. </div>
  162. <?php if ($v_username == "admin") { ?>
  163. <!-- Hide option to change 'admin' user's role-->
  164. <?php } else { ?>
  165. <?php if ($_SESSION["userContext"] === "admin" && $_SESSION["user"] != $v_username) { ?>
  166. <div class="u-mb10">
  167. <label for="v_role" class="form-label"><?= _("Role") ?></label>
  168. <select class="form-select" name="v_role" id="v_role">
  169. <option value="user"><?= _("User") ?>
  170. <option value="admin" <?php if($v_role == "admin" ){ echo "selected"; } ?>><?= _("Administrator") ?>
  171. <option value="dns-cluster" <?php if($v_role == "dns-cluster" ){ echo "selected"; } ?>><?= _("DNS Sync user") ?>
  172. </select>
  173. </div>
  174. <?php } ?>
  175. <?php } ?>
  176. <?php if ($_SESSION["POLICY_USER_CHANGE_THEME"] !== "no") { ?>
  177. <div class="u-mb10">
  178. <label for="v_user_theme" class="form-label"><?= _("Theme") ?></label>
  179. <select class="form-select" name="v_user_theme" id="v_user_theme">
  180. <?php
  181. foreach ($themes as $key => $value) {
  182. echo "\t\t\t\t<option value=\"".$value."\"";
  183. if ((!empty($_SESSION['userTheme'])) && ( $value == $v_user_theme )) {
  184. echo ' selected' ;
  185. }
  186. if ((empty($v_user_theme) && (!empty($_SESSION['THEME']))) && ( $value == $_SESSION['THEME'] )) {
  187. echo ' selected' ;
  188. }
  189. echo ">".$value."</option>\n";
  190. }
  191. ?>
  192. </select>
  193. </div>
  194. <?php } ?>
  195. <div class="u-mb10">
  196. <label for="v_sort_order" class="form-label"><?= _("Default list sort order") ?></label>
  197. <select class="form-select" name="v_sort_order" id="v_sort_order">
  198. <option value='date' <?php if($v_sort_order === 'date') echo 'selected' ?>><?= _("Date") ?></option>
  199. <option value='name' <?php if($v_sort_order === 'name') echo 'selected' ?>><?= _("Name") ?></option>
  200. </select>
  201. </div>
  202. <?php if ($_SESSION['userContext'] === 'admin') {?>
  203. <div class="u-mb20">
  204. <label for="v_package" class="form-label"><?= _("Package") ?></label>
  205. <select class="form-select" name="v_package" id="v_package">
  206. <?php
  207. foreach ($packages as $key => $value) {
  208. echo "\n\t\t\t\t\t\t\t\t\t<option value=\"".htmlentities($key)."\"";
  209. $skey = "'".$key."'";
  210. if (( $key == $v_package ) || ( $skey == $v_package)){
  211. echo 'selected' ;
  212. }
  213. echo ">".htmlentities($key)."</option>\n";
  214. }
  215. ?>
  216. </select>
  217. </div>
  218. <div class="u-mb20">
  219. <button x-on:click="showAdvanced = !showAdvanced" type="button" class="button button-secondary">
  220. <?= _("Advanced options") ?>
  221. </button>
  222. </div>
  223. <div x-cloak x-show="showAdvanced">
  224. <div class="u-mb10">
  225. <label for="v_shell" class="form-label"><?= _("SSH Access") ?></label>
  226. <select class="form-select" name="v_shell" id="v_shell">
  227. <?php
  228. foreach ($shells as $key => $value) {
  229. echo "\t\t\t\t<option value=\"".htmlentities($value)."\"";
  230. $svalue = "'".$value."'";
  231. if (( $value == $v_shell ) || ($svalue == $v_shell )){
  232. echo 'selected' ;
  233. }
  234. echo ">".htmlentities($value)."</option>\n";
  235. }
  236. ?>
  237. </select>
  238. </div>
  239. <div class="u-mb10">
  240. <label for="v_phpcli" class="form-label"><?= _("PHP CLI Version") ?></label>
  241. <select class="form-select" name="v_phpcli" id="v_phpcli">
  242. <?php
  243. foreach ($php_versions as $key => $value) {
  244. $php = explode('-',$value);
  245. echo "\t\t\t\t<option value=\"".$value."\"";
  246. $svalue = "'".$value."'";
  247. if ((!empty($v_phpcli)) && ( $value == $v_phpcli ) || ($svalue == $v_phpcli)){
  248. echo ' selected' ;
  249. }
  250. if ((empty($v_phpcli)) && ($value == DEFAULT_PHP_VERSION)){
  251. echo ' selected' ;
  252. }
  253. echo ">".htmlentities($value)."</option>\n";
  254. }
  255. ?>
  256. </select>
  257. </div>
  258. <?php if ((isset($_SESSION['DNS_SYSTEM'])) && (!empty($_SESSION['DNS_SYSTEM']))) {?>
  259. <p class="form-label u-mb10"><?= _("Default Name Servers") ?></p>
  260. <div class="u-mb5">
  261. <input type="text" class="form-control" name="v_ns1" value="<?=htmlentities(trim($v_ns1, "'"))?>">
  262. </div>
  263. <div class="u-mb5">
  264. <input type="text" class="form-control" name="v_ns2" value="<?=htmlentities(trim($v_ns2, "'"))?>">
  265. </div>
  266. <?php
  267. if($v_ns3) {
  268. echo '<div class="u-side-by-side u-mb5">
  269. <input type="text" class="form-control" name="v_ns3" value="'.htmlentities(trim($v_ns3, "'")).'">
  270. <span class="u-ml10 js-remove-ns"><i class="fas fa-trash icon-dim icon-red"></i></span>
  271. </div>';
  272. }
  273. if($v_ns4) {
  274. echo '<div class="u-side-by-side u-mb5">
  275. <input type="text" class="form-control" name="v_ns4" value="'.htmlentities(trim($v_ns4, "'")).'">
  276. <span class="u-ml10 js-remove-ns"><i class="fas fa-trash icon-dim icon-red"></i></span>
  277. </div>';
  278. }
  279. if($v_ns5) {
  280. echo '<div class="u-side-by-side u-mb5">
  281. <input type="text" class="form-control" name="v_ns5" value="'.htmlentities(trim($v_ns5, "'")).'">
  282. <span class="u-ml10 js-remove-ns"><i class="fas fa-trash icon-dim icon-red"></i></span>
  283. </div>';
  284. }
  285. if($v_ns6) {
  286. echo '<div class="u-side-by-side u-mb5">
  287. <input type="text" class="form-control" name="v_ns6" value="'.htmlentities(trim($v_ns6, "'")).'">
  288. <span class="u-ml10 js-remove-ns"><i class="fas fa-trash icon-dim icon-red"></i></span>
  289. </div>';
  290. }
  291. if($v_ns7) {
  292. echo '<div class="u-side-by-side u-mb5">
  293. <input type="text" class="form-control" name="v_ns7" value="'.htmlentities(trim($v_ns7, "'")).'">
  294. <span class="u-ml10 js-remove-ns"><i class="fas fa-trash icon-dim icon-red"></i></span>
  295. </div>';
  296. }
  297. if($v_ns8) {
  298. echo '<div class="u-side-by-side u-mb5">
  299. <input type="text" class="form-control" name="v_ns8" value="'.htmlentities(trim($v_ns8, "'")).'">
  300. <span class="u-ml10 js-remove-ns"><i class="fas fa-trash icon-dim icon-red"></i></span>
  301. </div>';
  302. }
  303. ?>
  304. <div class="u-pt18 js-add-ns" <?php if ($v_ns8) echo 'style="display:none;"'; ?>>
  305. <span class="form-link js-add-ns"><?= _("Add one more Name Server") ?></span>
  306. </div>
  307. <?php } ?>
  308. </div>
  309. <?php } ?>
  310. </div>
  311. </form>
  312. </div>