commit 3a45d10cdf76a24eacfd57ac4c87391033fa0225
parent 0fca745d655d1b1864dfe4ea87bcf8bf9b7d67f3
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Tue, 29 Apr 2025 14:10:13 +0200
actually use logging subsystem
Diffstat:
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), ®Metadata)
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