2018-11-12 22:31:10 +00:00
package main
import (
2020-09-05 10:09:49 +00:00
"fmt"
2018-11-12 22:31:10 +00:00
"html/template"
"log"
"net/http"
2020-09-05 10:09:49 +00:00
"gopkg.in/ldap.v2"
2018-11-12 22:31:10 +00:00
)
2020-09-05 10:09:49 +00:00
func login ( login string , password string ) ( [ ] * ldap . EntryAttribute , error ) {
conn , err := myLDAP . Connect ( )
if err != nil || conn == nil {
return nil , err
} else if err := conn . ServiceBind ( ) ; err != nil {
return nil , err
} else if dn , err := conn . SearchDN ( login ) ; err != nil {
return nil , err
} else if err := conn . Bind ( dn , password ) ; err != nil {
return nil , err
} else if entries , err := conn . GetEntry ( dn ) ; err != nil {
return nil , err
} else {
return entries , nil
}
}
2018-11-12 22:31:10 +00:00
func tryLogin ( w http . ResponseWriter , r * http . Request ) {
if r . Method != "POST" {
displayTmpl ( w , "login.html" , map [ string ] interface { } { } )
return
}
2020-09-05 10:09:49 +00:00
if entries , err := login ( r . PostFormValue ( "login" ) , r . PostFormValue ( "password" ) ) ; err != nil {
2018-11-12 22:31:10 +00:00
log . Println ( err )
displayTmplError ( w , http . StatusInternalServerError , "login.html" , map [ string ] interface { } { "error" : err . Error ( ) } )
} else {
cnt := "<ul>"
for _ , e := range entries {
for _ , v := range e . Values {
if e . Name == "userPassword" {
cnt += "<li><strong>" + e . Name + ":</strong> <em>[...]</em></li>"
} else {
cnt += "<li><strong>" + e . Name + ":</strong> " + v + "</li>"
}
}
}
displayTmpl ( w , "message.html" , map [ string ] interface { } { "details" : template . HTML ( ` Login ok<br><br>Here are the information we have about you: ` + cnt + "</ul>" ) } )
}
}
2020-09-05 10:09:49 +00:00
func httpBasicAuth ( w http . ResponseWriter , r * http . Request ) {
if user , pass , ok := r . BasicAuth ( ) ; ok {
if entries , err := login ( user , pass ) ; err != nil {
w . Header ( ) . Set ( "WWW-Authenticate" , ` Basic realm="nemunai.re restricted" ` )
w . WriteHeader ( http . StatusUnauthorized )
w . Write ( [ ] byte ( err . Error ( ) ) )
} else {
w . WriteHeader ( http . StatusOK )
for _ , e := range entries {
for _ , v := range e . Values {
if e . Name != "userPassword" {
w . Write ( [ ] byte ( fmt . Sprintf ( "%s: %s" , e . Name , v ) ) )
}
}
}
}
} else {
w . Header ( ) . Set ( "WWW-Authenticate" , ` Basic realm="nemunai.re restricted" ` )
w . WriteHeader ( http . StatusUnauthorized )
w . Write ( [ ] byte ( "Please login" ) )
}
}