feat: passwords hashing
This commit is contained in:
parent
8bb1509786
commit
c9e1bf65fa
1
go.mod
1
go.mod
@ -5,6 +5,7 @@ go 1.20
|
||||
require (
|
||||
github.com/kr/pretty v0.3.1
|
||||
github.com/redis/go-redis/v9 v9.2.1
|
||||
golang.org/x/crypto v0.15.0
|
||||
)
|
||||
|
||||
require (
|
||||
|
2
go.sum
2
go.sum
@ -14,3 +14,5 @@ github.com/redis/go-redis/v9 v9.2.1 h1:WlYJg71ODF0dVspZZCpYmoF1+U1Jjk9Rwd7pq6Qml
|
||||
github.com/redis/go-redis/v9 v9.2.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
|
||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||
golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA=
|
||||
golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
|
||||
|
@ -11,6 +11,8 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
|
||||
"sunshine.industries/some-automoderation/rooms"
|
||||
"sunshine.industries/some-automoderation/sessions"
|
||||
)
|
||||
@ -125,14 +127,20 @@ func createRoomHandler(templateFs *embed.FS,
|
||||
log.Printf("error, room name occupied %s", roomName)
|
||||
return
|
||||
}
|
||||
personPassHash, err := hashPassword(r.PostFormValue("personalPassword"))
|
||||
if err != nil {
|
||||
log.Printf("error, room name occupied %s", roomName)
|
||||
return
|
||||
}
|
||||
person := rooms.Person{
|
||||
Id: rooms.RandomPersonId(),
|
||||
Name: r.PostFormValue("personalName"),
|
||||
PasswordHash: r.PostFormValue("personalPassword"), // TODO hash the password, not to store
|
||||
PasswordHash: personPassHash,
|
||||
}
|
||||
roomPassHash, err := hashPassword(r.PostFormValue("roomPassword"))
|
||||
newRoom := rooms.Room{
|
||||
Name: roomName,
|
||||
PasswordHash: r.PostFormValue("roomPassword"), // TODO hash the password, not to store
|
||||
PasswordHash: roomPassHash,
|
||||
AdminIds: []rooms.PersonId{person.Id},
|
||||
Paricipants: []rooms.PersonId{person.Id},
|
||||
AllKnownPeople: map[rooms.PersonId]rooms.Person{
|
||||
@ -207,7 +215,7 @@ func joinRoomHandler(templateFs *embed.FS,
|
||||
}
|
||||
|
||||
// b) check if room password OK
|
||||
if room.PasswordHash != roomPass {
|
||||
if !isPasswordCorrect(roomPass, room.PasswordHash) {
|
||||
log.Printf("/login/join bad room pass for %+v", room)
|
||||
w.WriteHeader(http.StatusForbidden)
|
||||
// TODO render error to be put in error place
|
||||
@ -223,7 +231,7 @@ func joinRoomHandler(templateFs *embed.FS,
|
||||
// c) check if such person exists,
|
||||
// knownPerson, found :=
|
||||
// check the password
|
||||
if (person != rooms.Person{}) && person.PasswordHash != personPass {
|
||||
if (person != rooms.Person{}) && !isPasswordCorrect(personPass, person.PasswordHash) {
|
||||
log.Printf("/login/join bad person pass for %+s", person.Name)
|
||||
w.WriteHeader(http.StatusForbidden)
|
||||
// TODO render error to be put in error place
|
||||
@ -233,12 +241,13 @@ func joinRoomHandler(templateFs *embed.FS,
|
||||
if (person == rooms.Person{}) {
|
||||
log.Printf("/login/join room pass correct, new person joins")
|
||||
// creating a new person with provided password hash
|
||||
personPassHash, err := hashPassword(personPass)
|
||||
person = rooms.Person{
|
||||
Name: personName,
|
||||
PasswordHash: personPass,
|
||||
PasswordHash: personPassHash,
|
||||
Id: rooms.RandomPersonId(),
|
||||
}
|
||||
err := roomsM.Update(r.Context(), room.Name, func(fromRoom rooms.Room) (toRoom rooms.Room) {
|
||||
err = roomsM.Update(r.Context(), room.Name, func(fromRoom rooms.Room) (toRoom rooms.Room) {
|
||||
log.Printf("/login/join about to modify room %+v", fromRoom)
|
||||
toRoom = fromRoom
|
||||
toRoom.AllKnownPeople[person.Id] = person
|
||||
@ -330,3 +339,16 @@ func logoutRoute(sessionSM sessions.SessionManagement,
|
||||
w.Header().Add("HX-Redirect", "/")
|
||||
}
|
||||
}
|
||||
|
||||
func isPasswordCorrect(password, hash string) bool {
|
||||
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
|
||||
return err == nil
|
||||
}
|
||||
|
||||
func hashPassword(password string) (string, error) {
|
||||
hashBytes, err := bcrypt.GenerateFromPassword([]byte(password), 0)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(hashBytes), nil
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user