Add_Directory_and_ProfilePicture #9
2 changed files with 31 additions and 23 deletions
32
directory.go
32
directory.go
|
@ -34,6 +34,10 @@ type Results struct {
|
||||||
MessageID uint32 `json:"id"`
|
MessageID uint32 `json:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type UniqueID struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
func handleSearch(w http.ResponseWriter, r *http.Request) {
|
func handleSearch(w http.ResponseWriter, r *http.Request) {
|
||||||
//Get input value by user
|
//Get input value by user
|
||||||
input := mux.Vars(r)["input"]
|
input := mux.Vars(r)["input"]
|
||||||
|
@ -43,10 +47,10 @@ func handleSearch(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
session, err := store.Get(r, SESSION_NAME)
|
/**session, err := store.Get(r, SESSION_NAME)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}**/
|
||||||
|
|
||||||
//Search values with ldap and filter
|
//Search values with ldap and filter
|
||||||
searchRequest := ldap.NewSearchRequest(
|
searchRequest := ldap.NewSearchRequest(
|
||||||
|
@ -79,20 +83,26 @@ func handleSearch(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if result.Search == nil {
|
||||||
|
result = Results{
|
||||||
|
Search: append(result.Search, SearchResult{
|
||||||
|
Identifiant: "",
|
||||||
|
|||||||
|
Name: "",
|
||||||
|
Email: "",
|
||||||
|
Description: "",
|
||||||
|
DN: "",
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Convert interface to uint32 with Type Assertions and not a simple convert for messageID
|
var id UniqueID
|
||||||
if val_Raw, ok_raw := session.Values["MessageID"]; ok_raw {
|
//Decode JSON body
|
||||||
if val, ok := val_Raw.(uint32); ok {
|
err = json.NewDecoder(r.Body).Decode(&id)
|
||||||
val += 1
|
|
||||||
session.Values["MessageID"] = val
|
|
||||||
result.MessageID = val
|
|
||||||
err = session.Save(r, w)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
result.MessageID = uint32(id.Id)
|
||||||
}
|
|
||||||
|
|
||||||
//Send JSON through xhttp
|
//Send JSON through xhttp
|
||||||
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
|
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
var perso_id = 0;
|
var perso_id = 0;
|
||||||
|
var last_id = 0;
|
||||||
|
|
||||||
function searchDirectory() {
|
function searchDirectory() {
|
||||||
var input = document.getElementById("search").value;
|
var input = document.getElementById("search").value;
|
||||||
|
@ -10,8 +11,8 @@ function searchDirectory() {
|
||||||
//Response from Request Ajax
|
//Response from Request Ajax
|
||||||
var jsonResponse = JSON.parse(xhttp.responseText);
|
var jsonResponse = JSON.parse(xhttp.responseText);
|
||||||
|
|
||||||
if (perso_id < jsonResponse.id) {
|
if (last_id < jsonResponse.id) {
|
||||||
perso_id = jsonResponse.id
|
last_id = jsonResponse.id
|
||||||
//We get the old table element, we create an new table element then we increment this new table.
|
//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.
|
//After the new add, we replace the old table by the new one.
|
||||||
var old_table = document.getElementById("users");
|
var old_table = document.getElementById("users");
|
||||||
|
@ -29,19 +30,16 @@ function searchDirectory() {
|
||||||
identifiant.innerHTML = `<a href="/admin/ldap/${jsonResponse.search[i].dn}">${jsonResponse.search[i].identifiant}</a>`
|
identifiant.innerHTML = `<a href="/admin/ldap/${jsonResponse.search[i].dn}">${jsonResponse.search[i].identifiant}</a>`
|
||||||
name.innerHTML = jsonResponse.search[i].name
|
name.innerHTML = jsonResponse.search[i].name
|
||||||
email.innerHTML = jsonResponse.search[i].email
|
email.innerHTML = jsonResponse.search[i].email
|
||||||
description.innerHTML = `${jsonResponse.search[i].description}`
|
description.innerHTML = jsonResponse.search[i].description
|
||||||
|
|
||||||
}
|
}
|
||||||
old_table.parentNode.replaceChild(table, old_table)
|
old_table.parentNode.replaceChild(table, old_table)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
lx
commented
faudrait utiliser innerText plutôt que innerHTML, sinon on peut trivialement faire une injection de script faudrait utiliser innerText plutôt que innerHTML, sinon on peut trivialement faire une injection de script
erwan
commented
?? une injection de script dans un JS ? je ne comprends pas bien. J'ai quand-même appliqué tes modifications. Mais je ne serais pas contre plus de détails. ?? une injection de script dans un JS ? je ne comprends pas bien. J'ai quand-même appliqué tes modifications. Mais je ne serais pas contre plus de détails.
lx
commented
Imagine dans ma description je met Avec Avec Imagine dans ma description je met `<script>alert('coucou')</script>`.
Avec `innerText`, ça apparait tel quel.
Avec `innerHTML`, quand quelqu'un affiche mon profil, ça lui fait une popup qui affiche coucou.
erwan
commented
Donc si je comprends bien, si un utilisateur crée un compte qui se nomme Donc si je comprends bien, si un utilisateur crée un compte qui se nomme `<script>alert('coucou')</script>` alors à chaque fois qu'on le cherchera sur l'annuaire ça produira cette pop-up ?
|
|||||||
|
perso_id += 1
|
||||||
xhttp.overrideMimeType("application/json");
|
xhttp.overrideMimeType("application/json");
|
||||||
xhttp.open("GET", "/search/".concat(input), true);
|
xhttp.open("POST", "/search/".concat(input), true);
|
||||||
xhttp.send();
|
xhttp.send(JSON.stringify({"id": perso_id}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue
Pourquoi un résultat vide?
Si tu veux créer un résultat vide en Go, pas la peine de mettre tous les champs à
""
, si tu écris justeSearchResult{}
ça crée une structure avec des chaines vides dans tous les champsUn 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 lego fmt
et aussi de tous les warnings.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 çaJustement 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)Elle n'était tout bonnement pas appelée.