Berechtigungen
Ein Befehl ist standardmäßig nur für den Besitzer. Weiteren Zugriff öffnest du bewusst.
Nur-Besitzer ist der Standard
func (m *Weather) CommandMetas() map[string]goroku.CommandMeta {
return map[string]goroku.CommandMeta{
"weather": {OnlyOwner: true},
}
}OnlyOwner prüft allein die Identität — sudo, temporäre Freigaben und Gruppenmasken werden ignoriert. Nimm es für alles, was dein Konto, deine Dateien oder die Shell berührt.
Berechtigungsmasken
Für Befehle, die auch andere nutzen dürfen, hat Goroku ein Bitmasken-System. Der Besitzer vergibt Masken zur Laufzeit mit .security; dein Modul deklariert nichts, solange dir der Standard reicht.
| Konstante | Gewährt |
|---|---|
OWNER | Dem Kontobesitzer |
SUDO | Nutzern auf der sudo-Liste |
GROUP_OWNER | Dem Ersteller der Gruppe |
GROUP_ADMIN | Jedem Admin |
GROUP_ADMIN_BAN_USERS | Admins mit Bann-Recht |
GROUP_ADMIN_DEL_MSGS | Admins mit Lösch-Recht |
GROUP_ADMIN_PIN_MSGS | Admins mit Anheft-Recht |
GROUP_ADMIN_ADD_ADMINS | Admins, die befördern dürfen |
GROUP_ADMIN_CHANGE_INFO | Admins, die Infos ändern dürfen |
GROUP_ADMIN_INVITE | Admins, die einladen dürfen |
GROUP_MEMBER | Jedem Gruppenmitglied |
PM | Jedem im privaten Chat |
EVERYONE | Jedem, überall |
Sie lassen sich kombinieren:
GROUP_ADMIN_BAN_USERS | GROUP_OWNEREVERYONE heißt wirklich jeder
EVERYONE erlaubt jedem Fremden in jedem Chat, den Befehl gegen dein Konto auszuführen. Greif zuerst zu GROUP_MEMBER oder einem konkreten Admin-Recht.
Prüfen im Handler
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>Nur für den Besitzer</b>"))
}
return m.doIt(msg)
}Bevorzuge das deklarative OnlyOwner — der Dispatcher lehnt ab, bevor dein Code läuft, und es gibt keinen Pfad, auf dem du die Prüfung vergisst.
Ein Modul schreiben, das andere installieren
Wer dein Modul installiert, gibt ihm seine Telegram-Sitzung und seinen Server. Was sich lohnt:
- Standardmäßig die engste Berechtigung. Erweitere nur dort, wo die Funktion es braucht.
- Niemals Geheimnisse loggen. Markiere Konfigurationsfelder mit
Secret: true(Konfiguration). - Nutzereingaben escapen, bevor sie ins HTML gehen (Antworten).
- Vor dem Handeln validieren. Eine vom Nutzer gelieferte Chat-ID oder ein Pfad verdient eine Prüfung.
- Keine Nutzereingaben an die Shell. Musst du ein Programm starten, übergib die Argumente als Slice — bau nie einen Shell-String.
// In Ordnung: Argumente getrennt, keine Shell beteiligt.
exec.CommandContext(ctx, "ffmpeg", "-i", path, out)
// Nicht in Ordnung: ein Dateiname mit Anführungszeichen wird zur Shell-Injection.
exec.CommandContext(ctx, "sh", "-c", "ffmpeg -i "+path)Fernlader
Über das Netz geladene Module gehen nur über HTTPS, und private, Loopback-, Link-Local- und CGNAT-Adressen werden abgelehnt — geprüft wird die aufgelöste IP, nicht bloß der Hostname, DNS-Tricks helfen also nicht.
Das schützt den Transport. Über die Sicherheit des Codes sagt es nichts. Ein natives Modul ist beliebiges Go in deinem Prozess; lies es, bevor du es installierst.