change hashmap to sync.Map

This commit is contained in:
2021-04-08 21:59:03 +02:00
parent e48cbd396b
commit ed48629a61
3 changed files with 21 additions and 37 deletions

View File

@ -3,12 +3,12 @@ import (
"time" "time"
"net/http" "net/http"
"bytes" "bytes"
"github.com/cornelk/hashmap" "sync"
) )
type loginStruct struct { type loginStruct struct {
FalsePassword bool FalsePassword bool
} }
var sessions hashmap.HashMap var sessions sync.Map
const sessionName string = "session" const sessionName string = "session"
const sessionTimeout time.Duration = 10 * 24 * time.Hour const sessionTimeout time.Duration = 10 * 24 * time.Hour
func login(w http.ResponseWriter, r *http.Request) { func login(w http.ResponseWriter, r *http.Request) {
@ -41,7 +41,7 @@ func login(w http.ResponseWriter, r *http.Request) {
Secure: true, Secure: true,
} }
http.SetCookie(w, &cookie) http.SetCookie(w, &cookie)
sessions.Set(key, username) sessions.Store(key, username)
go deleteSession(key) go deleteSession(key)
http.Redirect(w, r, redirectUrl, http.StatusSeeOther) http.Redirect(w, r, redirectUrl, http.StatusSeeOther)
} }
@ -52,15 +52,15 @@ func login(w http.ResponseWriter, r *http.Request) {
} }
func loggedIn(r *http.Request) bool { func loggedIn(r *http.Request) bool {
key, err := r.Cookie(sessionName) cookie, err := r.Cookie(sessionName)
if err != nil { if err != nil {
return false return false
} }
_, valid := sessions.GetStringKey(key.Value) _, valid := sessions.Load(cookie.Value)
return valid return valid
} }
func deleteSession(key string) { func deleteSession(key string) {
time.Sleep(sessionTimeout) time.Sleep(sessionTimeout)
sessions.Del(key) sessions.Delete(key)
} }

View File

