@@ -218,9 +218,22 @@ trait WhiskActionsApi extends WhiskCollectionAPI with PostActionActivation with
218
218
219
219
onComplete(checkAdditionalPrivileges) {
220
220
case Success (_) =>
221
- putEntity(WhiskAction , entityStore, entityName.toDocId, overwrite, update(user, request) _, () => {
222
- make(user, entityName, request)
223
- })
221
+ val operation = if (overwrite) " update" else " create"
222
+ onComplete(
223
+ entitlementProvider
224
+ .checkActionPermissions(
225
+ operation,
226
+ user,
227
+ entityStore,
228
+ entityName,
229
+ WhiskAction .get,
230
+ content.getPermissions())) {
231
+ case Success (_) =>
232
+ putEntity(WhiskAction , entityStore, entityName.toDocId, overwrite, update(user, request) _, () => {
233
+ make(user, entityName, request)
234
+ })
235
+ case Failure (f) => super .handleEntitlementFailure(f)
236
+ }
224
237
case Failure (f) =>
225
238
super .handleEntitlementFailure(f)
226
239
}
@@ -241,37 +254,43 @@ trait WhiskActionsApi extends WhiskCollectionAPI with PostActionActivation with
241
254
*/
242
255
override def activate (user : Identity , entityName : FullyQualifiedEntityName , env : Option [Parameters ])(
243
256
implicit transid : TransactionId ) = {
244
- parameter(
245
- ' blocking ? false ,
246
- ' result ? false ,
247
- ' timeout .as[FiniteDuration ] ? controllerActivationConfig.maxWaitForBlockingActivation) {
248
- (blocking, result, waitOverride) =>
249
- entity(as[Option [JsObject ]]) { payload =>
250
- getEntity(WhiskActionMetaData .resolveActionAndMergeParameters(entityStore, entityName), Some {
251
- act : WhiskActionMetaData =>
252
- // resolve the action --- special case for sequences that may contain components with '_' as default package
253
- val action = act.resolve(user.namespace)
254
- onComplete(entitleReferencedEntitiesMetaData(user, Privilege .ACTIVATE , Some (action.exec))) {
255
- case Success (_) =>
256
- val actionWithMergedParams = env.map(action.inherit(_)) getOrElse action
257
-
258
- // incoming parameters may not override final parameters (i.e., parameters with already defined values)
259
- // on an action once its parameters are resolved across package and binding
260
- val allowInvoke = payload
261
- .map(_.fields.keySet.forall(key => ! actionWithMergedParams.immutableParameters.contains(key)))
262
- .getOrElse(true )
257
+ onComplete(
258
+ entitlementProvider
259
+ .checkActionPermissions(" invoke" , user, entityStore, entityName, WhiskAction .get)) {
260
+ case Success (_) =>
261
+ parameter(
262
+ ' blocking ? false ,
263
+ ' result ? false ,
264
+ ' timeout .as[FiniteDuration ] ? controllerActivationConfig.maxWaitForBlockingActivation) {
265
+ (blocking, result, waitOverride) =>
266
+ entity(as[Option [JsObject ]]) { payload =>
267
+ getEntity(WhiskActionMetaData .resolveActionAndMergeParameters(entityStore, entityName), Some {
268
+ act : WhiskActionMetaData =>
269
+ // resolve the action --- special case for sequences that may contain components with '_' as default package
270
+ val action = act.resolve(user.namespace)
271
+ onComplete(entitleReferencedEntitiesMetaData(user, Privilege .ACTIVATE , Some (action.exec))) {
272
+ case Success (_) =>
273
+ val actionWithMergedParams = env.map(action.inherit(_)) getOrElse action
274
+
275
+ // incoming parameters may not override final parameters (i.e., parameters with already defined values)
276
+ // on an action once its parameters are resolved across package and binding
277
+ val allowInvoke = payload
278
+ .map(_.fields.keySet.forall(key => ! actionWithMergedParams.immutableParameters.contains(key)))
279
+ .getOrElse(true )
280
+
281
+ if (allowInvoke) {
282
+ doInvoke(user, actionWithMergedParams, payload, blocking, waitOverride, result)
283
+ } else {
284
+ terminate(BadRequest , Messages .parametersNotAllowed)
285
+ }
263
286
264
- if (allowInvoke) {
265
- doInvoke(user, actionWithMergedParams, payload, blocking, waitOverride, result)
266
- } else {
267
- terminate(BadRequest , Messages .parametersNotAllowed)
287
+ case Failure (f) =>
288
+ super .handleEntitlementFailure(f)
268
289
}
269
-
270
- case Failure (f) =>
271
- super .handleEntitlementFailure(f)
272
- }
273
- })
290
+ })
291
+ }
274
292
}
293
+ case Failure (f) => super .handleEntitlementFailure(f)
275
294
}
276
295
}
277
296
@@ -333,11 +352,17 @@ trait WhiskActionsApi extends WhiskCollectionAPI with PostActionActivation with
333
352
* - 500 Internal Server Error
334
353
*/
335
354
override def remove (user : Identity , entityName : FullyQualifiedEntityName )(implicit transid : TransactionId ) = {
336
- deleteEntity(WhiskAction , entityStore, entityName.toDocId, (a : WhiskAction ) => Future .successful({}))
355
+ onComplete(
356
+ entitlementProvider
357
+ .checkActionPermissions(" remove" , user, entityStore, entityName, WhiskAction .get)) {
358
+ case Success (_) =>
359
+ deleteEntity(WhiskAction , entityStore, entityName.toDocId, (a : WhiskAction ) => Future .successful({}))
360
+ case Failure (f) => super .handleEntitlementFailure(f)
361
+ }
337
362
}
338
363
339
364
/** Checks for package binding case. we don't want to allow get for a package binding in shared package */
340
- private def fetchEntity (entityName : FullyQualifiedEntityName , env : Option [Parameters ], code : Boolean )(
365
+ private def fetchEntity (user : Identity , entityName : FullyQualifiedEntityName , env : Option [Parameters ], code : Boolean )(
341
366
implicit transid : TransactionId ) = {
342
367
val resolvedPkg : Future [Either [String , FullyQualifiedEntityName ]] = if (entityName.path.defaultPackage) {
343
368
Future .successful(Right (entityName))
@@ -357,13 +382,19 @@ trait WhiskActionsApi extends WhiskCollectionAPI with PostActionActivation with
357
382
case Left (f) => terminate(Forbidden , f)
358
383
case Right (_) =>
359
384
if (code) {
360
- getEntity(WhiskAction .resolveActionAndMergeParameters(entityStore, entityName), Some {
361
- action : WhiskAction =>
362
- val mergedAction = env map {
363
- action inherit _
364
- } getOrElse action
365
- complete(OK , mergedAction)
366
- })
385
+ onComplete(
386
+ entitlementProvider
387
+ .checkActionPermissions(" download" , user, entityStore, entityName, WhiskAction .get)) {
388
+ case Success (_) =>
389
+ getEntity(WhiskAction .resolveActionAndMergeParameters(entityStore, entityName), Some {
390
+ action : WhiskAction =>
391
+ val mergedAction = env map {
392
+ action inherit _
393
+ } getOrElse action
394
+ complete(OK , mergedAction)
395
+ })
396
+ case Failure (f) => super .handleEntitlementFailure(f)
397
+ }
367
398
} else {
368
399
getEntity(WhiskActionMetaData .resolveActionAndMergeParameters(entityStore, entityName), Some {
369
400
action : WhiskActionMetaData =>
@@ -396,7 +427,7 @@ trait WhiskActionsApi extends WhiskCollectionAPI with PostActionActivation with
396
427
if (executeOnly && user.namespace.name != entityName.namespace) {
397
428
terminate(Forbidden , forbiddenGetAction(entityName.path.asString))
398
429
} else {
399
- fetchEntity(entityName, env, code)
430
+ fetchEntity(user, entityName, env, code)
400
431
}
401
432
}
402
433
}
0 commit comments