Buckets:
| import path from 'path'; | |
| import { existsSync, readFileSync } from 'fs'; | |
| export function normalizeWhatsAppIdentifier(value) { | |
| return String(value || '') | |
| .trim() | |
| .replace(/:.*@/, '@') | |
| .replace(/@.*/, '') | |
| .replace(/^\+/, ''); | |
| } | |
| export function parseAllowedUsers(rawValue) { | |
| return new Set( | |
| String(rawValue || '') | |
| .split(',') | |
| .map((value) => normalizeWhatsAppIdentifier(value)) | |
| .filter(Boolean) | |
| ); | |
| } | |
| function readMappingFile(sessionDir, identifier, suffix = '') { | |
| const filePath = path.join(sessionDir, `lid-mapping-${identifier}${suffix}.json`); | |
| if (!existsSync(filePath)) { | |
| return null; | |
| } | |
| try { | |
| const parsed = JSON.parse(readFileSync(filePath, 'utf8')); | |
| const normalized = normalizeWhatsAppIdentifier(parsed); | |
| return normalized || null; | |
| } catch { | |
| return null; | |
| } | |
| } | |
| export function expandWhatsAppIdentifiers(identifier, sessionDir) { | |
| const normalized = normalizeWhatsAppIdentifier(identifier); | |
| if (!normalized) { | |
| return new Set(); | |
| } | |
| // Walk both phone->LID and LID->phone mapping files so allowlists can use | |
| // either form transparently in bot mode. | |
| const resolved = new Set(); | |
| const queue = [normalized]; | |
| while (queue.length > 0) { | |
| const current = queue.shift(); | |
| if (!current || resolved.has(current)) { | |
| continue; | |
| } | |
| resolved.add(current); | |
| for (const suffix of ['', '_reverse']) { | |
| const mapped = readMappingFile(sessionDir, current, suffix); | |
| if (mapped && !resolved.has(mapped)) { | |
| queue.push(mapped); | |
| } | |
| } | |
| } | |
| return resolved; | |
| } | |
| export function matchesAllowedUser(senderId, allowedUsers, sessionDir) { | |
| // Empty allowlist = NO ONE allowed (secure default, #8389). Operators | |
| // who want an open bot must set ``WHATSAPP_ALLOWED_USERS=*`` explicitly. | |
| // Previous behaviour (empty → return true) let any stranger DM the | |
| // bridge and trigger a Python-side pairing-code reply. | |
| if (!allowedUsers || allowedUsers.size === 0) { | |
| return false; | |
| } | |
| // "*" means allow everyone (consistent with SIGNAL_GROUP_ALLOWED_USERS) | |
| if (allowedUsers.has('*')) { | |
| return true; | |
| } | |
| const aliases = expandWhatsAppIdentifiers(senderId, sessionDir); | |
| for (const alias of aliases) { | |
| if (allowedUsers.has(alias)) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
Xet Storage Details
- Size:
- 2.33 kB
- Xet hash:
- 1c346a8c9f7ca38eecf62fde89b5631e17cb63ca83d5eb20a91fd0965f13c548
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.