diff --git a/cache/index.php b/cache/index.php new file mode 100644 index 0000000..312a51d --- /dev/null +++ b/cache/index.php @@ -0,0 +1,53 @@ + ['timeout' => 10]]); + $ical_str = @file_get_contents($ical_url, false, $context); + + if ($ical_str !== false && strpos($ical_str, 'BEGIN:VCALENDAR') !== false) { + file_put_contents($cachefile, $ical_str); + } +} + +if (file_exists($cachefile)) { + $content = file_get_contents($cachefile); + + // Replace X-WR-CALNAME + $content = preg_replace('/X-WR-CALNAME:.*(\r\n|\n|\r)/i', "X-WR-CALNAME:" . $ical_name . "\r\n", $content); + + // Remove all ORGANIZER + $content = preg_replace('/^ORGANIZER[:;].*(?:\r?\n[\t ].*)*(\r?\n)?/mi', '', $content); + + // Filter CATEGORIES + $exclude = $_GET['exclude'] ?? ''; + + if ($exclude && strlen($exclude) < 32 && preg_match('/^[a-zA-Z0-9_|-]+$/', $exclude)) { + + $parts = explode('|', $exclude); + $safe_parts = array_map(function($part) { + return preg_quote(trim($part), '/'); + }, $parts); + $safe_exclude = implode('|', $safe_parts); + + $filtered_content = preg_replace('/BEGIN:VEVENT(?!(?:(?!END:VEVENT)[\s\S])*CATEGORIES:(?:(?!' . $safe_exclude . ')[\s\S])*?(?:\r?\n|;))(?:(?!END:VEVENT)[\s\S])*END:VEVENT(?:\r?\n)?/ms', '', $content); + + if ($filtered_content !== null) { + $content = $filtered_content; + } + } + + header('Content-Type: text/calendar; charset=utf-8'); + header('Content-Disposition: attachment; filename="' . $ical_file . '"'); + header('Content-Description: File Transfer'); + header('Cache-Control: public, max-age=120, must-revalidate'); + header('Content-Length: ' . strlen($content)); + + echo $content; + exit; +} else { + die("File not found."); +} \ No newline at end of file