commit 85df31764efbf10f1fda986de99b682a431fca87
parent 7c109122aeb3eb8af1564aea673061bb2eaf9879
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Fri, 8 Aug 2025 11:41:02 +0200
only disseminate new
Diffstat:
3 files changed, 51 insertions(+), 25 deletions(-)
diff --git a/pkg/taldir/disseminator.go b/pkg/taldir/disseminator.go
@@ -18,20 +18,17 @@
package taldir
-type Disseminator struct {
+type Disseminator interface {
// Disseminator name
- Name string
-
- // Config disseminator uses
- Config *TaldirConfig
+ Name() string
// Disseminator function
- DisseminateStart func(d *Disseminator, e *Entry) error
+ DisseminateStart(e *Entry) error
// Disseminator function
- DisseminateStop func(d *Disseminator, e *Entry) error
+ DisseminateStop(e *Entry) error
// Disseminator active status
- Enabled bool
+ IsEnabled() bool
}
diff --git a/pkg/taldir/disseminator_gns.go b/pkg/taldir/disseminator_gns.go
@@ -21,14 +21,36 @@ package taldir
import (
"fmt"
"os/exec"
+ "strings"
)
-func gns_disseminate_stop(d *Disseminator, e *Entry) error {
+type GnsDisseminator struct {
+ // Config
+ config *TaldirConfig
+}
+
+func (d *GnsDisseminator) gns_check_is_disseminated (e *Entry) bool {
+ path, err := exec.LookPath("gnunet-gns")
+ if err != nil {
+ return false
+ }
+ zone := d.config.Ini.Section("taldir-disseminator-gns").Key("zone").MustString("taldir")
+ out, err := exec.Command(path, "--lookup", e.HsAddress + "." + zone, "--type", "TXT").Output()
+ if err != nil {
+ return false
+ }
+ return strings.Contains(string(out), "TXT: `" + e.TargetUri + "'")
+}
+
+func (d *GnsDisseminator) DisseminateStop(e *Entry) error {
+ if ! d.gns_check_is_disseminated(e) {
+ return nil
+ }
path, err := exec.LookPath("gnunet-namestore")
if err != nil {
return fmt.Errorf("path of command not found: %w", err)
}
- zone := d.Config.Ini.Section("taldir-disseminator-gns").Key("zone").MustString("taldir")
+ zone := d.config.Ini.Section("taldir-disseminator-gns").Key("zone").MustString("taldir")
out, err := exec.Command(path, "--delete", "--public", "--zone", zone, "--type", "TXT", "--name", e.HsAddress, "--value", e.TargetUri).Output()
if err != nil {
return fmt.Errorf("failed to execute disseminator command: `%s', %w", out, err)
@@ -36,13 +58,17 @@ func gns_disseminate_stop(d *Disseminator, e *Entry) error {
return nil
}
-func gns_disseminate_start(d *Disseminator, e *Entry) error {
+func (d *GnsDisseminator) DisseminateStart(e *Entry) error {
+ if d.gns_check_is_disseminated(e) {
+ fmt.Printf("`%s' is already being disseminated\n", e.HsAddress)
+ return nil
+ }
path, err := exec.LookPath("gnunet-namestore")
if err != nil {
return fmt.Errorf("path of command not found: %w", err)
}
- expiration := d.Config.Ini.Section("taldir-disseminator-gns").Key("expiration").MustString("1d")
- zone := d.Config.Ini.Section("taldir-disseminator-gns").Key("zone").MustString("taldir")
+ expiration := d.config.Ini.Section("taldir-disseminator-gns").Key("expiration").MustString("1d")
+ zone := d.config.Ini.Section("taldir-disseminator-gns").Key("zone").MustString("taldir")
out, err := exec.Command(path, "--add", "--public", "--expiration", expiration, "--zone", zone, "--type", "TXT", "--name", e.HsAddress, "--value", e.TargetUri).Output()
if err != nil {
return fmt.Errorf("failed to execute disseminator command: `%s', %w", out, err)
@@ -50,13 +76,17 @@ func gns_disseminate_start(d *Disseminator, e *Entry) error {
return nil
}
-func make_gns_disseminator(cfg *TaldirConfig) Disseminator {
- d := Disseminator{
- Name: "gns",
- Config: cfg,
- DisseminateStart: gns_disseminate_start,
- DisseminateStop: gns_disseminate_stop,
- Enabled: cfg.Ini.Section("taldir-disseminator-gns").Key("enabled").MustBool(false),
+func (d *GnsDisseminator) Name() string {
+ return "gns"
+}
+
+func (d *GnsDisseminator) IsEnabled() bool {
+ return d.config.Ini.Section("taldir-disseminator-gns").Key("enabled").MustBool(false)
+}
+
+func make_gns_disseminator(cfg *TaldirConfig) GnsDisseminator {
+ d := GnsDisseminator{
+ config: cfg,
}
return d
}
diff --git a/pkg/taldir/taldir.go b/pkg/taldir/taldir.go
@@ -342,7 +342,7 @@ func (t *Taldir) getSingleEntry(w http.ResponseWriter, r *http.Request) {
// Disseminate entry
func (t *Taldir) disseminateStop(e Entry) error {
for _, d := range t.Disseminators {
- err := d.DisseminateStop(&d, &e)
+ err := d.DisseminateStop(&e)
if err != nil {
t.Logf(LogWarning, "Dissemination stop failed for disseminator `%s' and entry `%s'", d.Name, e.HsAddress)
}
@@ -353,7 +353,7 @@ func (t *Taldir) disseminateStop(e Entry) error {
// Disseminate entry
func (t *Taldir) disseminateStart(e Entry) {
for _, d := range t.Disseminators {
- err := d.DisseminateStart(&d, &e)
+ err := d.DisseminateStart(&e)
if err != nil {
t.Logf(LogWarning, "Dissemination start failed for disseminator `%s' and entry `%s': %v", d.Name, e.HsAddress, err)
}
@@ -739,7 +739,6 @@ func (t *Taldir) validationPage(w http.ResponseWriter, r *http.Request) {
}
t.ValidationTpl.Execute(w, fullData)
}
- return
}
// ClearDatabase nukes the database (for tests)
@@ -1007,8 +1006,8 @@ func (t *Taldir) Initialize(cfg TaldirConfig) {
}
t.Disseminators = make(map[string]Disseminator)
gnsdisseminator := make_gns_disseminator(&cfg)
- if gnsdisseminator.Enabled {
- t.Disseminators[gnsdisseminator.Name] = gnsdisseminator
+ if gnsdisseminator.IsEnabled() {
+ t.Disseminators[gnsdisseminator.Name()] = &gnsdisseminator
t.Logger.Printf("Disseminator `%s' enabled.\n", gnsdisseminator.Name)
}
t.ChallengeBytes = cfg.Ini.Section("taldir").Key("challenge_bytes").MustInt(16)