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