Skip to content

Commit b9c7a96

Browse files
committed
Makefile+wasm-client: add LND subserver perms
In this commit, all the rpc subserver tags of LND are included in the build so that the permissions of all the subservers can be extracted. These permissions are then included in the permissions list used by the `HasPermissions` function.
1 parent df76e88 commit b9c7a96

File tree

2 files changed

+120
-6
lines changed

2 files changed

+120
-6
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ build:
5353
wasm:
5454
# The appengine build tag is needed because of the jessevdk/go-flags library
5555
# that has some OS specific terminal code that doesn't compile to WASM.
56-
cd cmd/wasm-client; GOOS=js GOARCH=wasm go build -trimpath -ldflags="$(LDFLAGS)" -tags="appengine" -v -o wasm-client.wasm .
56+
cd cmd/wasm-client; GOOS=js GOARCH=wasm go build -trimpath -ldflags="$(LDFLAGS)" -tags="appengine autopilotrpc chainrpc invoicesrpc neutrinorpc peersrpc signrpc wtclientrpc watchtowerrpc routerrpc walletrpc verrpc" -v -o wasm-client.wasm .
5757
$(CP) cmd/wasm-client/wasm-client.wasm example/wasm-client.wasm
5858

5959
# =======

cmd/wasm-client/permissions.go

Lines changed: 119 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,76 @@
11
package main
22

33
import (
4+
"net"
5+
46
faraday "github.com/lightninglabs/faraday/frdrpcserver/perms"
57
loopd "github.com/lightninglabs/loop/loopd/perms"
68
poold "github.com/lightninglabs/pool/perms"
79
"github.com/lightningnetwork/lnd"
10+
"github.com/lightningnetwork/lnd/autopilot"
11+
"github.com/lightningnetwork/lnd/chainreg"
12+
"github.com/lightningnetwork/lnd/lnrpc"
13+
"github.com/lightningnetwork/lnd/lnrpc/autopilotrpc"
14+
"github.com/lightningnetwork/lnd/lnrpc/chainrpc"
15+
"github.com/lightningnetwork/lnd/lnrpc/devrpc"
16+
"github.com/lightningnetwork/lnd/lnrpc/invoicesrpc"
17+
"github.com/lightningnetwork/lnd/lnrpc/neutrinorpc"
18+
"github.com/lightningnetwork/lnd/lnrpc/peersrpc"
19+
"github.com/lightningnetwork/lnd/lnrpc/routerrpc"
20+
"github.com/lightningnetwork/lnd/lnrpc/signrpc"
21+
"github.com/lightningnetwork/lnd/lnrpc/walletrpc"
22+
"github.com/lightningnetwork/lnd/lnrpc/watchtowerrpc"
23+
"github.com/lightningnetwork/lnd/lnrpc/wtclientrpc"
24+
"github.com/lightningnetwork/lnd/lntest/mock"
25+
"github.com/lightningnetwork/lnd/routing"
26+
"github.com/lightningnetwork/lnd/sweep"
827
"gopkg.in/macaroon-bakery.v2/bakery"
928
)
1029

