1<?php 2 3/** 4 * The RSS feed with the news. 5 * 6 * This Source Code Form is subject to the terms of the Mozilla Public License, 7 * v. 2.0. If a copy of the MPL was not distributed with this file, You can 8 * obtain one at http://mozilla.org/MPL/2.0/. 9 * 10 * @package phpMyFAQ 11 * @author Thorsten Rinne <thorsten@phpmyfaq.de> 12 * @author Matteo Scaramuccia <matteo@phpmyfaq.de> 13 * @copyright 2004-2020 phpMyFAQ Team 14 * @license http://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0 15 * @link https://www.phpmyfaq.de 16 * @since 2004-11-05 17 */ 18 19define('PMF_ROOT_DIR', dirname(dirname(__DIR__))); 20define('IS_VALID_PHPMYFAQ', null); 21 22use phpMyFAQ\Date; 23use phpMyFAQ\Helper\HttpHelper; 24use phpMyFAQ\Language; 25use phpMyFAQ\Link; 26use phpMyFAQ\News; 27use phpMyFAQ\Strings; 28use phpMyFAQ\User\CurrentUser; 29 30// 31// Bootstrapping 32// 33require PMF_ROOT_DIR.'/src/Bootstrap.php'; 34 35// 36// get language (default: english) 37// 38$Language = new Language($faqConfig); 39$faqLangCode = $Language->setLanguage($faqConfig->get('main.languageDetection'), $faqConfig->get('main.language')); 40// Preload English strings 41require_once PMF_ROOT_DIR.'/lang/language_en.php'; 42$faqConfig->setLanguage($Language); 43 44if (isset($faqLangCode) && Language::isASupportedLanguage($faqLangCode)) { 45 // Overwrite English strings with the ones we have in the current language 46 require_once PMF_ROOT_DIR.'/lang/language_'.$faqLangCode.'.php'; 47} else { 48 $faqLangCode = 'en'; 49} 50 51if ($faqConfig->get('security.enableLoginOnly')) { 52 if (!isset($_SERVER['PHP_AUTH_USER'])) { 53 header('WWW-Authenticate: Basic realm="phpMyFAQ RSS Feeds"'); 54 header('HTTP/1.0 401 Unauthorized'); 55 exit; 56 } else { 57 $user = new CurrentUser($faqConfig); 58 if ($user->login($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) { 59 if ($user->getStatus() != 'blocked') { 60 $auth = true; 61 } else { 62 $user = null; 63 } 64 } else { 65 $user = null; 66 } 67 } 68} else { 69 $user = CurrentUser::getFromCookie($faqConfig); 70 if (!$user instanceof CurrentUser) { 71 $user = CurrentUser::getFromSession($faqConfig); 72 } 73} 74 75// 76// Initializing static string wrapper 77// 78Strings::init($faqLangCode); 79 80if (!$faqConfig->get('main.enableRssFeeds')) { 81 exit('The RSS Feeds are disabled.'); 82} 83 84$oNews = new News($faqConfig); 85$showArchive = false; 86$active = true; 87$forceConfLimit = true; 88$rssData = $oNews->getLatestData($showArchive, $active, $forceConfLimit); 89$num = count($rssData); 90 91$rss = new XMLWriter(); 92$rss->openMemory(); 93$rss->setIndent(true); 94 95$rss->startDocument('1.0', 'utf-8'); 96$rss->startElement('rss'); 97$rss->writeAttribute('version', '2.0'); 98$rss->writeAttribute('xmlns:atom', 'http://www.w3.org/2005/Atom'); 99$rss->startElement('channel'); 100$rss->writeElement('title', $faqConfig->get('main.titleFAQ').' - '.$PMF_LANG['msgNews']); 101$rss->writeElement('description', html_entity_decode($faqConfig->get('main.metaDescription'))); 102$rss->writeElement('link', $faqConfig->getDefaultUrl()); 103$rss->startElementNs('atom', 'link', 'http://www.w3.org/2005/Atom'); 104$rss->writeAttribute('rel', 'self'); 105$rss->writeAttribute('type', 'application/rss+xml'); 106$rss->writeAttribute('href', $faqConfig->getDefaultUrl().'feed/news/rss.php'); 107$rss->endElement(); 108 109if ($num > 0) { 110 foreach ($rssData as $item) { 111 // Get the url 112 $link = '/index.php?action=news&newsid='.$item['id'].'&newslang='.$item['lang']; 113 if (PMF_RSS_USE_SEO) { 114 if (isset($item['header'])) { 115 $oLink = new Link($link, $faqConfig); 116 $oLink->itemTitle = $item['header']; 117 $link = $oLink->toString(); 118 } 119 } 120 121 $rss->startElement('item'); 122 $rss->writeElement('title', html_entity_decode($item['header'], ENT_COMPAT, 'UTF-8')); 123 124 $rss->startElement('description'); 125 $rss->writeCdata($item['content']); 126 $rss->endElement(); 127 128 $rss->writeElement('link', $link); 129 $rss->writeElement('guid', $link); 130 $rss->writeElement('pubDate', Date::createRFC822Date($item['date'], true)); 131 $rss->endElement(); 132 } 133} 134 135$rss->endElement(); 136$rss->endElement(); 137$rssData = $rss->outputMemory(); 138 139$headers = [ 140 'Content-Type: application/rss+xml', 141 'Content-Length: '.strlen($rssData), 142]; 143 144$http = new HttpHelper(); 145$http->sendWithHeaders($rssData, $headers); 146 147$faqConfig->getDb()->close(); 148