Skip to content

Commit 3b610ad

Browse files
committed
firewall: obfuscate ConnectPeer
Also adds a privacy flag that controls obfuscation of network addresses.
1 parent 9480d9f commit 3b610ad

File tree

4 files changed

+119
-7
lines changed

4 files changed

+119
-7
lines changed

firewall/privacy_mapper.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,12 @@ func (p *PrivacyMapper) checkers(db firewalldb.PrivacyMapDB,
311311
handleChannelOpenResponse(db, flags),
312312
mid.PassThroughErrorHandler,
313313
),
314+
315+
"/lnrpc.Lightning/ConnectPeer": mid.NewRequestRewriter(
316+
&lnrpc.ConnectPeerRequest{},
317+
&lnrpc.ConnectPeerResponse{},
318+
handleConnectPeerRequest(db, flags),
319+
),
314320
}
315321
}
316322

@@ -1410,6 +1416,62 @@ func handleChannelOpenResponse(db firewalldb.PrivacyMapDB,
14101416
}
14111417
}
14121418

1419+
func handleConnectPeerRequest(db firewalldb.PrivacyMapDB,
1420+
flags session.PrivacyFlags) func(ctx context.Context,
1421+
r *lnrpc.ConnectPeerRequest) (proto.Message, error) {
1422+
1423+
return func(_ context.Context, r *lnrpc.ConnectPeerRequest) (
1424+
proto.Message, error) {
1425+
1426+
var addr *lnrpc.LightningAddress
1427+
1428+
err := db.View(func(tx firewalldb.PrivacyMapTx) error {
1429+
var err error
1430+
// Note, this only works if the pubkey alias was
1431+
// already created via other calls, e.g. via
1432+
// ListChannels or GetNodeInfo.
1433+
pubkey := r.Addr.Pubkey
1434+
if !flags.Contains(session.ClearPubkeys) {
1435+
pubkey, err = firewalldb.RevealString(
1436+
tx, r.Addr.Pubkey,
1437+
)
1438+
if err != nil {
1439+
return err
1440+
}
1441+
}
1442+
1443+
host := r.Addr.Host
1444+
if !flags.Contains(session.ClearNetworkAddresses) {
1445+
host, err = firewalldb.RevealString(
1446+
tx, r.Addr.Host,
1447+
)
1448+
if err != nil {
1449+
return err
1450+
}
1451+
}
1452+
1453+
addr = &lnrpc.LightningAddress{
1454+
Pubkey: pubkey,
1455+
Host: host,
1456+
}
1457+
1458+
return nil
1459+
})
1460+
if err != nil {
1461+
return nil, err
1462+
}
1463+
1464+
return &lnrpc.ConnectPeerRequest{
1465+
// Obfuscated fields.
1466+
Addr: addr,
1467+
1468+
// Non-obfuscated fields.
1469+
Perm: r.Perm,
1470+
Timeout: r.Timeout,
1471+
}, nil
1472+
}
1473+
}
1474+
14131475
// maybeHideAmount hides an amount if the privacy flag is not set.
14141476
func maybeHideAmount(flags session.PrivacyFlags, randIntn func(int) (int, error),
14151477
a int64) (int64, error) {

firewall/privacy_mapper_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ func TestPrivacyMapper(t *testing.T) {
5050
outPoint(clearTxID, 0): outPoint(obfusTxID0, obfusOut0),
5151
outPoint(clearTxID, 1): outPoint(obfusTxID1, obfusOut1),
5252
"01020304": "c8134495",
53+
"secret-host.com": "sksiuekalkdoowurekdf",
5354
}
5455

5556
var (
@@ -761,6 +762,45 @@ func TestPrivacyMapper(t *testing.T) {
761762
OutputIndex: 0,
762763
},
763764
},
765+
766+
{
767+
name: "ConnectPeer Request",
768+
uri: "/lnrpc.Lightning/ConnectPeer",
769+
msgType: rpcperms.TypeRequest,
770+
msg: &lnrpc.ConnectPeerRequest{
771+
Addr: &lnrpc.LightningAddress{
772+
Pubkey: "c8134495",
773+
Host: "sksiuekalkdoowurekdf",
774+
},
775+
},
776+
expectedReplacement: &lnrpc.ConnectPeerRequest{
777+
Addr: &lnrpc.LightningAddress{
778+
Pubkey: "01020304",
779+
Host: "secret-host.com",
780+
},
781+
},
782+
},
783+
{
784+
name: "ConnectPeer Request clear",
785+
uri: "/lnrpc.Lightning/ConnectPeer",
786+
msgType: rpcperms.TypeRequest,
787+
msg: &lnrpc.ConnectPeerRequest{
788+
Addr: &lnrpc.LightningAddress{
789+
Pubkey: "c8134495",
790+
Host: "secret-host.com",
791+
},
792+
},
793+
privacyFlags: []session.PrivacyFlag{
794+
session.ClearPubkeys,
795+
session.ClearNetworkAddresses,
796+
},
797+
expectedReplacement: &lnrpc.ConnectPeerRequest{
798+
Addr: &lnrpc.LightningAddress{
799+
Pubkey: "c8134495",
800+
Host: "secret-host.com",
801+
},
802+
},
803+
},
764804
}
765805

766806
decodedID := &lnrpc.MacaroonId{

session/privacy_flags.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,21 @@ const (
4545
// ClearClosingTxIds is a privacy flag that indicates that the channel
4646
// closing transaction ids in the API should not be obfuscated.
4747
ClearClosingTxIds PrivacyFlag = 6
48+
49+
// ClearNetworkAddresses is a privacy flag that indicates that the
50+
// network addresses in the API should not be obfuscated.
51+
ClearNetworkAddresses PrivacyFlag = 7
4852
)
4953

5054
var flagMap = map[PrivacyFlag]string{
51-
ClearPubkeys: "ClearPubkeys",
52-
ClearAmounts: "ClearAmounts",
53-
ClearChanIDs: "ClearChanIDs",
54-
ClearTimeStamps: "ClearTimeStamps",
55-
ClearChanInitiator: "ClearChanInitiator",
56-
ClearHTLCs: "ClearHTLCs",
57-
ClearClosingTxIds: "ClearClosingTxIds",
55+
ClearPubkeys: "ClearPubkeys",
56+
ClearAmounts: "ClearAmounts",
57+
ClearChanIDs: "ClearChanIDs",
58+
ClearTimeStamps: "ClearTimeStamps",
59+
ClearChanInitiator: "ClearChanInitiator",
60+
ClearHTLCs: "ClearHTLCs",
61+
ClearClosingTxIds: "ClearClosingTxIds",
62+
ClearNetworkAddresses: "ClearNetworkAddresses",
5863
}
5964

6065
// String returns a string representation of the privacy flag.

session/privacy_flags_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,9 @@ func TestPrivacyFlags(t *testing.T) {
5656
require.True(t, flags.Contains(ClearPubkeys))
5757
require.True(t, flags.Contains(ClearAmounts))
5858
require.False(t, flags.Contains(ClearChanIDs))
59+
60+
autoOpenFlags := PrivacyFlags{ClearPubkeys, ClearNetworkAddresses}
61+
require.NoError(t, err)
62+
require.Equal(t, "ClearPubkeys|ClearNetworkAddresses",
63+
autoOpenFlags.String())
5964
}

0 commit comments

Comments
 (0)