@@ -21,9 +21,11 @@ import (
21
21
"fmt"
22
22
"net/http"
23
23
"net/url"
24
+ "strings"
24
25
"time"
25
26
26
27
"github.com/gorilla/websocket"
28
+ "k8s.io/apimachinery/pkg/util/validation"
27
29
"k8s.io/klog/v2"
28
30
29
31
"github.com/kubeedge/sedna/cmd/sedna-lc/app/options"
@@ -76,6 +78,34 @@ func (c *wsClient) Subscribe(m MessageResourceHandler) error {
76
78
return nil
77
79
}
78
80
81
+ func sanitizeHeaderField (rawStr string ) string {
82
+ return strings .ReplaceAll (strings .ReplaceAll (rawStr , "\n " , "" ), "\r " , "" )
83
+ }
84
+
85
+ func sanitizeHeader (h MessageHeader ) MessageHeader {
86
+ h .ResourceName = sanitizeHeaderField (h .ResourceName )
87
+ h .Namespace = sanitizeHeaderField (h .Namespace )
88
+ h .ResourceKind = sanitizeHeaderField (h .ResourceKind )
89
+ h .Operation = sanitizeHeaderField (h .Operation )
90
+ return h
91
+ }
92
+
93
+ func validateMessage (msg * Message ) (err error ) {
94
+ // ResourceName/Namespace follow 'RFC 1123 Label Names' constraint
95
+ // https://kubernetes.io/docs/concepts/overview/working-with-objects/names/
96
+ errs := validation .IsDNS1123Label (msg .Header .ResourceName )
97
+ if len (errs ) > 0 {
98
+ err = fmt .Errorf ("invalid resource name: %s" , strings .Join (errs , "," ))
99
+ return
100
+ }
101
+ errs = validation .IsDNS1123Label (msg .Header .Namespace )
102
+ if len (errs ) > 0 {
103
+ err = fmt .Errorf ("invalid namespace: %s" , strings .Join (errs , "," ))
104
+ return
105
+ }
106
+ return
107
+ }
108
+
79
109
// handleReceivedMessage handles received message
80
110
func (c * wsClient ) handleReceivedMessage (stop chan struct {}) {
81
111
defer func () {
@@ -85,16 +115,22 @@ func (c *wsClient) handleReceivedMessage(stop chan struct{}) {
85
115
ws := c .WSConnection .WSConn
86
116
87
117
for {
88
- message := Message {}
118
+ var message Message
89
119
if err := ws .ReadJSON (& message ); err != nil {
90
- klog .Errorf ("client received message from global manager(address: %s) failed, error : %v" ,
120
+ klog .Errorf ("client failed to read message from gm( %s): %v" ,
91
121
c .Options .GMAddr , err )
92
122
return
93
123
}
124
+ if err := validateMessage (& message ); err != nil {
125
+ klog .Warningf ("failed to validate message from gm(%s): %v" ,
126
+ message .Header , c .Options .GMAddr , err )
127
+ continue
128
+ }
129
+ message .Header = sanitizeHeader (message .Header )
94
130
95
- klog .V (2 ).Infof ("client received message header: %+v from global manager(address: %s)" ,
131
+ klog .V (2 ).Infof ("client received message header: %+v from gm( %s)" ,
96
132
message .Header , c .Options .GMAddr )
97
- klog .V (4 ).Infof ("client received message content: %s from global manager(address: %s)" ,
133
+ klog .V (4 ).Infof ("client received message content: %s from gm( %s)" ,
98
134
message .Content , c .Options .GMAddr )
99
135
100
136
m := c .SubscribeMessageMap [message .Header .ResourceKind ]
0 commit comments