From c8f300b2cdc6f00ba1aeb98c51a534f18474b895 Mon Sep 17 00:00:00 2001
From: Denis Denisov <denji@users.noreply.github.com>
Date: Sat, 3 Dec 2016 07:49:17 +0200
Subject: [PATCH] Safe compare password (timing attack) (#338)

---
 models/user.go | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/models/user.go b/models/user.go
index 41fdf0b024..40afc48491 100644
--- a/models/user.go
+++ b/models/user.go
@@ -8,6 +8,7 @@ import (
 	"bytes"
 	"container/list"
 	"crypto/sha256"
+	"crypto/subtle"
 	"encoding/hex"
 	"errors"
 	"fmt"
@@ -368,7 +369,7 @@ func (u *User) EncodePasswd() {
 func (u *User) ValidatePassword(passwd string) bool {
 	newUser := &User{Passwd: passwd, Salt: u.Salt}
 	newUser.EncodePasswd()
-	return u.Passwd == newUser.Passwd
+	return subtle.ConstantTimeCompare([]byte(u.Passwd), []byte(newUser.Passwd)) == 1
 }
 
 // UploadAvatar saves custom avatar for user.