Skip to content

Commit 51bf68a

Browse files
Update spam measures.
1 parent eb95b12 commit 51bf68a

File tree

5 files changed

+117
-36
lines changed

5 files changed

+117
-36
lines changed

src/Controller/Admin/CheckerController.php

+31-34
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class CheckerController extends AbstractController
2727
private const MESSAGES_REPORTED = 1;
2828
private const MESSAGES_PROCESSED = 2;
2929
private const MESSAGES_BLOCK_WORDS = 3;
30+
private const MESSAGES_BLOCK_WORDS_PROCESSED = 4;
3031

3132
private CheckerModel $checkerModel;
3233
private EntityManagerInterface $entityManager;
@@ -39,48 +40,40 @@ public function __construct(CheckerModel $checkerModel, EntityManagerInterface $
3940

4041
/**
4142
* @Route("/admin/spam/messages", name="admin_spam_messages")
42-
*
43-
* @throws AccessDeniedException
44-
*
45-
* @return Response
4643
*/
47-
public function showReportedMessages(Request $request)
44+
public function showReportedMessages(Request $request): Response
4845
{
4946
return $this->handleMessages($request, self::MESSAGES_REPORTED);
5047
}
5148

49+
/**
50+
* @Route("/admin/spam/messages/processed", name="admin_spam_messages_processed")
51+
*/
52+
public function showProcessedMessages(Request $request): Response
53+
{
54+
return $this->handleMessages($request, self::MESSAGES_PROCESSED);
55+
}
56+
5257
/**
5358
* @Route("/admin/spam/messages/blocked", name="admin_spam_messages_block_words")
54-
*
55-
* @throws AccessDeniedException
56-
*
57-
* @return Response
5859
*/
59-
public function showBlockWordMessages(Request $request)
60+
public function showBlockWordMessages(Request $request): Response
6061
{
6162
return $this->handleMessages($request, self::MESSAGES_BLOCK_WORDS);
6263
}
6364

6465
/**
65-
* @Route("/admin/spam/messages/processed", name="admin_spam_messages_processed")
66-
*
67-
* @throws AccessDeniedException
68-
*
69-
* @return Response
66+
* @Route("/admin/spam/messages/blocked/processed", name="admin_spam_messages_block_words_processed")
7067
*/
71-
public function showProcessedMessages(Request $request)
68+
public function showProcessedBlockWordMessages(Request $request): Response
7269
{
73-
return $this->handleMessages($request, self::MESSAGES_PROCESSED);
70+
return $this->handleMessages($request, self::MESSAGES_BLOCK_WORDS_PROCESSED);
7471
}
7572

7673
/**
7774
* @Route("/admin/spam/activities", name="admin_spam_activities")
78-
*
79-
* @throws AccessDeniedException
80-
*
81-
* @return Response
8275
*/
83-
public function showActivities(Request $request, ActivityModel $activitiesModel)
76+
public function showActivities(Request $request, ActivityModel $activitiesModel): Response
8477
{
8578
if (
8679
!$this->isGranted(Member::ROLE_ADMIN_CHECKER)
@@ -123,12 +116,8 @@ public function showActivities(Request $request, ActivityModel $activitiesModel)
123116

124117
/**
125118
* @Route("/admin/spam/communitynews", name="admin_spam_community_news")
126-
*
127-
* @throws AccessDeniedException
128-
*
129-
* @return Response
130119
*/
131-
public function showCommunityNewsComments(Request $request, CommunityNewsModel $communityNewsModel)
120+
public function showCommunityNewsComments(Request $request, CommunityNewsModel $communityNewsModel): Response
132121
{
133122
if (
134123
!$this->isGranted(Member::ROLE_ADMIN_CHECKER)
@@ -172,26 +161,30 @@ public function showCommunityNewsComments(Request $request, CommunityNewsModel $
172161
/**
173162
* @Route("/admin/spam", name="admin_spam")
174163
*/
175-
public function redirectToSpamMessages()
164+
public function redirectToSpamMessages(): RedirectResponse
176165
{
177166
return new RedirectResponse($this->generateUrl('admin_spam_messages'));
178167
}
179168

180-
private function getSubmenuItems()
169+
private function getSubmenuItems(): array
181170
{
182171
return [
183172
'messages' => [
184173
'key' => 'reported.messages',
185174
'url' => $this->generateUrl('admin_spam_messages'),
186175
],
187-
'blockwords' => [
188-
'key' => 'block.words.messages',
189-
'url' => $this->generateUrl('admin_spam_messages_block_words'),
190-
],
191176
'processed_messages' => [
192177
'key' => 'reported.messages.processed',
193178
'url' => $this->generateUrl('admin_spam_messages_processed'),
194179
],
180+
'blocked_words' => [
181+
'key' => 'block.words.messages',
182+
'url' => $this->generateUrl('admin_spam_messages_block_words'),
183+
],
184+
'processed_blocked_words' => [
185+
'key' => 'block.words.processed',
186+
'url' => $this->generateUrl('admin_spam_messages_block_words_processed'),
187+
],
195188
'activities' => [
196189
'key' => 'activities',
197190
'url' => $this->generateUrl('admin_spam_activities'),
@@ -227,9 +220,13 @@ private function handleMessages(Request $request, int $type): Response
227220
$messages = $this->checkerModel->getProcessedReportedMessages($page, $limit);
228221
break;
229222
case self::MESSAGES_BLOCK_WORDS:
230-
$active = 'block.words.messages';
223+
$active = 'blocked_words';
231224
$messages = $this->checkerModel->getBlockWordsMessages($page, $limit);
232225
break;
226+
case self::MESSAGES_BLOCK_WORDS_PROCESSED:
227+
$active = 'processed_blocked_words';
228+
$messages = $this->checkerModel->getProcessedBlockWordsMessages($page, $limit);
229+
break;
233230
default:
234231
throw new InvalidArgumentException();
235232
}

src/Model/Admin/CheckerModel.php

+38-1
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77
use App\Doctrine\SpamInfoType;
88
use App\Entity\Message;
99
use App\Repository\MessageRepository;
10+
use App\Service\Mailer;
1011
use Doctrine\ORM\EntityManagerInterface;
1112
use Pagerfanta\Pagerfanta;
1213

1314
class CheckerModel
1415
{
1516
private EntityManagerInterface $entityManager;
17+
private Mailer $mailer;
1618

17-
public function __construct(EntityManagerInterface $entityManager)
19+
public function __construct(EntityManagerInterface $entityManager, Mailer $mailer)
1820
{
1921
$this->entityManager = $entityManager;
22+
$this->mailer = $mailer;
2023
}
2124

2225
public function markAsSpamByChecker(array $messageIds): void
@@ -56,6 +59,7 @@ public function unmarkAsSpamByChecker(array $messageIds): void
5659
$message->setStatus(MessageStatusType::CHECKED);
5760
if (strpos($message->getSpamInfo(), SpamInfoType::SPAM_BLOCKED_WORD) !== false) {
5861
$message->setFolder(InFolderType::NORMAL);
62+
$this->sendNotification($message);
5963
}
6064
}
6165
$this->entityManager->persist($message);
@@ -86,4 +90,37 @@ public function getBlockWordsMessages(int $page = 1, int $limit = 10): Pagerfant
8690

8791
return $repository->findBlockWordsMessages($page, $limit);
8892
}
93+
94+
public function getProcessedBlockWordsMessages(int $page = 1, int $limit = 10): Pagerfanta
95+
{
96+
/** @var MessageRepository $repository */
97+
$repository = $this->entityManager->getRepository(Message::class);
98+
99+
return $repository->findProcessedBlockWordsMessages($page, $limit);
100+
}
101+
102+
private function sendNotification(Message $message): void
103+
{
104+
// Is this a message or a request?
105+
if (null === $message->getRequest()) {
106+
$this->mailer->sendMessageNotificationEmail(
107+
$message->getSender(),
108+
$message->getReceiver(),
109+
'message',
110+
[
111+
'message' => $message,
112+
'subject' => $message->getSubject()->getSubject(),
113+
'body' => $message->getMessage(),
114+
]
115+
);
116+
} else {
117+
$this->mailer->sendMessageNotificationEmail($message->getSender(), $message->getReceiver(), 'request', [
118+
'host' => $message->getReceiver(),
119+
'subject' => $message->getSubject()->getSubject(),
120+
'message' => $message,
121+
'request' => $message->getRequest(),
122+
'changed' => false,
123+
]);
124+
}
125+
}
89126
}

src/Repository/MessageRepository.php

+42
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use App\Doctrine\DeleteRequestType;
66
use App\Doctrine\InFolderType;
7+
use App\Doctrine\MemberStatusType;
78
use App\Doctrine\MessageResultSetMapping;
89
use App\Doctrine\MessageStatusType;
910
use App\Doctrine\SpamInfoType;
@@ -137,6 +138,23 @@ public function findBlockWordsMessages($page = 1, $items = 10): Pagerfanta
137138
return $paginator;
138139
}
139140

141+
/**
142+
* Returns a Pagerfanta object encapsulating the matching paginated processed reported messages.
143+
*
144+
* @param mixed $page
145+
* @param mixed $items
146+
*/
147+
public function findProcessedBlockWordsMessages($page = 1, $items = 10): Pagerfanta
148+
{
149+
$queryBuilder = $this->queryProcessedBlockWordsMessages();
150+
$adapter = new QueryAdapter($queryBuilder);
151+
$paginator = new Pagerfanta($adapter);
152+
$paginator->setMaxPerPage($items);
153+
$paginator->setCurrentPage($page);
154+
155+
return $paginator;
156+
}
157+
140158
public function getThread(Message $message)
141159
{
142160
$qb = $this->createNativeNamedQuery('get_thread')
@@ -354,10 +372,34 @@ private function queryBlockWordsMessages(): QueryBuilder
354372
{
355373
$qb = $this->createQueryBuilder('m');
356374
$qb
375+
->join('App:Member', 'mb', Join::WITH, 'm.sender = mb.id')
357376
->where('m.status = :status')
358377
->setParameter('status', MessageStatusType::CHECK)
359378
->andWhere('m.spamInfo LIKE :spamInfo')
360379
->setParameter('spamInfo', '%' . SpamInfoType::SPAM_BLOCKED_WORD . '%')
380+
->andWhere($qb->expr()->eq('mb.status', ':active'))
381+
->setParameter('active', MemberStatusType::ACTIVE)
382+
->orderBy('m.created', 'DESC')
383+
;
384+
385+
return $qb;
386+
}
387+
388+
private function queryProcessedBlockWordsMessages(): QueryBuilder
389+
{
390+
$qb = $this->createQueryBuilder('m');
391+
$qb
392+
->join('App:Member', 'mb', Join::WITH, 'm.sender = mb.id')
393+
->where('m.spamInfo LIKE :spamInfo')
394+
->setParameter('spamInfo', '%' . SpamInfoType::SPAM_BLOCKED_WORD . '%')
395+
->andWhere(
396+
$qb->expr()->orX(
397+
$qb->expr()->eq('m.status', ':status'),
398+
$qb->expr()->eq('mb.status', ':banned'),
399+
)
400+
)
401+
->setParameter('status', MessageStatusType::CHECKED)
402+
->setParameter('banned', MemberStatusType::BANNED)
361403
->orderBy('m.created', 'DESC')
362404
;
363405

templates/admin/checker/messages.html.twig

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
<tr>
5959
<td>{{ macros.avatarstack(message.Sender.Username, 30) }}<br>
6060
<small class="text-muted">{{ ('memberstatus' ~ message.Sender.Status)|lower|trans }}</small></td>
61-
<td><strong>{{ message.subject.subject }}</strong><br>
61+
<td><strong>{{ message.subject.subject }}</strong>&nbsp;{% if message.request is null %}<i class="fa fa-envelope"></i>{% else %}<i class="fa fa-bed"></i>{% endif %}<br>
6262
{{ message.Message|purify }}</td>
6363
<td>{{ macros.avatarstack(message.Receiver.Username, 30) }}<br>
6464
<small class="text-muted">{{ ('memberstatus' ~ message.Receiver.Status)|lower|trans }}</small></td>

translations/missing/checker.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,9 @@ block.words.messages:
33
- 'Menu item in Checker Volunteer tool. (Do not translate)'
44
- 'messages+intl-icu'
55
- 'no'
6+
block.words.processed:
7+
- 'Processed Blocked Notifications'
8+
- 'Menu item in Checker Volunteer tool. (Do not translate)'
9+
- 'messages+intl-icu'
10+
- 'no'
611

0 commit comments

Comments
 (0)