taldir

Directory service to resolve wallet mailboxes by messenger addresses
Log | Files | Refs | Submodules | README | LICENSE

commit 85df31764efbf10f1fda986de99b682a431fca87
parent 7c109122aeb3eb8af1564aea673061bb2eaf9879
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Fri,  8 Aug 2025 11:41:02 +0200

only disseminate new

Diffstat:
Mpkg/taldir/disseminator.go | 13+++++--------
Mpkg/taldir/disseminator_gns.go | 54++++++++++++++++++++++++++++++++++++++++++------------
Mpkg/taldir/taldir.go | 9++++-----
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)