Fixed time zone calculation issue
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / data / moderation / queue / ModerationQueueReportAction.class.php
1 <?php
2 namespace wcf\data\moderation\queue;
3 use wcf\system\exception\PermissionDeniedException;
4 use wcf\system\exception\UserInputException;
5 use wcf\system\moderation\queue\ModerationQueueReportManager;
6 use wcf\system\WCF;
7 use wcf\util\StringUtil;
8
9 /**
10 * Executes actions for reports.
11 *
12 * @author Alexander Ebert
13 * @copyright 2001-2014 WoltLab GmbH
14 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
15 * @package com.woltlab.wcf
16 * @subpackage data.moderation.queue
17 * @category Community Framework
18 */
19 class ModerationQueueReportAction extends ModerationQueueAction {
20 /**
21 * @see \wcf\data\AbstractDatabaseObjectAction::$allowGuestAccess
22 */
23 protected $allowGuestAccess = array('prepareReport', 'removeContent', 'removeReport', 'report');
24
25 /**
26 * moderation queue editor object
27 * @var \wcf\data\moderation\queue\ModerationQueueEditor
28 */
29 public $queue = null;
30
31 /**
32 * Validates parameters to delete reported content.
33 */
34 public function validateRemoveContent() {
35 $this->validateRemoveReport();
36
37 $this->parameters['message'] = (isset($this->parameters['message']) ? StringUtil::trim($this->parameters['message']) : '');
38 }
39
40 /**
41 * Deletes reported content.
42 */
43 public function removeContent() {
44 // mark content as deleted
45 ModerationQueueReportManager::getInstance()->removeContent($this->queue->getDecoratedObject(), $this->parameters['message']);
46
47 $this->queue->markAsDone();
48 }
49
50 /**
51 * Validates parameters to mark this report as done.
52 */
53 public function validateRemoveReport() {
54 $this->queue = $this->getSingleObject();
55 if (!$this->queue->canEdit()) {
56 throw new PermissionDeniedException();
57 }
58 }
59
60 /**
61 * Removes this report by marking it as done without further processing.
62 */
63 public function removeReport() {
64 $this->queue->markAsDone();
65 }
66
67 /**
68 * Validates parameters to prepare a report.
69 */
70 public function validatePrepareReport() {
71 $this->readInteger('objectID');
72 $this->readString('objectType');
73
74 if (!ModerationQueueReportManager::getInstance()->isValid($this->parameters['objectType'])) {
75 throw new UserInputException('objectType');
76 }
77
78 // validate the combination of object type and object id
79 if (!ModerationQueueReportManager::getInstance()->isValid($this->parameters['objectType'], $this->parameters['objectID'])) {
80 throw new UserInputException('objectID');
81 }
82
83 // validate if user may read the content (prevent information disclosure by reporting random ids)
84 if (!ModerationQueueReportManager::getInstance()->canReport($this->parameters['objectType'], $this->parameters['objectID'])) {
85 throw new PermissionDeniedException();
86 }
87 }
88
89 /**
90 * Prepares a report.
91 */
92 public function prepareReport() {
93 // content was already reported
94 $alreadyReported = (ModerationQueueReportManager::getInstance()->isAlreadyReported($this->parameters['objectType'], $this->parameters['objectID'])) ? 1 : 0;
95
96 WCF::getTPL()->assign(array(
97 'alreadyReported' => $alreadyReported,
98 'object' => ModerationQueueReportManager::getInstance()->getReportedObject($this->parameters['objectType'], $this->parameters['objectID'])
99 ));
100
101 return array(
102 'alreadyReported' => $alreadyReported,
103 'template' => WCF::getTPL()->fetch('moderationReportDialog')
104 );
105 }
106
107 /**
108 * Validates parameters for reporting.
109 */
110 public function validateReport() {
111 $this->readString('message');
112
113 $this->validatePrepareReport();
114 }
115
116 /**
117 * Reports an item.
118 */
119 public function report() {
120 // if the specified content was already reported, e.g. a different user reported this
121 // item meanwhile, silently ignore it. Just display a success and the user is happy :)
122 if (!ModerationQueueReportManager::getInstance()->isAlreadyReported($this->parameters['objectType'], $this->parameters['objectID'])) {
123 ModerationQueueReportManager::getInstance()->addReport(
124 $this->parameters['objectType'],
125 $this->parameters['objectID'],
126 $this->parameters['message']
127 );
128 }
129
130 return array(
131 'reported' => 1
132 );
133 }
134 }