Skip to content

Права доступа

По умолчанию команда доступна только владельцу. Более широкий доступ вы открываете осознанно.

Только владелец — это умолчание

go
func (m *Weather) CommandMetas() map[string]goroku.CommandMeta {
	return map[string]goroku.CommandMeta{
		"weather": {OnlyOwner: true},
	}
}

OnlyOwner проверяет только личность — он игнорирует sudo, временные выдачи и групповые маски. Используйте его для всего, что трогает ваш аккаунт, файлы или шелл.

Маски прав

Для команд, которыми могут пользоваться другие, в Goroku есть система битовых масок. Владелец назначает маски в рантайме через .security; ваш модуль ничего не объявляет, если вас устраивает умолчание.

КонстантаКому даёт
OWNERВладельцу аккаунта
SUDOПользователям из списка sudo
GROUP_OWNERСоздателю группы
GROUP_ADMINЛюбому админу
GROUP_ADMIN_BAN_USERSАдминам с правом бана
GROUP_ADMIN_DEL_MSGSАдминам с правом удаления
GROUP_ADMIN_PIN_MSGSАдминам с правом закрепления
GROUP_ADMIN_ADD_ADMINSАдминам, которые могут назначать админов
GROUP_ADMIN_CHANGE_INFOАдминам, которые могут менять информацию
GROUP_ADMIN_INVITEАдминам, которые могут приглашать
GROUP_MEMBERЛюбому участнику группы
PMЛюбому в личном чате
EVERYONEКому угодно и где угодно

Они комбинируются:

go
GROUP_ADMIN_BAN_USERS | GROUP_OWNER

EVERYONE — это буквально все

EVERYONE позволяет любому постороннему в любом чате выполнить команду от имени вашего аккаунта. Сначала посмотрите на GROUP_MEMBER или конкретное админское право.

Проверка внутри обработчика

go
func (m *Mod) DangerousCmd(msg *goroku.Message) error {
	sm := m.Client.GetSecurityManager()
	if sm == nil || !sm.IsOwner(msg.SenderID) {
		return msg.Answer(m.T("owner_only", "🚫 <b>Только для владельца</b>"))
	}
	return m.doIt(msg)
}

Декларативный OnlyOwner предпочтительнее — диспетчер отсеет вызов до вашего кода, и не будет пути, на котором вы забыли проверку.

Если модуль будут ставить другие

Устанавливая ваш модуль, человек отдаёт ему свою сессию Telegram и свой сервер. Что стоит делать:

  • По умолчанию — самые узкие права. Расширяйте только там, где это нужно функции.
  • Никогда не логируйте секреты. Помечайте поля настроек Secret: true (Настройки).
  • Экранируйте пользовательский ввод перед вставкой в HTML (Ответы).
  • Проверяйте перед действием. ID чата или путь, пришедшие от пользователя, заслуживают проверки.
  • Не передавайте пользовательский ввод в шелл. Если нужно запустить команду, передавайте аргументы слайсом, а не собирайте строку для оболочки.
go
// Нормально: аргументы отдельны, оболочка не участвует.
exec.CommandContext(ctx, "ffmpeg", "-i", path, out)

// Плохо: имя файла с кавычкой превращается в инъекцию в шелл.
exec.CommandContext(ctx, "sh", "-c", "ffmpeg -i "+path)

Удалённый код

Модули, загружаемые по сети, скачиваются только по HTTPS, а приватные, loopback, link-local и CGNAT-адреса отклоняются — причём проверяется разрешённый IP, а не только имя хоста, так что фокусы с DNS не помогут.

Это защищает транспорт. О безопасности самого кода это не говорит ничего. Нативный модуль — произвольный Go в вашем процессе; прочитайте его перед установкой.

Released under the GNU AGPL v3 License.