diff --git a/docs/user/config-file-glossary.rst b/docs/user/config-file-glossary.rst index 21beffc..a5c914b 100644 --- a/docs/user/config-file-glossary.rst +++ b/docs/user/config-file-glossary.rst @@ -171,6 +171,11 @@ Telegram settings ``SHOW_DISCONNECT_MESSAGE=true`` Sends a message to Telegram when the bot disconnects from the IRC side. +``WHITELIST_USERNAMES=""`` + (Optional) Comma-separated list of Telegram usernames whose messages will be sent to IRC channel. + (This always compares the actual @username - not «First name» or alike) + + ************** Imgur settings ************** diff --git a/env.example b/env.example index c9282e7..106e025 100644 --- a/env.example +++ b/env.example @@ -75,6 +75,8 @@ SHOW_NICK_MESSAGE=false SHOW_LEAVE_MESSAGE=false LEAVE_MESSAGE_ALLOW_LIST="" SHOW_DISCONNECT_MESSAGE=true +WHITELIST_USERNAMES="" + ################################################################################ diff --git a/internal/config.go b/internal/config.go index 4d22cc9..3a8f78c 100644 --- a/internal/config.go +++ b/internal/config.go @@ -65,6 +65,7 @@ type TelegramSettings struct { ShowNickMessage bool `env:"SHOW_NICK_MESSAGE" envDefault:"false"` ShowDisconnectMessage bool `env:"SHOW_DISCONNECT_MESSAGE" envDefault:"false"` MaxMessagePerMinute int `env:"MAX_MESSAGE_PER_MINUTE" envDefault:"20"` + UsernameWhitelist []string `env:"WHITELIST_USERNAMES" envSeparator:","` } // ImgurSettings includes settings related to Imgur uploading for Telegram photos diff --git a/internal/handlers/telegram/handler.go b/internal/handlers/telegram/handler.go index 021f49d..b2cc117 100644 --- a/internal/handlers/telegram/handler.go +++ b/internal/handlers/telegram/handler.go @@ -17,10 +17,16 @@ type Handler = func(tg *Client, u tgbotapi.Update) /* updateHandler takes in a Telegram Update channel, and determines -which handler to fire off +which handler to fire off (optionally only if user is in whitelist) */ func updateHandler(tg *Client, updates tgbotapi.UpdatesChannel) { for u := range updates { + if u.Message != nil && u.Message.From != nil && !checkAllowedUsernames(tg.Settings.UsernameWhitelist, u.Message.From.UserName) { + tg.logger.LogDebug("Telegram Username is not in whitelist: " + u.Message.From.UserName) + tg.logger.LogDebug("Whitelisted Telegram Users: " + strings.Join(tg.Settings.UsernameWhitelist, ", ")) + continue + } + switch { case u.Message == nil: tg.logger.LogError("Missing message data") diff --git a/internal/handlers/telegram/helpers.go b/internal/handlers/telegram/helpers.go index 19b65ab..9c7261a 100644 --- a/internal/handlers/telegram/helpers.go +++ b/internal/handlers/telegram/helpers.go @@ -1,6 +1,8 @@ package telegram import ( + "strings" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api" ) @@ -67,3 +69,25 @@ func uploadImage(tg *Client, u tgbotapi.Update) string { return getImgurLink(tg, tgLink) } + +/* +checkAllowedUsernames checks the Telegram whitelist for a username, and returns whether +or not the name is in the allow list +*/ +func checkAllowedUsernames(whitelist []string, username string) bool { + // Empty whitelist means no filtering - all users allowed + if len(whitelist) == 0 { + return true + } + // Empty username with non-empty whitelist should be rejected + if len(username) == 0 { + return false + } + // Filter username against provided whitelist + for _, name := range whitelist { + if strings.EqualFold(username, name) { + return true + } + } + return false +}