|
1 | 1 | package perms
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "fmt" |
5 | 4 | "regexp"
|
6 | 5 | "strings"
|
7 | 6 | "sync"
|
8 | 7 |
|
9 |
| - faraday "github.com/lightninglabs/faraday/frdrpcserver/perms" |
10 |
| - loop "github.com/lightninglabs/loop/loopd/perms" |
11 |
| - pool "github.com/lightninglabs/pool/perms" |
12 | 8 | "github.com/lightningnetwork/lnd"
|
13 | 9 | "github.com/lightningnetwork/lnd/lnrpc"
|
14 | 10 | "gopkg.in/macaroon-bakery.v2/bakery"
|
15 | 11 | )
|
16 | 12 |
|
17 | 13 | const (
|
18 |
| - poolPerms string = "pool" |
19 |
| - loopPerms string = "loop" |
20 |
| - faradayPerms string = "faraday" |
21 |
| - litPerms string = "lit" |
22 |
| - lndPerms string = "lnd" |
| 14 | + litPerms string = "lit" |
| 15 | + lndPerms string = "lnd" |
23 | 16 | )
|
24 | 17 |
|
25 | 18 | // Manager manages the permission lists that Lit requires.
|
@@ -54,9 +47,6 @@ type Manager struct {
|
54 | 47 | // was compiled with and then only the corresponding permissions will be added.
|
55 | 48 | func NewManager(withAllSubServers bool) (*Manager, error) {
|
56 | 49 | permissions := make(map[string]map[string][]bakery.Op)
|
57 |
| - permissions[faradayPerms] = faraday.RequiredPermissions |
58 |
| - permissions[loopPerms] = loop.RequiredPermissions |
59 |
| - permissions[poolPerms] = pool.RequiredPermissions |
60 | 50 | permissions[litPerms] = RequiredPermissions
|
61 | 51 | permissions[lndPerms] = lnd.MainRPCServerPermissions()
|
62 | 52 | for k, v := range whiteListedLNDMethods {
|
@@ -106,6 +96,21 @@ func NewManager(withAllSubServers bool) (*Manager, error) {
|
106 | 96 | }, nil
|
107 | 97 | }
|
108 | 98 |
|
| 99 | +// RegisterSubServer adds the permissions of a given sub-server to the set |
| 100 | +// managed by the Manager. |
| 101 | +func (pm *Manager) RegisterSubServer(name string, |
| 102 | + permissions map[string][]bakery.Op) { |
| 103 | + |
| 104 | + pm.permsMu.Lock() |
| 105 | + defer pm.permsMu.Unlock() |
| 106 | + |
| 107 | + pm.fixedPerms[name] = permissions |
| 108 | + |
| 109 | + for uri, ops := range permissions { |
| 110 | + pm.perms[uri] = ops |
| 111 | + } |
| 112 | +} |
| 113 | + |
109 | 114 | // OnLNDBuildTags should be called once a list of LND build tags has been
|
110 | 115 | // obtained. It then uses those build tags to decide which of the LND sub-server
|
111 | 116 | // permissions to add to the main permissions list. This method should only
|
@@ -225,50 +230,19 @@ func (pm *Manager) ActivePermissions(readOnly bool) []bakery.Op {
|
225 | 230 | // _except_ for any LND permissions. In other words, this returns permissions
|
226 | 231 | // for which the external validator of Lit is responsible.
|
227 | 232 | func (pm *Manager) GetLitPerms() map[string][]bakery.Op {
|
228 |
| - mapSize := len(pm.fixedPerms[litPerms]) + |
229 |
| - len(pm.fixedPerms[faradayPerms]) + |
230 |
| - len(pm.fixedPerms[loopPerms]) + len(pm.fixedPerms[poolPerms]) |
| 233 | + result := make(map[string][]bakery.Op) |
| 234 | + for subserver, ops := range pm.fixedPerms { |
| 235 | + if subserver == lndPerms { |
| 236 | + continue |
| 237 | + } |
231 | 238 |
|
232 |
| - result := make(map[string][]bakery.Op, mapSize) |
233 |
| - for key, value := range pm.fixedPerms[faradayPerms] { |
234 |
| - result[key] = value |
235 |
| - } |
236 |
| - for key, value := range pm.fixedPerms[loopPerms] { |
237 |
| - result[key] = value |
238 |
| - } |
239 |
| - for key, value := range pm.fixedPerms[poolPerms] { |
240 |
| - result[key] = value |
241 |
| - } |
242 |
| - for key, value := range pm.fixedPerms[litPerms] { |
243 |
| - result[key] = value |
| 239 | + for key, value := range ops { |
| 240 | + result[key] = value |
| 241 | + } |
244 | 242 | }
|
245 | 243 | return result
|
246 | 244 | }
|
247 | 245 |
|
248 |
| -// SubServerHandler returns the name of the subserver that should handle the |
249 |
| -// given URI. |
250 |
| -func (pm *Manager) SubServerHandler(uri string) (string, error) { |
251 |
| - switch { |
252 |
| - case pm.IsSubServerURI(lndPerms, uri): |
253 |
| - return lndPerms, nil |
254 |
| - |
255 |
| - case pm.IsSubServerURI(faradayPerms, uri): |
256 |
| - return faradayPerms, nil |
257 |
| - |
258 |
| - case pm.IsSubServerURI(loopPerms, uri): |
259 |
| - return loopPerms, nil |
260 |
| - |
261 |
| - case pm.IsSubServerURI(poolPerms, uri): |
262 |
| - return poolPerms, nil |
263 |
| - |
264 |
| - case pm.IsSubServerURI(litPerms, uri): |
265 |
| - return litPerms, nil |
266 |
| - |
267 |
| - default: |
268 |
| - return "", fmt.Errorf("unknown gRPC web request: %v", uri) |
269 |
| - } |
270 |
| -} |
271 |
| - |
272 | 246 | // IsSubServerURI if the given URI belongs to the RPC of the given server.
|
273 | 247 | func (pm *Manager) IsSubServerURI(name string, uri string) bool {
|
274 | 248 | if name == lndPerms {
|
|
0 commit comments