Skip to content

Commit c1eb6f7

Browse files
committed
User: Allow admins to update user account properties
Such as number of invites left, access level, and ban reason.
1 parent 72ee8d2 commit c1eb6f7

File tree

6 files changed

+137
-13
lines changed

6 files changed

+137
-13
lines changed

index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@
415415
%broadcast%
416416
<div class="content %page%">%content%</div>
417417

418-
<div class=footer>&copy; 2015-2021 akokarev, binarymaster, Felis-Sapiens, Fusix</div>
418+
<div class=footer>&copy; 2015-2022 akokarev, binarymaster, Felis-Sapiens, Fusix</div>
419419

420420
<div class=modal>
421421
<div class=modal_bkg onclick="hideModal()"></div>

l10n/en-US.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -612,8 +612,10 @@
612612
'Remove from map if not found';
613613
$l10n['msg_user_mgmt'] =
614614
'User account management';
615+
$l10n['msg_user_set_success'] =
616+
'User account has been updated';
615617
$l10n['msg_user_reset_success'] =
616-
'Password was reset';
618+
'Password has been reset';
617619
$l10n['btn_get'] =
618620
'Obtain';
619621
$l10n['btn_reset'] =

l10n/ru-RU.php

+2
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,8 @@
612612
'Удалить с карты, если не найдена';
613613
$l10n['msg_user_mgmt'] =
614614
'Управление пользователями';
615+
$l10n['msg_user_set_success'] =
616+
'Учётная запись пользователя обновлена';
615617
$l10n['msg_user_reset_success'] =
616618
'Пароль был сброшен';
617619
$l10n['btn_get'] =

user.class.php

+35-7
Original file line numberDiff line numberDiff line change
@@ -445,13 +445,45 @@ public function changePass($NewPass)
445445
return true;
446446
}
447447

448-
public function resetPass($login)
448+
public function admResetPass($login)
449449
{
450450
$salt = $this->GenerateRandomString(32);
451451
$pass = $this->GenerateRandomString(10, false);
452452
$hash = md5($pass.$salt);
453453

454-
return (self::$mysqli->query("UPDATE users SET pass_hash='$hash',salt='{$this->quote($salt)}' WHERE login='{$this->quote($login)}'") ? $pass : false);
454+
return (self::$mysqli->query("UPDATE users SET pass_hash='$hash',salt='{$this->quote($salt)}',lastupdate=lastupdate WHERE login='{$this->quote($login)}'") ? $pass : false);
455+
}
456+
457+
public function admSetLevel($uid, $level)
458+
{
459+
self::$mysqli->query("UPDATE users SET level=$level,lastupdate=lastupdate WHERE uid=$uid");
460+
if (self::$mysqli->errno != 0)
461+
{
462+
$this->LastError = 'database';
463+
return false;
464+
}
465+
return true;
466+
}
467+
468+
public function admSetInvites($uid, $invites)
469+
{
470+
self::$mysqli->query("UPDATE users SET invites=$invites,lastupdate=lastupdate WHERE uid=$uid");
471+
if (self::$mysqli->errno != 0)
472+
{
473+
$this->LastError = 'database';
474+
return false;
475+
}
476+
return true;
477+
}
478+
479+
public function admBanReason($uid, $ban_reason)
480+
{
481+
if (is_null($ban_reason))
482+
$ban_reason = 'NULL';
483+
else
484+
$ban_reason = "'{$this->quote($ban_reason)}'";
485+
486+
return self::$mysqli->query("UPDATE users SET ban_reason=$ban_reason,lastupdate=lastupdate WHERE uid=$uid");
455487
}
456488

457489
public function Registration($Login, $Nick, $Password, $Invite)
@@ -716,12 +748,8 @@ public function updateInvite($invite, $level)
716748
}
717749
if ($uid != null && $this->Level == self::USER_ADMIN)
718750
{
719-
self::$mysqli->query("UPDATE users SET level=$level WHERE uid=$uid");
720-
if (self::$mysqli->errno != 0)
721-
{
722-
$this->LastError = 'database';
751+
if (!$this->admSetLevel($uid, $level))
723752
return false;
724-
}
725753
}
726754
return true;
727755
}

user.html

+45-3
Original file line numberDiff line numberDiff line change
@@ -1055,10 +1055,52 @@
10551055
return getUserById(mgmt_puid, e);
10561056
}
10571057

