コード例 #1
0
ファイル: indexer.php プロジェクト: AlexanderS/Part-DB
/**
 * Send digest and list mails for all subscriptions which are in effect for the
 * current page
 *
 * @author Adrian Lang <*****@*****.**>
 */
function sendDigest()
{
    echo 'sendDigest(): started' . NL;
    global $ID;
    global $conf;
    if (!$conf['subscribers']) {
        echo 'sendDigest(): disabled' . NL;
        return false;
    }
    $subscriptions = subscription_find($ID, array('style' => '(digest|list)', 'escaped' => true));
    /** @var auth_basic $auth */
    global $auth;
    global $lang;
    global $conf;
    global $USERINFO;
    // remember current user info
    $olduinfo = $USERINFO;
    $olduser = $_SERVER['REMOTE_USER'];
    foreach ($subscriptions as $id => $users) {
        if (!subscription_lock($id)) {
            continue;
        }
        foreach ($users as $data) {
            list($user, $style, $lastupdate) = $data;
            $lastupdate = (int) $lastupdate;
            if ($lastupdate + $conf['subscribe_time'] > time()) {
                // Less than the configured time period passed since last
                // update.
                continue;
            }
            // Work as the user to make sure ACLs apply correctly
            $USERINFO = $auth->getUserData($user);
            $_SERVER['REMOTE_USER'] = $user;
            if ($USERINFO === false) {
                continue;
            }
            if (substr($id, -1, 1) === ':') {
                // The subscription target is a namespace
                $changes = getRecentsSince($lastupdate, null, getNS($id));
            } else {
                if (auth_quickaclcheck($id) < AUTH_READ) {
                    continue;
                }
                $meta = p_get_metadata($id);
                $changes = array($meta['last_change']);
            }
            // Filter out pages only changed in small and own edits
            $change_ids = array();
            foreach ($changes as $rev) {
                $n = 0;
                while (!is_null($rev) && $rev['date'] >= $lastupdate && ($_SERVER['REMOTE_USER'] === $rev['user'] || $rev['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT)) {
                    $rev = getRevisions($rev['id'], $n++, 1);
                    $rev = count($rev) > 0 ? $rev[0] : null;
                }
                if (!is_null($rev) && $rev['date'] >= $lastupdate) {
                    // Some change was not a minor one and not by myself
                    $change_ids[] = $rev['id'];
                }
            }
            if ($style === 'digest') {
                foreach ($change_ids as $change_id) {
                    subscription_send_digest($USERINFO['mail'], $change_id, $lastupdate);
                }
            } elseif ($style === 'list') {
                subscription_send_list($USERINFO['mail'], $change_ids, $id);
            }
            // TODO: Handle duplicate subscriptions.
            // Update notification time.
            subscription_set($user, $id, $style, time(), true);
        }
        subscription_unlock($id);
    }
    // restore current user info
    $USERINFO = $olduinfo;
    $_SERVER['REMOTE_USER'] = $olduser;
    echo 'sendDigest(): finished' . NL;
    return true;
}
コード例 #2
0
ファイル: indexer.php プロジェクト: Harvie/dokuwiki
/**
 * Send digest and list mails for all subscriptions which are in effect for the
 * current page
 *
 * @author Adrian Lang <*****@*****.**>
 */
function sendDigest()
{
    echo 'sendDigest(): start' . NL;
    global $ID;
    global $conf;
    if (!$conf['subscribers']) {
        return;
    }
    $subscriptions = subscription_find($ID, array('style' => '(digest|list)', 'escaped' => true));
    global $auth;
    global $lang;
    global $conf;
    global $USERINFO;
    // remember current user info
    $olduinfo = $USERINFO;
    $olduser = $_SERVER['REMOTE_USER'];
    foreach ($subscriptions as $id => $users) {
        if (!subscription_lock($id)) {
            continue;
        }
        foreach ($users as $data) {
            list($user, $style, $lastupdate) = $data;
            $lastupdate = (int) $lastupdate;
            if ($lastupdate + $conf['subscribe_time'] > time()) {
                // Less than the configured time period passed since last
                // update.
                continue;
            }
            // Work as the user to make sure ACLs apply correctly
            $USERINFO = $auth->getUserData($user);
            $_SERVER['REMOTE_USER'] = $user;
            if ($USERINFO === false) {
                continue;
            }
            if (substr($id, -1, 1) === ':') {
                // The subscription target is a namespace
                $changes = getRecentsSince($lastupdate, null, getNS($id));
                if (count($changes) === 0) {
                    continue;
                }
                if ($style === 'digest') {
                    foreach ($changes as $change) {
                        subscription_send_digest($USERINFO['mail'], $change, $lastupdate);
                    }
                } elseif ($style === 'list') {
                    subscription_send_list($USERINFO['mail'], $changes, $id);
                }
                // TODO: Handle duplicate subscriptions.
            } else {
                if (auth_quickaclcheck($id) < AUTH_READ) {
                    continue;
                }
                $meta = p_get_metadata($id);
                $rev = $meta['last_change']['date'];
                if ($rev < $lastupdate) {
                    // There is no new revision.
                    continue;
                }
                subscription_send_digest($USERINFO['mail'], $meta['last_change'], $lastupdate);
            }
            // Update notification time.
            subscription_set($user, $id, $style, time(), true);
        }
        subscription_unlock($id);
    }
    // restore current user info
    $USERINFO = $olduinfo;
    $_SERVER['REMOTE_USER'] = $olduser;
}