Skip to content

Commit

Permalink
PUT prefs now handles missing JSON fields correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
Arturo Vergara committed Nov 22, 2013
1 parent cad6713 commit 8befb32
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 14 deletions.
46 changes: 33 additions & 13 deletions preferences.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import (
)

type Preferences struct {
RefreshRate string `json:"refresh_rate"`
NewUserPermissions UserRole `json:"new_user_permissions"`
RefreshRate *string `json:"refresh_rate"`
NewUserPermissions *UserRole `json:"new_user_permissions"`
}

func getOrCreatePrefs() (*os.File, error) {
Expand All @@ -20,15 +20,17 @@ func getOrCreatePrefs() (*os.File, error) {
if f, err := os.Create(ExePath + "/prefs.gob"); err != nil {
return nil, err
} else {
p := Preferences{"30m", PublicRole}
WritePreferences(&p)
interval := "30m"
role := PublicRole
p := Preferences{&interval, &role}
writePreferences(&p)
return f, nil
}
}
return f, err
}

func WritePreferences(prefs *Preferences) error {
func writePreferences(prefs *Preferences) error {
prefFile, err := getOrCreatePrefs()
if err != nil {
return err
Expand All @@ -38,7 +40,7 @@ func WritePreferences(prefs *Preferences) error {
return err
}

func ReadPreferences() (*Preferences, error) {
func readPreferences() (*Preferences, error) {
f, err := getOrCreatePrefs()
if err != nil {
return nil, err
Expand All @@ -49,11 +51,14 @@ func ReadPreferences() (*Preferences, error) {
if err != nil {
return nil, err
}
if prefs.NewUserPermissions == nil {
prefs.NewUserPermissions = new(UserRole)
}
return &prefs, nil
}

func ReloadPreferences() error {
prefs, err := ReadPreferences()
prefs, err := readPreferences()
if err != nil {
return err
}
Expand All @@ -62,7 +67,7 @@ func ReloadPreferences() error {
CRON.Stop()
}
CRON = cron.New()
CRON.AddFunc("@every "+UserPreferences.RefreshRate, UpdateArticles)
CRON.AddFunc("@every "+*UserPreferences.RefreshRate, UpdateArticles)
CRON.Start()
return nil
}
Expand All @@ -80,7 +85,7 @@ func GetPreferences(w http.ResponseWriter, req *http.Request) {
WriteJSONError(w, http.StatusUnauthorized, "You must be an administrator to read or write server preferences")
return
}
prefs, err := ReadPreferences()
prefs, err := readPreferences()
if err != nil {
w.Header().Set("content-type", "application/json")
w.WriteHeader(http.StatusInternalServerError)
Expand Down Expand Up @@ -108,15 +113,30 @@ func PutPreferences(w http.ResponseWriter, req *http.Request) {
var prefs Preferences
err = dec.Decode(&prefs)
if err != nil {
WriteJSONError(w, http.StatusBadRequest, "Malformed JSON or missing field")
WriteJSONError(w, http.StatusBadRequest, "Malformed JSON")
return
}
if prefs.NewUserPermissions == nil && prefs.RefreshRate == nil {
WriteJSONError(w, http.StatusBadRequest, "You must provide at least one field")
return
}
_, err = time.ParseDuration(prefs.RefreshRate)
currentPrefs, err := readPreferences()
if err != nil {
WriteJSONError(w, http.StatusBadRequest, "Invalid duration")
w.WriteHeader(http.StatusInternalServerError)
return
}
err = WritePreferences(&prefs)
if prefs.NewUserPermissions != nil {
currentPrefs.NewUserPermissions = prefs.NewUserPermissions
}
if prefs.RefreshRate != nil {
_, err = time.ParseDuration(*prefs.RefreshRate)
if err != nil {
WriteJSONError(w, http.StatusBadRequest, "Invalid duration")
return
}
currentPrefs.RefreshRate = prefs.RefreshRate
}
err = writePreferences(currentPrefs)
if err != nil {
WriteJSONError(w, http.StatusInternalServerError, "Couldn't write preferences")
return
Expand Down
2 changes: 1 addition & 1 deletion users.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ type User struct {

func PostUser(w http.ResponseWriter, req *http.Request) {
uAuth, err, _ := GetUserForSessionToken(req.Header.Get("x-session-token"))
if UserPreferences.NewUserPermissions != PublicRole && (uAuth == nil || uAuth.Role > UserPreferences.NewUserPermissions) {
if *UserPreferences.NewUserPermissions != PublicRole && (uAuth == nil || uAuth.Role > *UserPreferences.NewUserPermissions) {
WriteJSONError(w, http.StatusUnauthorized, "Insufficient permissions to create new accounts")
return
}
Expand Down

0 comments on commit 8befb32

Please sign in to comment.