Add_Directory_and_ProfilePicture #9

Merged
lx merged 13 commits from Add_Directory into main 2021-08-16 14:44:53 +00:00
2 changed files with 31 additions and 23 deletions
Showing only changes of commit 0ca6a159b2 - Show all commits

View file

@ -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: "",
Outdated
Review
  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

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
Outdated
Review

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.

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.
Outdated
Review

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

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
Outdated
Review

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)

 xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 201) {

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.
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")

View file

@ -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)
} }
} }
}; };
Outdated
Review

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
Outdated
Review

?? 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.
Outdated
Review

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.

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.
Outdated
Review

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 ?

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}));
} }
} }