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');
|
||
|
}
|
||
|
|
||
|
}
|