Merge branch 'master' into 9998-unsigned_manifest
authorTom Clegg <tom@curoverse.com>
Tue, 22 Nov 2016 18:35:06 +0000 (13:35 -0500)
committerTom Clegg <tom@curoverse.com>
Tue, 22 Nov 2016 18:35:06 +0000 (13:35 -0500)
Conflicts:
services/api/test/functional/arvados/v1/collections_controller_test.rb

1  2 
services/api/app/controllers/arvados/v1/collections_controller.rb
services/api/test/functional/arvados/v1/collections_controller_test.rb

index cda7d6b7584abc4f803bc9582a765db64ac16bbb,922cf7dac16b87741013c23e4073d4070a6fbe43..81accd8c5681ed06fbd10c6594719c941000bb5e
@@@ -31,8 -31,6 +31,8 @@@ class Arvados::V1::CollectionsControlle
  
    def show
      if @object.is_a? Collection
 +      # Omit unsigned_manifest_text
 +      @select ||= model_class.selectable_attributes - ["unsigned_manifest_text"]
        super
      else
        send_json @object
    protected
  
    def load_limit_offset_order_params *args
+     super
      if action_name == 'index'
 -      # Omit manifest_text from index results unless expressly selected.
 -      @select ||= model_class.selectable_attributes - ["manifest_text"]
 +      # Omit manifest_text and unsigned_manifest_text from index results unless expressly selected.
 +      @select ||= model_class.selectable_attributes - ["manifest_text", "unsigned_manifest_text"]
      end
-     super
    end
  end
index c0d63e0f301bfe97dffdfb6b8385a0cdb80c6a5a,c85cc1979f99482ff36ba6dc38ba5790ec7bf591..c285f8db20e825a74bff16022ba98f5058fc116c
@@@ -2,8 -2,6 +2,8 @@@ require 'test_helper
  
  class Arvados::V1::CollectionsControllerTest < ActionController::TestCase
  
 +  PERM_TOKEN_RE = /\+A[[:xdigit:]]+@[[:xdigit:]]{8}\b/
 +
    def permit_unsigned_manifests isok=true
      # Set security model for the life of a test.
      Rails.configuration.permit_create_collection_with_unsigned_manifest = isok
    def assert_signed_manifest manifest_text, label=''
      assert_not_nil manifest_text, "#{label} manifest_text was nil"
      manifest_text.scan(/ [[:xdigit:]]{32}\S*/) do |tok|
 -      assert_match(/\+A[[:xdigit:]]+@[[:xdigit:]]{8}\b/, tok,
 +      assert_match(PERM_TOKEN_RE, tok,
                     "Locator in #{label} manifest_text was not signed")
      end
    end
  
 +  def assert_unsigned_manifest resp, label=''
 +    txt = resp['unsigned_manifest_text']
 +    assert_not_nil(txt, "#{label} unsigned_manifest_text was nil")
 +    locs = 0
 +    txt.scan(/ [[:xdigit:]]{32}\S*/) do |tok|
 +      locs += 1
 +      refute_match(PERM_TOKEN_RE, tok,
 +                   "Locator in #{label} unsigned_manifest_text was signed: #{tok}")
 +    end
 +    return locs
 +  end
 +
    test "should get index" do
      authorize_with :active
      get :index
             "basic Collections index included manifest_text")
    end
  
 -  test "collections.get returns signed locators" do
 +  test "collections.get returns signed locators, and no unsigned_manifest_text" do
      permit_unsigned_manifests
      authorize_with :active
      get :show, {id: collections(:foo_file).uuid}
      assert_response :success
      assert_signed_manifest json_response['manifest_text'], 'foo_file'
 +    refute_includes json_response, 'unsigned_manifest_text'
    end
  
    test "index with manifest_text selected returns signed locators" do
      assert(assigns(:objects).andand.any?,
             "no Collections returned for index with columns selected")
      json_response["items"].each do |coll|
 -      assert_equal(columns, columns & coll.keys,
 +      assert_equal(coll.keys - ['kind'], columns,
                     "Collections index did not respect selected columns")
        assert_signed_manifest coll['manifest_text'], coll['uuid']
      end
    end
  
 +  test "index with unsigned_manifest_text selected returns only unsigned locators" do
 +    authorize_with :active
 +    get :index, select: ['unsigned_manifest_text']
 +    assert_response :success
 +    assert_operator json_response["items"].count, :>, 0
 +    locs = 0
 +    json_response["items"].each do |coll|
 +      assert_equal(coll.keys - ['kind'], ['unsigned_manifest_text'],
 +                   "Collections index did not respect selected columns")
 +      locs += assert_unsigned_manifest coll, coll['uuid']
 +    end
 +    assert_operator locs, :>, 0, "no locators found in any manifests"
 +  end
 +
+   test 'index without select returns everything except manifest' do
+     authorize_with :active
+     get :index
+     assert_response :success
+     assert json_response['items'].any?
+     json_response['items'].each do |coll|
+       assert_includes(coll.keys, 'uuid')
+       assert_includes(coll.keys, 'name')
+       assert_includes(coll.keys, 'created_at')
+       refute_includes(coll.keys, 'manifest_text')
+     end
+   end
+   ['', nil, false, 'null'].each do |select|
+     test "index with select=#{select.inspect} returns everything except manifest" do
+       authorize_with :active
+       get :index, select: select
+       assert_response :success
+       assert json_response['items'].any?
+       json_response['items'].each do |coll|
+         assert_includes(coll.keys, 'uuid')
+         assert_includes(coll.keys, 'name')
+         assert_includes(coll.keys, 'created_at')
+         refute_includes(coll.keys, 'manifest_text')
+       end
+     end
+   end
+   [["uuid"],
+    ["uuid", "manifest_text"],
+    '["uuid"]',
+    '["uuid", "manifest_text"]'].each do |select|
+     test "index with select=#{select.inspect} returns no name" do
+       authorize_with :active
+       get :index, select: select
+       assert_response :success
+       assert json_response['items'].any?
+       json_response['items'].each do |coll|
+         refute_includes(coll.keys, 'name')
+       end
+     end
+   end
    [0,1,2].each do |limit|
      test "get index with limit=#{limit}" do
        authorize_with :active