Skip to content

Berechtigungen

Ein Befehl ist standardmäßig nur für den Besitzer. Weiteren Zugriff öffnest du bewusst.

Nur-Besitzer ist der Standard

go
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.

KonstanteGewährt
OWNERDem Kontobesitzer
SUDONutzern auf der sudo-Liste
GROUP_OWNERDem Ersteller der Gruppe
GROUP_ADMINJedem Admin
GROUP_ADMIN_BAN_USERSAdmins mit Bann-Recht
GROUP_ADMIN_DEL_MSGSAdmins mit Lösch-Recht
GROUP_ADMIN_PIN_MSGSAdmins mit Anheft-Recht
GROUP_ADMIN_ADD_ADMINSAdmins, die befördern dürfen
GROUP_ADMIN_CHANGE_INFOAdmins, die Infos ändern dürfen
GROUP_ADMIN_INVITEAdmins, die einladen dürfen
GROUP_MEMBERJedem Gruppenmitglied
PMJedem im privaten Chat
EVERYONEJedem, überall

Sie lassen sich kombinieren:

go
GROUP_ADMIN_BAN_USERS | GROUP_OWNER

EVERYONE 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

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>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.
go
// 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.

Released under the GNU AGPL v3 License.