/
drand_daemon_interceptors.go
93 lines (76 loc) 路 2.32 KB
/
drand_daemon_interceptors.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package core
import (
"context"
"fmt"
"github.com/drand/drand/v2/common/tracer"
"github.com/drand/drand/v2/protobuf/drand"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
commonutils "github.com/drand/drand/v2/common"
)
type MetadataGetter interface {
GetMetadata() *drand.Metadata
}
func (dd *DrandDaemon) NodeVersionValidator(ctx context.Context, req interface{},
_ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (response interface{}, err error) {
ctx, span := tracer.NewSpan(ctx, "dd.NodeVersionValidator")
defer span.End()
reqWithContext, ok := req.(MetadataGetter)
if !ok {
return handler(ctx, req)
}
metadata := reqWithContext.GetMetadata()
if metadata == nil {
return handler(ctx, req)
}
v := metadata.GetNodeVersion()
if v == nil {
return handler(ctx, req)
}
prerelease := ""
if v.Prerelease != nil {
prerelease = *v.Prerelease
}
rcvVer := commonutils.Version{
Major: v.Major,
Minor: v.Minor,
Patch: v.Patch,
Prerelease: prerelease,
}
if !dd.version.IsCompatible(rcvVer) {
dd.log.Named("node_version_interceptor").Warnw(
"node version rcv is no compatible --> rejecting message",
"received", rcvVer,
"our node", dd.version)
msg := fmt.Sprintf("Incompatible node version. Current: %v, received: %v", dd.version, rcvVer)
return nil, status.Error(codes.PermissionDenied, msg)
}
return handler(ctx, req)
}
func (dd *DrandDaemon) NodeVersionStreamValidator(srv interface{}, ss grpc.ServerStream,
_ *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
reqWithContext, ok := srv.(MetadataGetter)
if !ok {
return handler(srv, ss)
}
metadata := reqWithContext.GetMetadata()
if metadata == nil {
return handler(srv, ss)
}
v := metadata.GetNodeVersion()
if v == nil {
return handler(srv, ss)
}
prerelease := ""
if v.Prerelease != nil {
prerelease = *v.Prerelease
}
rcvVer := commonutils.Version{Major: v.Major, Minor: v.Minor, Patch: v.Patch, Prerelease: prerelease}
if !dd.version.IsCompatible(rcvVer) {
dd.log.Warnw("", "node_version_interceptor", "node version rcv is no compatible --> rejecting message", "version", rcvVer)
msg := fmt.Sprintf("Incompatible node version. Current: %v, received: %v", dd.version, rcvVer)
return status.Error(codes.PermissionDenied, msg)
}
return handler(srv, ss)
}