@@ -39,6 +39,7 @@ type P2PForgeCertMgr struct {
39
39
cfg * certmagic.Config
40
40
log * zap.SugaredLogger
41
41
allowPrivateForgeAddresses bool
42
+ produceShortAddrs bool
42
43
43
44
hasCert bool // tracking if we've received a certificate
44
45
certCheckMx sync.RWMutex
@@ -85,6 +86,7 @@ type P2PForgeCertMgrConfig struct {
85
86
onCertLoaded func ()
86
87
log * zap.SugaredLogger
87
88
allowPrivateForgeAddresses bool
89
+ produceShortAddrs bool
88
90
}
89
91
90
92
type P2PForgeCertMgrOptions func (* P2PForgeCertMgrConfig ) error
@@ -184,6 +186,23 @@ func WithAllowPrivateForgeAddrs() P2PForgeCertMgrOptions {
184
186
}
185
187
}
186
188
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
+
187
206
func WithLogger (log * zap.SugaredLogger ) P2PForgeCertMgrOptions {
188
207
return func (config * P2PForgeCertMgrConfig ) error {
189
208
config .log = log
@@ -303,6 +322,7 @@ func NewP2PForgeCertMgr(opts ...P2PForgeCertMgrOptions) (*P2PForgeCertMgr, error
303
322
cfg : certCfg ,
304
323
log : mgrCfg .log ,
305
324
allowPrivateForgeAddresses : mgrCfg .allowPrivateForgeAddresses ,
325
+ produceShortAddrs : mgrCfg .produceShortAddrs ,
306
326
}
307
327
308
328
certCfg .OnEvent = func (ctx context.Context , event string , data map [string ]any ) error {
@@ -419,7 +439,8 @@ func (m *P2PForgeCertMgr) TLSConfig() *tls.Config {
419
439
}
420
440
421
441
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 ),
423
444
fmt .Sprintf ("/ip6/::/tcp/0/tls/sni/*.%s/ws" , m .forgeDomain ),
424
445
}
425
446
}
@@ -431,7 +452,7 @@ func (m *P2PForgeCertMgr) AddressFactory() config.AddrsFactory {
431
452
tlsCfg := m .cfg .TLSConfig ()
432
453
tlsCfg .NextProtos = []string {"h2" , "http/1.1" } // remove the ACME ALPN and set the HTTP 1.1 and 2 ALPNs
433
454
434
- return m .createAddrsFactory (m .allowPrivateForgeAddresses )
455
+ return m .createAddrsFactory (m .allowPrivateForgeAddresses , m . produceShortAddrs )
435
456
}
436
457
437
458
// 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 {
450
471
return fmt .Sprintf ("*.%s.%s" , pb36 , suffixDomain )
451
472
}
452
473
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 ))
455
476
456
477
return func (multiaddrs []multiaddr.Multiaddr ) []multiaddr.Multiaddr {
457
478
var skipForgeAddrs bool
@@ -464,7 +485,7 @@ func (m *P2PForgeCertMgr) createAddrsFactory(allowPrivateForgeAddrs bool) config
464
485
}
465
486
m .certCheckMx .RUnlock ()
466
487
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 )
468
489
}
469
490
}
470
491
@@ -528,14 +549,16 @@ func (d *dns01P2PForgeSolver) Present(ctx context.Context, challenge acme.Challe
528
549
}
529
550
530
551
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?
532
553
return nil
533
554
}
534
555
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
+ )
537
560
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 {
539
562
retAddrs := make ([]multiaddr.Multiaddr , 0 , len (multiaddrs ))
540
563
for _ , a := range multiaddrs {
541
564
if isRelayAddr (a ) {
@@ -553,17 +576,20 @@ func addrFactoryFn(skipForgeAddrs bool, peerIDFn func() peer.ID, forgeDomain str
553
576
554
577
index := 0
555
578
var escapedIPStr string
579
+ var ipVersion string
556
580
var ipMaStr string
557
581
var tcpPortStr string
558
582
multiaddr .ForEach (withoutForgeWSS , func (c multiaddr.Component ) bool {
559
583
switch index {
560
584
case 0 :
561
585
switch c .Protocol ().Code {
562
586
case multiaddr .P_IP4 :
587
+ ipVersion = "4"
563
588
ipMaStr = c .String ()
564
589
ipAddr := c .Value ()
565
590
escapedIPStr = strings .ReplaceAll (ipAddr , "." , "-" )
566
591
case multiaddr .P_IP6 :
592
+ ipVersion = "6"
567
593
ipMaStr = c .String ()
568
594
ipAddr := c .Value ()
569
595
escapedIPStr = strings .ReplaceAll (ipAddr , ":" , "-" )
@@ -603,9 +629,14 @@ func addrFactoryFn(skipForgeAddrs bool, peerIDFn func() peer.ID, forgeDomain str
603
629
continue
604
630
}
605
631
606
- pidStr := peer .ToCid (peerIDFn ()).Encode (multibase .MustNewEncoder (multibase .Base36 ))
632
+ b36PidStr := peer .ToCid (peerIDFn ()).Encode (multibase .MustNewEncoder (multibase .Base36 ))
607
633
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
+ }
609
640
newMA , err := multiaddr .NewMultiaddr (newMaStr )
610
641
if err != nil {
611
642
log .Errorf ("error creating new multiaddr from %q: %s" , newMaStr , err .Error ())
0 commit comments