fetch_language(); // // Set the xml content type and only parse the xml templates // $template->content_type = 'application/rss+xml'; $template->parse_special_templates_only = true; // // Error page for the RSS feed // Don't use the templated pages for RSS readers // function usebb_rss_error($num) { switch ( $num ) { case 403: header(HEADER_403); die('

403 Forbidden

'); break; case 404: header(HEADER_404); die('

404 Not Found

'); } } function usebb_check_rss_access() { global $session, $functions; // // Make a Forbidden header when the RSS feed cannot be requested // if ( $session->sess_info['ip_banned'] || $functions->get_config('board_closed') || ( !$functions->get_config('guests_can_access_board') && $functions->get_user_level() == LEVEL_GUEST ) ) usebb_rss_error(403); } $pubDate = $functions->make_date(time(), 'D, d M Y H:i:s', true, false).' GMT'; // // Absolute template gfx directory // $template->add_global_vars(array('img_dir' => $functions->get_config('board_url').str_replace('./', '', ROOT_PATH).'templates/'.$functions->get_config('template').'/gfx/')); // // Figure out what feed to show // if ( !empty($_GET['forum']) && valid_int($_GET['forum']) ) { // // Show a feed for a forum // $session->update('rss-forum:'.$_GET['forum']); usebb_check_rss_access(); if ( !$functions->get_config('enable_rss_per_forum') ) usebb_rss_error(404); // // Get information about the forum // $result = $db->query("SELECT id, name, descr, auth FROM ".TABLE_PREFIX."forums WHERE id = ".$_GET['forum']); $forumdata = $db->fetch_result($result); // // Forum does not exist // if ( !$forumdata['id'] ) usebb_rss_error(404); // // Forum is not accessible // if ( !$functions->auth($forumdata['auth'], 'view', $_GET['forum']) ) usebb_rss_error(403); $forum_name = unhtml(stripslashes($forumdata['name']), true); $forum_link = $functions->get_config('board_url').$functions->make_url('forum.php', array('id' => $_GET['forum']), true, false); $header_vars = array( 'board_name' => unhtml($functions->get_config('board_name').': '.stripslashes($forumdata['name']), true), // Stripping tags, Firefox doesn't show the description when it has tags. 'board_descr' => named_entities_to_numeric(strip_tags(stripslashes($forumdata['descr']))), 'board_url' => $forum_link, 'pubDate' => $pubDate, 'link_rss' => $functions->get_config('board_url').$functions->make_url('rss.php', array('forum' => $_GET['forum']), true, false), ); $template->parse('header', 'rss', $header_vars, true); // // Get the topics // if ( $functions->auth($forumdata['auth'], 'read', $_GET['forum']) ) { $can_read = true; $add_to_query = array("p.content", "p.enable_bbcode", "p.enable_smilies", "p.enable_html", "m.level AS poster_level", "m.active"); } else { $can_read = false; $add_to_query = array(); } $add_to_query = count($add_to_query) ? ', '.implode(', ', $add_to_query) : ''; $result = $db->query("SELECT t.id, t.topic_title, p.poster_id, p.poster_guest, p.post_time, m.displayed_name".$add_to_query." FROM ".TABLE_PREFIX."topics t LEFT JOIN ".TABLE_PREFIX."posts p ON t.first_post_id = p.id LEFT JOIN ".TABLE_PREFIX."members m ON p.poster_id = m.id WHERE t.forum_id = ".$_GET['forum']." ORDER BY p.post_time DESC LIMIT ".$functions->get_config('rss_items_count')); while ( $topicdata = $db->fetch_result($result) ) { $link = $functions->get_config('board_url').$functions->make_url('topic.php', array('id' => $topicdata['id']), true, false); $can_post_links = $can_read && $functions->antispam_can_post_links($topicdata); $template->parse('topic', 'rss', array( 'title' => unhtml($functions->replace_badwords(stripslashes($topicdata['topic_title'])), true), 'description' => $can_read ? $functions->markup($functions->replace_badwords(stripslashes($topicdata['content'])), $topicdata['enable_bbcode'], $topicdata['enable_smilies'], $topicdata['enable_html'], true, $can_post_links) : '', // was renamed to in the default template to keep validity. 'author' => unhtml(stripslashes( ( !empty($topicdata['poster_id']) ) ? $topicdata['displayed_name'] : $topicdata['poster_guest']), true), 'link' => $link, // was removed from the default template because it was used incorrectly (not for posting comments). 'comments' => $link, 'category' => $forum_name, 'category_domain' => $forum_link, 'pubDate' => $functions->make_date($topicdata['post_time'], 'D, d M Y H:i:s', true, false).' GMT', 'guid' => $link ), true); } $template->parse('footer', 'rss', $header_vars, true); } elseif ( !empty($_GET['topic']) && valid_int($_GET['topic']) ) { // // Show a feed for a topic // $session->update('rss-topic:'.$_GET['topic']); usebb_check_rss_access(); if ( !$functions->get_config('enable_rss_per_topic') ) usebb_rss_error(404); // // Get information about the topic and forum // $result = $db->query("SELECT t.id, t.forum_id, t.topic_title, t.first_post_id, f.name AS forum_name, f.auth FROM ".TABLE_PREFIX."forums f, ".TABLE_PREFIX."topics t WHERE f.id = t.forum_id AND t.id = ".$_GET['topic']); $topicdata = $db->fetch_result($result); // // Topic does not exist // if ( !$topicdata['id'] ) usebb_rss_error(404); // // Topic is not accessible // if ( !$functions->auth($topicdata['auth'], 'read', $topicdata['forum_id']) ) usebb_rss_error(403); $topic_name = unhtml(stripslashes($topicdata['topic_title']), true); $topic_link = $functions->get_config('board_url').$functions->make_url('topic.php', array('id' => $_GET['topic']), true, false); $header_vars = array( 'board_name' => unhtml($functions->get_config('board_name'), true).': '.unhtml(stripslashes($topicdata['topic_title']), true), 'board_descr' => '', 'board_url' => $topic_link, 'pubDate' => $pubDate, 'link_rss' => $functions->get_config('board_url').$functions->make_url('rss.php', array('topic' => $_GET['topic']), true, false), ); $template->parse('header', 'rss', $header_vars, true); // // Get the posts // $result = $db->query("SELECT p.id, p.poster_id, p.poster_guest, p.content, p.post_time, p.enable_bbcode, p.enable_smilies, p.enable_html, m.displayed_name, m.level AS poster_level, m.active FROM ".TABLE_PREFIX."posts p LEFT JOIN ".TABLE_PREFIX."members m ON p.poster_id = m.id WHERE p.topic_id = ".$_GET['topic']." ORDER BY p.post_time DESC LIMIT ".$functions->get_config('rss_items_count')); while ( $postdata = $db->fetch_result($result) ) { $title = unhtml($functions->replace_badwords(stripslashes($topicdata['topic_title'])), true); $title = ( ( $postdata['id'] != $topicdata['first_post_id'] ) ? $lang['Re'].' ' : '' ) . $title; $link = $functions->get_config('board_url').$functions->make_url('topic.php', array('post' => $postdata['id']), true, false).'#post'.$postdata['id']; $can_post_links = $functions->antispam_can_post_links($postdata); $template->parse('topic', 'rss', array( 'title' => $title, 'description' => $functions->markup($functions->replace_badwords(stripslashes($postdata['content'])), $postdata['enable_bbcode'], $postdata['enable_smilies'], $postdata['enable_html'], true, $can_post_links), // was renamed to in the default template to keep validity. 'author' => unhtml(stripslashes( ( !empty($postdata['poster_id']) ) ? $postdata['displayed_name'] : $postdata['poster_guest']), true), 'link' => $link, // was removed from the default template because it was used incorrectly (not for posting comments). 'comments' => $link, 'category' => $topic_name, 'category_domain' => $topic_link, 'pubDate' => $functions->make_date($postdata['post_time'], 'D, d M Y H:i:s', true, false).' GMT', 'guid' => $link ), true); } $template->parse('footer', 'rss', $header_vars, true); } else { // // Show a regular active topics feed // $session->update('rss'); usebb_check_rss_access(); if ( !$functions->get_config('enable_rss') ) usebb_rss_error(404); // // Excluded forums // $exclude_forums = $functions->get_config('exclude_forums_rss'); $exclude_forums_query_part = ( is_array($exclude_forums) && count($exclude_forums) ) ? " WHERE id NOT IN (".join(', ', $exclude_forums).")" : ''; // // Get a list of forums // $result = $db->query("SELECT id, name, auth FROM ".TABLE_PREFIX."forums".$exclude_forums_query_part); $forum_ids = $forum_names = array(); while ( $forumdata = $db->fetch_result($result) ) { // // Place permitted forums into the arrays // if ( $functions->auth($forumdata['auth'], 'read', $forumdata['id']) ) { $forum_ids[] = $forumdata['id']; $forum_names[$forumdata['id']] = $forumdata['name']; } } // // No viewable forums // if ( !count($forum_ids) ) usebb_rss_error(403); $header_vars = array( 'board_name' => unhtml($functions->get_config('board_name'), true), 'board_descr' => unhtml($functions->get_config('board_descr'), true), 'board_url' => $functions->get_config('board_url'), 'pubDate' => $pubDate, 'link_rss' => $functions->get_config('board_url').$functions->make_url('rss.php', null, true, false), ); $template->parse('header', 'rss', $header_vars, true); $result = $db->query("SELECT p.id AS post_id, p.topic_id, t.forum_id, t.topic_title, t.count_replies, p.content, p.enable_bbcode, p.enable_smilies, p.enable_html, p.poster_id, m.displayed_name AS last_poster_name, m.level AS poster_level, m.active, p.poster_guest AS last_poster_guest, p.post_time FROM ".TABLE_PREFIX."posts p LEFT JOIN ".TABLE_PREFIX."members m ON p.poster_id = m.id, ".TABLE_PREFIX."topics t WHERE t.forum_id IN(".join(', ', $forum_ids).") AND t.id = p.topic_id ORDER BY p.post_time DESC LIMIT ".$functions->get_config('rss_items_count')); $reply_counts = array(); while ( $topicdata = $db->fetch_result($result) ) { if ( !array_key_exists($topicdata['topic_id'], $reply_counts) ) $reply_counts[$topicdata['topic_id']] = $topicdata['count_replies']; else $reply_counts[$topicdata['topic_id']]--; $title = unhtml($functions->replace_badwords(stripslashes($topicdata['topic_title'])), true); if ( $reply_counts[$topicdata['topic_id']] ) $title = $lang['Re'].' '.$title; $link = $functions->get_config('board_url').$functions->make_url('topic.php', array('post' => $topicdata['post_id']), true, false).'#post'.$topicdata['post_id']; $can_post_links = $functions->antispam_can_post_links($topicdata); // // Parse the topic template // $template->parse('topic', 'rss', array( 'title' => $title, 'description' => $functions->markup($functions->replace_badwords(stripslashes($topicdata['content'])), $topicdata['enable_bbcode'], $topicdata['enable_smilies'], $topicdata['enable_html'], true, $can_post_links), // was renamed to in the default template to keep validity. 'author' => unhtml(stripslashes( ( !empty($topicdata['poster_id']) ) ? $topicdata['last_poster_name'] : $topicdata['last_poster_guest']), true), 'link' => $link, // was removed from the default template because it was used incorrectly (not for posting comments). 'comments' => $functions->get_config('board_url').$functions->make_url('post.php', array('topic' => $topicdata['topic_id'], 'quotepost' => $topicdata['post_id']), true, false), 'category' => unhtml(stripslashes($forum_names[$topicdata['forum_id']]), true), 'category_domain' => $functions->get_config('board_url').$functions->make_url('forum.php', array('id' => $topicdata['forum_id']), true, false), 'pubDate' => $functions->make_date($topicdata['post_time'], 'D, d M Y H:i:s', true, false).' GMT', 'guid' => $link ), true); } $template->parse('footer', 'rss', $header_vars, true); } // // Include the page footer // require(ROOT_PATH.'sources/page_foot.php'); ?>