You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by du...@apache.org on 2017/11/15 20:30:58 UTC

[incubator-openwhisk] branch master updated: Reject requests to create packages having the name 'default' (#2964)

This is an automated email from the ASF dual-hosted git repository.

dubeejw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk.git


The following commit(s) were added to refs/heads/master by this push:
     new e79e6e3  Reject requests to create packages having the name 'default' (#2964)
e79e6e3 is described below

commit e79e6e327953ecf082dd11a3247c13ad31d8186d
Author: Mark Deuser <md...@us.ibm.com>
AuthorDate: Wed Nov 15 15:30:55 2017 -0500

    Reject requests to create packages having the name 'default' (#2964)
    
    * Reject requests to create packages having the name 'default'
    
    * Comment updates
---
 .../src/main/scala/whisk/http/ErrorResponse.scala  |  3 ++
 .../scala/whisk/core/controller/Packages.scala     | 40 +++++++++++++---------
 .../core/controller/test/PackagesApiTests.scala    | 29 +++++++++++++++-
 3 files changed, 54 insertions(+), 18 deletions(-)

diff --git a/common/scala/src/main/scala/whisk/http/ErrorResponse.scala b/common/scala/src/main/scala/whisk/http/ErrorResponse.scala
index 5130578..f8d948d 100644
--- a/common/scala/src/main/scala/whisk/http/ErrorResponse.scala
+++ b/common/scala/src/main/scala/whisk/http/ErrorResponse.scala
@@ -106,6 +106,9 @@ object Messages {
   val bindingCannotReferenceBinding = "Cannot bind to another package binding."
   val requestedBindingIsNotValid = "Cannot bind to a resource that is not a package."
   val notAllowedOnBinding = "Operation not permitted on package binding."
+  def packageNameIsReserved(name: String) = {
+    s"Package name '$name' is reserved."
+  }
 
   /** Error messages for sequence activations. */
   def sequenceRetrieveActivationTimeout(id: ActivationId) =
diff --git a/core/controller/src/main/scala/whisk/core/controller/Packages.scala b/core/controller/src/main/scala/whisk/core/controller/Packages.scala
index 4ea7657..e97f316 100644
--- a/core/controller/src/main/scala/whisk/core/controller/Packages.scala
+++ b/core/controller/src/main/scala/whisk/core/controller/Packages.scala
@@ -43,6 +43,8 @@ trait WhiskPackagesApi extends WhiskCollectionAPI with ReferencedEntities {
 
   protected override val collection = Collection(Collection.PACKAGES)
 
+  protected[core] val RESERVED_NAMES = Array("default")
+
   /** Database service to CRUD packages. */
   protected val entityStore: EntityStore
 
@@ -76,25 +78,29 @@ trait WhiskPackagesApi extends WhiskCollectionAPI with ReferencedEntities {
    */
   override def create(user: Identity, entityName: FullyQualifiedEntityName)(implicit transid: TransactionId) = {
     parameter('overwrite ? false) { overwrite =>
-      entity(as[WhiskPackagePut]) { content =>
-        val request = content.resolve(entityName.namespace)
+      if (!overwrite && (RESERVED_NAMES contains entityName.name.asString)) {
+        terminate(BadRequest, Messages.packageNameIsReserved(entityName.name.asString))
+      } else {
+        entity(as[WhiskPackagePut]) { content =>
+          val request = content.resolve(entityName.namespace)
 
-        request.binding.map { b =>
-          logging.info(this, "checking if package is accessible")
-        }
-        val referencedentities = referencedEntities(request)
+          request.binding.map { b =>
+            logging.info(this, "checking if package is accessible")
+          }
+          val referencedentities = referencedEntities(request)
 
-        onComplete(entitlementProvider.check(user, Privilege.READ, referencedentities)) {
-          case Success(_) =>
-            putEntity(
-              WhiskPackage,
-              entityStore,
-              entityName.toDocId,
-              overwrite,
-              update(request) _,
-              () => create(request, entityName))
-          case Failure(f) =>
-            rewriteEntitlementFailure(f)
+          onComplete(entitlementProvider.check(user, Privilege.READ, referencedentities)) {
+            case Success(_) =>
+              putEntity(
+                WhiskPackage,
+                entityStore,
+                entityName.toDocId,
+                overwrite,
+                update(request) _,
+                () => create(request, entityName))
+            case Failure(f) =>
+              rewriteEntitlementFailure(f)
+          }
         }
       }
     }
diff --git a/tests/src/test/scala/whisk/core/controller/test/PackagesApiTests.scala b/tests/src/test/scala/whisk/core/controller/test/PackagesApiTests.scala
index 54e20e7..aad482d 100644
--- a/tests/src/test/scala/whisk/core/controller/test/PackagesApiTests.scala
+++ b/tests/src/test/scala/whisk/core/controller/test/PackagesApiTests.scala
@@ -41,7 +41,6 @@ import whisk.http.Messages
  * These tests exercise a fresh instance of the service object in memory -- these
  * tests do NOT communication with a whisk deployment.
  *
- *
  * @Idioglossia
  * "using Specification DSL to write unit tests, as in should, must, not, be"
  * "using Specs2RouteTest DSL to chain HTTP requests for unit testing, as in ~>"
@@ -370,6 +369,34 @@ class PackagesApiTests extends ControllerTestCommon with WhiskPackagesApi {
     }
   }
 
+  it should "reject create package when package name is a reserved name" in {
+    implicit val tid = transid()
+    RESERVED_NAMES foreach { reservedName =>
+      val provider = WhiskPackage(namespace, EntityName(s"$reservedName"), None)
+      val content = WhiskPackagePut()
+      Put(s"$collectionPath/${provider.name}", content) ~> Route.seal(routes(creds)) ~> check {
+        status should be(BadRequest)
+        val response = responseAs[String]
+        response should include {
+          Messages.packageNameIsReserved(reservedName)
+        }
+      }
+    }
+  }
+
+  it should "allow package update even when package name a reserved name" in {
+    implicit val tid = transid()
+    RESERVED_NAMES foreach { reservedName =>
+      val provider = WhiskPackage(namespace, EntityName(s"$reservedName"), None)
+      val content = WhiskPackagePut()
+      Put(s"$collectionPath/${provider.name}?overwrite=true", content) ~> Route.seal(routes(creds)) ~> check {
+        status should be(OK)
+        val response = responseAs[WhiskPackage]
+        response should be(provider)
+      }
+    }
+  }
+
   it should "create package reference with explicit namespace" in {
     implicit val tid = transid()
     val provider = WhiskPackage(namespace, aname())

-- 
To stop receiving notification emails like this one, please contact
['"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>'].