convert all email addresses to lower case (#14)

This commit is contained in:
Christoph Haas 2021-04-22 20:29:37 +02:00
parent 926733dea4
commit e052f400aa
5 changed files with 58 additions and 10 deletions

View File

@ -108,6 +108,7 @@ func (provider Provider) GetUserModel(ctx *authentication.AuthContext) (*authent
} }
func (provider Provider) InitializeAdmin(email, password string) error { func (provider Provider) InitializeAdmin(email, password string) error {
email = strings.ToLower(email)
if !emailRegex.MatchString(email) { if !emailRegex.MatchString(email) {
return errors.New("admin username must be an email address") return errors.New("admin username must be an email address")
} }

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"os" "os"
"path/filepath" "path/filepath"
"sort"
"time" "time"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -14,6 +15,22 @@ import (
"gorm.io/gorm/logger" "gorm.io/gorm/logger"
) )
func init() {
migrations = append(migrations, Migration{
version: "1.0.7",
migrateFn: func(db *gorm.DB) error {
if err := db.Exec("UPDATE users SET email = LOWER(email)").Error; err != nil {
return errors.Wrap(err, "failed to convert user emails to lower case")
}
if err := db.Exec("UPDATE peers SET email = LOWER(email)").Error; err != nil {
return errors.Wrap(err, "failed to convert peer emails to lower case")
}
logrus.Infof("upgraded database format to version 1.0.7")
return nil
},
})
}
type SupportedDatabase string type SupportedDatabase string
const ( const (
@ -80,16 +97,18 @@ type DatabaseMigrationInfo struct {
Applied time.Time Applied time.Time
} }
type Migration struct {
version string
migrateFn func(db *gorm.DB) error
}
var migrations []Migration
func MigrateDatabase(db *gorm.DB, version string) error { func MigrateDatabase(db *gorm.DB, version string) error {
if err := db.AutoMigrate(&DatabaseMigrationInfo{}); err != nil { if err := db.AutoMigrate(&DatabaseMigrationInfo{}); err != nil {
return errors.Wrap(err, "failed to migrate version database") return errors.Wrap(err, "failed to migrate version database")
} }
newVersion := DatabaseMigrationInfo{
Version: version,
Applied: time.Now(),
}
existingMigration := DatabaseMigrationInfo{} existingMigration := DatabaseMigrationInfo{}
db.Where("version = ?", version).FirstOrInit(&existingMigration) db.Where("version = ?", version).FirstOrInit(&existingMigration)
@ -97,11 +116,24 @@ func MigrateDatabase(db *gorm.DB, version string) error {
lastVersion := DatabaseMigrationInfo{} lastVersion := DatabaseMigrationInfo{}
db.Order("applied desc, version desc").FirstOrInit(&lastVersion) db.Order("applied desc, version desc").FirstOrInit(&lastVersion)
// TODO: migrate database sort.Slice(migrations, func(i, j int) bool {
return migrations[i].version < migrations[j].version
})
res := db.Create(&newVersion) for _, migration := range migrations {
if res.Error != nil { if migration.version > lastVersion.Version {
return errors.Wrap(res.Error, "failed to write version to database") if err := migration.migrateFn(db); err != nil {
return errors.Wrapf(err, "failed to migrate to version %s", migration.version)
}
res := db.Create(&DatabaseMigrationInfo{
Version: migration.version,
Applied: time.Now(),
})
if res.Error != nil {
return errors.Wrapf(res.Error, "failed to write version %s to database", migration.version)
}
}
} }
} }

View File

@ -1,4 +1,4 @@
package server package server
var Version = "testbuild" var Version = "testbuild"
var DatabaseVersion = "1.0.6" var DatabaseVersion = "1.0.7"

View File

@ -51,6 +51,8 @@ func (m Manager) UserExists(email string) bool {
} }
func (m Manager) GetUser(email string) *User { func (m Manager) GetUser(email string) *User {
email = strings.ToLower(email)
user := User{} user := User{}
m.db.Where("email = ?", email).First(&user) m.db.Where("email = ?", email).First(&user)
@ -62,6 +64,8 @@ func (m Manager) GetUser(email string) *User {
} }
func (m Manager) GetUserUnscoped(email string) *User { func (m Manager) GetUserUnscoped(email string) *User {
email = strings.ToLower(email)
user := User{} user := User{}
m.db.Unscoped().Where("email = ?", email).First(&user) m.db.Unscoped().Where("email = ?", email).First(&user)
@ -93,6 +97,8 @@ func (m Manager) GetFilteredAndSortedUsersUnscoped(sortKey, sortDirection, searc
} }
func (m Manager) GetOrCreateUser(email string) (*User, error) { func (m Manager) GetOrCreateUser(email string) (*User, error) {
email = strings.ToLower(email)
user := User{} user := User{}
m.db.Where("email = ?", email).FirstOrInit(&user) m.db.Where("email = ?", email).FirstOrInit(&user)
@ -113,6 +119,8 @@ func (m Manager) GetOrCreateUser(email string) (*User, error) {
} }
func (m Manager) GetOrCreateUserUnscoped(email string) (*User, error) { func (m Manager) GetOrCreateUserUnscoped(email string) (*User, error) {
email = strings.ToLower(email)
user := User{} user := User{}
m.db.Unscoped().Where("email = ?", email).FirstOrInit(&user) m.db.Unscoped().Where("email = ?", email).FirstOrInit(&user)
@ -133,6 +141,7 @@ func (m Manager) GetOrCreateUserUnscoped(email string) (*User, error) {
} }
func (m Manager) CreateUser(user *User) error { func (m Manager) CreateUser(user *User) error {
user.Email = strings.ToLower(user.Email)
res := m.db.Create(user) res := m.db.Create(user)
if res.Error != nil { if res.Error != nil {
return errors.Wrapf(res.Error, "failed to create user %s", user.Email) return errors.Wrapf(res.Error, "failed to create user %s", user.Email)
@ -142,6 +151,7 @@ func (m Manager) CreateUser(user *User) error {
} }
func (m Manager) UpdateUser(user *User) error { func (m Manager) UpdateUser(user *User) error {
user.Email = strings.ToLower(user.Email)
res := m.db.Save(user) res := m.db.Save(user)
if res.Error != nil { if res.Error != nil {
return errors.Wrapf(res.Error, "failed to update user %s", user.Email) return errors.Wrapf(res.Error, "failed to update user %s", user.Email)
@ -151,6 +161,7 @@ func (m Manager) UpdateUser(user *User) error {
} }
func (m Manager) DeleteUser(user *User) error { func (m Manager) DeleteUser(user *User) error {
user.Email = strings.ToLower(user.Email)
res := m.db.Delete(user) res := m.db.Delete(user)
if res.Error != nil { if res.Error != nil {
return errors.Wrapf(res.Error, "failed to update user %s", user.Email) return errors.Wrapf(res.Error, "failed to update user %s", user.Email)

View File

@ -623,6 +623,7 @@ func (m *PeerManager) GetFilteredAndSortedPeers(device, sortKey, sortDirection,
} }
func (m *PeerManager) GetSortedPeersForEmail(sortKey, sortDirection, email string) []Peer { func (m *PeerManager) GetSortedPeersForEmail(sortKey, sortDirection, email string) []Peer {
email = strings.ToLower(email)
peers := make([]Peer, 0) peers := make([]Peer, 0)
m.db.Where("email = ?", email).Find(&peers) m.db.Where("email = ?", email).Find(&peers)
@ -691,6 +692,7 @@ func (m *PeerManager) GetPeerByKey(publicKey string) Peer {
} }
func (m *PeerManager) GetPeersByMail(mail string) []Peer { func (m *PeerManager) GetPeersByMail(mail string) []Peer {
mail = strings.ToLower(mail)
var peers []Peer var peers []Peer
m.db.Where("email = ?", mail).Find(&peers) m.db.Where("email = ?", mail).Find(&peers)
for i := range peers { for i := range peers {
@ -706,6 +708,7 @@ func (m *PeerManager) CreatePeer(peer Peer) error {
peer.UID = fmt.Sprintf("u%x", md5.Sum([]byte(peer.PublicKey))) peer.UID = fmt.Sprintf("u%x", md5.Sum([]byte(peer.PublicKey)))
peer.UpdatedAt = time.Now() peer.UpdatedAt = time.Now()
peer.CreatedAt = time.Now() peer.CreatedAt = time.Now()
peer.Email = strings.ToLower(peer.Email)
res := m.db.Create(&peer) res := m.db.Create(&peer)
if res.Error != nil { if res.Error != nil {
@ -718,6 +721,7 @@ func (m *PeerManager) CreatePeer(peer Peer) error {
func (m *PeerManager) UpdatePeer(peer Peer) error { func (m *PeerManager) UpdatePeer(peer Peer) error {
peer.UpdatedAt = time.Now() peer.UpdatedAt = time.Now()
peer.Email = strings.ToLower(peer.Email)
res := m.db.Save(&peer) res := m.db.Save(&peer)
if res.Error != nil { if res.Error != nil {