From 05a30c5ad503ff2bc25cf6f83f9054100f644eeb Mon Sep 17 00:00:00 2001 From: Julian Hurst Date: Thu, 12 Jan 2023 17:41:47 +0100 Subject: Add session ids, privacy.txt and nav_logged.html --- go.mod | 1 + go.sum | 2 ++ main.go | 46 ++++++++++++++++++++++++++++++++++++++-------- static/privacy.txt | 9 +++++++++ templates/createuser.html | 5 +++-- templates/nav.html | 2 ++ templates/nav_logged.html | 1 + 7 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 static/privacy.txt diff --git a/go.mod b/go.mod index 3530f46..12c0393 100644 --- a/go.mod +++ b/go.mod @@ -4,5 +4,6 @@ go 1.19 require ( github.com/mattn/go-sqlite3 v1.14.16 // indirect + github.com/satori/go.uuid v1.2.0 // indirect golang.org/x/crypto v0.5.0 // indirect ) diff --git a/go.sum b/go.sum index dadd85b..494b688 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,6 @@ github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= diff --git a/main.go b/main.go index 26c76c0..1194c50 100644 --- a/main.go +++ b/main.go @@ -15,17 +15,27 @@ import ( "database/sql" "encoding/json" "encoding/base64" + "sync" + + "github.com/satori/go.uuid" ) var db *sql.DB const baseDocDir string = "docs" +var sessionIds sync.Map + type Doc struct { Name string Link string } +type UserSession struct { + User + SessionId string +} + func serveTemplate(w http.ResponseWriter, r *http.Request, view string, data interface{}) { var nav string = "templates/nav.html" if u, err := checkSession(w, r); u != nil && err == nil { @@ -57,12 +67,15 @@ func checkSession(w http.ResponseWriter, r *http.Request) (*User, error) { if err != nil { return nil, err } - var user User + var user UserSession err = json.Unmarshal(ub64, &user) if err != nil { return nil, err } - return &user, nil + if sessionId, ok := sessionIds.Load(user.User.User); !ok || sessionId != user.SessionId { + return nil, errors.New("Invalid session ID") + } + return &user.User, nil } func sendError(w http.ResponseWriter, r *http.Request, s string, status int) { @@ -121,6 +134,9 @@ func index(w http.ResponseWriter, r *http.Request) { } serveTemplate(w, r, "templates/user.html", data) return + } else if err != nil { + sendError(w, r, err.Error(), http.StatusInternalServerError) + return } serveTemplate(w, r, "templates/index.html", nil) } @@ -171,6 +187,10 @@ func createuser(w http.ResponseWriter, r *http.Request) { email := r.FormValue("email") pass := r.FormValue("pass") cpass := r.FormValue("cpass") + if len(pass) < 10 { + sendFlashError(w, r, "/createuser", errors.New("Le mot de passe doit avoir une longeur supérieure ou égale à 10 caractères.")) + return + } if pass != cpass { sendFlashError(w, r, "/createuser", errors.New("Le mot de passe et la confirmation du mot de passe ne sont pas les mêmes.")) return @@ -225,11 +245,15 @@ func sendFlashError(w http.ResponseWriter, r *http.Request, url string, err erro func logout(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: - http.SetCookie(w, &http.Cookie{ - Name: "session", - Value: "", - MaxAge: -1, - }) + u, err := checkSession(w, r) + if u != nil && err == nil { + http.SetCookie(w, &http.Cookie{ + Name: "session", + Value: "", + MaxAge: -1, + }) + sessionIds.Delete(u.User) + } http.Redirect(w, r, "/", http.StatusSeeOther) default: sendInvalidMethod(w, r) @@ -255,7 +279,13 @@ func login(w http.ResponseWriter, r *http.Request) { return } user.Pass = "" - jsonData, err := json.Marshal(user) + sessionId := uuid.NewV4().String() + sessionIds.Store(user.User, sessionId) + us := UserSession { + user, + sessionId, + } + jsonData, err := json.Marshal(us) if err != nil { sendFlashError(w, r, "/login", err) return diff --git a/static/privacy.txt b/static/privacy.txt new file mode 100644 index 0000000..bd15ad1 --- /dev/null +++ b/static/privacy.txt @@ -0,0 +1,9 @@ +Ce site utilise des cookies uniquement pour le bon fonctionnement du site. Les cookies utilisés sont : + +- Un cookie "session" lorsque l'utilisateur est loggué pour l'authentifier dans le contexte du site et stocker les informations liés à son compte (identifiant de session, nom d'utilisateur et email) +- Un cookie temporaire "flasherror" pour communiquer des erreurs (tels que les erreurs de saisie d'indentifiants) entre les différentes pages du site. Ce cookie est temporaire, c'est-à-dire qu'il est détruit directement après sa première lecture. + + +Ces cookies utilisent des fonctionnalités (samesite, secure, httponly, ...) permettant de réduire le risque d'attaques telles que les attaques CSRF. + +Ce site n'utilise en aucun cas des cookies de parties tierces et n'emploit aucune technique d'identification ou de récolte de données personnelles (création d'empreinte digitale, récolte d'informations du navigateur ou du matériel informatique utilisé par l'utilisateur, ...) diff --git a/templates/createuser.html b/templates/createuser.html index 20388b1..1a06fa0 100644 --- a/templates/createuser.html +++ b/templates/createuser.html @@ -6,10 +6,11 @@

{{.Error}}

{{end}}
+ Pour des raisons de sécurité, le mot de passe doit avoir une longeur supérieure ou égale à 10 caractères.





-

-

+

+

diff --git a/templates/nav.html b/templates/nav.html index d34a836..432ddec 100644 --- a/templates/nav.html +++ b/templates/nav.html @@ -1,6 +1,8 @@ {{define "nav"}} {{end}} diff --git a/templates/nav_logged.html b/templates/nav_logged.html index b433845..9e88507 100644 --- a/templates/nav_logged.html +++ b/templates/nav_logged.html @@ -1,6 +1,7 @@ {{define "nav"}} {{end}} -- cgit v1.2.3