Skip to content

Commit b73b630

Browse files
author
khaled basbous
committed
fix(Deployment): Checks for subscription and access to cres and infras should be done as owner of the deployment
1 parent e5619a8 commit b73b630

8 files changed

Lines changed: 75 additions & 77 deletions

File tree

code/src/com/sixsq/nuvla/auth/utils.clj

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,49 @@
22
(:require
33
[clojure.string :as str]))
44

5-
65
(def ^{:doc "Internal administrator identity for database queries."}
76
internal-identity
87
{:user-id "internal"
98
:active-claim "group/nuvla-admin"
109
:claims #{"group/nuvla-admin" "group/nuvla-user" "group/nuvla-anon"}})
1110

11+
(defn get-internal-request
12+
[]
13+
{:nuvla/authn internal-identity})
14+
15+
(defn get-owner-authn
16+
[{:keys [owner] :as _resource}]
17+
{:claims #{owner "group/nuvla-user" "group/nuvla-anon"}
18+
:user-id owner
19+
:active-claim owner})
20+
21+
(defn get-owner-request
22+
[resource]
23+
{:nuvla/authn (get-owner-authn resource)})
24+
25+
(defn get-resource-id-authn
26+
[{id :id :as _resource}]
27+
{:claims #{id "group/nuvla-user" "group/nuvla-anon"}
28+
:user-id id
29+
:active-claim id})
1230

1331
(defn current-authentication
1432
"Extracts the current authentication from the ring request."
1533
[{:keys [nuvla/authn] :as _request}]
1634
(select-keys authn [:user-id :active-claim :claims]))
1735

18-
1936
(defn current-user-id
2037
[request]
2138
(:user-id (current-authentication request)))
2239

23-
2440
(defn current-active-claim
2541
[request]
2642
(:active-claim (current-authentication request)))
2743

28-
2944
(defn current-session-id
3045
[request]
3146
(->> request
3247
current-authentication
3348
:claims
3449
(filter #(str/starts-with? % "session/"))
3550
first))
36-
37-

code/src/com/sixsq/nuvla/server/resources/deployment.clj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,9 @@ a container orchestration engine.
297297
deployment (-> (crud/retrieve-by-id-as-admin id)
298298
(u/throw-cannot-do-action-invalid-state utils/can-start? "start")
299299
(utils/throw-when-payment-required request)
300-
(utils/throw-can-not-access-registries-creds request)
301-
(utils/throw-can-not-access-helm-repo-cred request)
302-
(utils/throw-can-not-access-helm-repo-url request))
300+
utils/throw-can-not-access-registries-creds
301+
utils/throw-can-not-access-helm-repo-cred
302+
utils/throw-can-not-access-helm-repo-url)
303303
stopped? (= (:state deployment) "STOPPED")
304304
user-rights? (get-in deployment [:module :content :requires-user-rights])
305305
data? (some? (:data deployment))
@@ -384,9 +384,9 @@ a container orchestration engine.
384384
(u/throw-cannot-do-action-invalid-state
385385
utils/can-update? "update_deployment")
386386
(utils/throw-when-payment-required request)
387-
(utils/throw-can-not-access-registries-creds request)
388-
(utils/throw-can-not-access-helm-repo-cred request)
389-
(utils/throw-can-not-access-helm-repo-url request))
387+
utils/throw-can-not-access-registries-creds
388+
utils/throw-can-not-access-helm-repo-cred
389+
utils/throw-can-not-access-helm-repo-url)
390390
new (-> current
391391
(assoc :state "UPDATING")
392392
(edit-deployment request))]

code/src/com/sixsq/nuvla/server/resources/deployment/utils.clj

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -175,25 +175,25 @@
175175
(resource-log/create-log id components acl opts)))
176176

177177
(defn throw-can-not-access-registries-creds
178-
[{:keys [registries-credentials] :as resource} request]
178+
[{:keys [registries-credentials] :as resource}]
179179
(let [preselected-creds (-> resource
180180
(get-in [:module :content :registries-credentials] [])
181181
set)
182182
creds-to-be-checked (set/difference (set registries-credentials) preselected-creds)]
183-
(module-utils/throw-cannot-access-registries-credentials creds-to-be-checked request)
183+
(module-utils/throw-cannot-access-registries-credentials creds-to-be-checked (auth/get-owner-request resource))
184184
resource))
185185

186186

