Modifications 4304

This commit is contained in:
Deltacms 2022-09-02 08:44:18 +02:00
parent 0d282a86d9
commit 3eac7f08df
58 changed files with 4543 additions and 3837 deletions

View File

@ -1,36 +1,36 @@
# Active la compression GZIP - option Apache
# Racine du site DeltaCMS
<Files .htaccess>
Require all denied
</Files>
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text\.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image\.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|woff)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text\.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image\.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</IfModule>
# Active la compression DEFLATE - option Apache
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/shtml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>
# Bloque l'accès à la liste des fichiers
Options -Indexes
# Désactive l'option de substitution automatique
<IfModule mod_negotiation.c>
Options -MultiViews
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/shtml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE font/woff
AddOutputFilterByType DEFLATE font/woff2
AddOutputFilterByType DEFLATE application/font-woff
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>
Options -Indexes -MultiViews
# Attention, surtout ne rien modifier ci-dessous !
# URL rewriting

View File

@ -1,5 +1,19 @@
# Changelog
## Version 4.3.04 de Deltacms
- Modifications :
- Fichiers .htaccess : Mise à jour vers Apache 2.4. Attention pour cette mise à jour vers la version Deltacms 4.3.04
l'option "Préservez le fichier .htaccess racine", dans Configurer le site / onglet Configuration / bloc Mise à jour automatisée,
doit être décochée. Sinon vous devrez mettre en version Apache 2.4 votre .htaccess racine personnalisé,
- Fichiers robots.txt et sitemap.xml : suppression de la mise à jour automatique de ces fichiers, elle ne pourra plus se faire
que par un appui sur le bouton "Générer sitemap.xml et robots.txt" dans Configurer le site / onglet Référencement / bloc Paramètres,
- Blog : le lexique pour la langue d'administration est déporté dans un dossier 'lang',
- Blog : L'image d'illustration n'est plus obligatoire,
- Filemanager : les images au format webp sont autorisées,
- Agenda, Statislite : les dossiers d'installation de ces modules sont placés dans un dossier 'ressource' du module.
- Corrections :
- Form, Agenda : déplacement de l'initialisation de variables Javascript qui provoquait un décalage d'affichage dans la barre d'administration.
## Version 4.3.03 de Deltacms
- Modifications :
- News : nouvelle option insérer des images ou des iframe sans marges.

View File

@ -1,5 +1,5 @@
# DeltaCMS 4.3.03
# DeltaCMS 4.3.04
DeltaCMS est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.
L'administration du site est bilingue anglais ou français, le site peut être rédigé dans une des principales langues européennes.

View File

@ -1,3 +1 @@
# Bloque l'accès à la librairie
Order deny,allow
Deny from all
Require all denied

View File

@ -1,3 +0,0 @@
# Bloque l'accès à la librairie
Order deny,allow
Deny from all

View File

