Файл: pages/clan/clanzayavs.php
Строк: 134
<?php
/* Заявки в клан: безопасная обработка POST+CSRF, by Метриум (Стэлп) */
declare(strict_types=1);
// Physical module map v50.6: public URL stays clean while code lives in /pages.
if (!defined('GAME_ROOT')) define('GAME_ROOT', dirname(__DIR__, 2));
chdir(GAME_ROOT);
if (PHP_SAPI !== 'cli') { $_SERVER['PHP_SELF']='/clanzayavs.php'; $_SERVER['SCRIPT_NAME']='/clanzayavs.php'; }
$title='Заявки в клан';
require_once './system/common.php';
require_once './system/functions.php';
require_once './system/user.php';
if(!$user){ header('Location:/'); exit; }
if(!$clan || !$clan_memb || (int)($clan_memb['rank']??0)<4){ $_SESSION['err']='Заявки доступны лидеру и заместителю клана.'; header('Location:/clan/'); exit; }
$cid=(int)$clan['id']; $uid=(int)$user['id'];
if(($_SERVER['REQUEST_METHOD']??'GET')==='POST'){
security_require_csrf();
$appUser=max(0,(int)($_POST['user']??0)); $act=(string)($_POST['act']??'');
if($appUser>0 && in_array($act,['accept','reject'],true)){
$row=db_fetch_one('SELECT `user`,`clan` FROM `clan_z` WHERE `user`=:u AND `clan`=:c LIMIT 1',['u'=>$appUser,'c'=>$cid]);
if(!$row){ $_SESSION['err']='Заявка уже обработана.'; }
elseif($act==='reject'){
db_execute('DELETE FROM `clan_z` WHERE `user`=:u AND `clan`=:c',['u'=>$appUser,'c'=>$cid]);
$_SESSION['ok']='Заявка отклонена.';
}else{
$pdo=db_pdo();
try{
$pdo->beginTransaction();
$st=$pdo->prepare('SELECT `id` FROM `clan_memb` WHERE `user`=? FOR UPDATE'); $st->execute([$appUser]);
if($st->fetch()){ throw new RuntimeException('Игрок уже состоит в клане.'); }
$st=$pdo->prepare('SELECT `user` FROM `clan_z` WHERE `user`=? AND `clan`=? FOR UPDATE'); $st->execute([$appUser,$cid]);
if(!$st->fetch()){ throw new RuntimeException('Заявка уже обработана.'); }
$now=time();
$st=$pdo->prepare('INSERT INTO `clan_memb` (`clan`,`user`,`time`,`last_update`) VALUES (?,?,?,?)'); $st->execute([$cid,$appUser,$now,$now+86400]);
$st=$pdo->prepare('DELETE FROM `clan_z` WHERE `user`=?'); $st->execute([$appUser]);
$applicant=$pdo->prepare('SELECT `login`,`r` FROM `users` WHERE `id`=?'); $applicant->execute([$appUser]); $ap=$applicant->fetch(PDO::FETCH_ASSOC)?:['login'=>'Игрок','r'=>0];
$journal='<img src=/images/icon/race/'.(int)$ap['r'].'.png> '.strip_tags((string)$ap['login']).' принят в клан';
$st=$pdo->prepare('INSERT INTO `clan_journal` (`cl_id`,`text`,`time`) VALUES (?,?,?)');
$st->execute([$cid,$journal,$now]);
$pdo->commit(); $_SESSION['ok']='Игрок принят в клан.';
}catch(Throwable $e){ if($pdo->inTransaction())$pdo->rollBack(); $_SESSION['err']=$e instanceof RuntimeException?$e->getMessage():'Не удалось принять игрока.'; }
}
header('Location:/clan/application/'); exit;
}
}
require_once './system/h.php';
$q=db_prepare('SELECT z.`user`,u.`login`,u.`r`,u.`level`,u.`online` FROM `clan_z` z INNER JOIN `users` u ON u.`id`=z.`user` WHERE z.`clan`=:c ORDER BY z.`user` DESC',['c'=>$cid]);
$rows=$q->fetchAll(PDO::FETCH_ASSOC);
?>
<div class="block_zero center"><b>Заявки в клан</b><br><span class="grey">Ожидают решения: <?=n_f(count($rows))?></span></div>
<div class="mini-line"></div>
<?php if(!$rows): ?>
<div class="block_light center grey">Новых заявок пока нет.</div>
<?php else: foreach($rows as $r): ?>
<div class="block_light">
<img src="/images/icon/race/<?=(int)$r['r']?>.png" alt=""> <a href="/user/<?=(int)$r['user']?>/"><?=security_html($r['login'])?></a> <span class="grey">ур. <?=(int)$r['level']?></span>
<div class="separ"></div>
<form method="post" class="inline-form"><?=security_csrf_field()?><input type="hidden" name="user" value="<?=(int)$r['user']?>"><button class="btn" type="submit" name="act" value="accept"><span class="end"><span class="label">Принять</span></span></button></form>
<form method="post" class="inline-form"><?=security_csrf_field()?><input type="hidden" name="user" value="<?=(int)$r['user']?>"><button class="link-button grey" type="submit" name="act" value="reject">Отклонить</button></form>
</div><div class="mini-line"></div>
<?php endforeach; endif; ?>
<div class="menuList"><li><a href="/clan/"><img src="/images/icon/arrow.png" alt="">Вернуться в клан</a></li></div>
<?php require_once './system/f.php'; ?>