From 4ee4bca9759ba9a2e5f4171fa016e7c04fc45bbf Mon Sep 17 00:00:00 2001 From: Marc Ole Bulling Date: Wed, 23 Jun 2021 11:58:59 +0200 Subject: [PATCH] Changed Mutex to RWMutex --- cmd/gokapi/Main.go | 4 ++-- internal/configuration/Configuration.go | 16 ++++++++++++++-- internal/storage/FileServing.go | 8 ++++---- internal/webserver/Webserver.go | 8 ++++---- internal/webserver/api/Api.go | 4 ++-- .../webserver/sessionmanager/SessionManager.go | 2 +- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/cmd/gokapi/Main.go b/cmd/gokapi/Main.go index b825f6f..f4457b4 100644 --- a/cmd/gokapi/Main.go +++ b/cmd/gokapi/Main.go @@ -87,9 +87,9 @@ func resetPassword(passedFlags flags) { func createSsl(passedFlags flags) { if passedFlags.createSsl { - settings := configuration.GetServerSettings() - configuration.Release() + settings := configuration.GetServerSettingsReadOnly() ssl.GenerateIfInvalidCert(settings.ServerUrl, true) + configuration.ReleaseReadOnly() } } diff --git a/internal/configuration/Configuration.go b/internal/configuration/Configuration.go index a8053af..6b1295a 100644 --- a/internal/configuration/Configuration.go +++ b/internal/configuration/Configuration.go @@ -36,7 +36,7 @@ var serverSettings Configuration const currentConfigVersion = 7 // For locking this object to prevent race conditions -var mutex sync.Mutex +var mutex sync.RWMutex // Configuration is a struct that contains the global configuration type Configuration struct { @@ -98,13 +98,25 @@ func Release() { mutex.Unlock() } -// GetServerSettings locks the settings returns a pointer to the configuration +// GetServerSettings locks the settings returns a pointer to the configuration for Read/Write access // Release needs to be called when finished with the operation! func GetServerSettings() *Configuration { mutex.Lock() return &serverSettings } +// GetServerSettingsReadOnly locks the settings for read-only access and returns a copy of the configuration +// ReleaseReadOnly needs to be called when finished with the operation! +func GetServerSettingsReadOnly() *Configuration { + mutex.RLock() + return &serverSettings +} + +// ReleaseReadOnly unlocks the configuration opened for read-only access +func ReleaseReadOnly() { + mutex.RUnlock() +} + // Upgrades the ServerSettings if saved with a previous version func updateConfig() { // < v1.1.2 diff --git a/internal/storage/FileServing.go b/internal/storage/FileServing.go index 126210e..9679bc1 100644 --- a/internal/storage/FileServing.go +++ b/internal/storage/FileServing.go @@ -139,9 +139,9 @@ func GetFile(id string) (models.File, bool) { if id == "" { return emptyResult, false } - settings := configuration.GetServerSettings() + settings := configuration.GetServerSettingsReadOnly() + defer configuration.ReleaseReadOnly() file := settings.Files[id] - configuration.Release() if file.ExpireAt < time.Now().Unix() || file.DownloadsRemaining < 1 { return emptyResult, false } @@ -158,9 +158,9 @@ func GetFileByHotlink(id string) (models.File, bool) { if id == "" { return emptyResult, false } - settings := configuration.GetServerSettings() + settings := configuration.GetServerSettingsReadOnly() hotlink := settings.Hotlinks[id] - configuration.Release() + configuration.ReleaseReadOnly() return GetFile(hotlink.FileId) } diff --git a/internal/webserver/Webserver.go b/internal/webserver/Webserver.go index 5822d06..42066cc 100644 --- a/internal/webserver/Webserver.go +++ b/internal/webserver/Webserver.go @@ -113,7 +113,7 @@ func Start() { } func initLocalVariables() { - settings := configuration.GetServerSettings() + settings := configuration.GetServerSettingsReadOnly() webserverPort = settings.Port webserverExtUrl = settings.ServerUrl webserverRedirectUrl = settings.RedirectUrl @@ -121,7 +121,7 @@ func initLocalVariables() { webserverAdminPassword = settings.AdminPassword webserverMaxMemory = settings.MaxMemory webserverUseSsl = settings.UseSsl - configuration.Release() + configuration.ReleaseReadOnly() } // Initialises the templateFolder variable by scanning through all the templates. @@ -364,7 +364,7 @@ type UploadView struct { func (u *UploadView) convertGlobalConfig(isMainView bool) *UploadView { var result []models.File var resultApi []models.ApiKey - settings := configuration.GetServerSettings() + settings := configuration.GetServerSettingsReadOnly() if isMainView { for _, element := range settings.Files { result = append(result, element) @@ -401,7 +401,7 @@ func (u *UploadView) convertGlobalConfig(isMainView bool) *UploadView { u.TimeNow = time.Now().Unix() u.IsAdminView = true u.IsMainView = isMainView - configuration.Release() + configuration.ReleaseReadOnly() return u } diff --git a/internal/webserver/api/Api.go b/internal/webserver/api/Api.go index 00a1c7f..e96348d 100644 --- a/internal/webserver/api/Api.go +++ b/internal/webserver/api/Api.go @@ -94,13 +94,13 @@ func deleteFile(w http.ResponseWriter, request apiRequest) { func list(w http.ResponseWriter) { var validFiles []models.File sendOk(w) - settings := configuration.GetServerSettings() + settings := configuration.GetServerSettingsReadOnly() for _, element := range settings.Files { if element.ExpireAt > time.Now().Unix() && element.DownloadsRemaining > 0 { validFiles = append(validFiles, element) } } - configuration.Release() + configuration.ReleaseReadOnly() result, err := json.Marshal(validFiles) helper.Check(err) _, _ = w.Write(result) diff --git a/internal/webserver/sessionmanager/SessionManager.go b/internal/webserver/sessionmanager/SessionManager.go index ca0dcff..e06ac52 100644 --- a/internal/webserver/sessionmanager/SessionManager.go +++ b/internal/webserver/sessionmanager/SessionManager.go @@ -24,7 +24,7 @@ func IsValidSession(w http.ResponseWriter, r *http.Request) bool { sessionString := cookie.Value if sessionString != "" { settings := configuration.GetServerSettings() - defer configuration.ReleaseAndSave() + defer configuration.Release() _, ok := (settings.Sessions)[sessionString] if ok { return useSession(w, sessionString, &settings.Sessions)