|
- <?php
-
- namespace dokuwiki\Action;
-
- use dokuwiki\Action\Exception\ActionAbort;
- use dokuwiki\Action\Exception\ActionDisabledException;
- use dokuwiki\Subscriptions\SubscriberManager;
- use dokuwiki\Extension\Event;
- use dokuwiki\Ui;
- use Exception;
-
- /**
- * Class Subscribe
- *
- * E-Mail subscription handling
- *
- * @package dokuwiki\Action
- */
- class Subscribe extends AbstractUserAction
- {
- /** @inheritdoc */
- public function minimumPermission()
- {
- return AUTH_READ;
- }
-
- /** @inheritdoc */
- public function checkPreconditions()
- {
- parent::checkPreconditions();
-
- global $conf;
- if (isset($conf['subscribers']) && !$conf['subscribers']) throw new ActionDisabledException();
- }
-
- /** @inheritdoc */
- public function preProcess()
- {
- try {
- $this->handleSubscribeData();
- } catch (ActionAbort $e) {
- throw $e;
- } catch (Exception $e) {
- msg($e->getMessage(), -1);
- }
- }
-
- /** @inheritdoc */
- public function tplContent()
- {
- (new Ui\Subscribe())->show();
- }
-
- /**
- * Handle page 'subscribe'
- *
- * @author Adrian Lang <lang@cosmocode.de>
- * @throws Exception if (un)subscribing fails
- * @throws ActionAbort when (un)subscribing worked
- */
- protected function handleSubscribeData()
- {
- global $lang;
- global $INFO;
- global $INPUT;
-
- // get and preprocess data.
- $params = [];
- foreach (['target', 'style', 'action'] as $param) {
- if ($INPUT->has("sub_$param")) {
- $params[$param] = $INPUT->str("sub_$param");
- }
- }
-
- // any action given? if not just return and show the subscription page
- if (empty($params['action']) || !checkSecurityToken()) return;
-
- // Handle POST data, may throw exception.
- Event::createAndTrigger('ACTION_HANDLE_SUBSCRIBE', $params, [$this, 'handlePostData']);
-
- $target = $params['target'];
- $style = $params['style'];
- $action = $params['action'];
-
- // Perform action.
- $subManager = new SubscriberManager();
- if ($action === 'unsubscribe') {
- $ok = $subManager->remove($target, $INPUT->server->str('REMOTE_USER'), $style);
- } else {
- $ok = $subManager->add($target, $INPUT->server->str('REMOTE_USER'), $style);
- }
-
- if ($ok) {
- msg(
- sprintf(
- $lang["subscr_{$action}_success"],
- hsc($INFO['userinfo']['name']),
- prettyprint_id($target)
- ),
- 1
- );
- throw new ActionAbort('redirect');
- }
-
- throw new Exception(
- sprintf(
- $lang["subscr_{$action}_error"],
- hsc($INFO['userinfo']['name']),
- prettyprint_id($target)
- )
- );
- }
-
- /**
- * Validate POST data
- *
- * Validates POST data for a subscribe or unsubscribe request. This is the
- * default action for the event ACTION_HANDLE_SUBSCRIBE.
- *
- * @author Adrian Lang <lang@cosmocode.de>
- *
- * @param array &$params the parameters: target, style and action
- * @throws Exception
- */
- public function handlePostData(&$params)
- {
- global $INFO;
- global $lang;
- global $INPUT;
-
- // Get and validate parameters.
- if (!isset($params['target'])) {
- throw new Exception('no subscription target given');
- }
- $target = $params['target'];
- $valid_styles = ['every', 'digest'];
- if (str_ends_with($target, ':')) {
- // Allow “list” subscribe style since the target is a namespace.
- $valid_styles[] = 'list';
- }
- $style = valid_input_set(
- 'style',
- $valid_styles,
- $params,
- 'invalid subscription style given'
- );
- $action = valid_input_set(
- 'action',
- ['subscribe', 'unsubscribe'],
- $params,
- 'invalid subscription action given'
- );
-
- // Check other conditions.
- if ($action === 'subscribe') {
- if ($INFO['userinfo']['mail'] === '') {
- throw new Exception($lang['subscr_subscribe_noaddress']);
- }
- } elseif ($action === 'unsubscribe') {
- $is = false;
- foreach ($INFO['subscribed'] as $subscr) {
- if ($subscr['target'] === $target) {
- $is = true;
- }
- }
- if ($is === false) {
- throw new Exception(
- sprintf(
- $lang['subscr_not_subscribed'],
- $INPUT->server->str('REMOTE_USER'),
- prettyprint_id($target)
- )
- );
- }
- // subscription_set deletes a subscription if style = null.
- $style = null;
- }
-
- $params = ['target' => $target, 'style' => $style, 'action' => $action];
- }
- }
|