187187
(defn throw-can-not-access-helm-repo-url
188-
[resource request]
188+
[resource]
189189
(let [helm-repo-url (get-in resource [:module :content :helm-repo-url])]
190-
(module-utils/throw-can-not-access-helm-repo-url helm-repo-url request)
190+
(module-utils/throw-can-not-access-helm-repo-url helm-repo-url (auth/get-owner-request resource))
191191
resource))
192192

193193
(defn throw-can-not-access-helm-repo-cred
194-
[resource request]
194+
[resource]
195195
(let [cred (get-in resource [:module :content :helm-repo-cred])]
196-
(module-utils/throw-can-not-access-helm-repo-cred cred request)
196+
(module-utils/throw-can-not-access-helm-repo-cred cred (auth/get-owner-request resource))
197197
resource))
198198

199199

@@ -291,20 +291,18 @@
291291
(seq files) (assoc :files files)))))
292292

293293
(defn throw-when-payment-required
294-
[{{:keys [price] :as module} :module :as deployment} request]
294+
[{{:keys [price] :as module} :module owner :owner :as deployment} request]
295295
(if (or (nil? config-nuvla/*stripe-api-key*)
296296
(a/is-admin? (auth/current-authentication request))
297-
(let [active-claim (auth/current-active-claim request)]
298-
(or
299-
(a/can-edit-data? module request)
300-
(case (:status (payment/active-claim->subscription active-claim))
301-
("active" "past_due") true
302-
"trialing" (or (nil? price)
303-
(:follow-customer-trial price)
304-
(-> active-claim
305-
payment/active-claim->s-customer
306-
payment/can-pay?))
307-
false))))
297+
(a/can-edit-data? module request)
298+
(case (:status (payment/active-claim->subscription owner))
299+
("active" "past_due") true
300+
"trialing" (or (nil? price)
301+
(:follow-customer-trial price)
302+
(-> owner
303+
payment/active-claim->s-customer
304+
payment/can-pay?))
305+
false))
308306
deployment
309307
(payment/throw-payment-required)))
310308

code/src/com/sixsq/nuvla/server/resources/deployment_set.clj

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -111,26 +111,6 @@ These resources represent a deployment set that regroups deployments.
111111
;; CRUD operations
112112
;;
113113

114-
(defn get-owner-authn
115-
[{:keys [owner] :as _resource}]
116-
{:claims #{owner "group/nuvla-user"}
117-
:user-id owner
118-
:active-claim owner})
119-
120-
(defn get-owner-request
121-
[resource]
122-
{:nuvla/authn (get-owner-authn resource)})
123-
124-
(defn get-dg-authn
125-
[{dg-id :id :as _resource}]
126-
{:claims [dg-id "group/nuvla-user"]
127-
:user-id dg-id
128-
:active-claim dg-id})
129-
130-
(defn get-internal-request
131-
[]
132-
{:nuvla/authn auth/internal-identity})
133-
134114
(defn load-resource-throw-not-allowed-action
135115
[{{:keys [uuid]} :params :as request}]
136116
(-> (str resource-type "/" uuid)
@@ -143,7 +123,7 @@ These resources represent a deployment set that regroups deployments.
143123
(divergence-map (load-resource-throw-not-allowed-action request) request))
144124
([{:keys [applications-sets] :as deployment-set} _request]
145125
(when (seq applications-sets)
146-
(let [owner-request (get-owner-request deployment-set)
126+
(let [owner-request (auth/get-owner-request deployment-set)
147127
applications-sets (-> deployment-set
148128
utils/get-applications-sets-href
149129
(crud/get-resource-throw-nok owner-request))
@@ -182,7 +162,7 @@ These resources represent a deployment set that regroups deployments.
182162

183163
(defn create-module-apps-set
184164
[{:keys [owner modules] :as resource} request]
185-
(let [modules-data (mapv #(retrieve-module-as % (get-owner-authn resource))
165+
(let [modules-data (mapv #(retrieve-module-as % (auth/get-owner-authn resource))
186166
(distinct modules))]
187167
(create-module
188168
{:path (str module-utils/project-apps-sets "/" (u/rand-uuid))
@@ -215,7 +195,7 @@ These resources represent a deployment set that regroups deployments.
215195
If :fleet is not specified, it is computed by querying edges satisfying the :fleet-filter.
216196
If both :fleet and :fleet-filter are specified, they are stored as-is, no consistency check is made."
217197
[{:keys [fleet fleet-filter overwrites] :as resource}]
218-
(let [owner-authn (get-owner-authn resource)
198+
(let [owner-authn (auth/get-owner-authn resource)
219199
owner-request {:nuvla/authn owner-authn}
220200
apps-set-id (create-module-apps-set resource owner-request)
221201
fleet (or fleet (map :id (some-> fleet-filter (utils/query-nuvlaboxes-as owner-authn))))]
@@ -266,10 +246,10 @@ These resources represent a deployment set that regroups deployments.
266246
(defn check-edges-permissions
267247
[{:keys [id] :as resource}]
268248
(let [fleet (get-in resource [:applications-sets 0 :overwrites 0 :fleet])
269-
missing-edges (utils/get-missing-edges resource (get-internal-request))
249+
missing-edges (utils/get-missing-edges resource (auth/get-internal-request))
270250
not-deleted-edges (set/difference (set fleet) (set missing-edges))
271251
cimi-filter (str "id=['" (str/join "','" not-deleted-edges) "']")
272-
retrieved-fleet (utils/query-nuvlaboxes-as cimi-filter (get-owner-authn resource))]
252+
retrieved-fleet (utils/query-nuvlaboxes-as cimi-filter (auth/get-owner-authn resource))]
273253
(when (not= (count not-deleted-edges) (count retrieved-fleet))
274254
(throw (r/ex-response "All edges must be visible to DG owner" 403 id)))
275255
resource))
@@ -278,7 +258,7 @@ These resources represent a deployment set that regroups deployments.
278258
[{:keys [id] :as resource}]
279259
(let [apps (get-in resource [:applications-sets 0 :overwrites 0 :applications])
280260
cimi-filter (str "id=['" (str/join "','" (map :id apps)) "']")
281-
retrieved-apps (utils/query-modules-as cimi-filter (get-owner-authn resource))]
261+
retrieved-apps (utils/query-modules-as cimi-filter (auth/get-owner-authn resource))]
282262
(when (not= (count apps) (count retrieved-apps))
283263
(throw (r/ex-response (str "All apps must be visible to DG owner : "
284264
(mapv :id apps)
@@ -316,8 +296,8 @@ These resources represent a deployment set that regroups deployments.
316296

317297
(defn authn-info-payload
318298
[resource]
319-
{:dg-owner-authn-info (get-owner-authn resource)
320-
:dg-authn-info (get-dg-authn resource)})
299+
{:dg-owner-authn-info (auth/get-owner-authn resource)
300+
:dg-authn-info (auth/get-resource-id-authn resource)})
321301

322302
(defn action-bulk
323303
[{:keys [id] :as resource} {{:keys [action]} :params :as request}]
@@ -361,7 +341,7 @@ These resources represent a deployment set that regroups deployments.
361341
(defmethod crud/do-action [resource-type utils/action-plan]
362342
[request]
363343
(let [deployment-set (load-resource-throw-not-allowed-action request)
364-
owner-request (get-owner-request deployment-set)
344+
owner-request (auth/get-owner-request deployment-set)
365345
applications-sets (-> deployment-set
366346
utils/get-applications-sets-href
367347
(crud/get-resource-throw-nok owner-request))]
@@ -370,7 +350,7 @@ These resources represent a deployment set that regroups deployments.
370350
(defmethod crud/do-action [resource-type utils/action-check-requirements]
371351
[request]
372352
(let [deployment-set (load-resource-throw-not-allowed-action request)
373-
owner-request (get-owner-request deployment-set)
353+
owner-request (auth/get-owner-request deployment-set)
374354
applications-sets (-> deployment-set
375355
utils/get-applications-sets-href
376356
(crud/get-resource-throw-nok owner-request))]

code/src/com/sixsq/nuvla/server/resources/deployment_set/utils.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@
406406

407407
(defn query-nuvlaboxes
408408
[cimi-filter request]
409-
(query-nuvlaboxes-as cimi-filter (:nuvla/authn request)))
409+
(query-nuvlaboxes-as cimi-filter (auth/current-authentication request)))
410410

411411
(defn get-missing-edges
412412
[deployment-set request]

code/test/com/sixsq/nuvla/server/resources/deployment/utils_test.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,4 @@
114114
[m-a m-b] {:arg1 [m-a m-b] :arg2 [m-a (assoc m-b :value "any")]})))
115115

116116
(deftest throw-can-not-access-helm-repo-cred
117-
(is (= (t/throw-can-not-access-helm-repo-cred {} {}) {})))
117+
(is (= (t/throw-can-not-access-helm-repo-cred {}) {})))

code/test/com/sixsq/nuvla/server/resources/deployment_set_lifecycle_test.clj

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,6 @@
3939
(def app6-id "module/64e8d02d-1b40-46d0-b1d8-2093024fc1d2")
4040
(def app7-id "module/1cefb94b-c527-4b8a-be5f-802b131c1a9e")
4141

42-
(def all-apps
43-
(mapv (fn [app-id] {:id app-id}) [app1-id app2-id app3-id app4-id app5-id app6-id app7-id]))
44-
4542
(def dep-apps-sets [{:id app5-id,
4643
:version 11,
4744
:overwrites
@@ -178,6 +175,14 @@
178175
:manage ["group/nuvla-admin"],
179176
:edit-meta ["group/nuvla-admin"]}})
180177

178+
(defn read-payload
179+
[payload]
180+
(-> payload
181+
json/read-str
182+
(update-in ["authn-info" "claims"] set)
183+
(update-in ["dg-authn-info" "claims"] set)
184+
(update-in ["dg-owner-authn-info" "claims"] set)))
185+
181186
(deftest plan-test
182187
(is (= (utils/plan u-deployment-set u-applications-sets-v11)
183188
#{{:app-set "set-1"
@@ -329,18 +334,20 @@
329334

330335
dep-set-url (str p/service-context resource-id)
331336
job-payload {"authn-info" {"active-claim" "user/jane"
332-
"claims" ["group/nuvla-anon"
333-
"user/jane"
334-
"group/nuvla-user"
335-
session-id]
337+
"claims" #{"group/nuvla-anon"
338+
"user/jane"
339+
"group/nuvla-user"
340+
session-id}
336341
"user-id" "user/jane"}
337342
"dg-authn-info" {"active-claim" resource-id
338-
"claims" [resource-id
339-
"group/nuvla-user"]
343+
"claims" #{resource-id
344+
"group/nuvla-user"
345+
"group/nuvla-anon"}
340346
"user-id" resource-id}
341347
"dg-owner-authn-info" {"active-claim" "user/jane"
342-
"claims" ["user/jane"
343-
"group/nuvla-user"]
348+
"claims" #{"group/nuvla-anon"
349+
"user/jane"
350+
"group/nuvla-user"}
344351
"user-id" "user/jane"}}]
345352

346353
(testing "user query should see one document"
@@ -614,7 +621,7 @@
614621
(ltu/is-status 200)
615622
(ltu/is-key-value :href :target-resource resource-id)
616623
(ltu/is-key-value :action "bulk_deployment_set_update")
617-
(ltu/is-key-value json/read-str :payload job-payload))))
624+
(ltu/is-key-value read-payload :payload job-payload))))
618625

619626
(testing "edit action is not allowed in a transitional state"
620627
(with-redefs [crud/get-resource-throw-nok
@@ -670,7 +677,7 @@
670677
(ltu/is-status 200)
671678
(ltu/is-key-value :href :target-resource resource-id)
672679
(ltu/is-key-value :action "bulk_deployment_set_update")
673-
(ltu/is-key-value json/read-str :payload job-payload))
680+
(ltu/is-key-value read-payload :payload job-payload))
674681
(testing "cancel action will cancel the running job"
675682
(let [cancel-op-url (-> session-user
676683
(request dep-set-url)
@@ -739,7 +746,7 @@
739746
(ltu/is-status 200)
740747
(ltu/is-key-value :href :target-resource resource-id)
741748
(ltu/is-key-value :action "bulk_deployment_set_stop")
742-
(ltu/is-key-value json/read-str :payload job-payload))
749+
(ltu/is-key-value read-payload :payload job-payload))
743750
(-> session-user
744751
(request dep-set-url)
745752
ltu/body->edn

code/test/com/sixsq/nuvla/server/resources/module_lifecycle_test.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@
657657
(lifecycle-test-module module-spec/subtype-app-helm valid-application)))
658658

659659
(deftest throw-can-not-access-helm-repo-cred
660-
(is (= (t/throw-can-not-access-helm-repo-cred {} {}) {})))
660+
(is (= (t/throw-can-not-access-helm-repo-cred {}) {})))
661661

662662
(deftest bad-methods
663663
(let [resource-uri (str p/service-context (u/new-resource-id module/resource-type))]

0 commit comments

Comments
 (0)