summaryrefslogtreecommitdiff
path: root/platform/www/inc/Action/Subscribe.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/inc/Action/Subscribe.php')
-rw-r--r--platform/www/inc/Action/Subscribe.php168
1 files changed, 168 insertions, 0 deletions
diff --git a/platform/www/inc/Action/Subscribe.php b/platform/www/inc/Action/Subscribe.php
new file mode 100644
index 0000000..a129a86
--- /dev/null
+++ b/platform/www/inc/Action/Subscribe.php
@@ -0,0 +1,168 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+use dokuwiki\Action\Exception\ActionDisabledException;
+use dokuwiki\Subscriptions\SubscriberManager;
+use dokuwiki\Extension\Event;
+
+/**
+ * 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() {
+ tpl_subscribe();
+ }
+
+ /**
+ * 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 = array();
+ foreach(array('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, array($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 = array('every', 'digest');
+ if(substr($target, -1, 1) === ':') {
+ // 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', array('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 = compact('target', 'style', 'action');
+ }
+
+}