func handleSetupChange(rw http.ResponseWriter, req *http.Request) { hilevelConf, err := jsonconfig.ReadFile(osutil.UserServerConfigPath()) if err != nil { httputil.ServeError(rw, req, err) return } if !xsrftoken.Valid(req.FormValue("token"), serverKey, "user", "wizardSave") { http.Error(rw, "Form expired. Press back and reload form.", http.StatusBadRequest) log.Printf("invalid xsrf token=%q", req.FormValue("token")) return } hasChanged := false var el interface{} publish := jsonconfig.Obj{} for k, v := range req.Form { if _, ok := hilevelConf[k]; !ok { if k != "gallery" && k != "blog" { continue } } switch k { case "https", "shareHandler": b, err := strconv.ParseBool(v[0]) if err != nil { httputil.ServeError(rw, req, fmt.Errorf("%v field expects a boolean value", k)) } el = b default: el = v[0] } if reflect.DeepEqual(hilevelConf[k], el) { continue } hasChanged = true hilevelConf[k] = el } // "publish" wasn't checked yet if !reflect.DeepEqual(hilevelConf["publish"], publish) { hilevelConf["publish"] = publish hasChanged = true } if hasChanged { err = rewriteConfig(&hilevelConf, osutil.UserServerConfigPath()) if err != nil { httputil.ServeError(rw, req, err) return } err = osutil.RestartProcess() if err != nil { log.Fatal("Failed to restart: " + err.Error()) http.Error(rw, "Failed to restart process", 500) return } } sendWizard(rw, req, hasChanged) }
func sendWizard(rw http.ResponseWriter, req *http.Request, hasChanged bool) { config, err := jsonconfig.ReadFile(osutil.UserServerConfigPath()) if err != nil { httputil.ServeError(rw, req, err) return } err = flattenPublish(config) if err != nil { httputil.ServeError(rw, req, err) return } funcMap := template.FuncMap{ "printWizard": printWizard, "showField": func(inputName string) bool { if _, ok := ignoredFields[inputName]; ok { return false } return true }, "genXSRF": func() string { return xsrftoken.Generate(serverKey, "user", "wizardSave") }, } body := ` <form id="WizardForm" method="POST" enctype="multipart/form-data"> <table> {{range $k,$v := .}}{{if showField $k}}<tr><td>{{printf "%v" $k}}</td><td><input type="text" size="30" name ="{{printf "%v" $k}}" value="{{printWizard $v}}" ></td></tr>{{end}}{{end}} </table> <input type="hidden" name="token" value="{{genXSRF}}"> <input type="submit" form="WizardForm" value="Save"> (Will restart server.)</form>` if hasChanged { body += `<p> Configuration succesfully rewritten </p>` } tmpl, err := template.New("wizard").Funcs(funcMap).Parse(topWizard + body + bottomWizard) if err != nil { httputil.ServeError(rw, req, err) return } err = tmpl.Execute(rw, config) if err != nil { httputil.ServeError(rw, req, err) return } }
// serverKeyId returns the public gpg key id ("identity" field) // from the user's server config , if any. // It returns the empty string otherwise. func serverKeyId() string { serverConfigFile := osutil.UserServerConfigPath() if _, err := wkfs.Stat(serverConfigFile); err != nil { if os.IsNotExist(err) { return "" } log.Fatalf("Could not stat %v: %v", serverConfigFile, err) } obj, err := jsonconfig.ReadFile(serverConfigFile) if err != nil { return "" } keyId, ok := obj["identity"].(string) if !ok { return "" } return keyId }