diff --git a/controller/Controller.class.php b/controller/Controller.class.php index 408b6de2..166b0463 100644 --- a/controller/Controller.class.php +++ b/controller/Controller.class.php @@ -127,6 +127,7 @@ class Controller $router->any('/list/edit/{token}', 'MailActions::editEmailSettings'); $router->any('/dmca', 'ReportActions::executeDmca'); + $router->any('/dmca/{claimid}', 'ReportActions::executeDmcaWithClaimId'); $router->post('/youtube/edit', 'AcquisitionActions::executeYoutubeEdit'); $router->post('/youtube/token', 'AcquisitionActions::executeYoutubeToken'); diff --git a/controller/action/ReportActions.class.php b/controller/action/ReportActions.class.php index 441eef28..658c334a 100644 --- a/controller/action/ReportActions.class.php +++ b/controller/action/ReportActions.class.php @@ -2,32 +2,80 @@ class ReportActions extends Actions { - public static function executeDmca() - { - Response::setHeader(Response::HEADER_CROSS_ORIGIN, "*"); - if (!Request::isPost()) { - return ['report/dmca']; - } + + /** + * Handles all routing requests without a claimId as parameter. + * E.g. /dmca + * + * @return array + * @throws Exception + */ + public static function executeDmca() { + + self::setResponseHeader(); + self::redirectIfPostRequest(false, ''); $values = []; $errors = []; + self::validateForm($values, $errors); + + return ['report/dmca', [ + 'errors' => $errors, + 'values' => $values + ]]; + } + + /** + * Handles all routing requests with a claimId as routing parameter since the used router doesn't support optional parameters. + * E.g. /dmca/this-is-a-claim-id + * + * @param string $claimId + * + * @return array + * @throws Exception + */ + public static function executeDmcaWithClaimId(string $claimId): array { + + $claimId = htmlspecialchars($claimId); + + self::setResponseHeader(); + self::redirectIfPostRequest(true, $claimId); + + $values = []; + $errors = []; + + self::validateForm($values, $errors); + + return ['report/dmca', [ + 'errors' => $errors, + 'values' => $values, + 'claimId' => $claimId + ]]; + } + + /** + * @param array $values + * @param array $errors + * + * @return array + * @throws Exception + */ + private static function validateForm(array $values, array $errors) + { + foreach (['name', 'email', 'rightsholder', 'identifier'] as $field) { $value = Request::getPostParam($field); if (!$value) { $errors[$field] = __('form_error.required'); - } elseif ($field == 'email' && !filter_var($value, FILTER_VALIDATE_EMAIL)) { + } elseif ($field === 'email' && !filter_var($value, FILTER_VALIDATE_EMAIL)) { $errors[$field] = __('form_error.invalid'); } $values[$field] = $value; } - if ($_GET['claim_id'] && !$values['identifier']) { - $values['identifier'] = htmlspecialchars($_GET['claim_id']); - } - if (!$errors) { $values['report_id'] = Encoding::base58Encode(random_bytes(6)); Mailgun::sendDmcaReport($values); @@ -35,9 +83,34 @@ class ReportActions extends Actions return Controller::redirect(Request::getRelativeUri(), 303); } - return ['report/dmca', [ - 'errors' => $errors, - 'values' => $values - ]]; + } + + /** + * Sets the response header. + */ + private static function setResponseHeader() + { + Response::setHeader(Response::HEADER_CROSS_ORIGIN, "*"); + } + + /** + * Chooses the right template according to passed variables. + * + * @param bool $hasClaimId + * @param string $claimId + * + * @return array + */ + private static function redirectIfPostRequest(bool $hasClaimId = false, string $claimId = '') { + + if ($hasClaimId && !empty($claimId)) { + $returnValue = ['report/dmca', ['claimId' => $claimId]]; + } else { + $returnValue = ['report/dmca']; + } + + if (!Request::isPost()) { + return $returnValue; + } } } diff --git a/view/template/report/dmca.php b/view/template/report/dmca.php index 4b3a266c..63330155 100644 --- a/view/template/report/dmca.php +++ b/view/template/report/dmca.php @@ -42,7 +42,7 @@ 'identifier', - 'value' => $values['identifier'] ?? null, + 'value' => $claimId ?? null, 'error' => $errors['identifier'] ?? null, 'label' => __('dmca.form_labels.identifier'), 'help' => __('dmca.form_help.identifier'),