Merge pull request 'Impliment blocklist logic and db. TODO: Add web UI' (#2) from dev-blocklist into main
Reviewed-on: #2
This commit is contained in:
commit
da5a029161
68
index.js
68
index.js
|
|
@ -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`)
|
||||||
|
|
|
||||||
|
|
@ -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(() => {
|
||||||
|
|
|
||||||
8
migrations/010_add_blocklist_table.sql
Normal file
8
migrations/010_add_blocklist_table.sql
Normal 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
|
||||||
|
);
|
||||||
Loading…
Reference in a new issue