Skip to content

Commit 10bc187

Browse files
committed
Route connections based on LDAP
1 parent 225acc8 commit 10bc187

File tree

1 file changed

+29
-3
lines changed
  • server/common/oursrc/scripts-proxy

1 file changed

+29
-3
lines changed

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

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,24 @@ import (
99
"strings"
1010

1111
"inet.af/tcpproxy"
12+
13+
ldap "gopkg.in/ldap.v3"
1214
)
1315

1416
var (
1517
httpAddrs = flag.String("http_addrs", ":80", "comma-separated addresses to listen for HTTP traffic on")
1618
sniAddrs = flag.String("sni_addrs", ":443,:444", "comma-separated addresses to listen for SNI traffic on")
19+
ldapServer = flag.String("ldap_server", "scripts-ldap.mit.edu:389", "LDAP server to query")
1720
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")
21+
baseDn = flag.String("base_dn", "ou=VirtualHosts,dc=scripts,dc=mit,dc=edu", "base DN to query for hosts")
1822
)
1923

2024
func always(context.Context, string) bool {
2125
return true
2226
}
2327

2428
type ldapTarget struct {
29+
ldap *ldap.Conn
2530
}
2631

2732
// HandleConn is called by tcpproxy after receiving a connection and sniffing the host.
@@ -55,15 +60,36 @@ func (l *ldapTarget) HandleConn(netConn net.Conn) {
5560
}
5661

5762
func (l *ldapTarget) resolvePool(hostname string) (string, error) {
58-
// TODO: Hardcoding F20 pool until we can resolve the pool.
59-
return "18.4.86.22", nil
63+
escapedHostname := ldap.EscapeFilter(hostname)
64+
req := ldap.NewSearchRequest(
65+
*baseDn,
66+
ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
67+
fmt.Sprintf("(|(scriptsVhostName=%s)(scriptsVhostAlias=%s))", escapedHostname, escapedHostname),
68+
[]string{"scriptsVhostPoolIPv4"},
69+
nil,
70+
)
71+
sr, err := l.ldap.Search(req)
72+
if err != nil {
73+
return "", err
74+
}
75+
for _, entry := range sr.Entries {
76+
return entry.GetAttributeValue("scriptsVhostPoolIPv4"), nil
77+
}
78+
// Not found is not an error
79+
return "", nil
6080
}
6181

6282
func main() {
6383
flag.Parse()
6484

85+
l, err := ldap.Dial("tcp", *ldapServer)
86+
if err != nil {
87+
log.Fatal(err)
88+
}
89+
defer l.Close()
90+
6591
var p tcpproxy.Proxy
66-
t := &ldapTarget{}
92+
t := &ldapTarget{ldap: l}
6793
for _, addr := range strings.Split(*httpAddrs, ",") {
6894
p.AddHTTPHostMatchRoute(addr, always, t)
6995
}

0 commit comments

Comments
 (0)