Skip to content

Commit 66e6d63

Browse files
committed
firewall: obfuscate ConnectPeer
Also adds a privacy flag that controls obfuscation of network addresses.
1 parent bca729a commit 66e6d63

File tree

4 files changed

+120
-7
lines changed

4 files changed

+120
-7
lines changed

firewall/privacy_mapper.go

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

@@ -1612,6 +1618,63 @@ func handleChannelOpenResponse(db firewalldb.PrivacyMapDB,
16121618
}
16131619
}
16141620

1621+
func handleConnectPeerRequest(db firewalldb.PrivacyMapDB,
1622+
flags session.PrivacyFlags) func(ctx context.Context,
1623+
r *lnrpc.ConnectPeerRequest) (proto.Message, error) {
1624+
1625+
return func(_ context.Context, r *lnrpc.ConnectPeerRequest) (
1626+
proto.Message, error) {
1627+
1628+
var addr *lnrpc.LightningAddress
1629+
1630+
err := db.View(func(tx firewalldb.PrivacyMapTx) error {
1631+
var err error
1632+
1633+
// Note, this only works if the pubkey alias was
1634+
// already created via other calls, e.g. via
1635+
// ListChannels or GetNodeInfo.
1636+
pubkey := r.Addr.Pubkey
1637+
if !flags.Contains(session.ClearPubkeys) {
1638+
pubkey, err = firewalldb.RevealString(
1639+
tx, r.Addr.Pubkey,
1640+
)
1641+
if err != nil {
1642+
return err
1643+
}
1644+
}
1645+
1646+
host := r.Addr.Host
1647+
if !flags.Contains(session.ClearNetworkAddresses) {
1648+
host, err = firewalldb.RevealString(
1649+
tx, r.Addr.Host,
1650+
)
1651+
if err != nil {
1652+
return err
1653+
}
1654+
}
1655+
1656+
addr = &lnrpc.LightningAddress{
1657+
Pubkey: pubkey,
1658+
Host: host,
1659+
}
1660+
1661+
return nil
1662+
})
1663+
if err != nil {
1664+
return nil, err
1665+
}
1666+
1667+
return &lnrpc.ConnectPeerRequest{
1668+
// Obfuscated fields.
1669+
Addr: addr,
1670+
1671+
// Non-obfuscated fields.
1672+
Perm: r.Perm,
1673+
Timeout: r.Timeout,
1674+
}, nil
1675+
}
1676+
}
1677+
16151678
// maybeHideAmount hides an amount if the privacy flag is not set.
16161679
func maybeHideAmount(flags session.PrivacyFlags, randIntn func(int) (int,
16171680
error), a int64) (int64, error) {

firewall/privacy_mapper_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ func TestPrivacyMapper(t *testing.T) {
7777
outPoint(clearTxID, 0): outPoint(obfusTxID0, obfusOut0),
7878
outPoint(clearTxID, 1): outPoint(obfusTxID1, obfusOut1),
7979
"01020304": "c8134495",
80+
"secret-host.com": "sksiuekalkdoowurekdf",
8081
}
8182

8283
var (
@@ -827,6 +828,45 @@ func TestPrivacyMapper(t *testing.T) {
827828
OutputIndex: 0,
828829
},
829830
},
831+
832+
{
833+
name: "ConnectPeer Request",
834+
uri: "/lnrpc.Lightning/ConnectPeer",
835+
msgType: rpcperms.TypeRequest,
836+
msg: &lnrpc.ConnectPeerRequest{
837+
Addr: &lnrpc.LightningAddress{
838+
Pubkey: "c8134495",
839+
Host: "sksiuekalkdoowurekdf",
840+
},
841+
},
842+
expectedReplacement: &lnrpc.ConnectPeerRequest{
843+
Addr: &lnrpc.LightningAddress{
844+
Pubkey: "01020304",
845+
Host: "secret-host.com",
846+
},
847+
},
848+
},
849+
{
850+
name: "ConnectPeer Request clear",
851+
uri: "/lnrpc.Lightning/ConnectPeer",
852+
msgType: rpcperms.TypeRequest,
853+
msg: &lnrpc.ConnectPeerRequest{
854+
Addr: &lnrpc.LightningAddress{
855+
Pubkey: "c8134495",
856+
Host: "secret-host.com",
857+
},
858+
},
859+
privacyFlags: []session.PrivacyFlag{
860+
session.ClearPubkeys,
861+
session.ClearNetworkAddresses,
862+
},
863+
expectedReplacement: &lnrpc.ConnectPeerRequest{
864+
Addr: &lnrpc.LightningAddress{
865+
Pubkey: "c8134495",
866+
Host: "secret-host.com",
867+
},
868+
},
869+
},
830870
}
831871

832872
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)