@@ -209,13 +209,25 @@ trait WhiskActionsApi extends WhiskCollectionAPI with PostActionActivation with
209
209
val checkAdditionalPrivileges = entitleReferencedEntities(user, Privilege .READ , request.exec).flatMap {
210
210
case _ => entitlementProvider.check(user, content.exec)
211
211
}
212
- val unlock = content.unlock.getOrElse(false )
213
212
214
213
onComplete(checkAdditionalPrivileges) {
215
214
case Success (_) =>
216
- putEntity(WhiskAction , entityStore, entityName.toDocId, overwrite, update(user, request) _, () => {
217
- make(user, entityName, request)
218
- }, unlock = unlock)
215
+ val operation = if (overwrite) " update" else " create"
216
+ onComplete(
217
+ entitlementProvider
218
+ .checkActionPermissions(
219
+ operation,
220
+ user,
221
+ entityStore,
222
+ entityName,
223
+ WhiskAction .get,
224
+ content.getPermissions())) {
225
+ case Success (_) =>
226
+ putEntity(WhiskAction , entityStore, entityName.toDocId, overwrite, update(user, request) _, () => {
227
+ make(user, entityName, request)
228
+ })
229
+ case Failure (f) => super .handleEntitlementFailure(f)
230
+ }
219
231
case Failure (f) =>
220
232
super .handleEntitlementFailure(f)
221
233
}
@@ -236,37 +248,43 @@ trait WhiskActionsApi extends WhiskCollectionAPI with PostActionActivation with
236
248
*/
237
249
override def activate (user : Identity , entityName : FullyQualifiedEntityName , env : Option [Parameters ])(
238
250
implicit transid : TransactionId ) = {
239
- parameter(
240
- ' blocking ? false ,
241
- ' result ? false ,
242
- ' timeout .as[FiniteDuration ] ? controllerActivationConfig.maxWaitForBlockingActivation) {
243
- (blocking, result, waitOverride) =>
244
- entity(as[Option [JsObject ]]) { payload =>
245
- getEntity(WhiskActionMetaData .resolveActionAndMergeParameters(entityStore, entityName), Some {
246
- act : WhiskActionMetaData =>
247
- // resolve the action --- special case for sequences that may contain components with '_' as default package
248
- val action = act.resolve(user.namespace)
249
- onComplete(entitleReferencedEntitiesMetaData(user, Privilege .ACTIVATE , Some (action.exec))) {
250
- case Success (_) =>
251
- val actionWithMergedParams = env.map(action.inherit(_)) getOrElse action
252
-
253
- // incoming parameters may not override final parameters (i.e., parameters with already defined values)
254
- // on an action once its parameters are resolved across package and binding
255
- val allowInvoke = payload
256
- .map(_.fields.keySet.forall(key => ! actionWithMergedParams.immutableParameters.contains(key)))
257
- .getOrElse(true )
258
-
259
- if (allowInvoke) {
260
- doInvoke(user, actionWithMergedParams, payload, blocking, waitOverride, result)
261
- } else {
262
- terminate(BadRequest , Messages .parametersNotAllowed)
263
- }
251
+ onComplete(
252
+ entitlementProvider
253
+ .checkActionPermissions(" invoke" , user, entityStore, entityName, WhiskAction .get)) {
254
+ case Success (_) =>
255
+ parameter(
256
+ ' blocking ? false ,
257
+ ' result ? false ,
258
+ ' timeout .as[FiniteDuration ] ? controllerActivationConfig.maxWaitForBlockingActivation) {
259
+ (blocking, result, waitOverride) =>
260
+ entity(as[Option [JsObject ]]) { payload =>
261
+ getEntity(WhiskActionMetaData .resolveActionAndMergeParameters(entityStore, entityName), Some {
262
+ act : WhiskActionMetaData =>
263
+ // resolve the action --- special case for sequences that may contain components with '_' as default package
264
+ val action = act.resolve(user.namespace)
265
+ onComplete(entitleReferencedEntitiesMetaData(user, Privilege .ACTIVATE , Some (action.exec))) {
266
+ case Success (_) =>
267
+ val actionWithMergedParams = env.map(action.inherit(_)) getOrElse action
268
+
269
+ // incoming parameters may not override final parameters (i.e., parameters with already defined values)
270
+ // on an action once its parameters are resolved across package and binding
271
+ val allowInvoke = payload
272
+ .map(_.fields.keySet.forall(key => ! actionWithMergedParams.immutableParameters.contains(key)))
273
+ .getOrElse(true )
274
+
275
+ if (allowInvoke) {
276
+ doInvoke(user, actionWithMergedParams, payload, blocking, waitOverride, result)
277
+ } else {
278
+ terminate(BadRequest , Messages .parametersNotAllowed)
279
+ }
264
280
265
- case Failure (f) =>
266
- super .handleEntitlementFailure(f)
267
- }
268
- })
281
+ case Failure (f) =>
282
+ super .handleEntitlementFailure(f)
283
+ }
284
+ })
285
+ }
269
286
}
287
+ case Failure (f) => super .handleEntitlementFailure(f)
270
288
}
271
289
}
272
290
@@ -328,7 +346,13 @@ trait WhiskActionsApi extends WhiskCollectionAPI with PostActionActivation with
328
346
* - 500 Internal Server Error
329
347
*/
330
348
override def remove (user : Identity , entityName : FullyQualifiedEntityName )(implicit transid : TransactionId ) = {
331
- deleteEntity(WhiskAction , entityStore, entityName.toDocId, (a : WhiskAction ) => Future .successful({}))
349
+ onComplete(
350
+ entitlementProvider
351
+ .checkActionPermissions(" remove" , user, entityStore, entityName, WhiskAction .get)) {
352
+ case Success (_) =>
353
+ deleteEntity(WhiskAction , entityStore, entityName.toDocId, (a : WhiskAction ) => Future .successful({}))
354
+ case Failure (f) => super .handleEntitlementFailure(f)
355
+ }
332
356
}
333
357
334
358
/**
@@ -554,9 +578,7 @@ trait WhiskActionsApi extends WhiskCollectionAPI with PostActionActivation with
554
578
content.version getOrElse action.version.upPatch,
555
579
content.publish getOrElse action.publish,
556
580
WhiskActionsApi
557
- .amendAnnotations(content.annotations getOrElse action.annotations, exec, create = false ) ++ content.unlock
558
- .map(u => Parameters (WhiskAction .lockFieldName, JsBoolean (! u)))
559
- .getOrElse(Parameters ()))
581
+ .amendAnnotations(content.annotations getOrElse action.annotations, exec, create = false ))
560
582
.revision[WhiskAction ](action.docinfo.rev)
561
583
}
562
584
0 commit comments