Wednesday, September 23, 2026
4 changes · 19.0
Security fixes and vulnerability patches
This pull request fixes several issues in Odoo’s core processing tools, including safer handling of emails, images, logs, templates, profiling, and test data generation. It reduces the risk of credential leaks, improves resilience against malformed or heavy inputs, and prevents user-facing errors in common backend operations.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents referrers from downloading attachments for referred applicants when they are not otherwise allowed to access those applicant records. It protects sensitive recruitment documents by ensuring job-level attachment lists only include applicants visible to the current user.
Original PR description
Issue: ---------------------------------------- A referrer could open and download the attachments of an applicant they referred without any right to see that applicant's. Steps to reproduce:…
Issue: ---------------------------------------- A referrer could open and download the attachments of an applicant they referred without any right to see that applicant's. Steps to reproduce: ---------------------------------------- - Install hr_recruitment and hr_referral - Create two applicants for the same job position - Make another user the interviewer of the first one and the referrer of the second - Add an attachment to the second user - Connect as this user - In recruitment, go to the job position page - Click on the attachment button at the top - The user can download the attachment even though they can't access the applicant because they aren't their interviewer Cause: ---------------------------------------- The rule `hr_applicant_referral_user_rule` gives a referrer read access to the `hr.applicant` record they referred, so we can show them a few safe fields (`partner_name`, `job_id`, etc.). But they cannot see the applicant because of the field `is_accessible_to_current_user` added in `hr_referral` to prevent access to non interviewer users. `action_open_attachments` lists attachments of every application on the job from `application_ids`, without checking `is_accessible_to_current_user`, so it leaks attachments of applications the current user can only access as a referrer. Solution: ---------------------------------------- Create `_get_attachments_domain()` which will check `is_accessible_to_current_user` with an override in `hr_referral`. opw-6446049 Forward-Port-Of: odoo/odoo#288236 Forward-Port-Of: odoo/odoo#283547
This fix prevents referral users from opening or downloading attachments for job applicants they are not allowed to access. It protects sensitive recruitment documents by ensuring job-level attachment lists only include applicants visible to the current user.
Original PR description
Issue: ---------------------------------------- A referrer could open and download the attachments of an applicant they referred without any right to see that applicant's. Steps to reproduce:…
Issue: ---------------------------------------- A referrer could open and download the attachments of an applicant they referred without any right to see that applicant's. Steps to reproduce: ---------------------------------------- - Install hr_recruitment and hr_referral - Create two applicants for the same job position - Make another user the interviewer of the first one and the referrer of the second - Add an attachment to the second user - Connect as this user - In recruitment, go to the job position page - Click on the attachment button at the top - The user can download the attachment even though they can't access the applicant because they aren't their interviewer Cause: ---------------------------------------- The rule `hr_applicant_referral_user_rule` gives a referrer read access to the `hr.applicant` record they referred, so we can show them a few safe fields (`partner_name`, `job_id`, etc.). But they cannot see the applicant because of the field `is_accessible_to_current_user` added in `hr_referral` to prevent access to non interviewer users. `action_open_attachments` lists attachments of every application on the job from `application_ids`, without checking `is_accessible_to_current_user`, so it leaks attachments of applications the current user can only access as a referrer. Solution: ---------------------------------------- Create `_get_attachments_domain()` which will check `is_accessible_to_current_user` with an override in `hr_referral`. opw-6446049 Forward-Port-Of: odoo/enterprise#131519 Forward-Port-Of: odoo/enterprise#128597
Resolved issues and error corrections
Fixed an issue where Planning could show an access error when scheduling shifts for users working with multiple companies. The overlap check now only considers shifts from companies the user can currently access, preventing crashes and avoiding exposure of restricted company data.
Original PR description
Steps to Reproduce --- 1. Log in as a user with access to multiple companies (e.g., Company A and Company B). 2. Ensure both companies are ticked in the top-right multi-company widget. 3. In the…
Steps to Reproduce --- 1. Log in as a user with access to multiple companies (e.g., Company A and Company B). 2. Ensure both companies are ticked in the top-right multi-company widget. 3. In the Planning app, create a shift for an employee from 09:00 to 17:00 in Company B. 4. Remove the access of Company B 5. In the Planning Gantt view, click the same empty cell to schedule the same employee at the same time for Company A. Issue --- The _compute_overlap_slot_count method uses raw SQL to find overlapping shifts. However, this raw SQL fetches overlapping slot IDs from shifts belonging to companies the user has currently deselected or does not have access to. Current behaviour --- The raw SQL populates the conflicting_slot_ids field with inaccessible record IDs (the shift from the deselected Company B). This triggers accessError. Expected behaviour --- The system should only calculate overlapping shifts for companies the user currently has active in their environment. It should not leak the existence of shifts in deselected/unauthorized companies, and it should open the new shift dialog without crashing. Fix --- Add company_id to both raw SQL queries (for existing records and new virtual records) inside _compute_overlap_slot_count. Pass company id to ensure the database only returns conflict IDs that are valid within the user's active multi-company context. task - 4554813 Forward-Port-Of: odoo/enterprise#109027