1
1
package application
2
2
3
3
import (
4
+ "context"
4
5
"encoding/json"
5
- "github.com/gorilla/websocket"
6
- "github.com/stretchr/testify/assert"
7
6
"net/http"
8
7
"net/http/httptest"
9
8
"strings"
10
9
"testing"
10
+
11
+ v1 "k8s.io/api/core/v1"
12
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13
+ "k8s.io/client-go/kubernetes/fake"
14
+
15
+ "github.com/argoproj/argo-cd/v2/common"
16
+ "github.com/argoproj/argo-cd/v2/util/assets"
17
+ "github.com/argoproj/argo-cd/v2/util/rbac"
18
+
19
+ "github.com/golang-jwt/jwt/v4"
20
+ "github.com/gorilla/websocket"
21
+ "github.com/stretchr/testify/assert"
22
+ "github.com/stretchr/testify/require"
11
23
)
12
24
13
- func reconnect (w http.ResponseWriter , r * http.Request ) {
25
+ func newTestTerminalSession (w http.ResponseWriter , r * http.Request ) terminalSession {
14
26
var upgrader = websocket.Upgrader {}
15
27
c , err := upgrader .Upgrade (w , r , nil )
16
28
if err != nil {
17
- return
29
+ return terminalSession {}
18
30
}
19
31
20
- ts := terminalSession {wsConn : c }
32
+ return terminalSession {wsConn : c }
33
+ }
34
+
35
+ func newEnforcer () * rbac.Enforcer {
36
+ additionalConfig := make (map [string ]string , 0 )
37
+ kubeclientset := fake .NewSimpleClientset (& v1.ConfigMap {
38
+ ObjectMeta : metav1.ObjectMeta {
39
+ Namespace : testNamespace ,
40
+ Name : "argocd-cm" ,
41
+ Labels : map [string ]string {
42
+ "app.kubernetes.io/part-of" : "argocd" ,
43
+ },
44
+ },
45
+ Data : additionalConfig ,
46
+ }, & v1.Secret {
47
+ ObjectMeta : metav1.ObjectMeta {
48
+ Name : "argocd-secret" ,
49
+ Namespace : testNamespace ,
50
+ },
51
+ Data : map [string ][]byte {
52
+ "admin.password" : []byte ("test" ),
53
+ "server.secretkey" : []byte ("test" ),
54
+ },
55
+ })
56
+
57
+ enforcer := rbac .NewEnforcer (kubeclientset , testNamespace , common .ArgoCDRBACConfigMapName , nil )
58
+ return enforcer
59
+ }
60
+
61
+ func reconnect (w http.ResponseWriter , r * http.Request ) {
62
+ ts := newTestTerminalSession (w , r )
21
63
_ , _ = ts .reconnect ()
22
64
}
23
65
@@ -44,3 +86,71 @@ func TestReconnect(t *testing.T) {
44
86
assert .Equal (t , message .Data , ReconnectMessage )
45
87
46
88
}
89
+
90
+ func TestValidateWithAdminPermissions (t * testing.T ) {
91
+ validate := func (w http.ResponseWriter , r * http.Request ) {
92
+ enf := newEnforcer ()
93
+ _ = enf .SetBuiltinPolicy (assets .BuiltinPolicyCSV )
94
+ enf .SetDefaultRole ("role:admin" )
95
+ enf .SetClaimsEnforcerFunc (func (claims jwt.Claims , rvals ... interface {}) bool {
96
+ return true
97
+ })
98
+ ts := newTestTerminalSession (w , r )
99
+ ts .enf = enf
100
+ ts .appRBACName = "test"
101
+ // nolint:staticcheck
102
+ ts .ctx = context .WithValue (context .Background (), "claims" , & jwt.MapClaims {"groups" : []string {"admin" }})
103
+ _ , err := ts .validatePermissions ([]byte {})
104
+ require .NoError (t , err )
105
+ }
106
+
107
+ s := httptest .NewServer (http .HandlerFunc (validate ))
108
+ defer s .Close ()
109
+
110
+ u := "ws" + strings .TrimPrefix (s .URL , "http" )
111
+
112
+ // Connect to the server
113
+ ws , _ , err := websocket .DefaultDialer .Dial (u , nil )
114
+ require .NoError (t , err )
115
+
116
+ defer ws .Close ()
117
+ }
118
+
119
+ func TestValidateWithoutPermissions (t * testing.T ) {
120
+ validate := func (w http.ResponseWriter , r * http.Request ) {
121
+ enf := newEnforcer ()
122
+ _ = enf .SetBuiltinPolicy (assets .BuiltinPolicyCSV )
123
+ enf .SetDefaultRole ("role:test" )
124
+ enf .SetClaimsEnforcerFunc (func (claims jwt.Claims , rvals ... interface {}) bool {
125
+ return false
126
+ })
127
+ ts := newTestTerminalSession (w , r )
128
+ ts .enf = enf
129
+ ts .appRBACName = "test"
130
+ // nolint:staticcheck
131
+ ts .ctx = context .WithValue (context .Background (), "claims" , & jwt.MapClaims {"groups" : []string {"test" }})
132
+ _ , err := ts .validatePermissions ([]byte {})
133
+ require .Error (t , err )
134
+ assert .Equal (t , permissionDeniedErr .Error (), err .Error ())
135
+ }
136
+
137
+ s := httptest .NewServer (http .HandlerFunc (validate ))
138
+ defer s .Close ()
139
+
140
+ u := "ws" + strings .TrimPrefix (s .URL , "http" )
141
+
142
+ // Connect to the server
143
+ ws , _ , err := websocket .DefaultDialer .Dial (u , nil )
144
+ require .NoError (t , err )
145
+
146
+ defer ws .Close ()
147
+
148
+ _ , p , _ := ws .ReadMessage ()
149
+
150
+ var message TerminalMessage
151
+
152
+ err = json .Unmarshal (p , & message )
153
+
154
+ require .NoError (t , err )
155
+ assert .Equal (t , "Permission denied" , message .Data )
156
+ }
0 commit comments