30+
var (
31+
// whiteListedMethods is a map of all lnd RPC methods that don't require
32+
// any macaroon authentication.
33+
whiteListedMethods = map[string][]bakery.Op{
34+
"/lnrpc.WalletUnlocker/GenSeed": {},
35+
"/lnrpc.WalletUnlocker/InitWallet": {},
36+
"/lnrpc.WalletUnlocker/UnlockWallet": {},
37+
"/lnrpc.WalletUnlocker/ChangePassword": {},
38+
39+
// The State service must be available at all times, even
40+
// before we can check macaroons, so we whitelist it.
41+
"/lnrpc.State/SubscribeState": {},
42+
"/lnrpc.State/GetState": {},
43+
}
44+
)
45+
1146
// getAllMethodPermissions returns a merged map of all litd's method
1247
// permissions.
1348
func getAllMethodPermissions() map[string][]bakery.Op {
14-
mapSize := len(lnd.MainRPCServerPermissions()) +
15-
len(faraday.RequiredPermissions) +
16-
len(loopd.RequiredPermissions) + len(poold.RequiredPermissions)
49+
allPerms := make(map[string][]bakery.Op)
1750

18-
allPerms := make(map[string][]bakery.Op, mapSize)
19-
for key, value := range lnd.MainRPCServerPermissions() {
51+
lndMainPerms := lnd.MainRPCServerPermissions()
52+
for key, value := range lndMainPerms {
2053
allPerms[key] = value
2154
}
55+
56+
for key, value := range whiteListedMethods {
57+
allPerms[key] = value
58+
}
59+
60+
ss := lnrpc.RegisteredSubServers()
61+
for _, subServer := range ss {
62+
_, perms, err := subServer.NewGrpcHandler().CreateSubServer(
63+
&mockConfig{},
64+
)
65+
if err != nil {
66+
panic(err)
67+
}
68+
69+
for key, value := range perms {
70+
allPerms[key] = value
71+
}
72+
}
73+
2274
for key, value := range faraday.RequiredPermissions {
2375
allPerms[key] = value
2476
}
@@ -30,3 +82,65 @@ func getAllMethodPermissions() map[string][]bakery.Op {
3082
}
3183
return allPerms
3284
}
85+
86+
var _ lnrpc.SubServerConfigDispatcher = (*mockConfig)(nil)
87+
88+
// mockConfig implements lnrpc.SubServerConfigDispatcher. It provides th
89+
// functionality required so that the lnrpc.GrpcHandler.CreateSubServer
90+
// function can be called without panicking.
91+
type mockConfig struct{}
92+
93+
// FetchConfig is a mock implementation of lnrpc.SubServerConfigDispatcher. It
94+
// is used as a parameter to lnrpc.GrpcHandler.CreateSubServer and allows the
95+
// function to be called without panicking. This is useful because
96+
// CreateSubServer can be used to extract the permissions required by each
97+
// registered subserver.
98+
//
99+
// TODO(elle): remove this once the sub-server permission lists in LND have been
100+
// exported.
101+
func (t *mockConfig) FetchConfig(subServerName string) (interface{}, bool) {
102+
switch subServerName {
103+
case "InvoicesRPC":
104+
return &invoicesrpc.Config{}, true
105+
case "WatchtowerClientRPC":
106+
return &wtclientrpc.Config{
107+
Resolver: func(_, _ string) (*net.TCPAddr, error) {
108+
return nil, nil
109+
},
110+
}, true
111+
case "AutopilotRPC":
112+
return &autopilotrpc.Config{
113+
Manager: &autopilot.Manager{},
114+
}, true
115+
case "ChainRPC":
116+
return &chainrpc.Config{
117+
ChainNotifier: &chainreg.NoChainBackend{},
118+
}, true
119+
case "DevRPC":
120+
return &devrpc.Config{}, true
121+
case "NeutrinoKitRPC":
122+
return &neutrinorpc.Config{}, true
123+
case "PeersRPC":
124+
return &peersrpc.Config{}, true
125+
case "RouterRPC":
126+
return &routerrpc.Config{
127+
Router: &routing.ChannelRouter{},
128+
}, true
129+
case "SignRPC":
130+
return &signrpc.Config{
131+
Signer: &mock.DummySigner{},
132+
}, true
133+
case "WalletKitRPC":
134+
return &walletrpc.Config{
135+
FeeEstimator: &chainreg.NoChainBackend{},
136+
Wallet: &mock.WalletController{},
137+
KeyRing: &mock.SecretKeyRing{},
138+
Sweeper: &sweep.UtxoSweeper{},
139+
Chain: &mock.ChainIO{},
140+
}, true
141+
case "WatchtowerRPC":
142+
return &watchtowerrpc.Config{}, true
143+
default:
144+
return nil, false
145+
}
146+
}

0 commit comments

Comments
 (0)