lotus/node/impl/common/common.go

125 lines
3.0 KiB
Go
Raw Normal View History

package common
2019-07-24 00:58:31 +00:00
import (
"context"
2020-03-03 04:55:25 +00:00
logging "github.com/ipfs/go-log/v2"
2019-07-24 00:58:31 +00:00
"github.com/gbrlsnchs/jwt/v3"
"github.com/libp2p/go-libp2p-core/host"
2019-07-25 00:55:19 +00:00
"github.com/libp2p/go-libp2p-core/network"
2019-07-24 00:58:31 +00:00
"github.com/libp2p/go-libp2p-core/peer"
2020-03-03 04:55:25 +00:00
swarm "github.com/libp2p/go-libp2p-swarm"
2019-07-24 00:58:31 +00:00
ma "github.com/multiformats/go-multiaddr"
"go.uber.org/fx"
"golang.org/x/xerrors"
2019-09-16 13:46:05 +00:00
2020-05-20 18:23:51 +00:00
"github.com/filecoin-project/go-jsonrpc/auth"
"github.com/filecoin-project/lotus/api"
"github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/node/modules/dtypes"
2020-05-20 18:23:51 +00:00
"github.com/filecoin-project/lotus/node/modules/lp2p"
2019-07-24 00:58:31 +00:00
)
type CommonAPI struct {
fx.In
2020-06-02 19:38:21 +00:00
APISecret *dtypes.APIAlg
Host host.Host
Router lp2p.BaseIpfsRouting
ShutdownChan dtypes.ShutdownChan
2019-07-24 00:58:31 +00:00
}
type jwtPayload struct {
2020-05-20 18:23:51 +00:00
Allow []auth.Permission
2019-07-24 00:58:31 +00:00
}
2020-05-20 18:23:51 +00:00
func (a *CommonAPI) AuthVerify(ctx context.Context, token string) ([]auth.Permission, error) {
2019-07-24 00:58:31 +00:00
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
}
2020-05-20 18:23:51 +00:00
func (a *CommonAPI) AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) {
2019-07-24 00:58:31 +00:00
p := jwtPayload{
Allow: perms, // TODO: consider checking validity
}
return jwt.Sign(&p, (*jwt.HMACSHA)(a.APISecret))
}
2019-07-25 00:55:19 +00:00
func (a *CommonAPI) NetConnectedness(ctx context.Context, pid peer.ID) (network.Connectedness, error) {
return a.Host.Network().Connectedness(pid), nil
}
2019-07-24 00:58:31 +00:00
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 {
2020-03-03 04:55:25 +00:00
if swrm, ok := a.Host.Network().(*swarm.Swarm); ok {
swrm.Backoff().Clear(p.ID)
}
2019-07-24 00:58:31 +00:00
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
}
2019-07-25 00:55:19 +00:00
func (a *CommonAPI) NetDisconnect(ctx context.Context, p peer.ID) error {
return a.Host.Network().ClosePeer(p)
}
func (a *CommonAPI) NetFindPeer(ctx context.Context, p peer.ID) (peer.AddrInfo, error) {
return a.Router.FindPeer(ctx, p)
}
2019-07-24 00:58:31 +00:00
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.UserVersion,
APIVersion: build.APIVersion,
BlockDelay: build.BlockDelay,
2019-07-24 00:58:31 +00:00
}, nil
}
func (a *CommonAPI) LogList(context.Context) ([]string, error) {
return logging.GetSubsystems(), nil
}
func (a *CommonAPI) LogSetLevel(ctx context.Context, subsystem, level string) error {
return logging.SetLogLevel(subsystem, level)
}
func (a *CommonAPI) Shutdown(ctx context.Context) error {
2020-06-02 19:38:21 +00:00
a.ShutdownChan <- struct{}{}
return nil
}
2019-07-24 00:58:31 +00:00
var _ api.Common = &CommonAPI{}