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.