Impliment blocklist logic and db. TODO: Add web UI #2

Merged
ChrisChrome merged 1 commit from dev-blocklist into main 2025-11-04 14:09:24 -07:00
3 changed files with 56 additions and 26 deletions
Showing only changes of commit 2594a7a8f7 - Show all commits

View file

@ -744,19 +744,19 @@ app.post('/api/v1/user/dir/newEntry', async (req, res) => {
[name, number, route.id]).then(() => { [name, number, route.id]).then(() => {
res.json({ message: 'Updated' }); res.json({ message: 'Updated' });
} }
).catch(err => { ).catch(err => {
console.error('Error updating directory entry:', err); console.error('Error updating directory entry:', err);
res.status(500).json({ error: 'Internal server error' }); res.status(500).json({ error: 'Internal server error' });
}); });
} else { } else {
pool.query('INSERT INTO directory (number, name, route) VALUES (?, ?, ?)', pool.query('INSERT INTO directory (number, name, route) VALUES (?, ?, ?)',
[number, name, route.id]).then(() => { [number, name, route.id]).then(() => {
res.status(201).json({ message: 'Created' }); res.status(201).json({ message: 'Created' });
} }
).catch(err => { ).catch(err => {
console.error('Error creating directory entry:', err); console.error('Error creating directory entry:', err);
res.status(500).json({ error: 'Internal server error' }); res.status(500).json({ error: 'Internal server error' });
}); });
} }
}).catch(err => { }).catch(err => {
console.error('Error checking for existing directory entry:', err); console.error('Error checking for existing directory entry:', err);
@ -831,7 +831,7 @@ app.post('/api/v1/user/dir/massUpdate', async (req, res) => {
return; return;
} }
} }
if(replace) { if (replace) {
// Delete all existing entries for this route // Delete all existing entries for this route
await pool.query('DELETE FROM directory WHERE route = ?', [route.id]); await pool.query('DELETE FROM directory WHERE route = ?', [route.id]);
} }
@ -1071,22 +1071,44 @@ const genCall = (req, res, apiKey, ani, number) => {
conn.query('SELECT * FROM routes WHERE block_start <= ? AND block_start + block_length >= ?', [number, number]).then((rows) => { conn.query('SELECT * FROM routes WHERE block_start <= ? AND block_start + block_length >= ?', [number, number]).then((rows) => {
const row = rows[0]; const row = rows[0];
if (row) {
// Check if the ANI is within the block range // Check blocklist. Type 1 is exact match, Type 2 is prefix match NNNXXXX where NNN is the prefix value.
// If it is, return `local` // Check if the ANI is blocked from calling this route
console.log(`New Call: ${ani} -> ${number}`); const routeId = row ? row.id : null;
logCall(ani, number); if (!routeId) {
// incriment estCallsMade analytics
addAnalytic("estCallsMade");
dailyAnalytic("dailyCallsMade");
if (ani >= row.block_start && ani <= row.block_start + row.block_length) {
res.status(200).send('local');
} else {
res.status(200).send(`IAX2/${row.auth}:${row.secret}@${row.server}:${row.port}/${number}`);
}
} else {
res.status(404).send(`${process.env.MSG_ROUTE_ADDRESS}/404`); res.status(404).send(`${process.env.MSG_ROUTE_ADDRESS}/404`);
return;
} }
conn.query('SELECT * FROM blocklist WHERE (blockType = 1 AND blockValue = ?) OR (blockType = 2 AND ? BETWEEN blockValue AND blockValue + ?);', [ani, ani, row.block_length]).then((blockRows) => {
if (blockRows.length > 0) {
// ANI is blocked from calling this route
console.log(`Blocked Call Attempt: ${ani} -> ${number}`);
res.status(403).send(`${process.env.MSG_ROUTE_ADDRESS}/403`);
return;
}
if (row) {
// Check if the ANI is within the block range
// If it is, return `local`
console.log(`New Call: ${ani} -> ${number}`);
logCall(ani, number);
// incriment estCallsMade analytics
addAnalytic("estCallsMade");
dailyAnalytic("dailyCallsMade");
if (ani >= row.block_start && ani <= row.block_start + row.block_length) {
res.status(200).send('local');
} else {
res.status(200).send(`IAX2/${row.auth}:${row.secret}@${row.server}:${row.port}/${number}`);
}
} else {
res.status(404).send(`${process.env.MSG_ROUTE_ADDRESS}/404`);
}
}).catch(err => {
console.error('Error checking blocklist:', err);
res.status(500).send(`${process.env.MSG_ROUTE_ADDRESS}/500`);
return;
});
}).catch(err => { }).catch(err => {
console.error('Error getting route:', err); console.error('Error getting route:', err);
res.status(500).send(`${process.env.MSG_ROUTE_ADDRESS}/500`) res.status(500).send(`${process.env.MSG_ROUTE_ADDRESS}/500`)

View file

@ -59,7 +59,7 @@ function runMigrations(pool) {
resolve(); resolve();
}) })
.catch(err => { .catch(err => {
console.errorr('Error running migrations:', err); console.error('Error running migrations:', err);
reject(err); reject(err);
}) })
.finally(() => { .finally(() => {

View file

@ -0,0 +1,8 @@
CREATE TABLE IF NOT EXISTS blocklist (
id INT AUTO_INCREMENT PRIMARY KEY,
ownerId INT NOT NULL,
blockType INT NOT NULL,
blockValue VARCHAR(255) NOT NULL,
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (ownerId) REFERENCES routes(id) ON DELETE CASCADE
);