Von: michi+ngircd@dataswamp.org
Betreff: ngircd patch: ircop WHO
Datum: 23. März 2021 um 10:24:13 MEZ
An: alex@barton.de
X-Spam-Status: No, score=-2.1 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
X-Greylist: delayed 761 seconds by postgrey-1.36 at arthur; Tue, 23 Mar 2021 10:36:57 CET

Hi Alex,

nachdem das in #ngircd mal Thema war: Ein patch um es Server 
Administratoren zu erlauben WHO auf allen Channels zu benutzen bzw. 
Resultate dafür zu bekommen. In den RFCs findet man leider nichts dazu 
wie sich z.B. WHO genau mit ircops verhalten soll. Das ganze ist aber 
etwas das mich selbst schon oft gestört hat. Sollte man sich dann vrmtl. 
für NAMES auch ansehen...

In IRC_WHO_Channel() bin ich mir etwas unsicher was "is_ircop, is_oper" 
angeht. Für mich wäre "ircop" der server Admin, und an dieser Stelle 
sollte das vrmtl. eher "is_chanop" o.ä. sein? Funktioniert so aber auch :)


Gruß
Michi




From c889ae0f2ba846f3e2138d5bb6ff368caf483924 Mon Sep 17 00:00:00 2001
From: michi <michi+ngircd@dataswamp.org>
Date: Tue, 23 Mar 2021 10:08:58 +0100
Subject: [PATCH] Allow ircops to use WHO on any channel.

---
 src/ngircd/irc-info.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c
index 82bd5518..03127b22 100644
--- a/src/ngircd/irc-info.c
+++ b/src/ngircd/irc-info.c
@@ -138,7 +138,7 @@ who_flags_qualifier(CLIENT *Client, const char *chan_user_modes,
 static bool
 IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
 {
-	bool is_visible, is_member, is_ircop;
+	bool is_visible, is_member, is_ircop, is_oper;
 	CL2CHAN *cl2chan;
 	char flags[10];
 	CLIENT *c;
@@ -148,9 +148,10 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
 	assert( Chan != NULL );
 
 	is_member = Channel_IsMemberOf(Chan, Client);
+	is_oper = Client_HasMode(Client, 'o');
 
 	/* Secret channel? */
-	if (!is_member && Channel_HasMode(Chan, 's'))
+	if (!is_member && !is_oper && Channel_HasMode(Chan, 's'))
 		return IRC_WriteStrClient(Client, RPL_ENDOFWHO_MSG,
 					  Client_ID(Client), Channel_Name(Chan));
 
@@ -163,7 +164,7 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
 			continue;
 
 		is_visible = !Client_HasMode(c, 'i');
-		if (is_member || is_visible) {
+		if (is_member || is_visible || is_oper) {
 			memset(flags, 0, sizeof(flags));
 
 			if (Client_HasMode(c, 'a'))
-- 
2.30.1

