diff options
| author | Julian Hurst <ark@mansus.space> | 2023-01-12 17:41:47 +0100 |
|---|---|---|
| committer | Julian Hurst <ark@mansus.space> | 2023-01-12 17:41:47 +0100 |
| commit | 05a30c5ad503ff2bc25cf6f83f9054100f644eeb (patch) | |
| tree | 1104e28c2c506d848b6be57d821f16fcac0f23d2 | |
| parent | 5685d2d4c1ede52796d00c5f4813e379ac3c377f (diff) | |
| download | docspace-05a30c5ad503ff2bc25cf6f83f9054100f644eeb.tar.gz | |
Add session ids, privacy.txt and nav_logged.html
| -rw-r--r-- | go.mod | 1 | ||||
| -rw-r--r-- | go.sum | 2 | ||||
| -rw-r--r-- | main.go | 46 | ||||
| -rw-r--r-- | static/privacy.txt | 9 | ||||
| -rw-r--r-- | templates/createuser.html | 5 | ||||
| -rw-r--r-- | templates/nav.html | 2 | ||||
| -rw-r--r-- | templates/nav_logged.html | 1 |
7 files changed, 56 insertions, 10 deletions
@@ -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 ) @@ -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= @@ -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 @@ <p class="error">{{.Error}}</p> {{end}} <form action="/createuser" method="POST"> + <span>Pour des raisons de sécurité, le mot de passe doit avoir une longeur supérieure ou égale à 10 caractères.<br/><br/> <input required type="text" name="user" id="user" placeholder="Nom d'utilisateur"><br/><br/> <input required type="email" name="email" id="email" placeholder="Email"><br/><br/> - <input required type="password" name="pass" id="pass" placeholder="Mot de passe"><br/><br/> - <input required type="password" name="cpass" id="cpass" placeholder="Confirmation du mot de passe"><br/><br/> + <input required type="password" name="pass" id="pass" placeholder="Mot de passe" minlength="10"><br/><br/> + <input required type="password" name="cpass" id="cpass" placeholder="Confirmation du mot de passe" minlength="10"><br/><br/> <input type="submit" value="Créer"> </form> </div> 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"}} <nav> <a href="/admin">Admin</a> | + <a href="/">Accueil</a> | + <a href="/login">Se connecter</a> | <a href="/createuser">Créer un compte</a> </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"}} <nav> <a href="/admin">Admin</a> | + <a href="/">Accueil</a> | <a href="/logout">Se déconnecter</a> </nav> {{end}} |
