Files
kopia/internal/server/api_ui_pref.go
Jarek Kowalski 9cba4a97be refactor(repository): major server code refactoring (#1837)
This removes big shared lock held for for the duration of each request
and replaces it with trivially short lock to capture the current
state of the server/repository before passing it to handlers.

Handlers are now limited to only accessing a small subset of Server
functionality to be able to better reason about them.
2022-03-19 22:01:38 -07:00

63 lines
1.4 KiB
Go

package server
import (
"bytes"
"context"
"encoding/json"
"os"
"github.com/natefinch/atomic"
"github.com/pkg/errors"
"github.com/kopia/kopia/internal/serverapi"
)
func getUIPreferencesOrEmpty(s serverInterface) (serverapi.UIPreferences, error) {
p := serverapi.UIPreferences{}
if s.getOptions().UIPreferencesFile == "" {
return p, nil
}
f, err := os.Open(s.getOptions().UIPreferencesFile)
if os.IsNotExist(err) {
return p, nil
}
if err != nil {
return p, errors.Wrap(err, "unable to open UI preferences file")
}
defer f.Close() //nolint:errcheck,gosec
if err := json.NewDecoder(f).Decode(&p); err != nil {
return p, errors.Wrap(err, "invalid UI preferences file")
}
return p, nil
}
func handleGetUIPreferences(ctx context.Context, rc requestContext) (interface{}, *apiError) {
p, err := getUIPreferencesOrEmpty(rc.srv)
if err != nil {
return nil, internalServerError(err)
}
return &p, nil
}
func handleSetUIPreferences(ctx context.Context, rc requestContext) (interface{}, *apiError) {
var p serverapi.UIPreferences
// verify the JSON is valid by unmarshaling it
if err := json.Unmarshal(rc.body, &p); err != nil {
return nil, requestError(serverapi.ErrorMalformedRequest, "malformed request")
}
if err := atomic.WriteFile(rc.srv.getOptions().UIPreferencesFile, bytes.NewReader(rc.body)); err != nil {
return nil, internalServerError(err)
}
return serverapi.Empty{}, nil
}