@ -48,7 +48,7 @@ class common {
// Numéro de version
const DELTA_UPDATE_URL = 'https://update.deltacms.fr/master/';
const DELTA_VERSION = '4.3.03';
const DELTA_VERSION = '4.3.04';
const DELTA_UPDATE_CHANNEL = "v4";
public static $actions = [];
@ -894,7 +894,7 @@ class common {
/**
* Génère un fichier un fichier sitemap.xml
* Génère un fichier sitemap.xml
* https://github.com/icamys/php-sitemap-generator
* $command valeurs possible
* all : génère un site map complet
@ -926,49 +926,54 @@ class common {
$datetime = new DateTime(date('c'));
$datetime->format(DateTime::ATOM); // Updated ISO8601
foreach($this->getHierarchy(null, null, null) as $parentPageId => $childrenPageIds) {
// Exclure les barres et les pages non publiques et les pages masquées
if ($this->getData(['page',$parentPageId,'group']) !== 0 ||
$this->getData(['page', $parentPageId, 'block']) === 'bar' ) {
continue;
}
// Page désactivée, traiter les sous-pages sans prendre en compte la page parente.
if ($this->getData(['page', $parentPageId, 'disable']) !== true ) {
// Cas de la page d'accueil ne pas dupliquer l'URL
$pageId = ($parentPageId !== $this->getData(['locale', 'homePageId'])) ? $parentPageId : '';
$sitemap->addUrl ('/' . $pageId, $datetime);
}
// Articles du blog
if ($this->getData(['page', $parentPageId, 'moduleId']) === 'blog' &&
!empty($this->getData(['module',$parentPageId])) ) {
foreach($this->getData(['module',$parentPageId,'posts']) as $articleId => $article) {
if($this->getData(['module',$parentPageId,'posts',$articleId,'state']) === true) {
$date = $this->getData(['module',$parentPageId,'posts',$articleId,'publishedOn']);
$sitemap->addUrl('/' . $parentPageId . '/' . $articleId , new DateTime("@{$date}",new DateTimeZone($timezone)));
}
}
}
// Sous-pages
foreach($childrenPageIds as $childKey) {
if ($this->getData(['page',$childKey,'group']) !== 0 || $this->getData(['page', $childKey, 'disable']) === true) {
if ($this->getData(['config','seo', 'robots']) === true) {
foreach($this->getHierarchy(null, null, null) as $parentPageId => $childrenPageIds) {
// Exclure les barres et les pages non publiques et les pages masquées
if ($this->getData(['page',$parentPageId,'group']) !== 0 ||
$this->getData(['page', $parentPageId, 'block']) === 'bar' ) {
continue;
}
// Cas de la page d'accueil ne pas dupliquer l'URL
$pageId = ($childKey !== $this->getData(['locale', 'homePageId'])) ? $childKey : '';
$sitemap->addUrl('/' . $childKey,$datetime);
// La sous-page est un blog
if ($this->getData(['page', $childKey, 'moduleId']) === 'blog' &&
!empty($this->getData(['module',$childKey])) ) {
foreach($this->getData(['module',$childKey,'posts']) as $articleId => $article) {
if($this->getData(['module',$childKey,'posts',$articleId,'state']) === true) {
$date = $this->getData(['module',$childKey,'posts',$articleId,'publishedOn']);
$sitemap->addUrl( '/' . $childKey . '/' . $articleId , new DateTime("@{$date}",new DateTimeZone($timezone)));
// Page désactivée, traiter les sous-pages sans prendre en compte la page parente.
if ($this->getData(['page', $parentPageId, 'disable']) !== true ) {
// Cas de la page d'accueil ne pas dupliquer l'URL
$pageId = ($parentPageId !== $this->getData(['locale', 'homePageId'])) ? $parentPageId : '';
$sitemap->addUrl ('/' . $pageId, $datetime);
}
// Articles du blog
if ($this->getData(['page', $parentPageId, 'moduleId']) === 'blog' &&
!empty($this->getData(['module',$parentPageId])) ) {
foreach($this->getData(['module',$parentPageId,'posts']) as $articleId => $article) {
if($this->getData(['module',$parentPageId,'posts',$articleId,'state']) === true) {
$date = $this->getData(['module',$parentPageId,'posts',$articleId,'publishedOn']);
$sitemap->addUrl('/' . $parentPageId . '/' . $articleId , new DateTime("@{$date}",new DateTimeZone($timezone)));
}
}
}
}
// Sous-pages
foreach($childrenPageIds as $childKey) {
if ($this->getData(['page',$childKey,'group']) !== 0 || $this->getData(['page', $childKey, 'disable']) === true) {
continue;
}
// Cas de la page d'accueil ne pas dupliquer l'URL
$pageId = ($childKey !== $this->getData(['locale', 'homePageId'])) ? $childKey : '';
$sitemap->addUrl('/' . $childKey,$datetime);
// La sous-page est un blog
if ($this->getData(['page', $childKey, 'moduleId']) === 'blog' &&
!empty($this->getData(['module',$childKey])) ) {
foreach($this->getData(['module',$childKey,'posts']) as $articleId => $article) {
if($this->getData(['module',$childKey,'posts',$articleId,'state']) === true) {
$date = $this->getData(['module',$childKey,'posts',$articleId,'publishedOn']);
$sitemap->addUrl( '/' . $childKey . '/' . $articleId , new DateTime("@{$date}",new DateTimeZone($timezone)));
}
}
}
}
}
}
else{
$sitemap->addUrl ('/', $datetime);
}
// Flush all stored urls from memory to the disk and close all necessary tags.
@ -999,7 +1004,7 @@ class common {
* Création d'une miniature
* Fonction utilisée lors de la mise à jour d'une version 9 à une version 10
* @param string $src image source
* @param string $dets image destination
* @param string $dest image destination
* @param integer $desired_width largeur demandée
*/
function makeThumb($src, $dest, $desired_width) {
@ -1021,6 +1026,9 @@ class common {
case 'gif':
$source_image = imagecreatefromgif($src);
break;
case 'webp':
$source_image = imagecreatefromwebp($src);
break;
}
// Image valide
if ($source_image) {
@ -1034,7 +1042,6 @@ class common {
imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height);
switch(mime_content_type($src) ) {
case 'image/jpeg':
case 'image/jpg':
return (imagejpeg($virtual_image, $dest));
break;
case 'image/png':
@ -1043,6 +1050,9 @@ class common {
case 'image/gif':
return (imagegif($virtual_image, $dest));
break;
case 'image/webp':
return (imagewebp($virtual_image, $dest));
break;
}
} else {
return (false);
@ -1255,6 +1265,7 @@ class common {
$blocks = [];
if( null !== $this->getData(['page',$this->getUrl(0),'block'])) $blocks = explode('-',$this->getData(['page',$this->getUrl(0),'block']));
// Initialiser
$content = "";
$blockleft=$blockright="";
switch (sizeof($blocks)) {
case 1 : // une colonne
@ -1369,8 +1380,7 @@ class common {
/**
* Affiche les crédits, conditions requis :
* La traduction est active et le site n'est pas en français.
* La fonction est activée.
* La traduction automatique est active et La fonction est activée.
*/
if ( $this->getData(['config', 'i18n', 'enable']) === true
AND $this->getData(['config', 'i18n','scriptGoogle']) === true
@ -1920,40 +1930,27 @@ class common {
echo $items;
}
/**
* Affiche le meta titre
*/
public function showMetaTitle() {
echo '<title>' . $this->output['metaTitle'] . '</title>';
echo '<meta property="og:title" content="' . $this->output['metaTitle'] . '" />';
echo '<link rel="canonical" href="'. helper::baseUrl(true).$this->getUrl() .'" />';
}
/**
* Affiche la meta description
*/
public function showMetaDescription() {
echo '<meta name="description" content="' . $this->output['metaDescription'] . '" />';
echo '<meta property="og:description" content="' . $this->output['metaDescription'] . '" />';
}
/**
* Affiche le meta type
*/
public function showMetaType() {
echo '<meta property="og:type" content="website" />';
}
/**
* Affiche la meta image (site screenshot)
*/
public function showMetaImage() {
echo '<meta property="og:image" content="' . helper::baseUrl() .self::FILE_DIR.'source/screenshot.jpg" />';
}
/**
* Affiche les balises title et meta name
*/
public function showMetaTitle() {
echo '<title>' . $this->output['metaTitle'] . '</title>' . PHP_EOL;
echo '<meta name="description" content="' . $this->output['metaDescription'] . '" />' . PHP_EOL;
echo '<link rel="canonical" href="'. helper::baseUrl(true).$this->getUrl() .'" />' . PHP_EOL;
}
/**
* Affiche les balises meta property
*/
public function showMetaProperty() {
echo '<meta property="og:title" content="' . $this->output['metaTitle'] . '" />' . PHP_EOL;
echo '<meta property="og:description" content="' . $this->output['metaDescription'] . '" />' . PHP_EOL;
echo '<meta property="og:type" content="website" />' . PHP_EOL;
echo '<meta property="og:image" content="' . helper::baseUrl() .self::FILE_DIR.'source/screenshot.jpg" />' . PHP_EOL;
}
/**
* Affiche la notification

View File

@ -60,8 +60,8 @@ if ($this->getData(['core', 'dataVersion']) < 4202) {
$this->setData(['core', 'dataVersion', 4202]);
}
if ($this->getData(['core', 'dataVersion']) < 4303) {
if ($this->getData(['core', 'dataVersion']) < 4304) {
// Mise à jour
$this->setData(['core', 'dataVersion', 4303]);
$this->setData(['core', 'dataVersion', 4304]);
}
?>

View File

@ -3,13 +3,15 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $this->showMetaTitle(); ?>
<?php $this->showMetaDescription(); ?>
<?php $this->showMetaType(); ?>
<?php $this->showMetaImage(); ?>
<?php $this->showFavicon(); ?>
<?php $this->showVendor(); ?>
<?php $this->showStyle(); ?>
<?php
$this->showMetaTitle();
$this->showMetaProperty();
?>
<?php
$this->showFavicon();
$this->showVendor();
$this->showStyle();
?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/blank.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">

View File

@ -3,13 +3,15 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $this->showMetaTitle(); ?>
<?php $this->showMetaDescription(); ?>
<?php $this->showMetaType(); ?>
<?php $this->showMetaImage(); ?>
<?php $this->showFavicon(); ?>
<?php $this->showVendor(); ?>
<?php $this->showStyle(); ?>
<?php
$this->showMetaTitle();
$this->showMetaProperty();
?>
<?php
$this->showFavicon();
$this->showVendor();
$this->showStyle();
?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/light.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">

View File

@ -7,12 +7,14 @@ if( $this->getInput('DELTA_I18N_SITE') !== '' && $this->getInput('DELTA_I18N_SIT
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $this->showMetaTitle(); ?>
<?php $this->showMetaDescription(); ?>
<?php $this->showMetaType(); ?>
<?php $this->showMetaImage(); ?>
<?php $this->showFavicon(); ?>
<?php $this->showVendor(); ?>
<?php
$this->showMetaTitle();
$this->showMetaProperty();
?>
<?php
$this->showFavicon();
$this->showVendor();
?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css?<?php echo md5_file('core/layout/common.css');?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR.'custom.css'); ?>">
@ -171,23 +173,23 @@ if( $this->getInput('DELTA_I18N_SITE') !== '' && $this->getInput('DELTA_I18N_SIT
<?php
$headerClass = $this->getData(['theme', 'header', 'position']) === 'hide' ? 'displayNone' : '';
$headerClass .= $this->getData(['theme', 'header', 'tinyHidden']) ? ' bannerDisplay ' : '';
?>
<header <?php echo empty($headerClass) ? '' : 'class="' . $headerClass . '"';?>>
<?php if ($this->getData(['theme','header','feature']) === 'wallpaper' ): ?>
<?php if(
$this->getData(['theme', 'header', 'textHide']) === false
// Affiche toujours le titre de la bannière pour l'édition du thème
OR ($this->getUrl(0) === 'theme' AND $this->getUrl(1) === 'header')
): ?>
<span class="notranslate" id="themeHeaderTitle"><?php echo $this->getData(['locale', 'title']); ?></span>
<?php else: ?>
<span id="themeHeaderTitle">&nbsp;</span>
<?php endif; ?>
?>
<header <?php echo empty($headerClass) ? '' : 'class="' . $headerClass . '"';?>>
<?php if ($this->getData(['theme','header','feature']) === 'wallpaper' ): ?>
<?php if(
$this->getData(['theme', 'header', 'textHide']) === false
// Affiche toujours le titre de la bannière pour l'édition du thème
OR ($this->getUrl(0) === 'theme' AND $this->getUrl(1) === 'header')
): ?>
<span class="notranslate" id="themeHeaderTitle"><?php echo $this->getData(['locale', 'title']); ?></span>
<?php else: ?>
<div id="featureContent">
<?php echo $this->getData(['theme','header','featureContent']);?>
</diV>
<span id="themeHeaderTitle">&nbsp;</span>
<?php endif; ?>
<?php else: ?>
<div id="featureContent">
<?php echo $this->getData(['theme','header','featureContent']);?>
</diV>
<?php endif; ?>
</header>
<?php echo ( $this->getData(['theme','header','linkHomePage']) && $this->getData(['theme','header','feature']) === 'wallpaper' ) ? '</a>' : ''; ?>
<?php endif; ?>

View File

@ -636,11 +636,11 @@ class config extends common {
$this->setData(['core', 'baseUrl', helper::baseUrl(true,false) ]);
}
// Générer robots.txt et sitemap
$this->generateFiles();
// $this->generateFiles();
// Valeurs en sortie
$this->addOutput([
'title' => $text[0],
'view' => 'index',
'redirect' => helper::baseUrl() . 'config',
'notification' => $text[1] ,
'state' => true
]);

View File

@ -1,10 +1,3 @@
# Bloque l'accès aux données
<Files *.json>
Order deny,allow
Deny from all
Require all denied
</Files>
# Bloque l'accès htaccess
<Files .htaccess>
Order deny,allow
Deny from all
</Files>

View File

@ -5,7 +5,7 @@
"feeds": true,
"feedsLabel": "Syndication RSS",
"itemsperPage": 6,
"versionData": "6.2"
"versionData": "6.3"
},
"texts": {
"NoComment": "No comment yet",
@ -23,7 +23,8 @@
"Send": "Send",
"TinymceMaxi": "You have reached the maximum of",
"TinymceCara": "characters left",
"TinymceExceed": "You were about to exceed the maximum of "
"TinymceExceed": "You were about to exceed the maximum of ",
"ReadMore": "Read more"
},
"posts": {
"premier-article": {
@ -140,7 +141,7 @@
"logoUrl": "",
"logoWidth": "40",
"maxSizeUpload": "500000",
"versionData": "4.1",
"versionData": "4.2",
"uploadJpg": true,
"uploadPng": true,
"uploadPdf": false,

View File

@ -5,7 +5,7 @@
"feeds": true,
"feedsLabel": "Syndication RSS",
"itemsperPage": 4,
"versionData": "6.2"
"versionData": "6.3"
},
"texts": {
"NoComment": "Pas encore de commentaire",
@ -23,7 +23,8 @@
"Send": "Envoyer",
"TinymceMaxi": "Vous avez atteint le maximum de",
"TinymceCara": "caractères restants",
"TinymceExceed": "Vous alliez dépasser le maximum de "
"TinymceExceed": "Vous alliez dépasser le maximum de ",
"ReadMore": "Lire la suite"
},
"posts": {
"premier-article": {
@ -140,7 +141,7 @@
"logoUrl": "",
"logoWidth": "40",
"maxSizeUpload": "1000000",
"versionData": "4.1",
"versionData": "4.2",
"uploadJpg": true,
"uploadPng": true,
"uploadPdf": false,

View File

@ -70,7 +70,7 @@ class init extends common {
]
],
'core' => [
'dataVersion' => 4303,
'dataVersion' => 4304,
'lastBackup' => 0,
'lastClearTmp' => 0,
'lastAutoUpdate' => 0,

View File

@ -223,7 +223,7 @@ class page extends common {
}
$this->setPage($pageId, '<p>'.$text[1].'</p>', self::$i18n);
// Met à jour le site map
$this->createSitemap('all');
// $this->createSitemap('all');
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $pageId,
@ -365,7 +365,7 @@ class page extends common {
}
$this->deleteData(['module', $url[0]]);
// Met à jour le site map
$this->createSitemap('all');
// $this->createSitemap('all');
// Met à jour 'config', 'statislite', 'enable' si aucume page utilise le module Statislite
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
$statislite = 'off';
@ -567,7 +567,7 @@ class page extends common {
}
}
// Met à jour le site map
$this->createSitemap('all');
// $this->createSitemap('all');
// Redirection vers la configuration
if($this->getInput('pageEditModuleRedirect', helper::FILTER_BOOLEAN)) {
// Valeurs en sortie

View File

@ -1,8 +1,4 @@
# Bloque l'accès aux données
Order deny,allow
Deny from all
# Sauf l'accès au modèle csv
<Files template.csv>
Order Allow,Deny
Allow from all
</Files>
Require all denied
<Files *.csv>
Require all granted
</Files>

View File

@ -41,6 +41,7 @@ class UploadHandler
const IMAGETYPE_GIF = 1;
const IMAGETYPE_JPEG = 2;
const IMAGETYPE_PNG = 3;
const IMAGETYPE_WEBP = 4;
protected $image_objects = array();
@ -508,7 +509,7 @@ class UploadHandler
$index, $content_range) {
// Add missing file extension for known image types:
if (strpos($name, '.') === false &&
preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) {
preg_match('/^image\/(gif|jpe?g|png|webp)/', $type, $matches)) {
$name .= '.'.$matches[1];
}
if ($this->options['correct_image_extensions']) {
@ -522,6 +523,9 @@ class UploadHandler
case self::IMAGETYPE_GIF:
$extensions = array('gif');
break;
case self::IMAGETYPE_WEBP:
$extensions = array('webp');
break;
}
// Adjust incorrect image file extensions:
if (!empty($extensions)) {
@ -734,6 +738,12 @@ class UploadHandler
$image_quality = isset($options['png_quality']) ?
$options['png_quality'] : 9;
break;
case 'webp':
$src_func = 'imagecreatefromwebp';
$write_func = 'imagewebp';
$image_quality = isset($options['webp_quality']) ?
$options['webp_quality'] : 75;
break;
default:
return false;
}
@ -1083,6 +1093,9 @@ class UploadHandler
if (bin2hex(@$data[0]).substr($data, 1, 4) === '89PNG') {
return self::IMAGETYPE_PNG;
}
if ($data === 'RIFF') {
return self::IMAGETYPE_WEBP;
}
return false;
}

View File

@ -1 +1 @@
Deny from all
Require all denied

View File

@ -466,7 +466,7 @@ $config = array(
//**********************
//Allowed extensions (lowercase insert)
//**********************
'ext_img' => array( 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff','svg', 'ico' ), //Images
'ext_img' => array( 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff','svg', 'ico', 'webp' ), //Images
'ext_file' => array( 'doc', 'docx', 'rtf', 'pdf', 'xls', 'xlsx', 'txt', 'csv', 'html', 'xhtml', 'psd', 'sql', 'log', 'fla', 'xml', 'ade', 'adp', 'mdb', 'accdb', 'ppt', 'pptx', 'odt', 'ots', 'ott', 'odb', 'odg', 'otp', 'otg', 'odf', 'ods', 'odp', 'css', 'ai', 'kmz','dwg', 'dxf', 'hpgl', 'plt', 'spl', 'step', 'stp', 'iges', 'igs', 'sat', 'cgm', 'ics', 'gpx', 'kml', 'ttf', 'eot', 'woff', 'otf', 'woff2', ''), //Files
'ext_video' => array( 'mov', 'mpeg', 'm4v', 'mp4', 'avi', 'mpg', 'wma', "flv", "webm" ), //Video
'ext_music' => array( 'mp3', 'mpga', 'm4a', 'ac3', 'aiff', 'mid', 'ogg', 'wav' ), //Audio

View File

@ -133,6 +133,8 @@ $mime_types = array(
"audio/x-ms-wax" => "wax",
"image/vnd.wap.wbmp" => "wbmp",
"application/vnd.wap.wbxml" => "wbxml",
"video/webm" => "webm",
"image/webp" => "webp",
"video/x-ms-wm" => "wm",
"audio/x-ms-wma" => "wma",
"text/vnd.wap.wml" => "wml",

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,7 @@ class agenda extends common {
'index' => self::GROUP_VISITOR
];
const VERSION = '5.1';
const VERSION = '5.2';
const REALNAME = 'Agenda';
const DELETE = true;
const UPDATE = '4.1';
@ -136,14 +136,14 @@ class agenda extends common {
* Appelée par les fonctions index et config
*/
private function update() {
// Initialisation ou mise à jour vers la version 4.7
// Mise à jour vers la version 4.7
if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '4.7', '<') ) {
if(! is_dir(self::DATAMODULE.'data/'.$this->getUrl(0).'_affiche')) mkdir(self::DATAMODULE.'data/'.$this->getUrl(0).'_affiche');
$this->setData(['module', $this->getUrl(0), 'config', 'versionData','4.7']);
}
// Initialisation ou mise à jour vers la version 5.0
// Mise à jour vers la version 5.0
if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '5.0', '<') ) {
$this->setData(['module', $this->getUrl(0), 'texts',[
'configTextButtonBack' => 'Retour',
@ -154,10 +154,14 @@ class agenda extends common {
$this->setData(['module', $this->getUrl(0), 'config', 'versionData','5.0']);
}
// Initialisation ou mise à jour vers la version 5.1
if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '5.1', '<') ) {
$this->setData(['module', $this->getUrl(0), 'config', 'versionData','5.1']);
}
// Mise à jour vers la version 5.2
if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '5.2', '<') ) {
// Mise à jour des .htaccess avec Apache2.4
copy( './module/agenda/ressource/data/agenda/module/adresses/.htaccess', './site/data/agenda/module/adresses/.htaccess');
copy( './module/agenda/ressource/data/agenda/module/data/.htaccess', './site/data/agenda/module/data/.htaccess');
copy( './module/agenda/ressource/file/source/agenda/adresses/.htaccess', './site/file/source/agenda/adresses/.htaccess');
$this->setData(['module', $this->getUrl(0), 'config', 'versionData','5.2']);
}
}
/**
@ -775,26 +779,12 @@ class agenda extends common {
self::$time_unix_deb = $date->getTimestamp();
$date->setTime(18, 00);
self::$time_unix_fin = $date->getTimestamp();
// Passage de la langue d'administration à Tinymce et à flatpickr
$lang_admin = 'fr_FR';
$lang_flatpickr = 'fr';
if( $this->getData(['config', 'i18n', 'langAdmin']) ==='en'){
$lang_admin = 'en_GB';
$lang_flatpickr = 'default';
}
?>
<script>
var lang_admin = "<?php echo $lang_admin; ?>";
var lang_flatpickr = "<?php echo $lang_flatpickr; ?>";
</script>
<?php
// Valeurs en sortie hors soumission du formulaire
$this->addOutput([
'showBarEditButton' => true,
'showPageContent' => false,
'vendor' => [
'flatpickr',
'tinymce',
'flatpickr'
],
'view' => 'creation'
]);
@ -911,26 +901,13 @@ class agenda extends common {
}
$this->limite_groupes();
if( $this->getUser('group') >= self::$evenement['groupe_mod']){
// Passage de la langue d'administration à Tinymce et à flatpickr
$lang_admin = 'fr_FR';
$lang_flatpickr = 'fr';
if( $this->getData(['config', 'i18n', 'langAdmin']) ==='en'){
$lang_admin = 'en_GB';
$lang_flatpickr = 'default';
}
?>
<script>
var lang_admin = "<?php echo $lang_admin; ?>";
var lang_flatpickr = "<?php echo $lang_flatpickr; ?>";
</script>
<?php
// Affichage de la page édition d'un évènement avec les valeurs actuelles
$this->addOutput([
'showBarEditButton' => true,
'showPageContent' => false,
'vendor' => [
'flatpickr',
'tinymce'
'flatpickr'
],
'view' => 'edition'
]);
@ -948,7 +925,7 @@ class agenda extends common {
/**
* Newname utilisé par la version 9 pour inscrire le nouveau nom de page dans le json du module
* Newname utilisé pour inscrire le nouveau nom de page dans le json du module
*/
public function newname() {
$this->setData(['module',$this->getUrl(0),'name',$this->getUrl(0)]);
@ -973,8 +950,10 @@ class agenda extends common {
}
// Mise à jour des données de module
$this->update();
if (null !== $this->getData(['module', $this->getUrl(0), 'config', 'versionData'])
&& version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '5.2', '<')){
$this->update();
}
//Pour récupération des données ajax jquery date ou id
$url = $_SERVER['REQUEST_URI'];
if (strpos($url,'/da:') !== false){
@ -1005,24 +984,22 @@ class agenda extends common {
'droit_creation' => 2,
'droit_limite' => true,
'maxiWidth' => '800',
'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData'])
'versionData' => self::VERSION
],
'categories' => [
'valCategories' => false
]
]]);
//Création des dossiers de sauvegarde de l'agenda
if(! is_dir(self::DATAMODULE.'data')) mkdir(self::DATAMODULE.'data',0770,true);
// Upload des ressources puis création des dossiers de sauvegarde de l'agenda
$this->custom_copy('./module/agenda/ressource/data', self::DATA_DIR);
$this->custom_copy('./module/agenda/ressource/file', self::FILE_DIR);
if(! is_dir(self::DATAMODULE.'data/'.$this->getUrl(0)))mkdir(self::DATAMODULE.'data/'.$this->getUrl(0));
if(! is_dir(self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve'))mkdir(self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve');
if(! is_dir(self::DATAMODULE.'data/'.$this->getUrl(0).'_visible')) mkdir(self::DATAMODULE.'data/'.$this->getUrl(0).'_visible');
if(! is_dir(self::DATAMODULE.'data/'.$this->getUrl(0).'_affiche')) mkdir(self::DATAMODULE.'data/'.$this->getUrl(0).'_affiche');
if(! is_dir(self::DATAMODULE.'data/'.$this->getUrl(0))) mkdir(self::DATAMODULE.'data/'.$this->getUrl(0));
if(! is_dir(self::DATAFILE.'ics')) mkdir(self::DATAFILE.'ics');
if(! is_dir(self::DATAFILE.'categories')) mkdir(self::DATAFILE.'categories');
if(! is_dir(self::DATAMODULE.'ics')) mkdir(self::DATAMODULE.'ics');
if(! is_dir(self::DATAMODULE.'adresses')) mkdir(self::DATAMODULE.'adresses');
$this->addOutput([
'notification' => $text[0],

View File

@ -0,0 +1,7 @@
# Bloque l'accès aux données
<Files "*.txt">
Require all denied
</Files>
<Files "*.csv">
Require all denied
</Files>

View File

@ -0,0 +1,3 @@
<Files "*.json">
Require all granted
</Files>

View File

@ -0,0 +1,7 @@
# Bloque l'accès aux données
<Files "*.txt">
Require all denied
</Files>
<Files "*.csv">
Require all denied
</Files>

View File

@ -0,0 +1,733 @@
BEGIN:VCALENDAR
VERSION:2.0
X-WR-CALNAME:Jours fériés Métropole
NAME:Jours fériés Métropole
PRODID:Etalab
BEGIN:VEVENT
DTSTART;VALUE=DATE:20250529
DTSTAMP:20200101T000000Z
SUMMARY:Ascension
UID:d1d8e2e240ae715d149c11145638a06d
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20150508
DTSTAMP:20200101T000000Z
SUMMARY:8 mai
UID:81b412b83868ed02ea1a8024c4c8a357
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20220508
DTSTAMP:20200101T000000Z
SUMMARY:8 mai
UID:00fd28dc3058aa5389abadb6a02b8b5b
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20250714
DTSTAMP:20200101T000000Z
SUMMARY:14 juillet
UID:93686d52c729aca3c401065e490d98fd
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20160516
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pentecôte
UID:a4b1c3723d5d877d7265deb24faaa8d8
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20150714
DTSTAMP:20200101T000000Z
SUMMARY:14 juillet
UID:de8342ff2afa7031a581237cc35cdbf0
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20180714
DTSTAMP:20200101T000000Z
SUMMARY:14 juillet
UID:95d3fe478e70603ed092aba9bb14cc03
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20221225
DTSTAMP:20200101T000000Z
SUMMARY:Jour de Noël
UID:8cbfd34c58535adf9152928830f16b56
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20210501
DTSTAMP:20200101T000000Z
SUMMARY:1er mai
UID:eb4f4cd6ccfb42abd6190130b4f80c77
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20210524
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pentecôte
UID:29bd64b591fb6044b6579673f13d241a
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20220714
DTSTAMP:20200101T000000Z
SUMMARY:14 juillet
UID:526c2a579f44a21fa277f3faed7f155b
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20160328
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pâques
UID:60bb00b126ff132ace83b1a77bdd4775
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20250501
DTSTAMP:20200101T000000Z
SUMMARY:1er mai
UID:81a277f6a2065fa3d9379df5559941de
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20211101
DTSTAMP:20200101T000000Z
SUMMARY:Toussaint
UID:ddf94e83421783ed9b68791012d4ffcc
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20161101
DTSTAMP:20200101T000000Z
SUMMARY:Toussaint
UID:242cd3a4e72710ea57ed35e76497783b
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20151101
DTSTAMP:20200101T000000Z
SUMMARY:Toussaint
UID:f96ae94fa61bb2f3c671ba8a0e127c65
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20171225
DTSTAMP:20200101T000000Z
SUMMARY:Jour de Noël
UID:dae23dc0b21d6334b5654044a52d95e1
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20171111
DTSTAMP:20200101T000000Z
SUMMARY:11 novembre
UID:6b06d7c6e368c2bb47895630c9ac618f
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20230501
DTSTAMP:20200101T000000Z
SUMMARY:1er mai
UID:512be151b9a03e408a8ee80371bdb5d5
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20230101
DTSTAMP:20200101T000000Z
SUMMARY:1er janvier
UID:5ec1ea7aeb0fcd5593fcc8b2de69ce6e
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20220101
DTSTAMP:20200101T000000Z
SUMMARY:1er janvier
UID:2c17ae593ff7e9e3c8585e30a3183279
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20230518
DTSTAMP:20200101T000000Z
SUMMARY:Ascension
UID:4a8d93da3ec625969c13c4820b24f514
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20201101
DTSTAMP:20200101T000000Z
SUMMARY:Toussaint
UID:fe6c71c56021b2d7e573e1cd6cde074d
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20210714
DTSTAMP:20200101T000000Z
SUMMARY:14 juillet
UID:5d769cd717fe2027b11077cca08ce35d
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20180521
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pentecôte
UID:9c332de8829db3bdaab01f1190f15663
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20211225
DTSTAMP:20200101T000000Z
SUMMARY:Jour de Noël
UID:0e4218e8cf22ab9abf21febe9456e20c
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20241101
DTSTAMP:20200101T000000Z
SUMMARY:Toussaint
UID:dd267dce0232b504133231c68f19c9ae
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20160815
DTSTAMP:20200101T000000Z
SUMMARY:Assomption
UID:f5144d62904c585628142166f2a2e695
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20180501
DTSTAMP:20200101T000000Z
SUMMARY:1er mai
UID:3c43707735a4d4a214466edf8e6fcbe6
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20150815
DTSTAMP:20200101T000000Z
SUMMARY:Assomption
UID:1edff23fc91c41ad446abf064725fc70
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20200601
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pentecôte
UID:2b10299dd0366c510b07bd9a4ff048b1
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20200714
DTSTAMP:20200101T000000Z
SUMMARY:14 juillet
UID:856f2701d117a9b188086541706c7964
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20231225
DTSTAMP:20200101T000000Z
SUMMARY:Jour de Noël
UID:367624e227aac3812528f241349a7c96
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20241225
DTSTAMP:20200101T000000Z
SUMMARY:Jour de Noël
UID:a2ad4bde5f021604f088ac8ff9dd8fd0
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20150101
DTSTAMP:20200101T000000Z
SUMMARY:1er janvier
UID:7b836334425862ddb4bf47b488d0fd03
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20190530
DTSTAMP:20200101T000000Z
SUMMARY:Ascension
UID:d9a96a99fbedf3bb211eccd97f155fd4
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20170815
DTSTAMP:20200101T000000Z
SUMMARY:Assomption
UID:f768ecc87a5cd7be120b87f25d9233bc
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20190714
DTSTAMP:20200101T000000Z
SUMMARY:14 juillet
UID:0840d81f66979ceec8c1d332f4012d01
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20160508
DTSTAMP:20200101T000000Z
SUMMARY:8 mai
UID:bc90b2144ad8e4a8f40d6174ba41fba0
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20150525
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pentecôte
UID:b99c07d06dc0e712f70888f4b78d413a
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20240520
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pentecôte
UID:0f00afe53d71e95961a45b42cda9ace8
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20181111
DTSTAMP:20200101T000000Z
SUMMARY:11 novembre
UID:6a18fa390a60e5a32d0b6898ca0fedf1
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20150501
DTSTAMP:20200101T000000Z
SUMMARY:1er mai
UID:848a71f1f9793e72415143c5847e2b9d
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20240509
DTSTAMP:20200101T000000Z
SUMMARY:Ascension
UID:b4016e3b941132ba6672d2f6fe1fe608
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20230529
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pentecôte
UID:c708f3ba4561a574d917b8301fb62e13
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20201111
DTSTAMP:20200101T000000Z
SUMMARY:11 novembre
UID:840d3b553f7c5745c66e526a5120296a
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20240101
DTSTAMP:20200101T000000Z
SUMMARY:1er janvier
UID:f4574587958b1848a827cefd81923521
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20220501
DTSTAMP:20200101T000000Z
SUMMARY:1er mai
UID:2b200c0a320d6c3c9376ec32ac5209bd
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20220606
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pentecôte
UID:47ecd83655fb3d9f3f466ed71b30edf5
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20240501
DTSTAMP:20200101T000000Z
SUMMARY:1er mai
UID:c6b6e5340de7a9d4382f02f409f70198
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20180815
DTSTAMP:20200101T000000Z
SUMMARY:Assomption
UID:72478cfa7389b0e74e289cd5548c52d8
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20170605
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pentecôte
UID:24d76b93707f517fd9742a53297eb15d
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20250508
DTSTAMP:20200101T000000Z
SUMMARY:8 mai
UID:a6590e8f64c1f8d2ec22a7f66a39f5db
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20240401
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pâques
UID:89aa3606f0cf255cd22be993f739c289
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20201225
DTSTAMP:20200101T000000Z
SUMMARY:Jour de Noël
UID:58eb1d45cb1e4020902c9d7f48a6aca3
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20240815
DTSTAMP:20200101T000000Z
SUMMARY:Assomption
UID:a5532e6257cf41e64b6c8f4f8e4f62f9
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20180402
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pâques
UID:53aef7b2068f87bb46c4d87b76d3f62f
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20251111
DTSTAMP:20200101T000000Z
SUMMARY:11 novembre
UID:d4fcc714c308a93c9d80b65b84e297ba
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20251101
DTSTAMP:20200101T000000Z
SUMMARY:Toussaint
UID:fca336a73b4976ab496d4afe93449e61
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20191225
DTSTAMP:20200101T000000Z
SUMMARY:Jour de Noël
UID:94dc7bca0d98b843c0a464dfaba404fa
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20220418
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pâques
UID:fd293a74887a0208fd4b2f996922d146
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20210513
DTSTAMP:20200101T000000Z
SUMMARY:Ascension
UID:71f318271fab7c933b84c9f4c1c2791d
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20170501
DTSTAMP:20200101T000000Z
SUMMARY:1er mai
UID:1d3c47ada506eafb4f0b1045343412e3
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20230410
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pâques
UID:7a6a65c90bf078e3ea7d1038166dd061
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20251225
DTSTAMP:20200101T000000Z
SUMMARY:Jour de Noël
UID:7adc4181e295ea370f71a6f017f77e4e
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20170525
DTSTAMP:20200101T000000Z
SUMMARY:Ascension
UID:f3265f5ca615c3fb59694612cd7077ef
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20191101
DTSTAMP:20200101T000000Z
SUMMARY:Toussaint
UID:546de5f95d01851e99635413b7328543
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20210508
DTSTAMP:20200101T000000Z
SUMMARY:8 mai
UID:147d0831ff1a762a404fcd1c62527fcb
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20210101
DTSTAMP:20200101T000000Z
SUMMARY:1er janvier
UID:77c4d1dce03d48cf722cc0d46d126876
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20210405
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pâques
UID:7ce5538a440f5b760fc61beeb005e279
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20151111
DTSTAMP:20200101T000000Z
SUMMARY:11 novembre
UID:82e5c9d47a87040e405295cb9de85b3a
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20171101
DTSTAMP:20200101T000000Z
SUMMARY:Toussaint
UID:0d4171e346dd06e288c5ca5d4c2694c3
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20180101
DTSTAMP:20200101T000000Z
SUMMARY:1er janvier
UID:b9a8a659021921221508c443a9385582
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20200501
DTSTAMP:20200101T000000Z
SUMMARY:1er mai
UID:9cdedd9a4810fc24e452a4bfe84ce2bd
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20220815
DTSTAMP:20200101T000000Z
SUMMARY:Assomption
UID:877bb3d4bec9c9e2202194eb67265250
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20200413
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pâques
UID:ee8b94a34f43dc3f00cf575ac9a3401b
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20151225
DTSTAMP:20200101T000000Z
SUMMARY:Jour de Noël
UID:c976c51152f0dd8144b46562cec06f22
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20240714
DTSTAMP:20200101T000000Z
SUMMARY:14 juillet
UID:fbf4c942a1bc6d8e18c69cfb477e89e2
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20161111
DTSTAMP:20200101T000000Z
SUMMARY:11 novembre
UID:89198e369802ebc60ae2d36128ad4dcf
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20200101
DTSTAMP:20200101T000000Z
SUMMARY:1er janvier
UID:ff83f977fea539750d3a7c076a799767
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20150406
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pâques
UID:b53416352327943804f0ec1d6a684947
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20250815
DTSTAMP:20200101T000000Z
SUMMARY:Assomption
UID:c3cf1311f57118aab4bc96248df024e1
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20230714
DTSTAMP:20200101T000000Z
SUMMARY:14 juillet
UID:c097697da80859a33dae16c90daff383
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20250609
DTSTAMP:20200101T000000Z
SUMMARY:Lundi de Pentecôte
UID:e7bec9699cfe0509ab2b5a1bc92e308d
END:VEVENT
BEGIN:VEVENT
<