Advertisement
Guest User

Untitled

a guest
Jun 28th, 2019
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "log"
  6.  
  7.     "gopkg.in/ldap.v3"
  8. )
  9.  
  10. func main() {
  11.     // The username and password we want to check
  12.     username := "jodo"
  13.     password := "7ujmsimme!"
  14.  
  15.     dc := "dc=smn,dc=local"
  16.     ldapserver := "dc.smn.local"
  17.     bindusername := "svc@smn.local"
  18.     bindpassword := "7ujmsimme!"
  19.     groups := []string{"Test", "WEB", "Web-lcal"}
  20.  
  21.     // Connect to LDAP-server
  22.     conn, err := connection(ldapserver, bindusername, bindpassword)
  23.     if err != nil {
  24.         log.Fatal(err)
  25.     }
  26.  
  27.     defer conn.Close()
  28.  
  29.     // Authenticate user
  30.     usr, err := authUser(conn, dc, username, password, groups)
  31.  
  32.     if err != nil {
  33.         log.Fatal(err)
  34.     }
  35.  
  36.     if usr == true {
  37.         log.Printf("%s is authenticated", username)
  38.     }
  39.  
  40.     // Rebind as the read only user for any further queries
  41.     err = conn.Bind(bindusername, bindpassword)
  42.     if err != nil {
  43.         log.Fatal(err)
  44.     }
  45. }
  46.  
  47. func connection(ldapserver string, bindusername string, bindpassword string) (*ldap.Conn, error) {
  48.     // Connect to the LDAP-server
  49.     conn, err := ldap.Dial("tcp", fmt.Sprintf("%s:%d", ldapserver, 389))
  50.     if err != nil {
  51.         return nil, err
  52.     }
  53.  
  54.     // Authenticate to the LDAP-server
  55.     err = conn.Bind(bindusername, bindpassword)
  56.     if err != nil {
  57.         return nil, err
  58.     }
  59.  
  60.     return conn, nil
  61. }
  62.  
  63. func authUser(conn *ldap.Conn, dc, username, password string, groups []string) (bool, error) {
  64.  
  65.     if len(groups) == 0 {
  66.         userRequest := ldap.NewSearchRequest(
  67.             dc,
  68.             ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
  69.             fmt.Sprintf("(sAMAccountName=%s)", username),
  70.             []string{"dn", "cn"},
  71.             nil,
  72.         )
  73.  
  74.         ur, err := checkUser(conn, userRequest, password)
  75.         if err != nil {
  76.             return false, err
  77.         }
  78.         if ur == true {
  79.             return true, nil
  80.         }
  81.     } else {
  82.         for _, group := range groups {
  83.  
  84.             groupRequest := ldap.NewSearchRequest(
  85.                 dc,
  86.                 ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
  87.                 fmt.Sprintf("(&(objectClass=user)(sAMAccountName=%s)(memberOf=CN=%s,%s))", username, group, dc),
  88.                 []string{"dn", "cn"},
  89.                 nil,
  90.             )
  91.  
  92.             gr, err := checkUser(conn, groupRequest, password)
  93.             if err != nil {
  94.                 return false, err
  95.             }
  96.             if gr == true {
  97.                 return true, nil
  98.             }
  99.         }
  100.         return false, nil
  101.     }
  102.     return false, nil
  103. }
  104.  
  105. func checkUser(conn *ldap.Conn, searchRequest *ldap.SearchRequest, password string) (bool, error) {
  106.     sr, err := conn.Search(searchRequest)
  107.     if err != nil {
  108.         return false, err
  109.     }
  110.  
  111.     if len(sr.Entries) != 1 {
  112.         return false, err
  113.     } else if len(sr.Entries) == 1 {
  114.         userdn := sr.Entries[0].DN
  115.  
  116.         // Bind as the user to verify their password
  117.         err = conn.Bind(userdn, password)
  118.         if err != nil {
  119.             return false, err
  120.         }
  121.         return true, nil
  122.     }
  123.     return false, nil
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement