Add_Directory_and_ProfilePicture #9
38
directory.go
|
@ -28,7 +28,10 @@ type SearchResult struct {
|
|||
DN string `json:"dn"`
|
||||
}
|
||||
|
||||
type Results []SearchResult
|
||||
type Results struct {
|
||||
Search []SearchResult `json:"search"`
|
||||
MessageID uint32 `json:"id"`
|
||||
}
|
||||
|
||||
func handleSearch(w http.ResponseWriter, r *http.Request) {
|
||||
//Get input value by user
|
||||
|
@ -39,6 +42,11 @@ func handleSearch(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
session, err := store.Get(r, SESSION_NAME)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
//Search value with ldap and filter
|
||||
searchRequest := ldap.NewSearchRequest(
|
||||
config.UserBaseDN,
|
||||
|
@ -58,16 +66,32 @@ func handleSearch(w http.ResponseWriter, r *http.Request) {
|
|||
for _, values := range sr.Entries {
|
||||
|
||||
if strings.Contains(values.GetAttributeValue("cn"), input) {
|
||||
erwan marked this conversation as resolved
Outdated
|
||||
result = append(result, SearchResult{
|
||||
Identifiant: values.GetAttributeValue("cn"),
|
||||
Name: values.GetAttributeValue("displayname"),
|
||||
Email: values.GetAttributeValue("email"),
|
||||
DN: values.DN,
|
||||
})
|
||||
result = Results{
|
||||
Search: append(result.Search, SearchResult{
|
||||
Identifiant: values.GetAttributeValue("cn"),
|
||||
erwan marked this conversation as resolved
Outdated
lx
commented
Idem, c'est pas Idem, c'est pas `cn` chez tout le monde
|
||||
Name: values.GetAttributeValue("displayname"),
|
||||
Email: values.GetAttributeValue("email"),
|
||||
DN: values.DN,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Convert interface to uint32 with Type Assertions and not a simple convert
|
||||
if val_Raw, ok_raw := session.Values["MessageID"]; ok_raw {
|
||||
if val, ok := val_Raw.(uint32); ok {
|
||||
val += 1
|
||||
session.Values["MessageID"] = val
|
||||
result.MessageID = val
|
||||
err = session.Save(r, w)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
lx
commented
1. Pourquoi un résultat vide?
2. Si tu veux créer un résultat vide en Go, pas la peine de mettre tous les champs à `""`, si tu écris juste `SearchResult{}` ça crée une structure avec des chaines vides dans tous les champs
erwan
commented
Un résultat vide permet d'avoir un readyStateChange dans le JS ce qui permet d'initialiser le tableau à vide quand il n'y a plus de match. Pour le Un résultat vide permet d'avoir un readyStateChange dans le JS ce qui permet d'initialiser le tableau à vide quand il n'y a plus de match.
Pour le `go fmt`, j'utilise VsCode et à chaque sauvegarde il fait le `go fmt` et aussi de tous les warnings.
lx
commented
Mais si tu met pas le Mais si tu met pas le `SearchResult` vide, tu as quand même le readyStateChange non ? Et tu as un tableau JSON vide, c'est tout, mais ta partie JS est sensé gérer ça
erwan
commented
Justement au début j'avais fait ça. Ce qui me donnait une valeur
Elle n'était tout bonnement pas appelée. Justement au début j'avais fait ça. Ce qui me donnait une valeur `null`. Mais la fonction JS suivante ne répondez pas, elle ignorait juste la réponse. (même en enlevant le if)
```js
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 201) {
```
Elle n'était tout bonnement pas appelée.
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Send JSON through xhttp
|
||||
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
|
||||
w.WriteHeader(http.StatusCreated)
|
||||
|
|
3
main.go
|
@ -392,6 +392,9 @@ func handleLogin(w http.ResponseWriter, r *http.Request) *LoginInfo {
|
|||
session.Values["login_password"] = password
|
||||
session.Values["login_dn"] = user_dn
|
||||
|
||||
//Add Value MessageID
|
||||
session.Values["MessageID"] = uint32(0)
|
||||
|
||||
err = session.Save(r, w)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
var perso_id = 0;
|
||||
|
||||
function searchDirectory() {
|
||||
var input = document.getElementById("search").value;
|
||||
if(input){
|
||||
|
@ -8,23 +10,26 @@ function searchDirectory() {
|
|||
//Response from Request Ajax
|
||||
var jsonResponse = JSON.parse(xhttp.responseText);
|
||||
|
||||
//We get the old table element, we create an new table element then we increment this new table.
|
||||
//After the new add, we replace the old table by the new one.
|
||||
var old_table = document.getElementById("users");
|
||||
var table = document.createElement('tbody');
|
||||
table.setAttribute("id","users");
|
||||
if (perso_id < jsonResponse.id) {
|
||||
perso_id = jsonResponse.id
|
||||
//We get the old table element, we create an new table element then we increment this new table.
|
||||
//After the new add, we replace the old table by the new one.
|
||||
var old_table = document.getElementById("users");
|
||||
var table = document.createElement('tbody');
|
||||
table.setAttribute("id","users");
|
||||
|
||||
for (let i =0; i < Object.keys(jsonResponse).length; i++) {
|
||||
var row = table.insertRow(0);
|
||||
var identifiant = row.insertCell(0);
|
||||
var name = row.insertCell(1);
|
||||
var email = row.insertCell(2);
|
||||
identifiant.innerHTML = `<a href="/admin/ldap/${jsonResponse[i].dn}">${jsonResponse[i].identifiant}</a>`
|
||||
name.innerHTML = jsonResponse[i].name
|
||||
email.innerHTML = jsonResponse[i].email
|
||||
for (let i =0; i < Object.keys(jsonResponse.search).length; i++) {
|
||||
var row = table.insertRow(0);
|
||||
var identifiant = row.insertCell(0);
|
||||
var name = row.insertCell(1);
|
||||
var email = row.insertCell(2);
|
||||
identifiant.innerHTML = `<a href="/admin/ldap/${jsonResponse.search[i].dn}">${jsonResponse.search[i].identifiant}</a>`
|
||||
name.innerHTML = jsonResponse.search[i].name
|
||||
email.innerHTML = jsonResponse.search[i].email
|
||||
|
||||
}
|
||||
old_table.parentNode.replaceChild(table, old_table)
|
||||
}
|
||||
old_table.parentNode.replaceChild(table, old_table)
|
||||
}
|
||||
};
|
||||
xhttp.overrideMimeType("application/json");
|
||||
|
|
Ce n'est pas toujours
cn
l'attribut qui contient l'identifiant de la personne, c'est le paramètreconfig.UserNameAttr
qui te donne le bon attribut à checkerOn aimerait aussi chercher dans le displayname, et peut-être aussi le mail