@@ -15,6 +15,7 @@ import (
15
15
16
16
"github.com/google/uuid"
17
17
"github.com/spf13/afero"
18
+ "github.com/stretchr/testify/assert"
18
19
"github.com/stretchr/testify/require"
19
20
"go.uber.org/goleak"
20
21
"nhooyr.io/websocket"
@@ -42,31 +43,37 @@ func TestVSCodeIPC(t *testing.T) {
42
43
srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
43
44
switch r .URL .Path {
44
45
case fmt .Sprintf ("/api/v2/workspaceagents/%s/connection" , id ):
46
+ assert .Equal (t , r .Method , http .MethodGet )
45
47
httpapi .Write (ctx , w , http .StatusOK , codersdk.WorkspaceAgentConnectionInfo {
46
48
DERPMap : derpMap ,
47
49
})
48
50
return
49
51
case fmt .Sprintf ("/api/v2/workspaceagents/%s/coordinate" , id ):
52
+ assert .Equal (t , r .Method , http .MethodGet )
50
53
ws , err := websocket .Accept (w , r , nil )
51
54
require .NoError (t , err )
52
55
conn := websocket .NetConn (ctx , ws , websocket .MessageBinary )
53
56
_ = coordinator .ServeClient (conn , uuid .New (), id )
54
57
return
55
58
case "/api/v2/workspaceagents/me/version" :
59
+ assert .Equal (t , r .Method , http .MethodPost )
56
60
w .WriteHeader (http .StatusOK )
57
61
return
58
62
case "/api/v2/workspaceagents/me/metadata" :
63
+ assert .Equal (t , r .Method , http .MethodGet )
59
64
httpapi .Write (ctx , w , http .StatusOK , codersdk.WorkspaceAgentMetadata {
60
65
DERPMap : derpMap ,
61
66
})
62
67
return
63
68
case "/api/v2/workspaceagents/me/coordinate" :
69
+ assert .Equal (t , r .Method , http .MethodGet )
64
70
ws , err := websocket .Accept (w , r , nil )
65
71
require .NoError (t , err )
66
72
conn := websocket .NetConn (ctx , ws , websocket .MessageBinary )
67
73
_ = coordinator .ServeAgent (conn , id )
68
74
return
69
75
case "/api/v2/workspaceagents/me/report-stats" :
76
+ assert .Equal (t , r .Method , http .MethodPost )
70
77
w .WriteHeader (http .StatusOK )
71
78
return
72
79
case "/" :
@@ -80,6 +87,8 @@ func TestVSCodeIPC(t *testing.T) {
80
87
srvURL , _ := url .Parse (srv .URL )
81
88
82
89
client := codersdk .New (srvURL )
90
+ token := uuid .New ().String ()
91
+ client .SetSessionToken (token )
83
92
agentConn := agent .New (agent.Options {
84
93
Client : client ,
85
94
Filesystem : afero .NewMemMapFs (),
@@ -99,6 +108,7 @@ func TestVSCodeIPC(t *testing.T) {
99
108
require .Eventually (t , func () bool {
100
109
res := httptest .NewRecorder ()
101
110
req := httptest .NewRequest (http .MethodGet , "/network" , nil )
111
+ req .Header .Set ("Coder-Session-Token" , token )
102
112
handler .ServeHTTP (res , req )
103
113
network := & vscodeipc.NetworkResponse {}
104
114
err = json .NewDecoder (res .Body ).Decode (& network )
@@ -109,6 +119,23 @@ func TestVSCodeIPC(t *testing.T) {
109
119
_ , port , err := net .SplitHostPort (srvURL .Host )
110
120
require .NoError (t , err )
111
121
122
+ t .Run ("NoSessionToken" , func (t * testing.T ) {
123
+ t .Parallel ()
124
+ res := httptest .NewRecorder ()
125
+ req := httptest .NewRequest (http .MethodGet , fmt .Sprintf ("/port/%s" , port ), nil )
126
+ handler .ServeHTTP (res , req )
127
+ require .Equal (t , http .StatusUnauthorized , res .Code )
128
+ })
129
+
130
+ t .Run ("MismatchedSessionToken" , func (t * testing.T ) {
131
+ t .Parallel ()
132
+ res := httptest .NewRecorder ()
133
+ req := httptest .NewRequest (http .MethodGet , fmt .Sprintf ("/port/%s" , port ), nil )
134
+ req .Header .Set ("Coder-Session-Token" , uuid .NewString ())
135
+ handler .ServeHTTP (res , req )
136
+ require .Equal (t , http .StatusUnauthorized , res .Code )
137
+ })
138
+
112
139
t .Run ("Port" , func (t * testing.T ) {
113
140
// Tests that the port endpoint can be used for forward traffic.
114
141
// For this test, we simply use the already listening httptest server.
@@ -118,6 +145,7 @@ func TestVSCodeIPC(t *testing.T) {
118
145
defer output .Close ()
119
146
res := & hijackable {httptest .NewRecorder (), output }
120
147
req := httptest .NewRequest (http .MethodGet , fmt .Sprintf ("/port/%s" , port ), nil )
148
+ req .Header .Set ("Coder-Session-Token" , token )
121
149
go handler .ServeHTTP (res , req )
122
150
123
151
req , err := http .NewRequestWithContext (ctx , http .MethodGet , "http://127.0.0.1/" , nil )
@@ -147,6 +175,7 @@ func TestVSCodeIPC(t *testing.T) {
147
175
Command : "echo test" ,
148
176
})
149
177
req := httptest .NewRequest (http .MethodPost , "/execute" , bytes .NewReader (data ))
178
+ req .Header .Set ("Coder-Session-Token" , token )
150
179
handler .ServeHTTP (res , req )
151
180
152
181
decoder := json .NewDecoder (res .Body )
0 commit comments