Premiers pas
Présentation de Pabal
Ce qu'est Pabal, comment il est construit, ce qui fonctionne aujourd'hui et ce qui ne fonctionne pas encore.
Qu'est-ce que Pabal ?
Le pabal (파발, 擺撥) était le système de relais de poste du royaume de Joseon : des cavaliers changeaient de monture aux relais pour acheminer au plus vite les nouvelles urgentes. Pabal.me est une messagerie qui porte ce nom : une messagerie compatible avec Telegram qu'une organisation ou une communauté exploite sur son propre serveur.
- Vous exploitez le serveur vous-même. Comptes, conversations et photos sont tous stockés sur le serveur et dans la base de données (PostgreSQL) de l'opérateur. Le programme serveur s'appelle HunsTelegram (Java 21).
- Il parle la langue de Telegram. Entre l'application et le serveur circule le même MTProto 2.0 (layer 216) que chez Telegram ; entre les bots et le serveur, la même Bot API HTTP que chez Telegram. Les applications, bibliothèques et bots conçus pour Telegram se connectent donc à Pabal en changeant seulement l'adresse.
- C'est un monde à part, sans lien avec Telegram. Un compte Pabal n'existe que sur le serveur Pabal, et il est impossible d'échanger des messages avec des utilisateurs de Telegram.
Comment il est construit
Explication du diagramme
- Trois zones : à gauche, ce qui tourne hors du serveur (application, programmes de bot, navigateur) ; au milieu, les deux entrées du serveur ; à droite, l'intérieur du serveur. Les programmes de bot tournent eux aussi hors du serveur, sur l'ordinateur de l'opérateur ou du développeur.
- Il n'y a que deux entrées : l'application se connecte directement au port MTProto (8443) (MTProto assure lui-même le chiffrement, HTTPS est donc inutile), tandis que le site web et la Bot API arrivent par HTTPS (443).
- Un bot se connecte par l'un des deux chemins : en général par la Bot API en HTTPS (trait plein) ou, si vous le souhaitez, par MTProto comme l'application (pointillés bleus). Dans les deux cas, c'est le même compte de bot et la même boîte de messages.
- Les pointillés rouges sont la seule flèche en sens inverse : quand un bot configure un webhook, le serveur envoie les nouveautés à l'adresse HTTPS du programme de bot. Tout le reste, ce sont des requêtes qui entrent dans le serveur depuis l'extérieur.
- Un seul lieu d'enregistrement : toute modification passe par les services et est consignée dans le magasin d'événements de PostgreSQL ; seules les photos originales sont conservées sous forme de fichiers. Les messages envoyés depuis l'application et ceux envoyés par les bots suivent le même chemin : notifications push, liste des discussions et rattrapage à la reconnexion s'appliquent donc à tous de la même façon.
Ce qui fonctionne, ce qui ne fonctionne pas encore
| Fonctionnalité | État | Remarque |
|---|---|---|
| Inscription et connexion (numéro de téléphone + code) | Disponible | L'opérateur choisit comment le code est remis : SMS, e-mail ou transmission par l'administrateur |
| Conversations 1:1, réception en temps réel, plusieurs appareils | Disponible | Un appareil éteint rattrape ce qu'il a manqué quand on le rallume |
| Modifier et supprimer des messages | Disponible | Répercuté aussitôt sur l'écran du correspondant |
| Groupes simples (création, ajout et retrait de membres, nom) | Disponible | Les membres s'ajoutent directement depuis les infos du groupe |
| Envoi de photos, photo de profil | Disponible | Stockées en une seule taille, celle de l'original |
| Bots — @BotFather, Bot API HTTP, webhooks, bots MTProto | Disponible | Boutons, callbacks, menu des commandes, photos, groupes |
| Page d'administration, paramètres d'exploitation | Disponible | Accessible uniquement sur l'adresse 127.0.0.1 du serveur |
| Site web en 10 langues, pages pour les liens de nom d'utilisateur et d'invitation | Disponible | La documentation développeurs existe aussi en 10 langues |
| Canaux, supergroupes | Pas encore | Peuvent ne pas s'afficher correctement dans l'application |
| Documents, vidéos, fichiers audio, albums | Pas encore | Refusés avec MEDIA_INVALID |
Texte mis en forme (gras, italique), parse_mode des bots | Pas encore | Envoyé tel quel. Commandes, mentions, liens et hashtags sont mis en évidence automatiquement |
| Appels audio et vidéo, conversations secrètes | Pas encore | |
| Validation en deux étapes (mot de passe cloud) | Pas encore | Refusée si vous essayez de l'activer |
| Application mobile, notifications push | Pas encore | Pour l'instant, seule l'application de bureau macOS existe |
| Rejoindre un groupe par un lien d'invitation | Pas encore | Le lien est créé, mais cliquer dessus ne fait pas de vous un membre |
Mode inline (@bot recherche), paiements, jeux | Pas encore |
Relation avec Telegram
Pabal est un serveur distinct qui suit le protocole public de Telegram. Il n'a aucun lien avec la société Telegram et ne se connecte pas non plus aux serveurs de Telegram.
- Ce qui est compatible : MTProto 2.0 (les 4 transports, le handshake, la liaison des clés temporaires), le format des requêtes et réponses de la layer 216, ainsi que, pour la Bot API HTTP, le format des adresses, des requêtes, des réponses et des erreurs. Nous l'avons vérifié en connectant Telegram Desktop 6.2.6 officiel sans modification (seules l'adresse du serveur et la clé publique ont été changées).
- Ce qui diffère : comptes et données sont propres à chaque serveur. Les identifiants d'utilisateur, de message et de fichier n'ont de sens qu'à l'intérieur de ce serveur. Un jeton de bot utilisé sur Telegram ne fonctionne pas : vous devez en obtenir un nouveau auprès du @BotFather de Pabal.
Format des liens
L'application et le serveur construisent les liens avec https://pabal.me/. Ouvert dans un navigateur, un lien affiche une petite page qui ouvre l'application.
| Lien | Signification | Adresse ouverte dans l'application |
|---|---|---|
pabal.me/<nom d'utilisateur> | Ouvrir la conversation avec une personne ou un bot | tg://resolve?domain=<nom d'utilisateur> |
pabal.me/+<code d'invitation> | Lien d'invitation à un groupe (l'application s'ouvre, mais rejoindre le groupe par le lien ne fonctionne pas encore) | tg://join?invite=<code d'invitation> |
pabal.me/joinchat/<code d'invitation> | Lien d'invitation à l'ancien format (même signification) | tg://join?invite=<code d'invitation> |
Un nom d'utilisateur compte de 5 à 32 caractères (lettres latines, chiffres et tiret bas) et commence par une lettre (celui d'un bot se termine par bot). Les noms identiques à un chemin utilisé par le site, comme docs, admin ou health, ne s'ouvrent pas en tant que liens.
Modèle de sécurité
- Application ↔ serveur : chiffré avec MTProto 2.0. L'application est compilée avec la clé publique RSA du serveur intégrée, si bien qu'aucun autre serveur ne peut se faire passer pour le serveur Pabal. Les conversations fonctionnent comme les « conversations cloud » de Telegram : le serveur peut lire leur contenu (ce n'est pas du chiffrement de bout en bout). C'est pourquoi le serveur doit être exploité par quelqu'un de confiance.
- Bot ↔ serveur : la Bot API n'est exposée qu'en HTTPS. Le jeton d'un bot est son mot de passe : s'il a fuité, changez-le avec
/revokeauprès de @BotFather. L'ancien jeton et les connexions ouvertes avec lui sont coupés immédiatement. - Serveur → webhook : le serveur n'envoie de requêtes qu'à des webhooks en HTTPS sur une adresse publique. Il refuse les adresses internes telles que réseaux privés, boucle locale ou métadonnées cloud. Grâce à
secret_token, le bot peut vérifier qu'une requête vient bien du vrai serveur Pabal. - Administration : la page d'administration n'est accessible que depuis le serveur lui-même (127.0.0.1), et il faut un jeton pour en voir les données. L'opérateur y accède par un tunnel SSH.
- Stockage : le serveur a besoin des clés d'autorisation pour déchiffrer ; elles sont donc stockées telles quelles dans la base de données. Protégez la base de données et les sauvegardes aussi soigneusement que la clé privée RSA du serveur.
Glossaire
| Terme | Signification |
|---|---|
| MTProto | Protocole de chiffrement entre l'application et le serveur, conçu par Telegram. Pabal utilise la version 2.0. |
| Layer (couche) | La version du format des requêtes et réponses échangées au-dessus de MTProto. Pabal utilise la 216. |
| Clé d'autorisation (auth key) | Secret de 2048 bits que l'application établit avec le serveur lors de sa première connexion. La connexion au compte est rattachée à cette clé. |
| DC | Numéro de centre de données (data center) chez Telegram. Chez Pabal, un seul serveur assure à lui seul les DC 1 à 5. |
| Mise à jour (update), pts | Un changement tel qu'un nouveau message, une modification ou une suppression. Le pts est le numéro d'ordre des changements, propre à chaque utilisateur : il permet à un appareil qui était déconnecté de savoir ce qu'il a manqué. |
| Pair (peer) | L'interlocuteur d'une conversation : une personne, un bot ou un groupe. |
| Jeton de bot | Chaîne de la forme <ID du bot>:<secret>. Placée dans l'adresse de la Bot API, elle prouve l'identité du bot. |
| Webhook | Mode de fonctionnement où, au lieu que le bot vienne chercher les nouveautés, le serveur les lui envoie à son adresse HTTPS. |