Skip to content

Commit fe07320

Browse files
feat: opt-in WithShortForgeAddrs(true|false) to produce /dnsX addrs (#40)
Co-authored-by: guillaumemichel <[email protected]>
1 parent bc6a575 commit fe07320

File tree

2 files changed

+197
-128
lines changed

2 files changed

+197
-128
lines changed

client/acme.go

+42-11
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type P2PForgeCertMgr struct {
3939
cfg *certmagic.Config
4040
log *zap.SugaredLogger
4141
allowPrivateForgeAddresses bool
42+
produceShortAddrs bool
4243

4344
hasCert bool // tracking if we've received a certificate
4445
certCheckMx sync.RWMutex
@@ -85,6 +86,7 @@ type P2PForgeCertMgrConfig struct {
8586
onCertLoaded func()
8687
log *zap.SugaredLogger
8788
allowPrivateForgeAddresses bool
89+
produceShortAddrs bool
8890
}
8991

9092
type P2PForgeCertMgrOptions func(*P2PForgeCertMgrConfig) error
@@ -184,6 +186,23 @@ func WithAllowPrivateForgeAddrs() P2PForgeCertMgrOptions {
184186
}
185187
}
186188

189+
// WithShortForgeAddrs controls if final addresses produced by p2p-forge addr
190+
// factory are short and start with /dnsX or are longer and the DNS name is
191+
// fully resolved into /ipX /sni components.
192+
//
193+
// Using /dnsX may be beneficial when interop with older libp2p clients is
194+
// required, or when shorter addresses are preferred.
195+
//
196+
// Example multiaddr formats:
197+
// - When true: /dnsX/<escaped-ip>.<peer-id>.<forge-domain>/tcp/<port>/tls/ws
198+
// - When false: /ipX/<ip>/tcp/<port>/tls/sni/<escaped-ip>.<peer-id>.<forge-domain>/ws
199+
func WithShortForgeAddrs(produceShortAddrs bool) P2PForgeCertMgrOptions {
200+
return func(config *P2PForgeCertMgrConfig) error {
201+
config.produceShortAddrs = produceShortAddrs
202+
return nil
203+
}
204+
}
205+
187206
func WithLogger(log *zap.SugaredLogger) P2PForgeCertMgrOptions {
188207
return func(config *P2PForgeCertMgrConfig) error {
189208
config.log = log
@@ -303,6 +322,7 @@ func NewP2PForgeCertMgr(opts ...P2PForgeCertMgrOptions) (*P2PForgeCertMgr, error
303322
cfg: certCfg,
304323
log: mgrCfg.log,
305324
allowPrivateForgeAddresses: mgrCfg.allowPrivateForgeAddresses,
325+
produceShortAddrs: mgrCfg.produceShortAddrs,
306326
}
307327

308328
certCfg.OnEvent = func(ctx context.Context, event string, data map[string]any) error {
@@ -419,7 +439,8 @@ func (m *P2PForgeCertMgr) TLSConfig() *tls.Config {
419439
}
420440

421441
func (m *P2PForgeCertMgr) AddrStrings() []string {
422-
return []string{fmt.Sprintf("/ip4/0.0.0.0/tcp/0/tls/sni/*.%s/ws", m.forgeDomain),
442+
return []string{
443+
fmt.Sprintf("/ip4/0.0.0.0/tcp/0/tls/sni/*.%s/ws", m.forgeDomain),
423444
fmt.Sprintf("/ip6/::/tcp/0/tls/sni/*.%s/ws", m.forgeDomain),
424445
}
425446
}
@@ -431,7 +452,7 @@ func (m *P2PForgeCertMgr) AddressFactory() config.AddrsFactory {
431452
tlsCfg := m.cfg.TLSConfig()
432453
tlsCfg.NextProtos = []string{"h2", "http/1.1"} // remove the ACME ALPN and set the HTTP 1.1 and 2 ALPNs
433454

434-
return m.createAddrsFactory(m.allowPrivateForgeAddresses)
455+
return m.createAddrsFactory(m.allowPrivateForgeAddresses, m.produceShortAddrs)
435456
}
436457

437458
// localCertExists returns true if a certificate matching passed name is already present in certmagic.Storage
@@ -450,8 +471,8 @@ func certName(id peer.ID, suffixDomain string) string {
450471
return fmt.Sprintf("*.%s.%s", pb36, suffixDomain)
451472
}
452473

453-
func (m *P2PForgeCertMgr) createAddrsFactory(allowPrivateForgeAddrs bool) config.AddrsFactory {
454-
var p2pForgeWssComponent = multiaddr.StringCast(fmt.Sprintf("/tls/sni/*.%s/ws", m.forgeDomain))
474+
func (m *P2PForgeCertMgr) createAddrsFactory(allowPrivateForgeAddrs bool, produceShortAddrs bool) config.AddrsFactory {
475+
p2pForgeWssComponent := multiaddr.StringCast(fmt.Sprintf("/tls/sni/*.%s/ws", m.forgeDomain))
455476

456477
return func(multiaddrs []multiaddr.Multiaddr) []multiaddr.Multiaddr {
457478
var skipForgeAddrs bool
@@ -464,7 +485,7 @@ func (m *P2PForgeCertMgr) createAddrsFactory(allowPrivateForgeAddrs bool) config
464485
}
465486
m.certCheckMx.RUnlock()
466487

467-
return addrFactoryFn(skipForgeAddrs, func() peer.ID { return m.hostFn().ID() }, m.forgeDomain, allowPrivateForgeAddrs, p2pForgeWssComponent, multiaddrs, m.log)
488+
return addrFactoryFn(skipForgeAddrs, func() peer.ID { return m.hostFn().ID() }, m.forgeDomain, allowPrivateForgeAddrs, produceShortAddrs, p2pForgeWssComponent, multiaddrs, m.log)
468489
}
469490
}
470491

@@ -528,14 +549,16 @@ func (d *dns01P2PForgeSolver) Present(ctx context.Context, challenge acme.Challe
528549
}
529550

530551
func (d *dns01P2PForgeSolver) CleanUp(ctx context.Context, challenge acme.Challenge) error {
531-
//TODO: Should we implement this, or is doing delete and Last-Writer-Wins enough?
552+
// TODO: Should we implement this, or is doing delete and Last-Writer-Wins enough?
532553
return nil
533554
}
534555

535-
var _ acmez.Solver = (*dns01P2PForgeSolver)(nil)
536-
var _ acmez.Waiter = (*dns01P2PForgeSolver)(nil)
556+
var (
557+
_ acmez.Solver = (*dns01P2PForgeSolver)(nil)
558+
_ acmez.Waiter = (*dns01P2PForgeSolver)(nil)
559+
)
537560

538-
func addrFactoryFn(skipForgeAddrs bool, peerIDFn func() peer.ID, forgeDomain string, allowPrivateForgeAddrs bool, p2pForgeWssComponent multiaddr.Multiaddr, multiaddrs []multiaddr.Multiaddr, log *zap.SugaredLogger) []multiaddr.Multiaddr {
561+
func addrFactoryFn(skipForgeAddrs bool, peerIDFn func() peer.ID, forgeDomain string, allowPrivateForgeAddrs bool, produceShortAddrs bool, p2pForgeWssComponent multiaddr.Multiaddr, multiaddrs []multiaddr.Multiaddr, log *zap.SugaredLogger) []multiaddr.Multiaddr {
539562
retAddrs := make([]multiaddr.Multiaddr, 0, len(multiaddrs))
540563
for _, a := range multiaddrs {
541564
if isRelayAddr(a) {
@@ -553,17 +576,20 @@ func addrFactoryFn(skipForgeAddrs bool, peerIDFn func() peer.ID, forgeDomain str
553576

554577
index := 0
555578
var escapedIPStr string
579+
var ipVersion string
556580
var ipMaStr string
557581
var tcpPortStr string
558582
multiaddr.ForEach(withoutForgeWSS, func(c multiaddr.Component) bool {
559583
switch index {
560584
case 0:
561585
switch c.Protocol().Code {
562586
case multiaddr.P_IP4:
587+
ipVersion = "4"
563588
ipMaStr = c.String()
564589
ipAddr := c.Value()
565590
escapedIPStr = strings.ReplaceAll(ipAddr, ".", "-")
566591
case multiaddr.P_IP6:
592+
ipVersion = "6"
567593
ipMaStr = c.String()
568594
ipAddr := c.Value()
569595
escapedIPStr = strings.ReplaceAll(ipAddr, ":", "-")
@@ -603,9 +629,14 @@ func addrFactoryFn(skipForgeAddrs bool, peerIDFn func() peer.ID, forgeDomain str
603629
continue
604630
}
605631

606-
pidStr := peer.ToCid(peerIDFn()).Encode(multibase.MustNewEncoder(multibase.Base36))
632+
b36PidStr := peer.ToCid(peerIDFn()).Encode(multibase.MustNewEncoder(multibase.Base36))
607633

608-
newMaStr := fmt.Sprintf("%s/tcp/%s/tls/sni/%s.%s.%s/ws", ipMaStr, tcpPortStr, escapedIPStr, pidStr, forgeDomain)
634+
var newMaStr string
635+
if produceShortAddrs {
636+
newMaStr = fmt.Sprintf("/dns%s/%s.%s.%s/tcp/%s/tls/ws", ipVersion, escapedIPStr, b36PidStr, forgeDomain, tcpPortStr)
637+
} else {
638+
newMaStr = fmt.Sprintf("%s/tcp/%s/tls/sni/%s.%s.%s/ws", ipMaStr, tcpPortStr, escapedIPStr, b36PidStr, forgeDomain)
639+
}
609640
newMA, err := multiaddr.NewMultiaddr(newMaStr)
610641
if err != nil {
611642
log.Errorf("error creating new multiaddr from %q: %s", newMaStr, err.Error())

0 commit comments

Comments
 (0)