From 64919270d855e9636664f297114308602a61b7c4 Mon Sep 17 00:00:00 2001 From: ht Date: Sun, 6 Sep 2026 18:03:39 +0300 Subject: [PATCH] validate Telegram bot token in production --- docs/quality/uygulama-durumu.md | 6 ++++++ server/telegram.mjs | 6 +++++- tests/telegram-link.test.mjs | 16 +++++++++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index fc42db2..b8ff860 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -1958,3 +1958,9 @@ Doğrulama: 284 test geçti, üretim derlemesi başarılı. Resend gönderiminden önce alıcılar (en fazla 50 ve metin), konu ve HTML/metin gövdesi tip/uzunluk kontrollerinden geçiyor; trim edilmiş değerler sağlayıcıya gönderiliyor. Doğrulama: 284 test geçti, üretim derlemesi başarılı. + +### 2026-09-06 · Telegram üretim token doğrulaması + +Telegram kanalı üretimde artık yalnızca BotFather biçimindeki tokenlarla etkin görünüyor; eksik veya placeholder değerler entegrasyonu yanlışlıkla aktif göstermiyor. Test/geliştirme ortamlarında sentetik tokenlarla mevcut entegrasyon testleri korunuyor. + +Doğrulama: 285 test geçti, üretim derlemesi başarılı. diff --git a/server/telegram.mjs b/server/telegram.mjs index 2443224..a27881d 100644 --- a/server/telegram.mjs +++ b/server/telegram.mjs @@ -10,7 +10,11 @@ const API = () => `https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}`; export function telegramConfigured() { - return Boolean(process.env.TELEGRAM_BOT_TOKEN); + const token = String(process.env.TELEGRAM_BOT_TOKEN || '').trim(); + if (!token) return false; + // Üretimde placeholder veya hatalı token ile kanalın aktif görünmesini engelle. + if (process.env.NODE_ENV === 'production') return /^\d{6,}:[A-Za-z0-9_-]{20,}$/.test(token); + return true; } let botOnbellek = { ad: null, zaman: 0 }; diff --git a/tests/telegram-link.test.mjs b/tests/telegram-link.test.mjs index e6aa358..0df386a 100644 --- a/tests/telegram-link.test.mjs +++ b/tests/telegram-link.test.mjs @@ -4,13 +4,27 @@ import {mkdtempSync,rmSync} from 'node:fs'; import {join} from 'node:path'; import {tmpdir} from 'node:os'; import {createTelegramLinker} from '../server/telegram-link.mjs'; -import {kodIleBagla} from '../server/telegram.mjs'; +import {kodIleBagla,telegramConfigured} from '../server/telegram.mjs'; const directory=mkdtempSync(join(tmpdir(),'telegram-link-')); process.env.IHALEIST_USER_DATA_DIR=directory; const store=await import('../server/user-store.mjs'); after(()=>rmSync(directory,{recursive:true,force:true})); const found={chatId:'123',ad:'Test'}; +test('production rejects malformed Telegram bot token values',()=>{ + const oldNode=process.env.NODE_ENV,oldToken=process.env.TELEGRAM_BOT_TOKEN; + process.env.NODE_ENV='production'; + try { + process.env.TELEGRAM_BOT_TOKEN='synthetic-token'; + assert.equal(telegramConfigured(),false); + process.env.TELEGRAM_BOT_TOKEN='123456:abcdefghijklmnopqrstuvwxyz'; + assert.equal(telegramConfigured(),true); + } finally { + if(oldNode===undefined)delete process.env.NODE_ENV;else process.env.NODE_ENV=oldNode; + if(oldToken===undefined)delete process.env.TELEGRAM_BOT_TOKEN;else process.env.TELEGRAM_BOT_TOKEN=oldToken; + } +}); + test('server challenge belongs to its account, expires, rotates and is consumed once',async()=>{ let time=1000000;const linker=createTelegramLinker(store,()=>time),email='link@example.test'; const first=linker.issue(email);assert.match(first.kod,/^[a-f0-9]{48}$/);