end
def assert_properties(test_method, event, props, *keys)
- verb = (test_method == :assert_nil) ? 'not include' : 'include'
+ verb = (test_method == :assert_nil) ? 'have nil' : 'define'
keys.each do |prop_name|
+ assert_includes(props, prop_name, "log properties missing #{prop_name}")
self.send(test_method, props[prop_name],
"#{event.to_s} log should #{verb} #{prop_name}")
end
"log is not 'modified by' current user")
assert_equal(current_api_client.andand.uuid, log.modified_by_client_uuid,
"log is not 'modified by' current client")
- assert_equal(thing.kind, log.object_kind, "log kind mismatch")
assert_equal(thing.uuid, log.object_uuid, "log UUID mismatch")
assert_equal(event_type.to_s, log.event_type, "log event type mismatch")
time_method, old_props_test, new_props_test = EVENT_TEST_METHODS[event_type]
yield props if block_given?
end
+ def assert_auth_logged_with_clean_properties(auth, event_type)
+ assert_logged(auth, event_type) do |props|
+ ['old_attributes', 'new_attributes'].map { |k| props[k] }.compact
+ .each do |attributes|
+ refute_includes(attributes, 'api_token',
+ "auth log properties include sensitive API token")
+ end
+ yield props if block_given?
+ end
+ end
+
def set_user_from_auth(auth_name)
client_auth = api_client_authorizations(auth_name)
Thread.current[:api_client_authorization] = client_auth
auth = api_client_authorizations(:spectator)
orig_etag = auth.etag
orig_attrs = auth.attributes
+ orig_attrs.delete 'api_token'
auth.destroy
assert_logged(auth, :destroy) do |props|
assert_equal(orig_etag, props['old_etag'], "destroyed auth etag mismatch")
"log count changed after 'using' ApiClientAuthorization")
auth.created_by_ip_address = '::1'
auth.save!
- assert_equal(start_log_count + 1, get_logs_about(auth).size,
- "no log after changed stable ApiClientAuthorization attribute")
+ assert_logged(auth, :update)
+ end
+
+ test "token isn't included in ApiClientAuthorization logs" do
+ set_user_from_auth :admin_trustedclient
+ auth = ApiClientAuthorization.new
+ auth.user = users(:spectator)
+ auth.api_client = api_clients(:untrusted)
+ auth.save!
+ assert_auth_logged_with_clean_properties(auth, :create)
+ auth.expires_at = Time.now
+ auth.save!
+ assert_auth_logged_with_clean_properties(auth, :update)
+ auth.destroy
+ assert_auth_logged_with_clean_properties(auth, :destroy)
+ end
+
+ test "use ownership and permission links to determine which logs a user can see" do
+ c = Log.readable_by(users(:admin)).order("id asc").each.to_a
+ assert_equal 5, c.size
+ assert_equal 1, c[0].id # no-op
+ assert_equal 2, c[1].id # admin changes repository foo, which is owned by active user
+ assert_equal 3, c[2].id # admin changes specimen owned_by_spectator
+ assert_equal 4, c[3].id # foo collection added, readable by active through link
+ assert_equal 5, c[4].id # baz collection added, readable by active and spectator through group 'all users' group membership
+
+ c = Log.readable_by(users(:active)).order("id asc").each.to_a
+ assert_equal 3, c.size
+ assert_equal 2, c[0].id # admin changes repository foo, which is owned by active user
+ assert_equal 4, c[1].id # foo collection added, readable by active through link
+ assert_equal 5, c[2].id # baz collection added, readable by active and spectator through group 'all users' group membership
+
+ c = Log.readable_by(users(:spectator)).order("id asc").each.to_a
+ assert_equal 2, c.size
+ assert_equal 3, c[0].id # admin changes specimen owned_by_spectator
+ assert_equal 5, c[1].id # baz collection added, readable by active and spectator through group 'all users' group membership
end
end