package impl import ( "context" "github.com/gbrlsnchs/jwt/v3" "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" "go.uber.org/fx" "golang.org/x/xerrors" "github.com/filecoin-project/go-lotus/api" "github.com/filecoin-project/go-lotus/build" "github.com/filecoin-project/go-lotus/node/modules" ) type CommonAPI struct { fx.In APISecret *modules.APIAlg Host host.Host } type jwtPayload struct { Allow []string } func (a *CommonAPI) AuthVerify(ctx context.Context, token string) ([]string, error) { var payload jwtPayload if _, err := jwt.Verify([]byte(token), (*jwt.HMACSHA)(a.APISecret), &payload); err != nil { return nil, xerrors.Errorf("JWT Verification failed: %w", err) } return payload.Allow, nil } func (a *CommonAPI) AuthNew(ctx context.Context, perms []string) ([]byte, error) { p := jwtPayload{ Allow: perms, // TODO: consider checking validity } return jwt.Sign(&p, (*jwt.HMACSHA)(a.APISecret)) } func (a *CommonAPI) NetPeers(context.Context) ([]peer.AddrInfo, error) { conns := a.Host.Network().Conns() out := make([]peer.AddrInfo, len(conns)) for i, conn := range conns { out[i] = peer.AddrInfo{ ID: conn.RemotePeer(), Addrs: []ma.Multiaddr{ conn.RemoteMultiaddr(), }, } } return out, nil } func (a *CommonAPI) NetConnect(ctx context.Context, p peer.AddrInfo) error { return a.Host.Connect(ctx, p) } func (a *CommonAPI) NetAddrsListen(context.Context) (peer.AddrInfo, error) { return peer.AddrInfo{ ID: a.Host.ID(), Addrs: a.Host.Addrs(), }, nil } func (a *CommonAPI) ID(context.Context) (peer.ID, error) { return a.Host.ID(), nil } func (a *CommonAPI) Version(context.Context) (api.Version, error) { return api.Version{ Version: build.Version, }, nil } var _ api.Common = &CommonAPI{}