begin rework use of conn interfaces to hold onto host info, will be useful for TLS

Signed-off-by: kim (grufwub) <grufwub@gmail.com>
master
kim (grufwub) 4 years ago
parent c45d62899c
commit b79bcf562d

@ -0,0 +1,99 @@
package main
import (
"net"
"crypto/tls"
"crypto/rand"
)
/* Simple wrapper to Listener that generates
* GophorConn instances on each accept
*/
type GophorListener struct {
Listener net.Listener
Hostname string
Port string
}
func BeginGophorListen(bindAddr, hostname, port string) (*GophorListener, error) {
gophorListener := new(GophorListener)
gophorListener.Hostname = hostname
gophorListener.Port = port
var err error
gophorListener.Listener, err = net.Listen("tcp", bindAddr+":"+port)
if err != nil {
return nil, err
} else {
return gophorListener, nil
}
}
func BeginGophorTlsListen(bindAddr, hostname, port, certFile, keyFile string) (*GophorListener, error) {
gophorListener := new(GophorListener)
gophorListener.Hostname = hostname
gophorListener.Port = port
/* Try load the key pair */
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
if err != nil {
return nil, err
}
/* Setup TLS configuration */
config := &tls.Config{
Certificates: []tls.Certificate{ cert },
}
/* Use a more cryptographically safe rand source */
config.Rand = rand.Reader
gophorListener.Listener, err = tls.Listen("tcp", bindAddr+":"+port, config)
if err != nil {
return nil, err
} else {
return gophorListener, nil
}
}
func (l *GophorListener) Accept() (*GophorConn, error) {
conn, err := l.Listener.Accept()
if err != nil {
return nil, err
}
gophorConn := new(GophorConn)
gophorConn.Conn = conn
gophorConn.Hostname = l.Hostname
gophorConn.Port = l.Port
return gophorConn, nil
}
func (l *GophorListener) Addr() net.Addr {
return l.Listener.Addr()
}
/* Simple wrapper to Conn with easier acccess
* to hostname / port information
*/
type GophorConn struct {
Conn net.Conn
Hostname string
Port string
}
func (c *GophorConn) Read(b []byte) (int, error) {
return c.Conn.Read(b)
}
func (c *GophorConn) Write(b []byte) (int, error) {
return c.Conn.Write(b)
}
func (c *GophorConn) RemoteAddr() net.Addr {
return c.Conn.RemoteAddr()
}
func (c *GophorConn) Close() error {
return c.Conn.Close()
}

@ -6,7 +6,6 @@ import (
"syscall"
"os/signal"
"flag"
"net"
"time"
)
@ -52,7 +51,7 @@ func main() {
/* Run this in it's own goroutine so we can go straight back to accepting */
go func() {
w := NewWorker(&newConn, Config.Port)
w := NewWorker(newConn)
w.Serve()
}()
}
@ -65,7 +64,7 @@ func main() {
os.Exit(0)
}
func setupServer() []net.Listener {
func setupServer() []*GophorListener {
/* First we setup all the flags and parse them... */
/* Base server settings */
@ -120,19 +119,19 @@ func setupServer() []net.Listener {
Config.LogSystem("Chroot success, new root: %s\n", *serverRoot)
/* Setup listeners */
listeners := make([]net.Listener, 0)
listeners := make([]*GophorListener, 0)
/* If provided unencrypted port, setup listener! */
if Config.Port == NullPort {
Config.LogSystemFatal("%s is not a valid port to bind to!\n", NullPort)
}
l, err := net.Listen("tcp", *serverBindAddr+":"+Config.Port)
/* Start the listener (open socket bound to *serverPort) */
l, err := BeginGophorListen(*serverBindAddr, *serverHostname, Config.Port)
if err != nil {
Config.LogSystemFatal("Error setting up listener on %s: %s\n", *serverBindAddr+":"+Config.Port, err.Error())
}
Config.LogSystem("Listening (unencrypted): gopher://%s\n", l.Addr())
listeners = append(listeners, l)
/* Drop privileges */

@ -2,7 +2,6 @@ package main
import (
"os"
"net"
"path"
"strings"
)
@ -20,14 +19,12 @@ const (
)
type Worker struct {
Conn net.Conn
Port string
Conn *GophorConn
}
func NewWorker(conn *net.Conn, port string) *Worker {
func NewWorker(conn *GophorConn) *Worker {
worker := new(Worker)
worker.Conn = *conn
worker.Port = port
worker.Conn = conn
return worker
}

Loading…
Cancel
Save