Skip to content

Commit f2a6d39

Browse files
authored
Merge pull request #55 from ellemouton/addLndSubServerPerms
Makefile+wasm-client: add LND subserver perms
2 parents df76e88 + b9c7a96 commit f2a6d39

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)