Initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/.obsidian/
|
||||||
7
Android.md
Normal file
7
Android.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
tags:
|
||||||
|
- android
|
||||||
|
title: Android
|
||||||
|
type: accueil
|
||||||
|
---
|
||||||
|
![[view-articles-android.base]]
|
||||||
37
Informatique et Technologie.md
Normal file
37
Informatique et Technologie.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
title: Informatique et Technologie
|
||||||
|
type: accueil
|
||||||
|
tags:
|
||||||
|
- accueil
|
||||||
|
---
|
||||||
|
![[dummy.png]]
|
||||||
|
Un wiki personnel consacré à la documentation technique autour de Linux, des technologies Open Source, de la domotique et des systèmes numériques.
|
||||||
|
|
||||||
|
Il regroupe des notes pratiques, des guides, des procédures et des références techniques.
|
||||||
|
|
||||||
|
---
|
||||||
|
## 📚 Explorer les notes
|
||||||
|
|
||||||
|
L’ensemble des connaissances et documentations techniques.
|
||||||
|
|
||||||
|
![[view-themes.base]]
|
||||||
|
|
||||||
|
## ✍️ Journal et veille
|
||||||
|
Billets, retours d’expérience et actualités.
|
||||||
|
|
||||||
|
- [varlog](https://varlog.abonnel.fr/) - billets et retour d'expérience
|
||||||
|
- [Podcast — S’informer sur la tech](https://mindcast.fr/@sinformersurlatech)
|
||||||
|
- [Vidéos — S’informer sur la tech](https://www.youtube.com/@SInformerSurLaTech)
|
||||||
|
|
||||||
|
---
|
||||||
|
## ℹ️ Informations
|
||||||
|
|
||||||
|
- [[legal-notices|Informations légales]]
|
||||||
|
- [[contact.html|Contact]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> [!important]
|
||||||
|
> **11 décembre 2025**
|
||||||
|
> mindcast.fr est actuellement hors ligne suite à une panne matérielle.
|
||||||
|
> Reconstruction prévue sur une nouvelle infrastructure.
|
||||||
10
Outils.md
Normal file
10
Outils.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
tags:
|
||||||
|
- DevOPS
|
||||||
|
- workflow
|
||||||
|
- outils
|
||||||
|
title: Outils
|
||||||
|
type: accueil
|
||||||
|
theme: outils
|
||||||
|
---
|
||||||
|
![[view-articles-tools.base]]
|
||||||
48
contact.html
Normal file
48
contact.html
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<div id="contact-area">
|
||||||
|
<div id="step1">
|
||||||
|
<input type="email" id="email" placeholder="Votre email" required><br>
|
||||||
|
<textarea id="message" placeholder="Votre message (10 caractères min.)"></textarea><br>
|
||||||
|
<button onclick="sendCode()">Recevoir un code de validation</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="step2" style="display:none;">
|
||||||
|
<p>Un code a été envoyé à votre adresse. Entrez-le ci-dessous :</p>
|
||||||
|
<input type="text" id="verify_code" placeholder="Code à 6 chiffres">
|
||||||
|
<button onclick="verifyAndSend()">Valider l'envoi définitif</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
let currentToken = "";
|
||||||
|
|
||||||
|
async function sendCode() {
|
||||||
|
const fd = new FormData();
|
||||||
|
fd.append('step', 'send_code');
|
||||||
|
fd.append('email', document.getElementById('email').value);
|
||||||
|
fd.append('message', document.getElementById('message').value);
|
||||||
|
|
||||||
|
const res = await fetch('/contact-verify.php', { method: 'POST', body: fd });
|
||||||
|
const data = await res.json();
|
||||||
|
|
||||||
|
if (data.status === 'success') {
|
||||||
|
currentToken = data.token;
|
||||||
|
document.getElementById('step1').style.display = 'none';
|
||||||
|
document.getElementById('step2').style.display = 'block';
|
||||||
|
} else {
|
||||||
|
alert(data.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function verifyAndSend() {
|
||||||
|
const fd = new FormData();
|
||||||
|
fd.append('step', 'verify_code');
|
||||||
|
fd.append('token', currentToken);
|
||||||
|
fd.append('code', document.getElementById('verify_code').value);
|
||||||
|
|
||||||
|
const res = await fetch('/contact-verify.php', { method: 'POST', body: fd });
|
||||||
|
const data = await res.json();
|
||||||
|
|
||||||
|
alert(data.message);
|
||||||
|
if (data.status === 'success') location.reload();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
50
legal-notices.md
Normal file
50
legal-notices.md
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
## Mentions légales
|
||||||
|
|
||||||
|
### Éditeur du site
|
||||||
|
|
||||||
|
Ce site est un blog personnel publié à titre non professionnel.
|
||||||
|
|
||||||
|
Conformément à l’article 6 III-2 de la loi n°2004-575 du 21 juin 2004 pour la confiance dans l’économie numérique (LCEN), l’éditeur a choisi de ne pas rendre publiques ses informations personnelles.
|
||||||
|
|
||||||
|
Les informations d’identification complètes peuvent être communiquées aux autorités compétentes sur réquisition judiciaire.
|
||||||
|
|
||||||
|
### Responsable de la publication
|
||||||
|
|
||||||
|
Responsable de la publication : l’éditeur du site
|
||||||
|
|
||||||
|
### Hébergement
|
||||||
|
|
||||||
|
Le site est auto-hébergé par l'éditeur. Les moyens de contact pour toute notification de contenu illicite sont disponibles via le formulaire de contact du site.
|
||||||
|
|
||||||
|
### Propriété intellectuelle — Licence CC BY 4.0
|
||||||
|
|
||||||
|
Sauf mention contraire, les contenus originaux publiés sur ce site (textes, images, illustrations, code, etc.) sont mis à disposition selon les termes de la licence **Creative Commons Attribution 4.0 International (CC BY 4.0)**.
|
||||||
|
|
||||||
|
Vous êtes autorisé à :
|
||||||
|
|
||||||
|
- partager, copier et redistribuer le contenu sur tout support ;
|
||||||
|
- adapter, transformer et exploiter le contenu, y compris à des fins commerciales ;
|
||||||
|
|
||||||
|
à condition de créditer l’auteur, d’indiquer si des modifications ont été effectuées et de mentionner la licence.
|
||||||
|
|
||||||
|
Le texte complet de la licence est disponible à l’adresse :
|
||||||
|
[https://creativecommons.org/licenses/by/4.0/](https://creativecommons.org/licenses/by/4.0/)
|
||||||
|
|
||||||
|
Les contenus tiers éventuellement présents sur le site restent la propriété de leurs auteurs respectifs et ne sont pas couverts par cette licence, sauf indication contraire.
|
||||||
|
|
||||||
|
### Responsabilité
|
||||||
|
|
||||||
|
Les informations publiées sur ce blog sont fournies à titre informatif.
|
||||||
|
L’éditeur ne saurait être tenu responsable des dommages directs ou indirects résultant de l’utilisation du site ou des informations qui y sont présentées.
|
||||||
|
|
||||||
|
### Données personnelles
|
||||||
|
|
||||||
|
Ce site peut collecter des données strictement nécessaires à son fonctionnement (formulaire de contact, journaux techniques, commentaires).
|
||||||
|
|
||||||
|
Conformément au RGPD et à la loi Informatique et Libertés, vous disposez d’un droit d’accès, de rectification et de suppression des données vous concernant.
|
||||||
|
Toute demande peut être effectuée via le formulaire de contact du site.
|
||||||
|
|
||||||
|
### Cookies
|
||||||
|
|
||||||
|
Le site utilise uniquement des cookies techniques nécessaires à son fonctionnement.
|
||||||
|
Aucun cookie publicitaire ou de suivi n’est utilisé sans consentement préalable.
|
||||||
84
notes/Android, où sont stockés les fichiers.md
Normal file
84
notes/Android, où sont stockés les fichiers.md
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
---
|
||||||
|
tags:
|
||||||
|
- android
|
||||||
|
title: Android, où sont stockés les fichiers
|
||||||
|
type: article
|
||||||
|
theme: android
|
||||||
|
---
|
||||||
|
## Un labyrinthe nommé "Scoped Storage"
|
||||||
|
|
||||||
|
Depuis l'époque d'Ice Cream Sandwich, Android a bien changé. À l'origine, une application pouvait virtuellement "voir" tout ce qui se trouvait sur votre mémoire une fois l'autorisation accordée. Aujourd'hui, pour protéger votre vie privée, Google a instauré le **Scoped Storage** (stockage partitionné).
|
||||||
|
|
||||||
|
Pour comprendre pourquoi on ne trouve jamais rien, il faut d'abord séparer le téléphone en deux mondes qui ne se mélangent presque jamais : **le système** et **l'utilisateur**.
|
||||||
|
|
||||||
|
Voici ce que j'ai compris et constaté.
|
||||||
|
|
||||||
|
### 1. La Partition Système (Le "Cerveau" verrouillé)
|
||||||
|
|
||||||
|
Imaginez une zone protégée par une vitre blindée. C'est ici que vit Android lui-même ainsi que les applications préinstallées par votre constructeur (le "bloatware").
|
||||||
|
|
||||||
|
* **Pourquoi vous ne la voyez pas :** Pour éviter qu'une fausse manipulation ne transforme votre smartphone en presse-papier.
|
||||||
|
* **L'évolution :** Depuis Android 10, cette partition est en "lecture seule". Même si vous vouliez y supprimer une application d'usine, le système vous en empêcherait.
|
||||||
|
### 2. Le stockage interne (L'espace privé)
|
||||||
|
|
||||||
|
Chaque application possède son propre bac à sable. Elle y stocke ses bases de données, vos identifiants et ses fichiers temporaires. C'est ce qui gonfle quand vous voyez qu'une application de réseau social pèse 2 Go alors qu'elle n'en faisait que 150 Mo à l'installation.
|
||||||
|
|
||||||
|
- **Emplacement :** `/data/user/0/[nom.de.l.application]/`
|
||||||
|
|
||||||
|
- **Particularité :** Ces fichiers sont invisibles pour les autres apps et pour vous-même (sauf si votre téléphone est "rooté"). Si vous désinstallez l'application, ces données disparaissent avec elle.
|
||||||
|
|
||||||
|
|
||||||
|
### 2. Le stockage partagé / public (Le dossier "Media")
|
||||||
|
|
||||||
|
C'est ici que se trouvent vos photos, téléchargements et musiques. C'est le seul endroit où vous avez réellement la main. Elle est la partie accessible via un câble USB sur votre ordinateur ou un explorateur de fichiers. Il apparaît souvent sous le nom trompeur de `0` ou `emulated/0`.
|
||||||
|
|
||||||
|
- **Dossiers standards :** * `DCIM/Camera` : Vos photos et vidéos.
|
||||||
|
|
||||||
|
- `Download` : Tout ce que vous récupérez via le web.
|
||||||
|
|
||||||
|
- `Documents` : Vos PDF et fichiers de travail.
|
||||||
|
|
||||||
|
Si vous explorez votre mémoire interne, vous verrez un dossier nommé `Android`. À l'intérieur, le sous-dossier `data` contient des dossiers nommés `com.instagram.android` ou `com.whatsapp`.
|
||||||
|
|
||||||
|
* **Avant :** N'importe quel explorateur de fichiers pouvait fouiller dedans.
|
||||||
|
* **Aujourd'hui :** Google a verrouillé cet accès. Même si vous voyez le dossier, il apparaît souvent "vide" sur les versions récentes d'Android. C'est une mesure de sécurité : une application de lampe torche n'a aucune raison d'aller lire les fichiers temporaires de votre application bancaire.
|
||||||
|
|
||||||
|
Certaines applications créent encore leur propre dossier à la racine, mais cette pratique tend à disparaître au profit du dossier `Android/media/`.
|
||||||
|
|
||||||
|
|
||||||
|
### 3. La carte SD : l'invitée imprévisible
|
||||||
|
|
||||||
|
La carte mémoire n'est plus traitée comme une extension directe de la mémoire interne, mais comme un **stockage amovible**.
|
||||||
|
|
||||||
|
- **Le problème :** Pour écrire sur la carte SD, une application doit vous demander une autorisation spécifique pour un dossier précis.
|
||||||
|
|
||||||
|
- **Le stockage adopté :** Android permet parfois de "fusionner" la carte SD avec la mémoire interne (Adoptable Storage), mais attention : la carte devient alors illisible si vous la retirez pour la mettre dans un PC. Android formate la carte pour qu'elle devienne une extension invisible de la mémoire interne.
|
||||||
|
* Si la carte SD est de mauvaise qualité (classe de vitesse lente), c'est tout votre téléphone qui se met à ramer, car le système traite la carte lente comme s'il s'agissait de sa propre puce mémoire ultra-rapide.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Comment s'y retrouver concrètement ?
|
||||||
|
|
||||||
|
Pour naviguer dans ce chaos, ne comptez pas uniquement sur la galerie photo native. Utilisez un **gestionnaire de fichiers** (File Manager).
|
||||||
|
|
||||||
|
Liste des outils propriétaires :
|
||||||
|
|
||||||
|
| **Outil** | **Utilité** |
|
||||||
|
| ---------------------- | ------------------------------------------------------------------ |
|
||||||
|
| **Files by Google** | Le plus simple pour nettoyer et trouver ses téléchargements. |
|
||||||
|
| **Gestionnaire natif** | Souvent nommé "Mes Fichiers" (Samsung) ou "Gestionnaire" (Xiaomi). |
|
||||||
|
|
||||||
|
Liste des outils Open Source disponible sur le store alternatif **F-Droid** :
|
||||||
|
|
||||||
|
| **Outil** | **Philosophie / Utilité** | **Pourquoi le choisir ?** |
|
||||||
|
| ------------------------ | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
|
||||||
|
| **Material Files** | Le "successeur spirituel" de l'interface Google. | **Open Source & Ultra-propre.** Respecte les codes design d'Android tout en étant léger. Excellent pour la navigation FTP/SFTP. |
|
||||||
|
| **Amaze File Manager** | L'alternative communautaire historique. | **Complet.** Gère très bien le "root", permet de sauvegarder ses APK et d'analyser le stockage pour trouver les gros fichiers. |
|
||||||
|
| **Fossify File Manager** | La simplicité avant tout (Fork de Simple Mobile Tools). | **Minimaliste.** Pas de fioritures, pas de publicités, juste l'essentiel pour ceux qui veulent un dossier "Téléchargements" lisible. |
|
||||||
|
| **Ghost Commander** | Pour les nostalgiques de Total Commander. | **Double panneau.** Idéal pour déplacer des fichiers d'un dossier à un autre par simple glisser-déposer (mode paysage recommandé). |
|
||||||
|
|
||||||
|
> **Le conseil d'ami :** Si vous ne trouvez pas un fichier que vous venez de télécharger, regardez toujours en priorité dans `/storage/emulated/0/Download`. C'est le "port d'attache" universel sur Android.
|
||||||
|
|
||||||
|
Cédrix
|
||||||
44
notes/GIT - Corriger un dossier un suivi par erreur.md
Normal file
44
notes/GIT - Corriger un dossier un suivi par erreur.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
tags:
|
||||||
|
- git
|
||||||
|
title: GIT - Corriger un dossier un suivi par erreur
|
||||||
|
description: Vous avez oublié de configurer votre .gitignore et des dossiers sensibles (ou inutiles) se retrouvent sur votre dépôt distant ? Découvrez comment retirer un dossier de l'index Git sans le supprimer de votre ordinateur.
|
||||||
|
type: article
|
||||||
|
theme: outils
|
||||||
|
---
|
||||||
|
|
||||||
|
C'est l'erreur classique du "trop tard" : une fois qu'un fichier est suivi par Git, l'ajouter au `.gitignore` ne suffit plus, car Git continue de surveiller ce qu'il connaît déjà.
|
||||||
|
|
||||||
|
Pas de panique, la manipulation est simple et se fait en trois étapes rapides.
|
||||||
|
|
||||||
|
### La procédure de correction
|
||||||
|
|
||||||
|
L'objectif est de dire à Git : "Oublie ce dossier, mais ne le supprime pas de mon ordinateur".
|
||||||
|
|
||||||
|
1. **Mettez à jour votre fichier `.gitignore`**
|
||||||
|
|
||||||
|
Assurez-vous que le nom du dossier est bien inscrit dedans (ex: `nom_du_dossier/`).
|
||||||
|
|
||||||
|
2. **Retirez le dossier de l'index de Git**
|
||||||
|
|
||||||
|
Utilisez la commande suivante dans votre terminal :
|
||||||
|
|
||||||
|
`git rm -r --cached nom_du_dossier/`
|
||||||
|
|
||||||
|
- `-r` : permet de supprimer récursivement tout le contenu du dossier.
|
||||||
|
|
||||||
|
- `--cached` : **Indispensable**. Cela retire le dossier de Git tout en le conservant physiquement sur votre disque dur.
|
||||||
|
|
||||||
|
3. **Validez le changement**
|
||||||
|
|
||||||
|
Il ne vous reste plus qu'à committer cette action :
|
||||||
|
|
||||||
|
`git add .`
|
||||||
|
|
||||||
|
`git commit -m "Suppression du dossier suivi par erreur et mise à jour du gitignore"`
|
||||||
|
|
||||||
|
### Et après ?
|
||||||
|
|
||||||
|
Si vous voulez vérifier ce que Git ignore réellement, vous pouvez lancer cette commande :
|
||||||
|
|
||||||
|
`git status --ignored`
|
||||||
119
notes/HUGO - Générateur de sites statiques.md
Normal file
119
notes/HUGO - Générateur de sites statiques.md
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
---
|
||||||
|
tags:
|
||||||
|
- "#draft"
|
||||||
|
- webmaster
|
||||||
|
title: HUGO - Générateur de sites statiques
|
||||||
|
description: Hugo est un générateur de sites statiques (SSG) à partir de fichiers Markdown. Des modèles ou templates peuvent être définis.
|
||||||
|
type: article
|
||||||
|
theme: outils
|
||||||
|
---
|
||||||
|
Hugo est un **générateur de sites statiques (SSG)** propulsé par le langage **Go**. Là où un CMS traditionnel comme WordPress génère chaque page à la volée via une base de données, Hugo adopte une approche radicale : il pré-compile l’intégralité de votre site.
|
||||||
|
|
||||||
|
Le résultat ? Une performance brute traduite par des fichiers HTML, CSS et JS légers, prêts à être déployés partout. Reconnu comme le SSG le plus rapide au monde, il traite des milliers de pages en une fraction de seconde. En éliminant le PHP et les bases de données, il neutralise les failles de sécurité classiques. Côté rédaction, tout se passe en **Markdown** : vous écrivez, Hugo s'occupe du reste, sans dépendances logicielles complexes.
|
||||||
|
|
||||||
|
## 1. Installer Hugo sur Debian
|
||||||
|
|
||||||
|
Bien que Hugo soit disponible dans les dépôts officiels de Debian (`sudo apt install hugo`), la version y est souvent ancienne. Pour bénéficier des dernières fonctionnalités (et du support de thèmes récents), il est préférable d'utiliser le binaire officiel.
|
||||||
|
|
||||||
|
1. Allez sur la page [Releases de Hugo](https://github.com/gohugoio/hugo/releases).
|
||||||
|
|
||||||
|
2. Téléchargez le pack `.deb` correspondant à votre architecture (généralement `hugo_extended_X.X.X_linux-amd64.deb`).
|
||||||
|
|
||||||
|
3. Installez-le avec `dpkg` :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo dpkg -i hugo_extended_*.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Vérifiez l'installation : `hugo version`.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Générer votre site
|
||||||
|
|
||||||
|
Placez-vous dans votre dossier de travail et créez votre projet :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
hugo new site mon-super-site
|
||||||
|
cd mon-super-site
|
||||||
|
# Ajoutez un thème (exemple avec Ananke)
|
||||||
|
git init
|
||||||
|
git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke
|
||||||
|
echo "theme = 'ananke'" >> hugo.toml
|
||||||
|
```
|
||||||
|
|
||||||
|
Une fois que votre contenu est prêt (dans le dossier `content/`), générez le site final :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
hugo
|
||||||
|
```
|
||||||
|
|
||||||
|
Cela crée un dossier **`public/`** à la racine de votre projet. C'est **ce dossier seul** qu'Apache doit servir.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Configurer Apache
|
||||||
|
|
||||||
|
Apache va simplement servir les fichiers statiques générés par Hugo.
|
||||||
|
|
||||||
|
### Déplacer les fichiers
|
||||||
|
|
||||||
|
Le plus propre est de copier le contenu de votre dossier `public/` vers le répertoire web standard :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo cp -r public/* /var/www/mon-site/
|
||||||
|
sudo chown -R www-data:www-data /var/www/mon-site/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Créer le VirtualHost
|
||||||
|
|
||||||
|
Créez un fichier de configuration pour votre site :
|
||||||
|
|
||||||
|
`sudo nano /etc/apache2/sites-available/mon-site.conf`
|
||||||
|
|
||||||
|
Collez-y cette configuration minimale :
|
||||||
|
|
||||||
|
Apache
|
||||||
|
|
||||||
|
```
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerName www.votre-domaine.com
|
||||||
|
DocumentRoot /var/www/mon-site
|
||||||
|
|
||||||
|
<Directory /var/www/mon-site>
|
||||||
|
Options Indexes FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||||
|
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||||
|
</VirtualHost>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Activer le site
|
||||||
|
|
||||||
|
Bash
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo a2ensite mon-site.conf
|
||||||
|
sudo systemctl reload apache2
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Le flux de travail idéal (Workflow)
|
||||||
|
|
||||||
|
Pour que ce soit efficace, vous ne devriez pas travailler directement dans `/var/www/`. Voici comment font les pros :
|
||||||
|
|
||||||
|
1. **Local :** Vous rédigez vos articles sur votre PC et testez avec `hugo server`.
|
||||||
|
|
||||||
|
2. **Génération :** Une fois prêt, vous lancez la commande `hugo`.
|
||||||
|
|
||||||
|
3. **Déploiement :** Vous envoyez le dossier `public/` vers votre serveur Debian (via `rsync`, `scp` ou un simple `git pull`).
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Un petit conseil :** Comme votre site est statique, n'oubliez pas d'activer le module **`mod_expires`** d'Apache. Cela permettra aux navigateurs de vos visiteurs de mettre en cache les images et le CSS, rendant votre site encore plus instantané.
|
||||||
79
send-mail.php
Normal file
79
send-mail.php
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
<?php
|
||||||
|
session_start();
|
||||||
|
$log_dir = "/tmp/contact_auth/";
|
||||||
|
if (!is_dir($log_dir)) mkdir($log_dir, 0700);
|
||||||
|
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
|
||||||
|
// --- CONFIGURATION ---
|
||||||
|
$to_admin = "votre-email@abonnel.fr";
|
||||||
|
$from_server = "webmaster@abonnel.fr";
|
||||||
|
|
||||||
|
$step = $_POST['step'] ?? '';
|
||||||
|
|
||||||
|
// --- ACTION 1 : GÉNÉRATION ET ENVOI DU CODE ---
|
||||||
|
if ($step === 'send_code') {
|
||||||
|
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
|
||||||
|
$message = trim($_POST['message'] ?? '');
|
||||||
|
|
||||||
|
if (!$email || strlen($message) < 10) {
|
||||||
|
echo json_encode(["status" => "error", "message" => "Données invalides."]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Génération du code
|
||||||
|
$code = rand(100000, 999999);
|
||||||
|
$token = md5($email . time());
|
||||||
|
|
||||||
|
// Stockage temporaire (Valide 1h)
|
||||||
|
$auth_data = [
|
||||||
|
'code' => $code,
|
||||||
|
'email' => $email,
|
||||||
|
'message' => $message,
|
||||||
|
'expires' => time() + 3600
|
||||||
|
];
|
||||||
|
file_put_contents($log_dir . $token, json_encode($auth_data));
|
||||||
|
|
||||||
|
// Envoi du code à l'utilisateur
|
||||||
|
$subject = "Votre code de vérification - abonnel.fr";
|
||||||
|
$body = "Votre code de validation est : $code\nCe code expire dans 1 heure.";
|
||||||
|
|
||||||
|
if (mail($email, $subject, $body, "From: $from_server")) {
|
||||||
|
echo json_encode(["status" => "success", "token" => $token]);
|
||||||
|
} else {
|
||||||
|
echo json_encode(["status" => "error", "message" => "Erreur d'envoi du code."]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- ACTION 2 : VÉRIFICATION ET ENVOI FINAL ---
|
||||||
|
if ($step === 'verify_code') {
|
||||||
|
$token = $_POST['token'] ?? '';
|
||||||
|
$user_code = $_POST['code'] ?? '';
|
||||||
|
$file = $log_dir . $token;
|
||||||
|
|
||||||
|
if (!file_exists($file)) {
|
||||||
|
echo json_encode(["status" => "error", "message" => "Session expirée."]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = json_decode(file_get_contents($file), true);
|
||||||
|
|
||||||
|
if (time() > $data['expires']) {
|
||||||
|
unlink($file);
|
||||||
|
echo json_encode(["status" => "error", "message" => "Code expiré."]);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($user_code == $data['code']) {
|
||||||
|
// Envoi final à VOUS
|
||||||
|
$final_subject = "[Validé] Contact de " . $data['email'];
|
||||||
|
$final_body = "Message de : " . $data['email'] . "\n\n" . $data['message'];
|
||||||
|
|
||||||
|
mail($to_admin, $final_subject, $final_body, "From: $from_server\r\nReply-To: " . $data['email']);
|
||||||
|
|
||||||
|
unlink($file); // Supprime le ticket après succès
|
||||||
|
echo json_encode(["status" => "success", "message" => "Message envoyé avec succès !"]);
|
||||||
|
} else {
|
||||||
|
echo json_encode(["status" => "error", "message" => "Code incorrect."]);
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
static/dummy.png
Normal file
BIN
static/dummy.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.1 KiB |
18
view-articles-android.base
Normal file
18
view-articles-android.base
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
views:
|
||||||
|
- type: cards
|
||||||
|
name: "View : Les thèmes"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- '!file.hasTag("#draft")'
|
||||||
|
- "!title.isEmpty()"
|
||||||
|
- file.folder.contains("notes")
|
||||||
|
- type == "article"
|
||||||
|
- theme == "android"
|
||||||
|
order:
|
||||||
|
- title
|
||||||
|
- description
|
||||||
|
sort:
|
||||||
|
- property: file.mtime
|
||||||
|
direction: DESC
|
||||||
|
imageAspectRatio: 1
|
||||||
|
cardSize: 800
|
||||||
18
view-articles-tools.base
Normal file
18
view-articles-tools.base
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
views:
|
||||||
|
- type: cards
|
||||||
|
name: "View : Les thèmes"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- '!file.hasTag("#draft")'
|
||||||
|
- "!title.isEmpty()"
|
||||||
|
- file.folder.contains("notes")
|
||||||
|
- type == "article"
|
||||||
|
- theme == "outils"
|
||||||
|
order:
|
||||||
|
- title
|
||||||
|
- description
|
||||||
|
sort:
|
||||||
|
- property: file.mtime
|
||||||
|
direction: DESC
|
||||||
|
imageAspectRatio: 1
|
||||||
|
cardSize: 800
|
||||||
15
view-themes.base
Normal file
15
view-themes.base
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
views:
|
||||||
|
- type: cards
|
||||||
|
name: "View : Les thèmes"
|
||||||
|
filters:
|
||||||
|
and:
|
||||||
|
- '!file.hasTag("#draft")'
|
||||||
|
- "!title.isEmpty()"
|
||||||
|
- type.contains("accueil")
|
||||||
|
order:
|
||||||
|
- title
|
||||||
|
sort:
|
||||||
|
- property: file.mtime
|
||||||
|
direction: DESC
|
||||||
|
imageAspectRatio: 1
|
||||||
|
cardSize: 480
|
||||||
Reference in New Issue
Block a user