Add_Directory_and_ProfilePicture #9
No reviewers
Labels
No labels
cat
bug
cat
feature
cat
idea
cat
performance
cat
reliability
cat
security
cat
ui
difficulty
high
difficulty
low
difficulty
mid
prio
high
prio
low
prio
mid
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: Deuxfleurs/guichet#9
Loading…
Reference in a new issue
No description provided.
Delete branch "Add_Directory"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Add a new directory for no-Admin. In the directory, a searchbox is used.
The default visibility's value is private. If the attribute doesn't exist, the value is like private.
Todo:
Add a link in the index page to directory pageChoose the default visibility (public or private or anything else)adc005c888
to768df58da6
WIP: Add_Directoryto Add_Directoryb6202be9b9
to46141a418d
aaf00147b8
to4891eb1aa9
07d14cd3ab
to3701abae46
8188f35b9a
to3abb38a746
J'ai fait quelques commentaires sur le code si tu veux bien regarder :)
Aussi, il faudrait appliquer
go fmt
pour nettoyer le formattage du code@ -0,0 +22,4 @@
}
type SearchResult struct {
Identifiant string `json:"identifiant"`
L'identifiant, c'est le CN ? Dans tous les cas
Identifiant
c'est un mot français, il faudrait appeller ça plutôt justeId
.@ -0,0 +23,4 @@
type SearchResult struct {
Identifiant string `json:"identifiant"`
Name string `json:"name"`
C'est le displayname que tu prends depuis le LDAP? Dans ce cas il faudrait appeller ça
DisplayName
@ -0,0 +65,4 @@
var result Results
for _, values := range sr.Entries {
if strings.Contains(values.GetAttributeValue("cn"), input) {
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
@ -0,0 +68,4 @@
if strings.Contains(values.GetAttributeValue("cn"), input) {
result = Results{
Search: append(result.Search, SearchResult{
Identifiant: values.GetAttributeValue("cn"),
Idem, c'est pas
cn
chez tout le monde@ -0,0 +86,4 @@
Email: "",
Description: "",
DN: "",
}),
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.
@ -44,2 +44,4 @@
GroupCanInvite string `json:"group_can_invite"`
GroupCanAdmin string `json:"group_can_admin"`
Endpoint string `json:"endpoint"`
Endpoint de quoi? Il faudrait appeller ça
S3Endpoint
pour être clair, et les autres les appellerS3AccessKey
etS3SecretKey
.@ -242,3 +251,3 @@
ldap.ScopeBaseObject, ldap.NeverDerefAliases, 0, 0, false,
requestKind,
[]string{"dn", "displayname", "givenname", "sn", "mail", "memberof"},
[]string{"dn", "displayname", "givenname", "sn", "mail", "memberof", "visibility", "description", "profilImage"},
pas de français ! appller ça
profilePicture
et nonprofilImage
@ -390,2 +399,4 @@
session.Values["login_dn"] = user_dn
//Add Value MessageID
session.Values["MessageID"] = uint32(0)
je pense que tu peux enlever ça du coup
@ -0,0 +1,244 @@
package main
il faudrait renommer ce fichier, moi je l'appellerais juste
s3.go
@ -0,0 +25,4 @@
)
//Upload image through guichet server.
func uploadImage(w http.ResponseWriter, r *http.Request, login *LoginStatus) (bool, string, error) {
Pourquoi on renvoie un bool, un string et une error ? je pense qu'on peut enlever le bool, ça complexifie trop et on se perd, et utiliser la sémantique suivante pour
(string, error)
:("", nil)
: aucun fichier n'a été envoyé par l'utilisateur, il ne se passe rien("", une erreur)
: une erreur se produit lors du traitement("machintruc.jpg", nil)
: on a traîté l'image correctement et elle existe sur s3Il suffit ensuite de checker qu'il n'y a pas d'erreur, puis copier la valeur dans LDAP seulement si elle n'est pas
""
@ -0,0 +40,4 @@
return false, "", err
}
if fileType == "" {
return false, "", nil
err == nil
, et le seul cas où c'est possible c'est quand le filetype est un filetypeimage/
correct@ -0,0 +50,4 @@
return false, "", err
}
mc, err := newMimioClient()
Minio, et pas Mimio ;)
@ -0,0 +54,4 @@
if err != nil {
return false, "", err
}
if mc == nil {
tu peux mettre les deux
if
en un seul avec||
@ -0,0 +60,4 @@
var name, nameFull string
if nameConsul := login.UserEntry.GetAttributeValue("profilImage"); nameConsul != "" {
profilePicture
au lieu deprofilImage
. Pour être sûr d'avoir la même valeur que partout, tu peux définir ça dans une constante:const PROFILE_PICTURE_FIELD_NAME = "profilePicture"
et ensuite dans le code tu utilises toujours la constante, tu ne répète jamais
"profilePicture"
@ -0,0 +68,4 @@
nameFull = "full_" + name
}
_, err = mc.PutObject(context.Background(), "bottin-pictures", name, buff_thumbnail, int64(buff_thumbnail.Len()), minio.PutObjectOptions{
Le nom du bucket
bottin-pictures
ça doit être dans config aussi, d'autres gens peuvent avoir un bucket qui s'appelle autrement@ -0,0 +85,4 @@
return true, name, nil
}
func newMimioClient() (*minio.Client, error) {
Minio*
@ -0,0 +95,4 @@
minioCLient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretKeyID, ""),
Secure: useSSL,
Region: "garage",
La région ça devrait aussi être dans la config
@ -0,0 +131,4 @@
if err != nil {
return errors.New("Decode: " + err.Error())
}
//Encode image to jpeg a first time to eliminate all problems
Pas besoin du premier encodage en jpeg, tu peux le virer
@ -0,0 +144,4 @@
}
buff.Reset()
images = resize.Thumbnail(200, 200, images, resize.Lanczos3)
images_thumbnail := resize.Thumbnail(80, 80, images, resize.Lanczos3)
Si l'image d'entrée est pas carrée, qu'est-ce que ça fait ?
J'ai testé avec des screenshots/ wallpapers et il n'y a eu aucun problèmes. ca les transforme en 200x196 le plus souvent. Si la taille est déjà inférieure à 200 alors il n'y touche pas.
@ -0,0 +177,4 @@
dn,
ldap.ScopeBaseObject, ldap.NeverDerefAliases, 0, 0, false,
"(objectclass=*)",
[]string{"profilImage"},
PROFILE_PICTURE_FIELD_NAME
@ -0,0 +191,4 @@
}
imageName = sr.Entries[0].GetAttributeValue("profilImage")
if imageName == "" {
http.Error(w, "User doesn't have profile image", http.StatusInternalServerError)
ça serait plutôt une 404 Not found et pas une 500 Internal error
@ -0,0 +240,4 @@
if _, err := w.Write(buff); err != nil {
http.Error(w, "WriteBody: "+err.Error(), http.StatusInternalServerError)
return
}
tu peux simplifier tout ça en utilisant
io.Copy(w, obj)
, ça t'évite de gérer un buffer et de prendre le risque de te planter sur les tailles ou les offset@ -0,0 +36,4 @@
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
description.innerHTML = jsonResponse.search[i].description
faudrait utiliser innerText plutôt que innerHTML, sinon on peut trivialement faire une injection de script
?? 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.
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.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 ?71638d4e0c
to27ea5101e4
Add_Directoryto Add_Directory_and_ProfilePicture27ea5101e4
tof00702b51c