gnunet-gns-registrar

GNU Name System registrar
Log | Files | Refs | README

commit 3a45d10cdf76a24eacfd57ac4c87391033fa0225
parent 0fca745d655d1b1864dfe4ea87bcf8bf9b7d67f3
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Tue, 29 Apr 2025 14:10:13 +0200

actually use logging subsystem

Diffstat:
Mpkg/rest/gnsregistrar.go | 139+++++++++++++++++++++++++++++++++++++++++++------------------------------------
1 file changed, 76 insertions(+), 63 deletions(-)

diff --git a/pkg/rest/gnsregistrar.go b/pkg/rest/gnsregistrar.go @@ -230,7 +230,7 @@ func (t *Registrar) configResponse(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") response, err := json.Marshal(cfg) if nil != err { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) return } w.Write(response) @@ -252,7 +252,7 @@ func (t *Registrar) landingPage(w http.ResponseWriter, r *http.Request) { } err := t.LandingTpl.Execute(w, fullData) if err != nil { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) } } @@ -272,7 +272,7 @@ func (t *Registrar) isNameValid(label string) (err error) { if t.ValidLabelScript != "" { path, err := exec.LookPath(t.ValidLabelScript) if err != nil { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) return errors.New("internal error") } _, err = exec.Command(path, label).Output() @@ -326,7 +326,7 @@ func (t *Registrar) expireRegistration(label string) (err error) { return nil } if http.StatusNoContent != resp.StatusCode { - fmt.Printf("Got error: %d\n", resp.StatusCode) + t.Logf(LogError, "Got error: %d\n", resp.StatusCode) _ = json.NewDecoder(resp.Body).Decode(&gnunetError) return errors.New("GNUnet REST API error: " + gnunetError.Description) } @@ -350,7 +350,7 @@ func (t *Registrar) createOrUpdateRegistration(nsRecord *NamestoreRecord) (err e return err } if http.StatusNoContent != resp.StatusCode { - fmt.Printf("Got error: %d\n", resp.StatusCode) + t.Logf(LogError, "Got error: %d\n", resp.StatusCode) err = json.NewDecoder(resp.Body).Decode(&gnunetError) if nil != err { return errors.New("GNUnet REST API error: " + err.Error()) @@ -424,7 +424,7 @@ func (t *Registrar) updateRegistration(w http.ResponseWriter, r *http.Request) { resp, err := client.Do(req) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents") + t.Logf(LogError, "Failed to get zone contents\n") return } defer resp.Body.Close() @@ -432,19 +432,19 @@ func (t *Registrar) updateRegistration(w http.ResponseWriter, r *http.Request) { respData, err := io.ReadAll(resp.Body) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) return } err = json.NewDecoder(bytes.NewReader(respData)).Decode(&namestoreResponse) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) return } regMetadata, err = t.getCurrentRegistrationMetadata(vars["label"], &namestoreResponse) if err != nil { http.Redirect(w, r, "/"+"?error=Failed to get registration metadata", http.StatusSeeOther) - fmt.Printf("Failed to get registration metadata" + err.Error()) + t.Logf(LogError, "Failed to get registration metadata: `%s'\n", err.Error()) return } } else if http.StatusNotFound != resp.StatusCode { @@ -457,7 +457,7 @@ func (t *Registrar) updateRegistration(w http.ResponseWriter, r *http.Request) { } err = r.ParseForm() if nil != err { - fmt.Printf("Unable to parse form: " + err.Error()) + t.Logf(LogError, "Unable to parse form: `%s'\n", err.Error()) http.Redirect(w, r, "/name/"+sanitizedLabel+"?error=Form invalid", http.StatusSeeOther) return } @@ -479,7 +479,7 @@ func (t *Registrar) updateRegistration(w http.ResponseWriter, r *http.Request) { namestoreResponse.Records = []RecordData{metaRecord, zkeyRecord} err = t.createOrUpdateRegistration(&namestoreResponse) if nil != err { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) http.Redirect(w, r, "/name/"+sanitizedLabel+"?error=Update: Internal error", http.StatusSeeOther) return } @@ -504,7 +504,7 @@ func (t *Registrar) editRegistration(w http.ResponseWriter, r *http.Request) { resp, err := client.Do(req) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents") + t.Logf(LogError, "Failed to get zone contents\n") return } defer resp.Body.Close() @@ -512,19 +512,19 @@ func (t *Registrar) editRegistration(w http.ResponseWriter, r *http.Request) { respData, err := io.ReadAll(resp.Body) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) return } err = json.NewDecoder(bytes.NewReader(respData)).Decode(&namestoreResponse) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) return } regMetadata, err = t.getCurrentRegistrationMetadata(vars["label"], &namestoreResponse) if err != nil { http.Redirect(w, r, "/"+"?error=Failed to get registration metadata", http.StatusSeeOther) - fmt.Printf("Failed to get registration metadata" + err.Error()) + t.Logf(LogError, "Failed to get registration metadata: `%s'\n", err.Error()) return } } else if http.StatusNotFound != resp.StatusCode { @@ -568,7 +568,7 @@ func (t *Registrar) editRegistration(w http.ResponseWriter, r *http.Request) { } err = t.EditTpl.Execute(w, fullData) if err != nil { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) } } @@ -597,7 +597,7 @@ func (t *Registrar) paymentPage(w http.ResponseWriter, r *http.Request) { resp, err := client.Do(req) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents") + t.Logf(LogError, "Failed to get zone contents\n") return } defer resp.Body.Close() @@ -605,19 +605,19 @@ func (t *Registrar) paymentPage(w http.ResponseWriter, r *http.Request) { respData, err := io.ReadAll(resp.Body) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) return } err = json.NewDecoder(bytes.NewReader(respData)).Decode(&namestoreResponse) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) return } regMetadata, err = t.getCurrentRegistrationMetadata(sanitizedLabel, &namestoreResponse) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get registration metadata", http.StatusSeeOther) - fmt.Printf("Failed to get registration metadata" + err.Error()) + t.Logf(LogError, "Failed to get registration metadata: `%s'\n", err.Error()) return } } else if http.StatusNotFound != resp.StatusCode { @@ -662,7 +662,7 @@ func (t *Registrar) paymentPage(w http.ResponseWriter, r *http.Request) { } err = t.BuyTpl.Execute(w, fullData) if err != nil { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) } } @@ -691,7 +691,7 @@ func (t *Registrar) buyPage(w http.ResponseWriter, r *http.Request) { resp, err := client.Do(req) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents") + t.Logf(LogError, "Failed to get zone contents\n") return } defer resp.Body.Close() @@ -699,19 +699,19 @@ func (t *Registrar) buyPage(w http.ResponseWriter, r *http.Request) { respData, err := io.ReadAll(resp.Body) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) return } err = json.NewDecoder(bytes.NewReader(respData)).Decode(&namestoreResponse) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get zone contents", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) return } regMetadata, err = t.getCurrentRegistrationMetadata(sanitizedLabel, &namestoreResponse) if err != nil { http.Redirect(w, r, "/"+"?error=Registration failed: Failed to get registration metadata", http.StatusSeeOther) - fmt.Printf("Failed to get registration metadata" + err.Error()) + t.Logf(LogError, "Failed to get registration metadata: `%s'\n", err.Error()) return } } else if http.StatusNotFound != resp.StatusCode { @@ -731,7 +731,7 @@ func (t *Registrar) buyPage(w http.ResponseWriter, r *http.Request) { summaryMsg := strings.Replace(t.SummaryTemplateString, "${NAME}", label, 1) orderID, newOrderErr := t.Merchant.AddNewOrder(*t.RegistrationCost, summaryMsg, t.BaseUrl+"/name/"+sanitizedLabel+"/edit?token="+regId) if newOrderErr != nil { - fmt.Println(newOrderErr) + t.Logf(LogError, "%s\n", newOrderErr.Error()) http.Redirect(w, r, "/name/"+sanitizedLabel+"?error=Registration failed: Unable to create order", http.StatusSeeOther) return } @@ -757,7 +757,7 @@ func (t *Registrar) buyPage(w http.ResponseWriter, r *http.Request) { regMetadata.OrderID = orderID metadataRecordValue, err := json.Marshal(regMetadata) if nil != err { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) http.Redirect(w, r, "/name/"+sanitizedLabel+"?error=Registration failed: Internal error", http.StatusSeeOther) return } @@ -765,14 +765,14 @@ func (t *Registrar) buyPage(w http.ResponseWriter, r *http.Request) { namestoreResponse.Records = []RecordData{metaRecord, newZkeyRecord} err = t.createOrUpdateRegistration(&namestoreResponse) if nil != err { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) http.Redirect(w, r, "/name/"+sanitizedLabel+"?error=Registration failed: Internal error", http.StatusSeeOther) return } } else { err = t.setupRegistrationMetadataBeforePayment(sanitizedLabel, r.URL.Query().Get("zkey"), orderID, paymentUntil, regId) if err != nil { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) http.Redirect(w, r, "/name/"+sanitizedLabel+"?error=Registration failed: Internal error", http.StatusSeeOther) return } @@ -790,7 +790,7 @@ func (t *Registrar) getCurrentRegistrationMetadata(label string, nsRecord *Names if record.RecordType == "TXT" { err := json.Unmarshal([]byte(record.Value), &regMetadata) if err != nil { - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) return nil, err } haveMetadata = true @@ -805,10 +805,10 @@ func (t *Registrar) getCurrentRegistrationMetadata(label string, nsRecord *Names if nil != paytoErr { if rc == http.StatusNotFound { if time.Now().After(time.UnixMicro(int64(regMetadata.Expiration))) { - fmt.Printf("Registration for %s not found, removing\n", label) + t.Logf(LogInfo, "Registration for `%s' not found, removing\n", label) err := t.expireRegistration(label) if nil != err { - fmt.Println(err) + t.Logf(LogInfo, "%s\n", err.Error()) } return nil, nil } else { @@ -852,20 +852,20 @@ func (t *Registrar) getCurrentRegistrationMetadata(label string, nsRecord *Names } else { // Remove metadata if payment limit exceeded and registration expired if time.Now().After(regMetadata.NeedsPaymentUntil) && time.Now().After(time.UnixMicro(int64(regMetadata.Expiration))) { - fmt.Printf("Payment request for %s has expired, removing\n", label) + t.Logf(LogDebug, "Payment request for `%s' has expired, removing\n", label) err := t.expireRegistration(label) if nil != err { - fmt.Println(err) + t.Logf(LogInfo, "%s\n", err.Error()) } return nil, nil } } } else { if time.Now().After(time.UnixMicro(int64(regMetadata.Expiration))) { - fmt.Printf("Registration for %s has expired, removing\n", label) + t.Logf(LogDebug, "Registration for `%s' has expired, removing\n", label) err := t.expireRegistration(label) if nil != err { - fmt.Println(err) + t.Logf(LogInfo, "%s\n", err.Error()) } return nil, nil } @@ -912,26 +912,26 @@ func (t *Registrar) namePage(w http.ResponseWriter, r *http.Request) { resp, err := client.Do(req) if err != nil { http.Redirect(w, r, "/"+"?error=Failed to get zone contents.", http.StatusSeeOther) - fmt.Printf("Failed to get zone contents") + t.Logf(LogError, "Failed to get zone contents\n") return } defer resp.Body.Close() if http.StatusOK == resp.StatusCode { respData, err := io.ReadAll(resp.Body) if err != nil { - fmt.Println("Failed to get zone contents: " + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) http.Redirect(w, r, "/"+"?error=Failed to get zone contents.", http.StatusSeeOther) return } err = json.NewDecoder(bytes.NewReader(respData)).Decode(&namestoreResponse) if err != nil { - fmt.Println("Failed to get zone contents: " + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) http.Redirect(w, r, "/"+"?error=Failed to get zone contents.", http.StatusSeeOther) return } regMetadata, err = t.getCurrentRegistrationMetadata(sanitizedLabel, &namestoreResponse) if err != nil { - fmt.Println("Failed to get registration metadata: " + err.Error()) + t.Logf(LogError, "Failed to get registration metadata: `%s'\n", err.Error()) http.Redirect(w, r, "/"+"?error=Failed to get registration metadata.", http.StatusSeeOther) return } @@ -952,7 +952,7 @@ func (t *Registrar) namePage(w http.ResponseWriter, r *http.Request) { } } cost, _ := t.RegistrationCost.FormatWithCurrencySpecification(t.CurrencySpec) - fullData := map[string]interface{}{ + fullData := map[string]any{ "label": sanitizedLabel, "version": t.Cfg.Version, "error": r.URL.Query().Get("error"), @@ -968,7 +968,7 @@ func (t *Registrar) namePage(w http.ResponseWriter, r *http.Request) { } err = t.NameTpl.Execute(w, fullData) if err != nil { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) } } @@ -996,6 +996,19 @@ func (t *Registrar) Logf(loglevel LogLevel, fmt string, args ...any) { t.Logger.Printf(fmt, args...) } +func (t *Registrar) getFileName(relativeFileName string) string { + _, err := os.Stat(relativeFileName) + if errors.Is(err, os.ErrNotExist) { + _, err := os.Stat(t.Cfg.Datahome + "/" + relativeFileName) + if errors.Is(err, os.ErrNotExist) { + t.Logf(LogError, "Tried fallback not found `%s'\n", t.Cfg.Datahome+"/"+relativeFileName) + return "" + } + return t.Cfg.Datahome + "/" + relativeFileName + } + return relativeFileName +} + func (t *Registrar) setupHandlers() { t.Router = mux.NewRouter().StrictSlash(true) @@ -1015,8 +1028,8 @@ func (t *Registrar) setupHandlers() { t.Router.HandleFunc("/config", t.configResponse).Methods("GET") /* Assets HTML */ - t.Router.PathPrefix("/css").Handler(http.StripPrefix("/css", http.FileServer(http.Dir("./static/css")))) - t.Router.PathPrefix("/images").Handler(http.StripPrefix("/images", http.FileServer(http.Dir("./static/images")))) + t.Router.PathPrefix("/css").Handler(http.StripPrefix("/css", http.FileServer(http.Dir(t.getFileName("static/css"))))) + t.Router.PathPrefix("/images").Handler(http.StripPrefix("/images", http.FileServer(http.Dir(t.getFileName("static/images"))))) } // Initialize the gnsregistrar instance with cfgfile @@ -1028,32 +1041,32 @@ func (t *Registrar) Initialize(cfg RegistrarConfig) { t.Cfg = cfg t.Logger = log.New(os.Stdout, "gnunet-gns-registrar:", log.LstdFlags) if t.Cfg.Ini.Section("gns-registrar").Key("production").MustBool(false) { - fmt.Println("Production mode enabled") + t.Logf(LogInfo, "Production mode enabled\n") } - navTplFile := t.Cfg.Ini.Section("gns-registrar").Key("nav_template").MustString("web/templates/nav.html") - footerTplFile := t.Cfg.Ini.Section("gns-registrar").Key("footer_template").MustString("web/templates/footer.html") - landingTplFile := t.Cfg.Ini.Section("gns-registrar").Key("landing_template").MustString("web/templates/landing.html") + navTplFile := t.Cfg.Ini.Section("gns-registrar").Key("nav_template").MustString(t.getFileName("web/templates/nav.html")) + footerTplFile := t.Cfg.Ini.Section("gns-registrar").Key("footer_template").MustString(t.getFileName("web/templates/footer.html")) + landingTplFile := t.Cfg.Ini.Section("gns-registrar").Key("landing_template").MustString(t.getFileName("web/templates/landing.html")) t.LandingTpl, err = template.ParseFiles(landingTplFile, navTplFile, footerTplFile) if err != nil { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) os.Exit(1) } - nameTplFile := t.Cfg.Ini.Section("gns-registrar").Key("name_template").MustString("web/templates/name.html") + nameTplFile := t.Cfg.Ini.Section("gns-registrar").Key("name_template").MustString(t.getFileName("web/templates/name.html")) t.NameTpl, err = template.ParseFiles(nameTplFile, navTplFile, footerTplFile) if err != nil { - fmt.Println(err) + t.Logf(LogError, err.Error()) os.Exit(1) } - buyTplFile := t.Cfg.Ini.Section("gns-registrar").Key("buy_template").MustString("web/templates/buy.html") + buyTplFile := t.Cfg.Ini.Section("gns-registrar").Key("buy_template").MustString(t.getFileName("web/templates/buy.html")) t.BuyTpl, err = template.ParseFiles(buyTplFile, navTplFile, footerTplFile) if err != nil { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) os.Exit(1) } - editTplFile := t.Cfg.Ini.Section("gns-registrar").Key("edit_template").MustString("web/templates/edit.html") + editTplFile := t.Cfg.Ini.Section("gns-registrar").Key("edit_template").MustString(t.getFileName("web/templates/edit.html")) t.EditTpl, err = template.ParseFiles(editTplFile, navTplFile, footerTplFile) if err != nil { - fmt.Println(err) + t.Logf(LogError, "%s\n", err.Error()) os.Exit(1) } paymentExp := t.Cfg.Ini.Section("gns-registrar").Key("payment_required_expiration").MustString("1h") @@ -1065,7 +1078,7 @@ func (t *Registrar) Initialize(cfg RegistrarConfig) { costStr := t.Cfg.Ini.Section("gns-registrar").Key("registration_cost").MustString("KUDOS:0.3") t.RegistrationCost, err = talerutil.ParseAmount(costStr) if err != nil { - fmt.Printf("Error parsing amount %s: %s\n", costStr, err.Error()) + t.Logf(LogError, "Error parsing amount `%s': `%s'\n", costStr, err.Error()) os.Exit(1) } t.BaseUrl = t.Cfg.Ini.Section("gns-registrar").Key("base_url").MustString("http://localhost:11000") @@ -1085,39 +1098,39 @@ func (t *Registrar) Initialize(cfg RegistrarConfig) { } resp, err := client.Do(req) if err != nil { - fmt.Println("Failed to get zone key. Is gnunet running?") + t.Logf(LogError, "Failed to get zone key. Is gnunet running?\n") os.Exit(1) return } defer resp.Body.Close() if http.StatusNotFound == resp.StatusCode { - fmt.Printf("Zone not found.") + t.Logf(LogError, "Zone not found.\n") os.Exit(1) } else if http.StatusOK == resp.StatusCode { respData, err := io.ReadAll(resp.Body) if err != nil { - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) os.Exit(1) } err = json.NewDecoder(bytes.NewReader(respData)).Decode(&identityResponse) if err != nil { - fmt.Printf("Failed to get zone contents" + err.Error()) + t.Logf(LogError, "Failed to get zone contents: `%s'\n", err.Error()) os.Exit(1) } t.RootZoneKey = identityResponse.Pubkey } else { - fmt.Printf("Failed to get zone contents") + t.Logf(LogError, "Failed to get zone contents\n") os.Exit(1) } t.Merchant = cfg.Merchant merchConfig, err := t.Merchant.GetConfig() if nil != err { - fmt.Printf("Failed to get merchant config") + t.Logf(LogError, "Failed to get merchant config\n") os.Exit(1) } currencySpec, currencySupported := merchConfig.Currencies[t.RegistrationCost.Currency] for !currencySupported { - fmt.Printf("Currency `%s' not supported by merchant!\n", t.RegistrationCost.Currency) + t.Logf(LogError, "Currency `%s' not supported by merchant!\n", t.RegistrationCost.Currency) os.Exit(1) } t.CurrencySpec = currencySpec