Skip to content

Commit 3d5087d

Browse files
committed
fix(discord-bot): harden RBAC checks and DB prefix defaults
Enforce admin permission at create-license modal submission, normalize owner/admin env parsing, and default DB table prefix to discord_bot_ with env override. Made-with: Cursor
1 parent d9e1f77 commit 3d5087d

3 files changed

Lines changed: 12 additions & 4 deletions

File tree

src/database/DatabaseManager.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
/**
22
* Database Manager for Discord Bot
3-
* Uses Supabase/PostgreSQL tg_bot_* tables. Set DATABASE_URL to Postgres connection string.
3+
* Uses Supabase/PostgreSQL discord_bot_* tables by default.
4+
* Set DATABASE_URL to Postgres connection string.
45
*/
56

67
const { Pool } = require('pg');
78
const Logger = require('../utils/Logger');
89

9-
const PREFIX = 'tg_bot_';
10+
const PREFIX = (process.env.BOT_DB_TABLE_PREFIX || 'discord_bot_').trim();
1011

1112
function getConnectionConfig() {
1213
const url = process.env.DATABASE_URL || '';

src/handlers/CommandHandler.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
const { Collection, SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, ModalBuilder, TextInputBuilder, TextInputStyle } = require('discord.js');
66
const fs = require('fs');
77
const path = require('path');
8+
const PermissionManager = require('../utils/PermissionManager');
89

910
class CommandHandler {
1011
constructor(client, licenseClient, dbManager) {
@@ -56,6 +57,9 @@ class CommandHandler {
5657
if (interaction.isModalSubmit && interaction.isModalSubmit()) {
5758
if (interaction.customId === 'create_license_modal') {
5859
try {
60+
const permissionManager = new PermissionManager(interaction.client);
61+
await permissionManager.requirePermission(interaction.member, 'admin');
62+
5963
const applicationName = interaction.fields.getTextInputValue('application_name');
6064
const planRaw = interaction.fields.getTextInputValue('plan');
6165
const plan = String(planRaw || '').trim().toUpperCase();

src/utils/PermissionManager.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ const logger = new Logger('PermissionManager');
99
class PermissionManager {
1010
constructor(client) {
1111
this.client = client;
12-
this.ownerId = process.env.BOT_OWNER_ID || null;
13-
this.adminRoleIds = (process.env.ADMIN_ROLE_IDS || '').split(',').filter(id => id.trim());
12+
this.ownerId = (process.env.BOT_OWNER_ID || '').trim() || null;
13+
this.adminRoleIds = (process.env.ADMIN_ROLE_IDS || '')
14+
.split(',')
15+
.map(id => id.trim())
16+
.filter(Boolean);
1417
}
1518

1619
/**

0 commit comments

Comments
 (0)