1058+
function setUserAccount(e, opt)
1059+
{
1060+
var btn = $(e);
1061+
btnShowLoad(btn, true);
1062+
$.get('user.php?a=token', function(json)
1063+
{
1064+
if (!json.result)
1065+
{
1066+
alert(errorStr(json.error));
1067+
return false;
1068+
} else {
1069+
var ban_reason = $('select#ban_reason').val();
1070+
var postdata = '';
1071+
postdata += 'token=' + encodeURIComponent(json.token);
1072+
postdata += '&uid=' + mgmt_uid;
1073+
if (opt == 'a')
1074+
{
1075+
postdata += '&level=' + $('select#user_level').val();
1076+
if (ban_reason != '')
1077+
postdata += '&ban_reason=' + ban_reason;
1078+
}
1079+
else
1080+
{
1081+
postdata += '&invites=' + $('input[name=invites]').val();
1082+
}
1083+
$.post('user.php?a=setuser', postdata, function(json)
1084+
{
1085+
btnShowLoad(btn, false);
1086+
if (!json.result)
1087+
{
1088+
alert(errorStr(json.error));
1089+
}
1090+
else
1091+
{
1092+
alert("%l10n_msg_user_set_success%");
1093+
}
1094+
return false;
1095+
}).fail(simpleFail);
1096+
}
1097+
}).fail(simpleFail);
1098+
return false;
1099+
}
1100+
10581101
function resetUser(e)
10591102
{
10601103
var login = $('input[name=login]', e).val();
1061-
var form = e;
10621104
var btn = $('input[type=submit]', e);
10631105
btnShowLoad(btn, true);
10641106
$.get('user.php?a=token', function(json)
@@ -1174,15 +1216,15 @@ <h2 align=center><span class=header_cap>%l10n_msg_user% %nick%</span></h2>
11741216
<tr><td>%l10n_str_reg_date%</td>
11751217
<td><input type="text" name="reg_date" id="reg_date" readonly /></td></tr>
11761218
<tr><td>%l10n_str_level%</td>
1177-
<td><select id="user_level"></select>&nbsp;<select id="ban_reason"></select></td><td><input type="button" value="%l10n_btn_save%"/><img src="%theme_ajax%" style="display: none;"/></td></tr>
1219+
<td><select id="user_level"></select>&nbsp;<select id="ban_reason"></select></td><td><input type="button" value="%l10n_btn_save%" onclick="return setUserAccount(this, 'a')"/><img src="%theme_ajax%" style="display: none;"/></td></tr>
11781220
<tr><td><label for="pass">%l10n_str_pass%</label></td>
11791221
<td><input type="text" name="pass" id="pass" readonly /></td><td><input type="submit" value="%l10n_btn_reset%"/><img src="%theme_ajax%" style="display: none;"/></td></tr>
11801222
<tr><td>%l10n_str_visited%</td>
11811223
<td><input type="text" name="visited" id="visited" readonly /></td></tr>
11821224
<tr><td>%l10n_str_inv_invited_created%</td>
11831225
<td><a href="#" id="inv_created">0/0</a></td></tr>
11841226
<tr><td><label for="invites">%l10n_str_inv_left%</label></td>
1185-
<td colspan=2><input type="number" name="invites" id="invites" min="0" max="100" step="1"/>&nbsp;<input type="button" value="%l10n_btn_save%"/><img src="%theme_ajax%" style="display: none;"/></td></tr>
1227+
<td colspan=2><input type="number" name="invites" id="invites" min="0" max="100" step="1"/>&nbsp;<input type="button" value="%l10n_btn_save%" onclick="return setUserAccount(this, 'b')"/><img src="%theme_ajax%" style="display: none;"/></td></tr>
11861228
<tr><td><label for="refuser">%l10n_str_inviter%</label></td>
11871229
<td><input type="text" name="refuser" id="refuser" readonly /></td><td><input type="button" value="%l10n_btn_get%" onclick="return getUserParent(this)"/><img src="%theme_ajax%" style="display: none;"/></td></tr>
11881230
</table>

user.php

+51-1
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,56 @@ function getFloatCoord($coord)
940940
}
941941
break;
942942

943+
// Изменение информации о пользователе
944+
case 'setuser':
945+
if (!$UserManager->isLogged())
946+
{
947+
$json['error'] = 'unauthorized';
948+
break;
949+
}
950+
if ($UserManager->Level != 3)
951+
{
952+
$json['error'] = 'lowlevel';
953+
break;
954+
}
955+
if (!$UserManager->checkToken($_POST['token']))
956+
{
957+
$json['error'] = 'token';
958+
break;
959+
}
960+
if (!isset($_POST['uid']))
961+
{
962+
$json['error'] = 'form';
963+
break;
964+
}
965+
966+
$uid = (int)$_POST['uid'];
967+
$level = isset($_POST['level']) ? (int)$_POST['level'] : null;
968+
$ban_reason = isset($_POST['ban_reason']) ? $_POST['ban_reason'] : null;
969+
970+
if (!is_null($level))
971+
{
972+
$json['result'] = $UserManager->admSetLevel($uid, $level);
973+
if ($json['result'])
974+
$json['result'] = $UserManager->admBanReason($uid, $ban_reason);
975+
if (!$json['result'])
976+
$json['error'] = 'database';
977+
break;
978+
}
979+
980+
$invites = isset($_POST['invites']) ? (int)$_POST['invites'] : null;
981+
982+
if (!is_null($invites) && $invites >= 0)
983+
{
984+
$json['result'] = $UserManager->admSetInvites($uid, $invites);
985+
if (!$json['result'])
986+
$json['error'] = 'database';
987+
break;
988+
}
989+
990+
$json['error'] = 'form';
991+
break;
992+
943993
// Сброс пароля пользователя
944994
case 'resetpass':
945995
if (!$UserManager->isLogged())
@@ -962,7 +1012,7 @@ function getFloatCoord($coord)
9621012
$json['error'] = 'notfound';
9631013
break;
9641014
}
965-
$json['pass'] = $UserManager->resetPass($_GET['login']);
1015+
$json['pass'] = $UserManager->admResetPass($_GET['login']);
9661016
if ($json['pass'] === false)
9671017
{
9681018
$json['error'] = 'database';

0 commit comments

Comments
 (0)