Fix UserParameters#without being a no-op#7070
Conversation
#without compared symbol keys (its only caller, CreateCasaAdminService#build, always passes symbols) against ActionController::Parameters#reject!'s string keys, so the block condition was always false and nothing was ever removed. It also didn't return self, breaking the builder chain. This let :active and :type survive into CasaAdmin.new via CreateCasaAdminService#build, letting any authenticated user set active=false on a new admin, or trigger an unrescued ActiveRecord::SubclassNotFound (500) by passing type=<sibling class>. Fixes rubyforgood#7067 Also replaces the pending spec stub in spec/values/user_parameters_spec.rb with real coverage of without, without_type, without_active, with_organization, and with_password.
|
Nice, thanks for jumping on this. The fix looks right. One heads-up on overlap. I opened this issue while doing the Since the only overlap is this one file, maybe the cleanest split is this: let #7068 land the coverage first, then rebase this PR to keep the |
Summary
Fixes #7067 —
UserParameters#withoutcompared symbol keys againstActionController::Parameters#reject!'s string keys, so its condition was always false and the method silently removed nothing. It also didn't returnself, breaking the builder chain.The only caller,
CreateCasaAdminService#build, calls.without(:active, :type)expecting both to be stripped beforeCasaAdmin.new. Because the call was a no-op:active=falseon a new admin via an extra field in the create request (DB default istrue).type=<sibling class>raised an unrescuedActiveRecord::SubclassNotFound(500), since Rails' STI guard is the only thing preventing type escalation.Fix
withoutnow stringifies the incoming keys before comparing (matching howreject!yields keys), and returnsselfso it can still be chained.Also replaces the pending stub in
spec/values/user_parameters_spec.rbwith real coverage forwithout,without_type,without_active,with_organization, andwith_password.Test plan
bundle exec rspec spec/values/user_parameters_spec.rbPOST /casa_adminswith an extratypeoractivefield no longer leaks through