account.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <?php
  2. require '../../lib/glob.php';
  3. require '../../lib/muoribene.php';
  4. require '../../lib/sessionstart.php';
  5. require '../../lib/myconn.php';
  6. require '../../lib/getadmacc.php';
  7. require '../../lib/menu.php';
  8. $menu['menu']['selected']=true;
  9. $menu['menu']['submenu']['account']['selected']=true;
  10. buildmenu($menu);
  11. if ($account['Level']!='guest') {
  12. require '../../lib/notifs.php';
  13. $notifs=notifs($link);
  14. $english=false;
  15. } else {
  16. $english=true;
  17. }
  18. require '../../lib/tables.php';
  19. $fields=tables($link);
  20. $fields=$fields['Admins'];
  21. require '../../lib/transiten.php';
  22. $dbg='';
  23. $dbg.='<pre>'.print_r($_POST,1).'</pre>'.N;
  24. use function mysqli_real_escape_string as myesc;
  25. // praticamente una macro
  26. function hspech($str) {
  27. return(htmlspecialchars($str,ENT_QUOTES|ENT_HTML5,'UTF-8'));
  28. }
  29. function inputerr(&$account) {
  30. muoribene(t('<p>Errori di input.<br>Stavi cercando di editare <a href="account.php?id='.$account['ID'].'">il tuo account</a>?</p>','<p>Input errors.<br>Where you trying to edit <a href="account.php?id='.$account['ID'].'"> your account</a>?</p>').N,true);
  31. }
  32. $postmisskeys=ckkeys(array('id','Username','Email','Password','CPassword'),$_POST);
  33. if (count($postmisskeys)==0 && preg_match('/^[0-9]+$/',$_POST['id'])===1 && mb_strlen($_POST['Username'])>=1 && mb_strlen($_POST['Username'])<=$fields['Username'] && mb_strlen($_POST['Email'])>=3 && mb_strlen($_POST['Email'])<=$fields['Email'] && $_POST['Password']==$_POST['CPassword'] && ($_POST['Password']=='' || (mb_strlen($_POST['Password'])>=8 && mb_strlen($_POST['Password'])<=64))) {
  34. $id=$_POST['id']+0;
  35. $post=true;
  36. } elseif (array_key_exists('id',$_GET) && preg_match('/^[0-9]+$/',$_GET['id'])==1) {
  37. $id=$_GET['id']+0;
  38. $post=false;
  39. } else {
  40. inputerr($account);
  41. }
  42. if ($account['Level']=='guest' && $id==0) inputerr($account);
  43. if ($account['Level']=='guest' && $id!=$account['ID'])
  44. muoribene('<p>You can edit <a href="account.php?id='.$account['ID'].'">your account</a> only.</p>'.N,true);
  45. if ($id!=0) {
  46. $res=mysqli_query($link,'SELECT * FROM Admins WHERE ID='.$id)
  47. or muoribene(__LINE__.': '.mysqli_error($link),true);
  48. if (mysqli_num_rows($res)==0)
  49. muoribene('<p>Non esiste alcun account con ID='.$id.'<br>Se vuoi puoi editare <a href="account.php?id='.$account['ID'].'">il tuo account</a>.</p>',true);
  50. $acc=mysqli_fetch_assoc($res);
  51. $passreq='';
  52. } else {
  53. $acc=array(
  54. 'ID'=>0,
  55. 'Username'=>'',
  56. 'Email'=>'',
  57. 'Password'=>'',
  58. 'Level'=>'normal',
  59. 'MaxLocalities'=>1,
  60. 'MaxLanguages'=>0,
  61. 'MaxFinancing'=>3,
  62. 'MaxPolicies'=>3,
  63. 'MaxTags'=>3,
  64. 'Enabled'=>1
  65. );
  66. $passreq=' required';
  67. }
  68. ($account['ID']==$acc['ID']) ? $ownacc=true : $ownacc=false;
  69. if ($id!=0 && $account['Level']=='normal' && !$ownacc && $acc['Level']!='guest')
  70. muoribene('<p>Come admin di livello “normale” puoi editare solo <a href="account.php?id='.$account['ID'].'">il tuo account</a> e gli account di livello “guest”.</p>',true);
  71. if ($id==0)
  72. $atit=t('Nuovo account','New account');
  73. elseif ($ownacc)
  74. $atit=t('Il tuo account','Your account');
  75. else
  76. $atit='Account «'.hspech($acc['Email']).'»';
  77. /*
  78. [id] => 3
  79. [Username] => bida
  80. [Email] => mastodon@bida.im
  81. [Password] =>
  82. [CPassword] =>
  83. [Level] => guest
  84. [MaxLocalities] => 1
  85. [MaxLanguages] => 0
  86. [MaxFinancing] => 5
  87. [MaxPolicies] => 3
  88. [MaxTags] => 3
  89. [Enabled] => 1
  90. */
  91. function ckmax($key) {
  92. global $fields;
  93. if (preg_match('/^[0-9]+$/',$_POST[$key])==1 && $_POST[$key]+0>=$fields[$key]['min'] && $_POST[$key]+0<=$fields[$key]['max'])
  94. return(true);
  95. else
  96. return(false);
  97. }
  98. if ($post) {
  99. $quea=array();
  100. $quea[]='Username="'.myesc($link,$_POST['Username']).'"';
  101. $quea[]='Email="'.myesc($link,$_POST['Email']).'"';
  102. if ($_POST['Password']!='' || $_POST['CPassword']!='') {
  103. if ($_POST['Password']!=$_POST['CPassword']) inputerr($account);
  104. $quea[]='Password="'.myesc($link,password_hash($_POST['Password'],PASSWORD_DEFAULT)).'"';
  105. }
  106. $ok=true;
  107. if (array_key_exists('Level',$_POST)) {
  108. if (!in_array($_POST['Level'],array('guest','normal','super'))) $ok=false;
  109. if ($account['Level']=='normal' && !$ownacc && !in_array($_POST['Level'],array('guest','normal'))) $ok=false;
  110. if ($account['Level']=='normal' && $ownacc) $ok=false;
  111. if ($account['Level']=='guest') $ok=false;
  112. if (!$ok) inputerr($account);
  113. $quea[]='Level="'.$_POST['Level'].'"';
  114. }
  115. if (count(ckkeys(array('MaxLocalities','MaxLanguages','MaxFinancing','MaxPolicies','MaxTags'),$_POST))==0) {
  116. if ($account['Level']=='guest') $ok=false;
  117. if ($account['Level']=='normal' && $ownacc) $ok=false;
  118. if ($ok && ckmax('MaxLocalities') && ckmax('MaxLanguages') && ckmax('MaxFinancing') && ckmax('MaxPolicies') && ckmax('MaxTags')) {
  119. $quea[]='MaxLocalities='.$_POST['MaxLocalities'];
  120. $quea[]='MaxLanguages='.$_POST['MaxLanguages'];
  121. $quea[]='MaxFinancing='.$_POST['MaxFinancing'];
  122. $quea[]='MaxPolicies='.$_POST['MaxPolicies'];
  123. $quea[]='MaxTags='.$_POST['MaxTags'];
  124. } else {
  125. inputerr($account);
  126. }
  127. }
  128. if (array_key_exists('Enabled',$_POST)) {
  129. if (!in_array($_POST['Enabled'],array('0','1'))) inputerr($account);
  130. ($ownacc && $_POST['Enabled']=='0') ? $logout=true : $logout=false;
  131. $quea[]='Enabled='.$_POST['Enabled'];
  132. }
  133. if ($id!=0)
  134. $que='UPDATE Admins SET '.implode(', ',$quea).' WHERE ID='.$id;
  135. else
  136. $que='INSERT INTO Admins SET '.implode(', ',$quea);
  137. $dbg.='QUERONA: '.hspech($que);
  138. mysqli_query($link,$que)
  139. or muoribene(__LINE__.': '.mysqli_error($link),true);
  140. if ($logout) {
  141. $_SESSION=array();
  142. session_destroy();
  143. muoribene('<p>'.t('Il tuo account è stato disattivato correttamente. Ciao! :-)','Your account has been correctly disabled. Bye! :-)').'</p>'.N,true);
  144. }
  145. $out='<div class="message">';
  146. if ($id!=0) {
  147. if ($ownacc)
  148. $out.=t('L’aggiornamento del <a href="account.php?id='.$id.'">tuo account («'.hspech($_POST['Email']).'»)</a> è andato a buon fine.','<a href="account.php?id='.$id.'">Your account («'.hspech($_POST['Email']).'»)</a> was updated successfully.');
  149. else
  150. $out.=t('L’aggiornamento dell’<a href="account.php?id='.$id.'">account «'.hspech($_POST['Email']).'»</a> è andato a buon fine.','<a href="account.php?id='.$id.'">Account «'.hspech($_POST['Email']).'»</a> was updated successfully.');
  151. } else {
  152. $id=mysqli_insert_id($link);
  153. $out.='Il <a href="account.php?id='.$id.'">nuovo account «'.hspech($_POST['Email']).'»</a> è stato creato correttamente.';
  154. }
  155. $out.='</div>'.N;
  156. } else {
  157. $out='<form action="account.php" method="post" name="f" id="f">'.N;
  158. $out.='<table class="edtab">'.N;
  159. $out.='<tr><td class="insthead">'.$atit.'</td></tr>'.N;
  160. $out.='<tr>'.N;
  161. $out.='<td>'.N;
  162. $out.='<input type="hidden" name="id" value="'.$id.'">'.N;
  163. $out.='<div class="edrow"><div class="edfieldd"><label for="Username">'.t('Nome','Name').':</label></div><div class="edfield"><input type="text" name="Username" id="Username" value="'.hspech($acc['Username']).'" class="edinp" minlength="1" maxlength="'.$fields['Username'].'" required autofocus></div></div>'.N;
  164. $out.='<div class="edrow"><div class="edfieldd"><label for="Email">Email:</label></div><div class="edfield"><input type="email" name="Email" id="Email" value="'.hspech($acc['Email']).'" minlength="3" maxlength="'.$fields['Email'].'" class="edinp" required></div></div>'.N;
  165. if ($id!=0) $out.='<div class="eddesc">'.t('Lascia vuoti i campi “Password” e “Conferma password” per mantenere la password attuale.','Leave “Password” and “Password confirm” fields blank to keep your current password.').'</div>'.N;
  166. $out.='<div class="edrow"><div class="edfieldd"><label for="Password">Password:</label></div><div class="edfield"><input type="password" name="Password" id="Password" minlength="8" maxlength="64" class="edinp" autocomplete="new-password"'.$passreq.'></div></div>'.N;
  167. $out.='<div class="edrow"><div class="edfieldd"><label for="CPassword">'.t('Conferma password','Confirm password').':</label></div><div class="edfield"><input type="password" name="CPassword" id="CPassword" minlength="8" maxlength="64" class="edinp"></div></div>'.N;
  168. if ($account['Level']!='guest' && !$ownacc) {
  169. $out.='<div class="edrow"><div class="edfieldd"><label for="Level">Livello:</label></div><div class="edfield"><select name="Level" id="Level" class="edinp"><option value="guest"'.(($acc['Level']=='guest') ? ' selected' : '').'>Ospite</option><option value="normal"'.(($acc['Level']=='normal') ? ' selected' : '').'>Normale</option>';
  170. if ($account['Level']=='super')
  171. $out.='<option value="super"'.(($acc['Level']=='super') ? ' selected' : '').'>Super</option>';
  172. $out.='</select></div></div>'.N;
  173. $out.='<div class="edrow"><div class="edfieldd"><label for="MaxLocalities">Numero massimo di località aggiungibili:</label></div><div class="edfield"><input type="number" step="1" name="MaxLocalities" id="MaxLocalities" min="'.$fields['MaxLocalities']['min'].'" max="'.$fields['MaxLocalities']['max'].'" value="'.$acc['MaxLocalities'].'" required class="edinp"></div></div>'.N;
  174. $out.='<div class="edrow"><div class="edfieldd"><label for="MaxLanguages">Numero massimo di lingue aggiungibili:</label></div><div class="edfield"><input type="number" step="1" name="MaxLanguages" id="MaxLanguages" min="'.$fields['MaxLanguages']['min'].'" max="'.$fields['MaxLanguages']['max'].'" value="'.$acc['MaxLanguages'].'" required class="edinp"></div></div>'.N;
  175. $out.='<div class="edrow"><div class="edfieldd"><label for="MaxFinancing">Numero massimo di mod. di finanziamento aggiungibili:</label></div><div class="edfield"><input type="number" step="1" name="MaxFinancing" id="MaxFinancing" min="'.$fields['MaxFinancing']['min'].'" max="'.$fields['MaxFinancing']['max'].'" value="'.$acc['MaxFinancing'].'" required class="edinp"></div></div>'.N;
  176. $out.='<div class="edrow"><div class="edfieldd"><label for="MaxPolicies">Numero massimo di policies aggiungibili:</label></div><div class="edfield"><input type="number" step="1" name="MaxPolicies" id="MaxPolicies" min="'.$fields['MaxPolicies']['min'].'" max="'.$fields['MaxPolicies']['max'].'" value="'.$acc['MaxPolicies'].'" required class="edinp"></div></div>'.N;
  177. $out.='<div class="edrow"><div class="edfieldd"><label for="MaxTags">Numero massimo di categorie aggiungibili:</label></div><div class="edfield"><input type="number" step="1" name="MaxTags" id="MaxTags" min="'.$fields['MaxTags']['min'].'" max="'.$fields['MaxTags']['max'].'" value="'.$acc['MaxTags'].'" required class="edinp"></div></div>'.N;
  178. }
  179. $out.='<div class="edrow"><div class="edfieldd"><label for="Enabled">'.t('Stato account:','Account status:').'</label></div><div class="edfield"><select name="Enabled" id="Enabled" class="edinp"><option value="1"'.(($acc['Enabled']==1) ? ' selected' : '').'>'.t('Attivo','Enabled').'</option><option value="0"'.(($acc['Enabled']==0) ? ' selected' : '').'>'.t('Non attivo','Disabled').'</option></select></div></div>'.N;
  180. $out.='<input type="submit" value="'.t('Salva','Save').'" class="button" onclick="return ckf();">'.N;
  181. $out.='</td>'.N;
  182. $out.='</tr>'.N;
  183. $out.='</table>'.N;
  184. $out.='</form>'.N;
  185. }
  186. mysqli_close($link);
  187. ?>
  188. <!DOCTYPE HTML>
  189. <html lang="en">
  190. <head>
  191. <title>Mustard - <?php echo($atit); ?></title>
  192. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  193. <meta name="description" content="Admin pages for Mastodon Help">
  194. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  195. <link rel="icon" type="image/png" href="imgs/icona-32.png" sizes="32x32">
  196. <link rel="icon" type="image/png" href="imgs/icona-192.png" sizes="192x192">
  197. <link rel="icon" type="image/png" href="imgs/icona-512.png" sizes="512x512">
  198. <link rel="apple-touch-icon-precomposed" href="imgs/icona-180.png">
  199. <link rel="stylesheet" type="text/css" href="css/theme.css?v=<?php echo($cjrand); ?>">
  200. <script language="JavaScript" src="js/menu.js?v=<?php echo($cjrand); ?>"></script>
  201. <script language="JavaScript" src="js/alerta.js?v=<?php echo($cjrand); ?>"></script>
  202. <script language="JavaScript" src="js/confirma.js?v=<?php echo($cjrand); ?>"></script>
  203. <script language="JavaScript">
  204. <!--
  205. <?php if ($account['Level']!='guest') require 'js/notifs.js.php'; ?>
  206. let english=<?php if ($english) echo('true'); else echo('false'); ?>;
  207. let ownacc=<?php if ($ownacc) echo('true'); else echo('false'); ?>;
  208. function t(it,en) {
  209. if (!english)
  210. return(it);
  211. else
  212. return(en);
  213. }
  214. function ckf() {
  215. /*let objv=document.getElementById('Username').value, amsg='';
  216. if (objv.length()<1) amsg+='<li>'+t('“Nome” deve essere almeno un carattere','“Name” must be at least one character')+'</li>';*/
  217. //alert('La gira!');
  218. let pass=document.getElementById('Password'), cpass=document.getElementById('CPassword');
  219. pass.setCustomValidity('');
  220. if (pass.value!='' && pass.value!=cpass.value) {
  221. pass.setCustomValidity(t('“Password” e “Conferma password” non corrispondono','“Password” and “Confirm password” don’t match'));
  222. pass.reportValidity();
  223. return(false);
  224. } else {
  225. if (ownacc && document.getElementById('Enabled').value=='0') {
  226. confirma(t('Attenzione!','Warning!'),'<p>'+t('Stai per disabilitare il tuo stesso account: la sessione corrente sarà interrotta e non potrai più rientrare in Mustard finché un admin non lo riabiliterà. Confermi di voler disabilitare il tuo account?', 'You are about to disable your own account: current session will be closed and you won’t be able to log into Mustard again until an admin will re-enable it. Do you confirm you want to disable it?')+'</p>','No',t('Si','Yes'),'','document.f.submit();');
  227. return(false);
  228. } else {
  229. //document.f.submit();
  230. return(true);
  231. }
  232. }
  233. }
  234. //-->
  235. </script>
  236. </head>
  237. <body>
  238. <nav>
  239. <div id="hmenu">
  240. <ul>
  241. <?php echo($menuout); ?>
  242. </ul>
  243. <div class="mtit"><?php echo($atit); ?></div>
  244. <div id="rightdiv">
  245. <?php if ($account['Level']!='guest') echo('<img src="'.$notifs['imgoff'].'" id="bell" class="rlinks" title="Show notifications" onclick="shidenotifs();">'.N); ?>
  246. <img src="imgs/esci.svg" class="rlinks" title="Logout" onclick="document.location.href='logout.php';">
  247. </div>
  248. </div>
  249. </nav>
  250. <?php if ($account['Level']!='guest') echo($notifs['div']); ?>
  251. <div id="popup">
  252. <div id="inpopup">
  253. <div id="popupcont">
  254. ...
  255. </div>
  256. </div>
  257. </div>
  258. <!-- <div id="footer">
  259. </div> -->
  260. <div id="fullscreen">
  261. <div id="middlerow">
  262. <?php echo($out); ?>
  263. </div>
  264. </div>
  265. <div id="debug">
  266. <?php echo($dbg); ?>
  267. </div>
  268. </body>
  269. </html>