% ============================================================================= % CHAPITRE : MÉTHODE 1 — URL ICAL SÉCURISÉE % ============================================================================= \chapter{Méthode 1 : URL iCal sécurisée (\texttt{icalsecurise})} \label{ch:method1} \section{Principe général} Pronote expose un flux de calendrier en lecture seule conforme à la norme \textbf{iCalendar (RFC 5545)}. L'accès est contrôlé par un \textbf{jeton secret} intégré dans l'URL sous forme de paramètre de requête \texttt{icalsecurise}. \begin{infobox} \textbf{Statut} : {\emojiinfo\ Observé localement} (fonctionnalité native de Pronote, version non spécifiée). \end{infobox} \section{Obtention du jeton} \begin{enumerate} \item Se connecter à Pronote (Espace Parents ou Élève) via n'importe quelle méthode. \item Accéder à la vue \guillemotleft Emploi du temps \guillemotright. \item Utiliser la fonction \guillemotleft Export iCal \guillemotright ou \guillemotleft Exporter \guillemotright. \item Pronote génère une URL contenant un jeton secret \texttt{icalsecurise}. \item \textbf{Copier cette URL} : elle constitue une crédentiale unique sensible qui doit être protégée comme un mot de passe. \end{enumerate} \begin{infobox} \textbf{Source} : {\emojiinfo\ Observé localement dans les interfaces Pronote} (version non spécifiée, hypothèse à valider). \textbf{Note} : Les étapes dépendent de l'instance et du type de compte. L'exemple ci-dessus est non fonctionnel et ne contient aucun secret. \end{infobox} \section{Format de l'URL} \begin{lstlisting}[language=bash, caption=Format d'URL iCal Pronote, label=lst:ical-url] https://{etablissement}.index-education.net/pronote/ical/Edt_{prenom}.ics?icalsecurise={jeton}&version={version}¶m={param} \end{lstlisting} \begin{itemize} \item \texttt{icalsecurise} : \textbf{Jeton secret} (crédentiale). \item \texttt{version} : Version de Pronote (ex. \texttt{2024}). \item \texttt{param} : Paramètres optionnels. \end{itemize} \begin{infobox} \textbf{Source} : {\emojiinfo\ Analysé via \texttt{pronote\_sync/sources/ical.py}}. \end{infobox} \section{Cycle de vie} \begin{itemize} \item \textbf{Pérennité} : Le jeton reste valide jusqu'à : \begin{itemize} \item Révocation manuelle par l'utilisateur dans Pronote. \item Régénération par l'établissement (ex. à la rentrée scolaire). \end{itemize} \item {\warningicon\ \textbf{Hypothèse à valider}} : La durée exacte dépend des politiques de l'établissement (non documentée officiellement). \end{itemize} \begin{infobox} \textbf{Source} : {\warningicon\ Comportement variable selon les instances} (à tester localement). \end{infobox} \section{Sécurité} \begin{enumerate} \item \textbf{Surface d'attaque} : Le jeton est encodé dans l'URL \rightarrow risque d'exposition via : \begin{itemize} \item Logs serveur/proxy. \item En-tête \texttt{Referer}. \item Historique du navigateur. \end{itemize} \item \textbf{Recommandations} : \begin{itemize} \item \textbf{Ne jamais versionner} l'URL (ex. dans \texttt{.env} ou Git). \item Utiliser \textbf{HTTPS} (obligatoire). \item Masquer l'URL dans les logs (ex. via \texttt{redact\_url()} dans \texttt{pronote-sync}). \end{itemize} \end{enumerate} \begin{infobox} \textbf{Source} : {\warningicon\ Recommandation du projet} (inspirée des bonnes pratiques générales de sécurité). \end{infobox} \section{Intégration dans \texttt{pronote-sync}} \begin{itemize} \item \textbf{Paramètre} : \texttt{PRONOTE\_ICAL\_URL} (ex. \texttt{.env.example} ligne 2). \item \textbf{Comportement} : \begin{itemize} \item Prioritaire en mode \texttt{PRONOTE\_AGENDA\_SOURCE=auto}. \item Si l'URL est invalide ou expire, repli automatique vers \texttt{pronotepy} (si \texttt{PRONOTE\_AGENDA\_SOURCE=auto}). \item \textbf{Aucun repli} si \texttt{PRONOTE\_AGENDA\_SOURCE=ical} (échec explicite). \end{itemize} \end{itemize} \begin{infobox} \textbf{Source} : {\emojiinfo\ \texttt{pronote\_sync/config/settings.py} + \texttt{pronote\_sync/sources/ical.py}}. \end{infobox} % ============================================================================= % FIN DU CHAPITRE % =============================================================================