refactor, add authent
This commit is contained in:
parent
aa967da857
commit
e5f5f1a202
|
@ -0,0 +1,4 @@
|
|||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine on
|
||||
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
|
||||
</IfModule>
|
293
ics.php
293
ics.php
|
@ -1,169 +1,150 @@
|
|||
<?php
|
||||
require 'settings.php';
|
||||
|
||||
if (isset($_POST['password']))
|
||||
{
|
||||
$password = $_POST['password'];
|
||||
|
||||
$curl = curl_init();
|
||||
|
||||
curl_setopt($curl, CURLOPT_URL, $url);
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($curl, CURLOPT_USERPWD, $user . ':' . $password);
|
||||
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
|
||||
$result = curl_exec($curl);
|
||||
|
||||
if (!$result)
|
||||
{
|
||||
die('error');
|
||||
}
|
||||
curl_close($curl);
|
||||
die($result);
|
||||
}
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<header>
|
||||
<title>Evénements à venir</title>
|
||||
</header>
|
||||
<body style="font-family: helvetica; line-height: 24px; font-size: 16px;">
|
||||
<div id="content">Récupération du calendrier...</div>
|
||||
<script type="text/javascript">
|
||||
function ics2json(input)
|
||||
<head>
|
||||
<title>Evénements à venir</title>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body style="font-family: helvetica; line-height: 24px; font-size: 16px;">
|
||||
<div id="content">
|
||||
<?php
|
||||
|
||||
require 'settings.php';
|
||||
|
||||
// authent
|
||||
if ($password && (!isset($_SERVER['PHP_AUTH_PW']) || $_SERVER['PHP_AUTH_PW'] != $password))
|
||||
{
|
||||
var id = 0;
|
||||
var root = {};
|
||||
var curr = root;
|
||||
input.split("\r\n").forEach(l =>
|
||||
{
|
||||
var key = l.split(":")[0].split(";")[0];
|
||||
var val = l.split(":")[1];
|
||||
if (key == "BEGIN")
|
||||
{
|
||||
if (curr[val])
|
||||
{
|
||||
val += "_" + (id++);
|
||||
}
|
||||
curr[val] = {
|
||||
parent: curr
|
||||
};
|
||||
curr = curr[val];
|
||||
}
|
||||
else if (key == "END")
|
||||
{
|
||||
var parent = curr.parent;
|
||||
delete curr.parent;
|
||||
curr = parent;
|
||||
}
|
||||
else
|
||||
{
|
||||
curr[key] = key.startsWith("DT") ? dt(val) : val;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
root.VCALENDAR.VEVENTS = [];
|
||||
Object.keys(root.VCALENDAR)
|
||||
.filter(k => (k == "VEVENT" || k.startsWith("VEVENT_")))
|
||||
.forEach(k =>
|
||||
{
|
||||
root.VCALENDAR.VEVENTS.push(root.VCALENDAR[k]);
|
||||
delete root.VCALENDAR[k];
|
||||
});
|
||||
|
||||
return root.VCALENDAR;
|
||||
header('WWW-Authenticate: Basic realm="bbn"');
|
||||
header('HTTP/1.0 401 Unauthorized');
|
||||
echo '<p>Access denied.</p></body></html>';
|
||||
exit;
|
||||
}
|
||||
|
||||
function dt(s)
|
||||
{
|
||||
var formatted = s.substr(0,4) + "-" + s.substr(4,2) + "-" + s.substr(6,2);
|
||||
if (s.length > 8)
|
||||
{
|
||||
formatted += "T" + s.substr(9,2) + ":" + s.substr(11,2) + ":" + s.substr(13,2);
|
||||
}
|
||||
return new Date(formatted);
|
||||
// Enable error reporting for debugging
|
||||
//error_reporting(E_ALL);
|
||||
//ini_set('display_errors', 1);
|
||||
|
||||
function ics2json($input) {
|
||||
$id = 0;
|
||||
$root = [];
|
||||
$curr = &$root;
|
||||
$lines = explode("\r\n", $input);
|
||||
foreach ($lines as $line) {
|
||||
$parts = explode(":", $line, 2);
|
||||
$key = explode(";", $parts[0])[0];
|
||||
$val = isset($parts[1]) ? $parts[1] : '';
|
||||
if ($key == "BEGIN") {
|
||||
if (isset($curr[$val])) {
|
||||
$val .= "_" . ($id++);
|
||||
}
|
||||
$curr[$val] = ['parent' => &$curr];
|
||||
$curr = &$curr[$val];
|
||||
} elseif ($key == "END") {
|
||||
$parent = &$curr['parent'];
|
||||
unset($curr['parent']);
|
||||
$curr = &$parent;
|
||||
} else {
|
||||
$curr[$key] = (strpos($key, "DT") === 0) ? dt($val) : $val;
|
||||
}
|
||||
}
|
||||
$root['VCALENDAR']['VEVENTS'] = [];
|
||||
foreach ($root['VCALENDAR'] as $k => $v) {
|
||||
if ($k == "VEVENT" || strpos($k, "VEVENT_") === 0) {
|
||||
$root['VCALENDAR']['VEVENTS'][] = $v;
|
||||
unset($root['VCALENDAR'][$k]);
|
||||
}
|
||||
}
|
||||
return $root['VCALENDAR'];
|
||||
}
|
||||
|
||||
function formatdate(d)
|
||||
{
|
||||
return d.toLocaleString('fr-FR', { timeZone: 'Europe/Paris', dateStyle: "full", timeStyle: "short" });
|
||||
function dt($s) {
|
||||
$formatted = substr($s, 0, 4) . "-" . substr($s, 4, 2) . "-" . substr($s, 6, 2);
|
||||
if (strlen($s) > 8) {
|
||||
$formatted .= "T" . substr($s, 9, 2) . ":" . substr($s, 11, 2) . ":" . substr($s, 13, 2);
|
||||
}
|
||||
return new DateTime($formatted);
|
||||
}
|
||||
|
||||
function showresult()
|
||||
{
|
||||
if (xhr.status == 200)
|
||||
{
|
||||
var params = new URLSearchParams(window.location.search);
|
||||
var recent = parseInt(params.get("recent"));
|
||||
if (isNaN(recent))
|
||||
{
|
||||
recent = 7;
|
||||
}
|
||||
|
||||
var recentonly = params.get("recentonly");
|
||||
|
||||
var html = "<h1>Evénements à venir</h1>";
|
||||
html += `<h3>${formatdate(new Date)}</h3>`;
|
||||
html += `<div>En gras: modifié les ${recent} derniers jours</div>`;
|
||||
|
||||
var weblink = params.get("weblink");
|
||||
if (weblink)
|
||||
{
|
||||
html += `<div><a target="_blank" href="${weblink}">Lien vers calendrier web</a></div>`;
|
||||
}
|
||||
|
||||
var o = ics2json(xhr.responseText);
|
||||
|
||||
var lastmodified = new Date();
|
||||
lastmodified.setDate(lastmodified.getDate() - recent);
|
||||
var group = {};
|
||||
|
||||
o.VEVENTS
|
||||
.filter(e => e.DTSTART >= (new Date) && (!recentonly || e.DTSTAMP >= lastmodified))
|
||||
.sort( (a,b) => a.DTSTART - b.DTSTART)
|
||||
.forEach(e => {
|
||||
var formatteddate = formatdate(e.DTSTART);
|
||||
var splitdate = formatteddate.split(" ");
|
||||
var year = splitdate[3];
|
||||
var month = splitdate[2];
|
||||
|
||||
if (!group[year])
|
||||
{
|
||||
html += `<h2>${year}</h2>`;
|
||||
group[year] = {};
|
||||
}
|
||||
|
||||
if (!group[year][month])
|
||||
{
|
||||
html += `<h3>${month}</h3>`;
|
||||
group[year][month] = true;
|
||||
}
|
||||
|
||||
var line = `<li title="modifié le ${formatdate(e.DTSTAMP)}"> ${formatteddate}: ${e.SUMMARY}`;
|
||||
if (e.DTSTAMP >= lastmodified)
|
||||
{
|
||||
line = `<b>${line}</b>`;
|
||||
}
|
||||
html += line;
|
||||
});
|
||||
|
||||
content.innerHTML = html;
|
||||
}
|
||||
function formatdate($d) {
|
||||
return strftime('%A, %e %B %Y %H:%M', $d->getTimestamp());
|
||||
}
|
||||
|
||||
var password = localStorage.getItem("icspassword");
|
||||
if (!password)
|
||||
{
|
||||
password = prompt("password:");
|
||||
localStorage.setItem("icspassword", password);
|
||||
function getWeek($date) {
|
||||
$dto = new DateTime();
|
||||
$dto->setISODate($date->format('o'), $date->format('W'));
|
||||
return $dto->format('W');
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onload = showresult;
|
||||
xhr.open("POST", "ics.php");
|
||||
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
||||
xhr.send("password=" + password);
|
||||
setlocale(LC_TIME, 'fr_FR.UTF-8');
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
$curl = curl_init();
|
||||
curl_setopt($curl, CURLOPT_URL, $davurl);
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($curl, CURLOPT_USERPWD, $davuser . ':' . $davpassword);
|
||||
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
|
||||
$result = curl_exec($curl);
|
||||
if (!$result) {
|
||||
die('error');
|
||||
}
|
||||
curl_close($curl);
|
||||
|
||||
$params = [];
|
||||
parse_str($_SERVER['QUERY_STRING'], $params);
|
||||
$recent = isset($params['recent']) ? (int)$params['recent'] : 7;
|
||||
$recentonly = isset($params['recentonly']);
|
||||
$weblink = isset($params['weblink']) ? $params['weblink'] : '';
|
||||
|
||||
$html = "<h1>Evénements à venir</h1>";
|
||||
$html .= "<h2>" . strftime('%A, %e %B %Y %H:%M') . "</h2>";
|
||||
$html .= "<div>En gras: modifié les $recent derniers jours</div>";
|
||||
if ($weblink) {
|
||||
$html .= "<div><a target=\"_blank\" href=\"$weblink\">Lien vers calendrier web</a></div>";
|
||||
}
|
||||
|
||||
$o = ics2json($result);
|
||||
$lastmodified = new DateTime();
|
||||
$lastmodified->modify("-$recent days");
|
||||
$group = [];
|
||||
usort($o['VEVENTS'], function($a, $b) {
|
||||
return $a['DTSTART'] <=> $b['DTSTART'];
|
||||
});
|
||||
|
||||
foreach ($o['VEVENTS'] as $e) {
|
||||
if ($e['DTSTART'] >= new DateTime() && (!$recentonly || $e['DTSTAMP'] >= $lastmodified)) {
|
||||
|
||||
$formatteddate = strftime('%A %d %B %Y %H:%M', $e['DTSTART']->getTimestamp());
|
||||
$splitdate = explode(' ', $formatteddate);
|
||||
$year = $splitdate[3];
|
||||
$month = $splitdate[2];
|
||||
$week = getWeek($e['DTSTART']);
|
||||
if (!isset($group[$year])) {
|
||||
$html .= "<h2>$year</h2>";
|
||||
$group[$year] = [];
|
||||
}
|
||||
if (!isset($group[$year][$month])) {
|
||||
$html .= "<h3>$month</h3>";
|
||||
$group[$year][$month] = [];
|
||||
}
|
||||
if (!isset($group[$year][$month][$week])) {
|
||||
$html .= "<h4>Semaine $week</h4>";
|
||||
$group[$year][$month][$week] = true;
|
||||
}
|
||||
$line = "<li title=\"modifié le " . strftime('%A, %e %B %Y %H:%M', $e['DTSTAMP']->getTimestamp()) . "\">";
|
||||
if ($e['DTSTAMP'] >= $lastmodified) {
|
||||
$line .= "<b>";
|
||||
}
|
||||
$line .= "$formatteddate: " . $e['SUMMARY'];
|
||||
if ($e['DTSTAMP'] >= $lastmodified) {
|
||||
$line .= "</b>";
|
||||
}
|
||||
$line .= '</li>';
|
||||
if ($e['DTSTAMP'] >= $lastmodified) {
|
||||
$line = "<b>$line</b>";
|
||||
}
|
||||
$html .= $line;
|
||||
}
|
||||
}
|
||||
echo $html;
|
||||
?>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -1,4 +1,6 @@
|
|||
<?php
|
||||
$url = 'https://caldav.example.com/path/to/calendar';
|
||||
$user = 'caldavuser';
|
||||
$davurl = 'https://caldav.example.com/path/to/calendar';
|
||||
$davuser = 'caldavuser';
|
||||
$davpassword = 'caldavpassword';
|
||||
$password = 'httppassword';
|
||||
?>
|
||||
|
|
Loading…
Reference in New Issue