@ -49,7 +49,7 @@ func checkBodyByTemplate(test *testing.T, response *http.Response, template *tem
func checkBody(test *testing.T, response *http.Response, expectedResponse []byte) { func checkBody(test *testing.T, response *http.Response, expectedResponse []byte) {
responseBody, _ := io.ReadAll(response.Body) responseBody, _ := io.ReadAll(response.Body)
if bytes.Equal(expectedResponse, responseBody) { if !bytes.Equal(expectedResponse, responseBody) {
test.Errorf("unexpected body:\n%v", string(responseBody)) test.Errorf("unexpected body:\n%v", string(responseBody))
} }
} }

View File

@ -8,7 +8,7 @@ import (
"github.com/dlclark/regexp2" "github.com/dlclark/regexp2"
"code.gitea.io/sdk/gitea" "code.gitea.io/sdk/gitea"
"crypto/rand" "crypto/rand"
"github.com/cornelk/hashmap" "sync"
) )
type account struct { type account struct {
email string email string
@ -35,7 +35,9 @@ type registerStruct struct {
type submitStruct struct { type submitStruct struct {
Success bool Success bool
} }
var cacheAccounts hashmap.HashMap var accountByToken sync.Map
var usernameExitsMap sync.Map
var discordUserExitsMap sync.Map
var rusername *regexp.Regexp var rusername *regexp.Regexp
var remail *regexp2.Regexp var remail *regexp2.Regexp
var rpassword *regexp2.Regexp var rpassword *regexp2.Regexp
@ -67,8 +69,10 @@ func register(w http.ResponseWriter, r *http.Request) {
newAccount.discordId = newRbuMember.User.ID newAccount.discordId = newRbuMember.User.ID
{ {
var username string var username string
registerStruct.AlreadyEsitsInDatabase.Username = db.QueryRow("SELECT username FROM account WHERE username = ?", newAccount.username).Scan(&username) == nil || UsernameExistsInMem(newAccount.username) // check if username exits _, usernameExitsInMem := usernameExitsMap.Load(newAccount.username)
registerStruct.AlreadyEsitsInDatabase.DiscordUsername = db.QueryRow("SELECT username FROM account WHERE discordUserId = ?", newAccount.discordId).Scan(&username) == nil || discordUsernameExistsInMem(newAccount.discordId) registerStruct.AlreadyEsitsInDatabase.Username = db.QueryRow("SELECT username FROM account WHERE username = ?", newAccount.username).Scan(&username) == nil || usernameExitsInMem
_, discordUserExitsInMem := discordUserExitsMap.Load(newAccount.discordId)
registerStruct.AlreadyEsitsInDatabase.DiscordUsername = db.QueryRow("SELECT username FROM account WHERE discordUserId = ?", newAccount.discordId).Scan(&username) == nil || discordUserExitsInMem
} }
registerStruct.Success = !registerStruct.WrongAccount.User && !registerStruct.WrongAccount.Pass && !registerStruct.WrongAccount.Email && !registerStruct.WrongAccount.DiscordUser && !registerStruct.AlreadyEsitsInDatabase.DiscordUsername && !registerStruct.AlreadyEsitsInDatabase.Username registerStruct.Success = !registerStruct.WrongAccount.User && !registerStruct.WrongAccount.Pass && !registerStruct.WrongAccount.Email && !registerStruct.WrongAccount.DiscordUser && !registerStruct.AlreadyEsitsInDatabase.DiscordUsername && !registerStruct.AlreadyEsitsInDatabase.Username
if !registerStruct.Success { if !registerStruct.Success {
@ -80,7 +84,9 @@ func register(w http.ResponseWriter, r *http.Request) {
dmChannel, err = discord.UserChannelCreate(newRbuMember.User.ID) dmChannel, err = discord.UserChannelCreate(newRbuMember.User.ID)
log(err) log(err)
discord.ChannelMessageSend(dmChannel.ID, "Bitte klicke auf den Link, um die Erstellung des Accounts abzuschließen.\n<" + config.RootUrl + "/submit?token=" + token + ">") discord.ChannelMessageSend(dmChannel.ID, "Bitte klicke auf den Link, um die Erstellung des Accounts abzuschließen.\n<" + config.RootUrl + "/submit?token=" + token + ">")
cacheAccounts.Set(token, newAccount) accountByToken.Store(token, newAccount)
usernameExitsMap.Store(newAccount.username, nil)
discordUserExitsMap.Store(newAccount.discordId, nil)
} }
registerReturn: runTemplate(w, registerTmpl, registerStruct) registerReturn: runTemplate(w, registerTmpl, registerStruct)
} }
@ -89,13 +95,14 @@ func register(w http.ResponseWriter, r *http.Request) {
var submitStruct submitStruct var submitStruct submitStruct
token := r.FormValue("token") token := r.FormValue("token")
var accInter interface{} var accInter interface{}
accInter, submitStruct.Success = cacheAccounts.GetStringKey(token) accInter, submitStruct.Success = accountByToken.LoadAndDelete(token)
if !submitStruct.Success { if !submitStruct.Success {
goto submitReturn goto submitReturn
} }
{ {
var account account = accInter.(account) var account account = accInter.(account)
cacheAccounts.Del(token) usernameExitsMap.Delete(account.username)
discordUserExitsMap.Delete(account.discordId)
salt := make([]byte, 32) salt := make([]byte, 32)
_, err = rand.Read(salt) _, err = rand.Read(salt)
log(err) log(err)
@ -129,26 +136,3 @@ func getRbuMember(user string, tag string) (*discordgo.Member, bool) {
} }
return nil, false return nil, false
} }
func UsernameExistsInMem(username string) bool {
for key := range cacheAccounts.Iter() {
var accInter interface{}
accInter, _ = cacheAccounts.Get(key)
var account account = accInter.(account)
if account.username == username {
return true
}
}
return false
}
func discordUsernameExistsInMem(id string) bool {
for key := range cacheAccounts.Iter() {
var accInter interface{}
accInter, _ = cacheAccounts.Get(key)
var account account = accInter.(account)
if account.discordId == id {
return true
}
}
return false
}