Procházet zdrojové kódy

Merge pull request #1286 from slingamn/issue1284.1

fix #1284
tags/v2.4.0-rc1
Shivaram Lingamneni před 3 roky
rodič
revize
1bbf6ab936
Žádný účet není propojen s e-mailovou adresou tvůrce revize
4 změnil soubory, kde provedl 18 přidání a 5 odebrání
  1. 3
    0
      irc/getters.go
  2. 5
    4
      irc/nickserv.go
  3. 1
    1
      irc/server.go
  4. 9
    0
      irc/utils/net.go

+ 3
- 0
irc/getters.go Zobrazit soubor

11
 
11
 
12
 	"github.com/oragono/oragono/irc/languages"
12
 	"github.com/oragono/oragono/irc/languages"
13
 	"github.com/oragono/oragono/irc/modes"
13
 	"github.com/oragono/oragono/irc/modes"
14
+	"github.com/oragono/oragono/irc/utils"
14
 )
15
 )
15
 
16
 
16
 func (server *Server) Config() (config *Config) {
17
 func (server *Server) Config() (config *Config) {
71
 	hostname  string
72
 	hostname  string
72
 	certfp    string
73
 	certfp    string
73
 	deviceID  string
74
 	deviceID  string
75
+	connInfo  string
74
 	sessionID int64
76
 	sessionID int64
75
 }
77
 }
76
 
78
 
91
 			certfp:    session.certfp,
93
 			certfp:    session.certfp,
92
 			deviceID:  session.deviceID,
94
 			deviceID:  session.deviceID,
93
 			sessionID: session.sessionID,
95
 			sessionID: session.sessionID,
96
+			connInfo:  utils.DescribeConn(session.socket.conn.UnderlyingConn().Conn),
94
 		}
97
 		}
95
 		if session.proxiedIP != nil {
98
 		if session.proxiedIP != nil {
96
 			data[i].ip = session.proxiedIP
99
 			data[i].ip = session.proxiedIP

+ 5
- 4
irc/nickserv.go Zobrazit soubor

12
 
12
 
13
 	"github.com/goshuirc/irc-go/ircfmt"
13
 	"github.com/goshuirc/irc-go/ircfmt"
14
 
14
 
15
-	"github.com/oragono/oragono/irc/modes"
16
 	"github.com/oragono/oragono/irc/passwd"
15
 	"github.com/oragono/oragono/irc/passwd"
17
 	"github.com/oragono/oragono/irc/sno"
16
 	"github.com/oragono/oragono/irc/sno"
18
 	"github.com/oragono/oragono/irc/utils"
17
 	"github.com/oragono/oragono/irc/utils"
1099
 		nsClientsLogoutHandler(server, client, params, rb)
1098
 		nsClientsLogoutHandler(server, client, params, rb)
1100
 	default:
1099
 	default:
1101
 		nsNotice(rb, client.t("Invalid parameters"))
1100
 		nsNotice(rb, client.t("Invalid parameters"))
1102
-		return
1103
 	}
1101
 	}
1104
 }
1102
 }
1105
 
1103
 
1106
 func nsClientsListHandler(server *Server, client *Client, params []string, rb *ResponseBuffer) {
1104
 func nsClientsListHandler(server *Server, client *Client, params []string, rb *ResponseBuffer) {
1107
 	target := client
1105
 	target := client
1106
+	hasPrivs := client.HasRoleCapabs("local_ban")
1108
 	if 0 < len(params) {
1107
 	if 0 < len(params) {
1109
 		target = server.clients.Get(params[0])
1108
 		target = server.clients.Get(params[0])
1110
 		if target == nil {
1109
 		if target == nil {
1111
 			nsNotice(rb, client.t("No such nick"))
1110
 			nsNotice(rb, client.t("No such nick"))
1112
 			return
1111
 			return
1113
 		}
1112
 		}
1114
-		// same permissions check as RPL_WHOISACTUALLY for now:
1115
-		if target != client && !client.HasMode(modes.Operator) {
1113
+		if target != client && !hasPrivs {
1116
 			nsNotice(rb, client.t("Command restricted"))
1114
 			nsNotice(rb, client.t("Command restricted"))
1117
 			return
1115
 			return
1118
 		}
1116
 		}
1131
 		}
1129
 		}
1132
 		nsNotice(rb, fmt.Sprintf(client.t("IP address:  %s"), session.ip.String()))
1130
 		nsNotice(rb, fmt.Sprintf(client.t("IP address:  %s"), session.ip.String()))
1133
 		nsNotice(rb, fmt.Sprintf(client.t("Hostname:    %s"), session.hostname))
1131
 		nsNotice(rb, fmt.Sprintf(client.t("Hostname:    %s"), session.hostname))
1132
+		if hasPrivs {
1133
+			nsNotice(rb, fmt.Sprintf(client.t("Connection:  %s"), session.connInfo))
1134
+		}
1134
 		nsNotice(rb, fmt.Sprintf(client.t("Created at:  %s"), session.ctime.Format(time.RFC1123)))
1135
 		nsNotice(rb, fmt.Sprintf(client.t("Created at:  %s"), session.ctime.Format(time.RFC1123)))
1135
 		nsNotice(rb, fmt.Sprintf(client.t("Last active: %s"), session.atime.Format(time.RFC1123)))
1136
 		nsNotice(rb, fmt.Sprintf(client.t("Last active: %s"), session.atime.Format(time.RFC1123)))
1136
 		if session.certfp != "" {
1137
 		if session.certfp != "" {

+ 1
- 1
irc/server.go Zobrazit soubor

443
 	if tOper != nil {
443
 	if tOper != nil {
444
 		rb.Add(nil, client.server.name, RPL_WHOISOPERATOR, cnick, tnick, tOper.WhoisLine)
444
 		rb.Add(nil, client.server.name, RPL_WHOISOPERATOR, cnick, tnick, tOper.WhoisLine)
445
 	}
445
 	}
446
-	if client.HasMode(modes.Operator) || client == target {
446
+	if client == target || client.HasRoleCapabs("local_ban") {
447
 		rb.Add(nil, client.server.name, RPL_WHOISACTUALLY, cnick, tnick, fmt.Sprintf("%s@%s", targetInfo.username, target.RawHostname()), target.IPString(), client.t("Actual user@host, Actual IP"))
447
 		rb.Add(nil, client.server.name, RPL_WHOISACTUALLY, cnick, tnick, fmt.Sprintf("%s@%s", targetInfo.username, target.RawHostname()), target.IPString(), client.t("Actual user@host, Actual IP"))
448
 	}
448
 	}
449
 	if target.HasMode(modes.TLS) {
449
 	if target.HasMode(modes.TLS) {

+ 9
- 0
irc/utils/net.go Zobrazit soubor

5
 package utils
5
 package utils
6
 
6
 
7
 import (
7
 import (
8
+	"fmt"
8
 	"net"
9
 	"net"
9
 	"regexp"
10
 	"regexp"
10
 	"strings"
11
 	"strings"
193
 	// or nil:
194
 	// or nil:
194
 	return
195
 	return
195
 }
196
 }
197
+
198
+func DescribeConn(conn net.Conn) string {
199
+	// XXX for unix domain sockets, this is not informative enough for an operator
200
+	// to determine who holds the other side of the connection. there seems to be
201
+	// no way to get either the correct file descriptor of the connection, or the
202
+	// udiag_ino from `man 7 sock_diag`. maybe there's something else we can do?
203
+	return fmt.Sprintf("%s <-> %s", conn.LocalAddr().String(), conn.RemoteAddr().String())
204
+}

Načítá se…
Zrušit
Uložit