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.