Skip to content

Commit 7493481

Browse files
committed
Route connections based on LDAP
1 parent 792150d commit 7493481

File tree

1 file changed

+28
-2
lines changed
  • server/common/oursrc/scripts-proxy

1 file changed

+28
-2
lines changed

server/common/oursrc/scripts-proxy/main.go

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,24 @@ import (
88
"net"
99
"strings"
1010

11+
ldap "gopkg.in/ldap.v3"
1112
"inet.af/tcpproxy"
1213
)
1314

1415
var (
1516
httpAddrs = flag.String("http_addrs", ":80", "comma-separated addresses to listen for HTTP traffic on")
1617
sniAddrs = flag.String("sni_addrs", ":443,:444", "comma-separated addresses to listen for SNI traffic on")
18+
ldapServer = flag.String("ldap_server", "scripts-ldap.mit.edu:389", "LDAP server to query")
1719
defaultHost = flag.String("default_host", "scripts.mit.edu", "default host to route traffic to if SNI/Host header cannot be parsed or cannot be found in LDAP")
20+
baseDn = flag.String("base_dn", "ou=VirtualHosts,dc=scripts,dc=mit,dc=edu", "base DN to query for hosts")
1821
)
1922

2023
func always(context.Context, string) bool {
2124
return true
2225
}
2326

2427
type ldapTarget struct {
28+
ldap *ldap.Conn
2529
}
2630

2731
func (l *ldapTarget) HandleConn(netConn net.Conn) {
@@ -52,14 +56,36 @@ func (l *ldapTarget) HandleConn(netConn net.Conn) {
5256
}
5357

5458
func (l *ldapTarget) resolvePool(hostname string) (string, error) {
55-
return "18.4.86.22", nil
59+
escapedHostname := ldap.EscapeFilter(hostname)
60+
req := ldap.NewSearchRequest(
61+
*baseDn,
62+
ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
63+
fmt.Sprintf("(|(scriptsVhostName=%s)(scriptsVhostAlias=%s))", escapedHostname, escapedHostname),
64+
[]string{"scriptsVhostPoolIPv4"},
65+
nil,
66+
)
67+
sr, err := l.ldap.Search(req)
68+
if err != nil {
69+
return "", err
70+
}
71+
for _, entry := range sr.Entries {
72+
return entry.GetAttributeValue("scriptsVhostPoolIPv4"), nil
73+
}
74+
// Not found is not an error
75+
return "", nil
5676
}
5777

5878
func main() {
5979
flag.Parse()
6080

81+
l, err := ldap.Dial("tcp", *ldapServer)
82+
if err != nil {
83+
log.Fatal(err)
84+
}
85+
defer l.Close()
86+
6187
var p tcpproxy.Proxy
62-
t := &ldapTarget{}
88+
t := &ldapTarget{ldap: l}
6389
for _, addr := range strings.Split(*httpAddrs, ",") {
6490
p.AddHTTPHostMatchRoute(addr, always, t)
6591
}

0 commit comments

Comments
 (0)