169 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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');
 | |
|     }
 | |
| 
 | |
| }
 |