<?php
if( basename(__FILE__) == basename($_SERVER['SCRIPT_FILENAME']) )
	die();

/**
 * FeedInterceptor_RS PHP class for the WordPress plugin Role Scoper
 * feed-interceptor_rs.php
 * 
 * Provides optional http authentication for RSS feeds.
 *
 * Also allows replacement of readable RSS feed content with a permalink to the post.
 * This may be desirable since browsers sometimes cache the feed content after user logout.
 *
 * @author 		S�ren Weber, with adaptations by Kevin Behrens
 * 
 */

define( 'HTTP_AUTH_RS', 'http_auth' );
define( 'PERMALINK_PLACEHOLDER_RS', '%permalink%' );

define( 'RSS_FULL_CONTENT_RS', 'full_content' );
define( 'RSS_EXCERPT_ONLY_RS', 'excerpt_only' );
define( 'RSS_TITLE_ONLY_RS', 'title_only' );

// Override WP's get_currentuserinfo in order to do the login
// via HTTP auth. Adapted from WP core get_currentuserinfo
if ( ! empty($_GET[HTTP_AUTH_RS]) ) {
	if ( function_exists( 'get_currentuserinfo' ) )
		define( 'HTTP_AUTH_DISABLED_RS', true );
	else {
		function get_currentuserinfo() {
			// Use HTTP auth instead of cookies
			global $current_user;
	
			if (!empty($current_user))
				return;
			
			// Some apache versions prepend "REDIRECT_" to server variable name, according to http://www.besthostratings.com/articles/http-auth-php-cgi.html
			if ( isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']) && ! isset($_SERVER['HTTP_AUTHORIZATION']) )
				$_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];

			// Workaround for HTTP Authentication with PHP running as CGI (htaccess rule copies authentication data into HTTP_AUTHORIZATION)
			if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
				$ha = base64_decode( substr($_SERVER['HTTP_AUTHORIZATION'],6) );
				list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', $ha);
				unset($ha);
			}

			if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])
				|| !wp_login($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
			{
				header('WWW-Authenticate: Basic realm="'. get_bloginfo('name'). '"');
				header('HTTP/1.0 401 Unauthorized');
	
				scoper_load_textdomain(); // otherwise this is only loaded for wp-admin
		
				die( __('Access denied: Incorrect credentials supplied.', 'scoper') );
			}
	
			$user_login = $_SERVER['PHP_AUTH_USER'];
			wp_set_current_user(0, $user_login);
		}
	}
}
 
class FeedInterceptor_RS {	
	function FeedInterceptor_RS() {
		$http_auth_if = scoper_get_option( 'feed_link_http_auth' );
		
		if ( 'logged' == $http_auth_if ) {
			global $current_user;
			$http_auth_if = ! empty($current_user->ID);
		}

		if ( $http_auth_if ) {
			add_filter('feed_link', array(&$this, 'filter_feed_link'));
			add_filter('category_feed_link', array(&$this, 'filter_feed_link'));
			add_filter('tag_feed_link', array(&$this, 'filter_feed_link'));
			add_filter('author_feed_link', array(&$this, 'filter_feed_link'));
			add_filter('post_comments_feed_link', array(&$this, 'filter_feed_link'));
		}
			
		add_filter('the_content_rss', array(&$this, 'filter_the_content_rss'));
		add_filter('the_excerpt_rss', array(&$this, 'filter_the_excerpt_rss'));
		
		if ( is_feed() ) {
			// Only filter the_content if we're sure this is an RSS request (TODO: is this still necessary?)
			if ( ! empty($_GET[HTTP_AUTH_RS]) )
				add_filter('the_content', array(&$this, 'filter_the_content_rss'));
		}
	}
	
	function replace_feed_teaser_placeholder($content) {
		if ( ! empty( $GLOBALS['post'] ) ) {
			$search[] = PERMALINK_PLACEHOLDER_RS;
			$replace[] = get_permalink($GLOBALS['post']->ID);
			$content = str_replace($search, $replace, $content);
		}
		
		return $content;
	}

	function filter_rss( $text, $subject = 'content' ) {
		global $post;

		if ( ! empty($post) && ! empty($post->scoper_teaser) )
			return $text;

		if ( $post->post_status == 'private')
			$feed_privacy = scoper_get_option( 'rss_private_feed_mode' );
		else
			$feed_privacy = scoper_get_option( 'rss_nonprivate_feed_mode' );

		switch ($feed_privacy) {
			case RSS_FULL_CONTENT_RS:
				return $text;
		
			case RSS_EXCERPT_ONLY_RS:
				if ( 'content' == $subject )
					return apply_filters( 'the_excerpt_rss', get_the_excerpt(true) );
				else
					return $text;
					
			default:
				if ( $msg = scoper_get_option( 'feed_teaser' ) ) {
					if ( defined('SCOPER_TRANSLATE_TEASER') ) {
						scoper_load_textdomain(); // otherwise this is only loaded for wp-admin
	
						$msg = translate( $msg, 'scoper');
					
						if ( ! empty($msg) && ! is_null($msg) && is_string($msg) )
							$msg = htmlspecialchars_decode( $msg );
					}
				
					return $this->replace_feed_teaser_placeholder( $msg );
				}
		} // end switch
	}
	
	// Called when using HTTP auth -- changes the article content for items which are not already filtered by Hidden Content Teaser
	function filter_the_content_rss($content) {
		return $this->filter_rss($content, 'content');
	}

	// Called when using HTTP auth -- changes the article excerpt for items which are not already filtered by Hidden Content Teaser
	function filter_the_excerpt_rss($excerpt) {
		return $this->filter_rss($excerpt, 'excerpt');
	}

	// Rewrites RSS feed links to support http authentication
	// if the user is logged in
	function filter_feed_link($output) {
		$delim = (strpos($output, '?') === false) ? '?' : '&';
		return $output. $delim . HTTP_AUTH_RS . '=1';
	}
}
?>