1
1
package main
2
2
3
3
import (
4
+ "net"
5
+
4
6
faraday "github.com/lightninglabs/faraday/frdrpcserver/perms"
5
7
loopd "github.com/lightninglabs/loop/loopd/perms"
6
8
poold "github.com/lightninglabs/pool/perms"
7
9
"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"
8
27
"gopkg.in/macaroon-bakery.v2/bakery"
9
28
)
10
29
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
+
11
46
// getAllMethodPermissions returns a merged map of all litd's method
12
47
// permissions.
13
48
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 )
17
50
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 {
20
53
allPerms [key ] = value
21
54
}
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
+
22
74
for key , value := range faraday .RequiredPermissions {
23
75
allPerms [key ] = value
24
76
}
@@ -30,3 +82,65 @@ func getAllMethodPermissions() map[string][]bakery.Op {
30
82
}
31
83
return allPerms
32
84
}
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