aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Hurst <ark@mansus.space>2023-01-12 17:41:47 +0100
committerJulian Hurst <ark@mansus.space>2023-01-12 17:41:47 +0100
commit05a30c5ad503ff2bc25cf6f83f9054100f644eeb (patch)
tree1104e28c2c506d848b6be57d821f16fcac0f23d2
parent5685d2d4c1ede52796d00c5f4813e379ac3c377f (diff)
downloaddocspace-05a30c5ad503ff2bc25cf6f83f9054100f644eeb.tar.gz
Add session ids, privacy.txt and nav_logged.html
-rw-r--r--go.mod1
-rw-r--r--go.sum2
-rw-r--r--main.go46
-rw-r--r--static/privacy.txt9
-rw-r--r--templates/createuser.html5
-rw-r--r--templates/nav.html2
-rw-r--r--templates/nav_logged.html1
7 files changed, 56 insertions, 10 deletions
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 @@
<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}}