validate Telegram bot token in production

This commit is contained in:
2026-09-06 18:03:39 +03:00
parent e70126b312
commit 64919270d8
3 changed files with 26 additions and 2 deletions
+6
View File
@@ -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. 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ı. 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ı.
+5 -1
View File
@@ -10,7 +10,11 @@
const API = () => `https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}`; const API = () => `https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}`;
export function telegramConfigured() { 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 }; let botOnbellek = { ad: null, zaman: 0 };
+15 -1
View File
@@ -4,13 +4,27 @@ import {mkdtempSync,rmSync} from 'node:fs';
import {join} from 'node:path'; import {join} from 'node:path';
import {tmpdir} from 'node:os'; import {tmpdir} from 'node:os';
import {createTelegramLinker} from '../server/telegram-link.mjs'; 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-')); const directory=mkdtempSync(join(tmpdir(),'telegram-link-'));
process.env.IHALEIST_USER_DATA_DIR=directory; process.env.IHALEIST_USER_DATA_DIR=directory;
const store=await import('../server/user-store.mjs'); const store=await import('../server/user-store.mjs');
after(()=>rmSync(directory,{recursive:true,force:true})); after(()=>rmSync(directory,{recursive:true,force:true}));
const found={chatId:'123',ad:'Test'}; 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()=>{ 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'; 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}$/); const first=linker.issue(email);assert.match(first.kod,/^[a-f0-9]{48}$/);