From f346ca44f0ece22931027323a26803e2b995483b Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 8 Aug 2017 12:14:32 -0700 Subject: [PATCH] config: Avoid stale credentials in memory. (#4466) --- cmd/admin-handlers.go | 8 +++++++- cmd/browser-peer-rpc.go | 7 +++++-- cmd/config-v19.go | 13 ++++++++++--- cmd/web-handlers.go | 5 ++++- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/cmd/admin-handlers.go b/cmd/admin-handlers.go index 3d4f34852..92ad057f9 100644 --- a/cmd/admin-handlers.go +++ b/cmd/admin-handlers.go @@ -181,8 +181,14 @@ func (adminAPI adminAPIHandlers) ServiceCredentialsHandler(w http.ResponseWriter } // Update local credentials in memory. - serverConfig.SetCredential(creds) + prevCred := serverConfig.SetCredential(creds) + + // Save credentials to config file if err = serverConfig.Save(); err != nil { + // Save the current creds when failed to update. + serverConfig.SetCredential(prevCred) + + errorIf(err, "Unable to update the config with new credentials.") writeErrorResponse(w, ErrInternalError, r.URL) return } diff --git a/cmd/browser-peer-rpc.go b/cmd/browser-peer-rpc.go index 4602cba27..b985d54ae 100644 --- a/cmd/browser-peer-rpc.go +++ b/cmd/browser-peer-rpc.go @@ -69,11 +69,14 @@ func (br *browserPeerAPIHandlers) SetAuthPeer(args SetAuthPeerArgs, reply *AuthR } // Update credentials in memory - serverConfig.SetCredential(args.Creds) + prevCred := serverConfig.SetCredential(args.Creds) // Save credentials to config file if err := serverConfig.Save(); err != nil { - errorIf(err, "Error updating config file with new credentials sent from browser RPC.") + // Save the current creds when failed to update. + serverConfig.SetCredential(prevCred) + + errorIf(err, "Unable to update the config with new credentials sent from browser RPC.") return err } diff --git a/cmd/config-v19.go b/cmd/config-v19.go index 144cb4fc7..1045db1cf 100644 --- a/cmd/config-v19.go +++ b/cmd/config-v19.go @@ -61,11 +61,12 @@ func (s *serverConfigV19) GetVersion() string { return s.Version } -// SetRegion set new region. +// SetRegion set a new region. func (s *serverConfigV19) SetRegion(region string) { s.Lock() defer s.Unlock() + // Save new region. s.Region = region } @@ -77,13 +78,19 @@ func (s *serverConfigV19) GetRegion() string { return s.Region } -// SetCredentials set new credentials. -func (s *serverConfigV19) SetCredential(creds credential) { +// SetCredentials set new credentials. SetCredential returns the previous credential. +func (s *serverConfigV19) SetCredential(creds credential) (prevCred credential) { s.Lock() defer s.Unlock() + // Save previous credential. + prevCred = s.Credential + // Set updated credential. s.Credential = creds + + // Return previous credential. + return prevCred } // GetCredentials get current credentials. diff --git a/cmd/web-handlers.go b/cmd/web-handlers.go index 1e886f45d..61773629c 100644 --- a/cmd/web-handlers.go +++ b/cmd/web-handlers.go @@ -405,10 +405,13 @@ func (web *webAPIHandlers) SetAuth(r *http.Request, args *SetAuthArgs, reply *Se errsMap := updateCredsOnPeers(creds) // Update local credentials - serverConfig.SetCredential(creds) + prevCred := serverConfig.SetCredential(creds) // Persist updated credentials. if err = serverConfig.Save(); err != nil { + // Save the current creds when failed to update. + serverConfig.SetCredential(prevCred) + errsMap[globalMinioAddr] = err }