Add option to hex encode the source IP of a client and use it as the ident, closes #24
This commit is contained in:
parent
e2c6cedc27
commit
c975c5d120
17 changed files with 163 additions and 41 deletions
|
@ -25,6 +25,7 @@ type indexData struct {
|
|||
Defaults connectDefaults
|
||||
Servers []Server
|
||||
Channels []*storage.Channel
|
||||
HexIP bool
|
||||
|
||||
// Users in the selected channel
|
||||
Users *Userlist
|
||||
|
@ -34,7 +35,9 @@ type indexData struct {
|
|||
}
|
||||
|
||||
func getIndexData(r *http.Request, state *State) *indexData {
|
||||
data := indexData{}
|
||||
data := indexData{
|
||||
HexIP: viper.GetBool("hexIP"),
|
||||
}
|
||||
|
||||
data.Defaults = connectDefaults{
|
||||
Name: viper.GetString("defaults.name"),
|
||||
|
|
|
@ -97,6 +97,8 @@ func easyjson7e607aefDecodeGithubComKhliengDispatchServer(in *jlexer.Lexer, out
|
|||
}
|
||||
in.Delim(']')
|
||||
}
|
||||
case "hexIP":
|
||||
out.HexIP = bool(in.Bool())
|
||||
case "users":
|
||||
if in.IsNull() {
|
||||
in.Skip()
|
||||
|
@ -187,6 +189,16 @@ func easyjson7e607aefEncodeGithubComKhliengDispatchServer(out *jwriter.Writer, i
|
|||
out.RawByte(']')
|
||||
}
|
||||
}
|
||||
if in.HexIP {
|
||||
const prefix string = ",\"hexIP\":"
|
||||
if first {
|
||||
first = false
|
||||
out.RawString(prefix[1:])
|
||||
} else {
|
||||
out.RawString(prefix)
|
||||
}
|
||||
out.Bool(bool(in.HexIP))
|
||||
}
|
||||
if in.Users != nil {
|
||||
const prefix string = ",\"users\":"
|
||||
if first {
|
||||
|
|
13
server/ip.go
Normal file
13
server/ip.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
package server
|
||||
|
||||
import "net"
|
||||
|
||||
func addrToIPBytes(addr net.Addr) []byte {
|
||||
ip := addr.(*net.TCPAddr).IP
|
||||
|
||||
if ipv4 := ip.To4(); ipv4 != nil {
|
||||
return ipv4
|
||||
}
|
||||
|
||||
return ip
|
||||
}
|
|
@ -2,6 +2,7 @@ package server
|
|||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"encoding/hex"
|
||||
"net"
|
||||
|
||||
"github.com/spf13/viper"
|
||||
|
@ -26,7 +27,7 @@ func createNickInUseHandler(i *irc.Client, state *State) func(string) string {
|
|||
}
|
||||
}
|
||||
|
||||
func connectIRC(server *storage.Server, state *State) *irc.Client {
|
||||
func connectIRC(server *storage.Server, state *State, srcIP []byte) *irc.Client {
|
||||
i := irc.NewClient(server.Nick, server.Username)
|
||||
i.TLS = server.TLS
|
||||
i.Realname = server.Realname
|
||||
|
@ -37,9 +38,12 @@ func connectIRC(server *storage.Server, state *State) *irc.Client {
|
|||
address = net.JoinHostPort(server.Host, server.Port)
|
||||
}
|
||||
|
||||
if i.Username == "" {
|
||||
if viper.GetBool("hexIP") {
|
||||
i.Username = hex.EncodeToString(srcIP)
|
||||
} else if i.Username == "" {
|
||||
i.Username = server.Nick
|
||||
}
|
||||
|
||||
if i.Realname == "" {
|
||||
i.Realname = server.Nick
|
||||
}
|
||||
|
|
|
@ -93,7 +93,7 @@ func (d *Dispatch) loadUser(user *storage.User) {
|
|||
}
|
||||
|
||||
for _, server := range servers {
|
||||
i := connectIRC(server, state)
|
||||
i := connectIRC(server, state, user.GetLastIP())
|
||||
|
||||
var joining []string
|
||||
for _, channel := range channels {
|
||||
|
|
|
@ -2,6 +2,7 @@ package server
|
|||
|
||||
import (
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
|
@ -12,24 +13,24 @@ import (
|
|||
type wsHandler struct {
|
||||
ws *wsConn
|
||||
state *State
|
||||
addr string
|
||||
addr net.Addr
|
||||
handlers map[string]func([]byte)
|
||||
}
|
||||
|
||||
func newWSHandler(conn *websocket.Conn, state *State, r *http.Request) *wsHandler {
|
||||
var address string
|
||||
|
||||
if r.Header.Get("X-Forwarded-For") != "" {
|
||||
address = r.Header.Get("X-Forwarded-For")
|
||||
} else {
|
||||
address = conn.RemoteAddr().String()
|
||||
}
|
||||
|
||||
h := &wsHandler{
|
||||
ws: newWSConn(conn),
|
||||
state: state,
|
||||
addr: address,
|
||||
addr: conn.RemoteAddr(),
|
||||
}
|
||||
|
||||
if r.Header.Get("X-Forwarded-For") != "" {
|
||||
ip := net.ParseIP(r.Header.Get("X-Forwarded-For"))
|
||||
if ip != nil {
|
||||
h.addr.(*net.TCPAddr).IP = ip
|
||||
}
|
||||
}
|
||||
|
||||
h.init(r)
|
||||
h.initHandlers()
|
||||
return h
|
||||
|
@ -44,7 +45,7 @@ func (h *wsHandler) run() {
|
|||
req, ok := <-h.ws.in
|
||||
if !ok {
|
||||
if h.state != nil {
|
||||
h.state.deleteWS(h.addr)
|
||||
h.state.deleteWS(h.addr.String())
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -60,7 +61,8 @@ func (h *wsHandler) dispatchRequest(req WSRequest) {
|
|||
}
|
||||
|
||||
func (h *wsHandler) init(r *http.Request) {
|
||||
h.state.setWS(h.addr, h.ws)
|
||||
h.state.setWS(h.addr.String(), h.ws)
|
||||
h.state.user.SetLastIP(addrToIPBytes(h.addr))
|
||||
|
||||
log.Println(h.addr, "[State] User ID:", h.state.user.ID, "|",
|
||||
h.state.numIRC(), "IRC connections |",
|
||||
|
@ -98,7 +100,7 @@ func (h *wsHandler) connect(b []byte) {
|
|||
if _, ok := h.state.getIRC(data.Host); !ok {
|
||||
log.Println(h.addr, "[IRC] Add server", data.Host)
|
||||
|
||||
connectIRC(data.Server, h.state)
|
||||
connectIRC(data.Server, h.state, addrToIPBytes(h.addr))
|
||||
|
||||
go h.state.user.AddServer(data.Server)
|
||||
} else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue