Modules
8672 Odoo modules tracked across all registered organizations.
Active Pull Requests 932
247 fresh 343 rotting 342 rotten 83 duplicate
Avg. time open before merge: 52.2 days (based on 82 merged PRs ⓘ)
Security Findings
Results are approximate: found by automated static analysis, not a full security audit. Treat them as a starting point for manual review, not confirmed issues.
Errors 1
| Module | Code | Message |
|---|---|---|
| calendar | rule-public-bypass | calendar_attendee_rule_my — Record rule with an always-true domain grants portal/public users access to every record of its model |
Warnings 445
| Module | Code | Message |
|---|---|---|
| account | rule-group-bypass | account_analytic_line_rule_billing_user — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| account | rule-group-bypass | account_move_rule_group_invoice — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| account | rule-group-bypass | account_move_line_rule_group_invoice — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| account | rule-group-bypass | account_move_send_single_rule_group_invoice — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| account | rule-group-bypass | account_move_send_batch_rule_group_invoice — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| account | rule-group-bypass | ir_rule_res_partner_bank_billing_officers — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| account | route-public-sudo | /terms — Unauthenticated endpoint 'TermsController.terms_conditions' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| account | route-public-sudo | /my/journal/<int:journal_id>/unsubscribe — Unauthenticated endpoint 'PortalAccount.portal_my_journal_unsubscribe' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| account_payment | rule-group-bypass | payment_token_billing_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| account_peppol | route-public-csrf-off | /peppol/webhook/new-message — Public HTTP endpoint 'PeppolWebhookController.webhook_new_message' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| account_peppol | route-public-sudo | /peppol/webhook/new-message — Unauthenticated endpoint 'PeppolWebhookController.webhook_new_message' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| account_peppol | route-public-csrf-off | /peppol/webhook/message-state-update — Public HTTP endpoint 'PeppolWebhookController.webhook_message_update' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| account_peppol | route-public-sudo | /peppol/webhook/message-state-update — Unauthenticated endpoint 'PeppolWebhookController.webhook_message_update' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| account_peppol | route-public-csrf-off | /peppol/webhook/user-state-update — Public HTTP endpoint 'PeppolWebhookController.webhook_user_update' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| account_peppol | route-public-sudo | /peppol/webhook/user-state-update — Unauthenticated endpoint 'PeppolWebhookController.webhook_user_update' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| account_peppol | route-public-csrf-off | /peppol/authentication/webhook — Public HTTP endpoint 'PeppolAuthentication.peppol_authentication_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| account_peppol | route-public-sudo | /peppol/authentication/webhook — Unauthenticated endpoint 'PeppolAuthentication.peppol_authentication_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| auth_oauth | route-auth-none | /auth_oauth/signin — Endpoint 'OAuthController.signin' uses auth="none": it runs with no user/session at all |
| auth_oauth | route-auth-none | /auth_oauth/oea — Endpoint 'OAuthController.oea' uses auth="none": it runs with no user/session at all |
| auth_passkey | acl-public-write | auth_passkey.access_auth_passkey_key_portal — Access rule grants write on 'model_auth_passkey_key' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| auth_passkey | acl-public-write | auth_passkey.access_auth_passkey_key_create_portal — Access rule grants write/create/unlink on 'model_auth_passkey_key_create' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| auth_signup | route-public-sudo | /web/signup — Unauthenticated endpoint 'AuthSignupHome.web_auth_signup' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| auth_signup | route-public-sudo | /web/reset_password — Unauthenticated endpoint 'AuthSignupHome.web_auth_reset_password' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| auth_totp | route-public-sudo | /web/login/totp — Unauthenticated endpoint 'Home.web_totp' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| auth_totp_portal | acl-public-write | access_auth_totp_portal_wizard — Access rule grants write/create/unlink on 'auth_totp.model_auth_totp_wizard' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| base | acl-public-write | access_res_users_identitycheck_portal — Access rule grants write/create on 'model_res_users_identitycheck' to the portal/public group 'group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| base | acl-public-write | access_res_users_apikeys_description_portal — Access rule grants create on 'model_res_users_apikeys_description' to the portal/public group 'group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| base | acl-public-write | access_ir_filter_portal — Access rule grants write/create/unlink on 'model_ir_filters' to the portal/public group 'group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| base | acl-public-write | access_ir_filter_public — Access rule grants write/create/unlink on 'model_ir_filters' to the portal/public group 'group_public' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| base_automation | route-public-csrf-off | /web/hook/<string:rule_uuid> — Public HTTP endpoint 'BaseAutomationController.call_webhook_http' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| base_automation | route-public-sudo | /web/hook/<string:rule_uuid> — Unauthenticated endpoint 'BaseAutomationController.call_webhook_http' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| base_import_module | route-public-csrf-off | /base_import_module/login_upload — Public HTTP endpoint 'ImportModule.login_upload' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| base_import_module | route-auth-none | /base_import_module/login_upload — Endpoint 'ImportModule.login_upload' uses auth="none": it runs with no user/session at all |
| base_report_to_printer_qztray | route-public-sudo | /qz-certificate/ — Unauthenticated endpoint 'SignMessage.qz_certificate' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| base_report_to_printer_qztray | route-public-sudo | /qz-sign-message/ — Unauthenticated endpoint 'SignMessage.qz_sign_message' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| base_setup | route-auth-none | /kpi/summary — Endpoint 'KpiController.kpi_summary' uses auth="none": it runs with no user/session at all |
| base_vat | route-public-csrf-off | /base_vat/1/webhook_update_vies — Public HTTP endpoint 'BaseVatWebhookController.webhook_update_vies' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| bus | route-public-sudo | /bus/has_missed_notifications — Unauthenticated endpoint 'BusController.has_missed_notifications' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| bus | route-auth-none | /websocket/health — Endpoint 'WebsocketController.health' uses auth="none": it runs with no user/session at all |
| calendar | rule-group-bypass | calendar_event_rule_employee — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| calendar | route-public-sudo | /calendar/join_videocall/<string:access_token> — Unauthenticated endpoint 'CalendarController.calendar_join_videocall' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| digest | route-public-csrf-off | /digest/<int:digest_id>/unsubscribe_oneclik — Public HTTP endpoint 'DigestController.digest_unsubscribe_oneclick' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| digest | route-public-sudo | /digest/<int:digest_id>/unsubscribe — Unauthenticated endpoint 'DigestController.digest_unsubscribe' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| event | route-public-sudo | /event/<model("event.event"):event>/ics — Unauthenticated endpoint 'EventController.event_ics_file' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| event | route-public-sudo | /event/<int:event_id>/my_tickets — Unauthenticated endpoint 'EventController.event_my_tickets' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| fieldservice | rule-group-bypass | fsm_order_user — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| fieldservice_stock | acl-public-write | access_stock_move_portal — Access rule grants write on 'stock.model_stock_move' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| gamification | acl-public-write | goal_portal — Access rule grants write on 'gamification.model_gamification_goal' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| gamification | acl-public-write | badge_user_portal — Access rule grants write/create on 'gamification.model_gamification_badge_user' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| helpdesk_mgmt | acl-public-write | access_helpdesk_ticket_stage_public — Access rule grants write on 'model_helpdesk_ticket_stage' to the portal/public group 'base.group_public' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| helpdesk_mgmt | rule-group-bypass | helpdesk_ticket_user_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr | rule-group-bypass | ir_rule_res_partner_bank_employees — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_attendance | rule-group-bypass | hr_attendance_rule_attendance_admin — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_attendance | rule-group-bypass | hr_attendance_overtime_line_rule_admin — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_attendance | route-public-sudo | /hr_attendance/<token> — Unauthenticated endpoint 'HrAttendance.open_kiosk_mode' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| hr_attendance | route-public-sudo | /hr_attendance/attendance_employee_data — Unauthenticated endpoint 'HrAttendance.employee_attendance_data' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| hr_attendance | route-public-sudo | /hr_attendance/attendance_barcode_scanned — Unauthenticated endpoint 'HrAttendance.scan_barcode_with_geolocation' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| hr_attendance | route-public-sudo | /hr_attendance/manual_selection — Unauthenticated endpoint 'HrAttendance.manual_selection' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| hr_attendance | route-public-sudo | /hr_attendance/employees_infos — Unauthenticated endpoint 'HrAttendance.employees_infos' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| hr_expense | rule-group-bypass | ir_rule_hr_expense_manager — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_gamification | rule-group-bypass | hr_gamification_badge_group_hr_user_access — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_holidays | rule-group-bypass | hr_leave_rule_user_read — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_holidays | rule-group-bypass | resource_leaves_holidays_user — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_homeworking | rule-group-bypass | homeworking_admin_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_homeworking_calendar | rule-group-bypass | homeworking_location_wizard_admin_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_recruitment | rule-group-bypass | hr_applicant_user_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_recruitment | rule-group-bypass | hr_job_user_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_recruitment | rule-group-bypass | hr_talent_pool_user_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_recruitment | rule-group-bypass | mail_message_user_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_recruitment_skills | rule-group-bypass | hr_applicant_skill_officer_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_skills | rule-group-bypass | hr_resume_rule_employee_hr_user — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_skills | rule-group-bypass | hr_skill_rule_hr_user — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_skills | rule-group-bypass | hr_employee_skill_report_hr_user — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_skills | rule-group-bypass | hr_employee_skill_history_report_hr_user — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| hr_timesheet_attendance | rule-group-bypass | hr_timesheet_attendance_report_rule_approver — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| html_editor | route-public-sudo | /web_editor/shape/<module>/<path:filename>, /html_editor/shape/<module>/<path:filename> — Unauthenticated endpoint 'HTML_Editor.shape' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| http_routing | route-public-sudo | /website/translations — Unauthenticated endpoint 'Routing.get_website_translations' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| im_livechat | route-auth-none | /im_livechat/font-awesome — Endpoint 'LivechatController.fontawesome' uses auth="none": it runs with no user/session at all |
| im_livechat | route-auth-none | /im_livechat/odoo_ui_icons — Endpoint 'LivechatController.odoo_ui_icons' uses auth="none": it runs with no user/session at all |
| im_livechat | route-public-sudo | /im_livechat/support/<int:channel_id> — Unauthenticated endpoint 'LivechatController.support_page' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| im_livechat | route-public-sudo | /im_livechat/loader/<int:channel_id> — Unauthenticated endpoint 'LivechatController.loader' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| im_livechat | route-public-sudo | /im_livechat/get_session — Unauthenticated endpoint 'LivechatController.get_session' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| im_livechat | route-public-sudo | /im_livechat/feedback — Unauthenticated endpoint 'LivechatController.feedback' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| im_livechat | route-public-sudo | /im_livechat/history — Unauthenticated endpoint 'LivechatController.history_pages' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| im_livechat | route-public-sudo | /im_livechat/download_transcript/<int:channel_id> — Unauthenticated endpoint 'LivechatController.download_livechat_transcript' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| im_livechat | route-public-sudo | /chatbot/answer/save — Unauthenticated endpoint 'LivechatChatbotScriptController.chatbot_save_answer' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| im_livechat | route-public-sudo | /chatbot/step/trigger — Unauthenticated endpoint 'LivechatChatbotScriptController.chatbot_trigger_step' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| im_livechat | route-public-sudo | /chatbot/step/validate_email — Unauthenticated endpoint 'LivechatChatbotScriptController.chatbot_validate_email' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| im_livechat | route-public-csrf-off | /im_livechat/cors/attachment/upload — Public HTTP endpoint 'LivechatAttachmentController.im_livechat_attachment_upload' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| iot_drivers | route-auth-none | /hw_proxy/scale_read — Endpoint 'ScaleReadHardwareProxy.scale_read' uses auth="none": it runs with no user/session at all |
| l10n_dk_nemhandel | route-public-csrf-off | /nemhandel/webhook/new-message — Public HTTP endpoint 'NemhandelWebhookController.webhook_nemhandel_new_message' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| l10n_dk_nemhandel | route-public-sudo | /nemhandel/webhook/new-message — Unauthenticated endpoint 'NemhandelWebhookController.webhook_nemhandel_new_message' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| l10n_dk_nemhandel | route-public-csrf-off | /nemhandel/webhook/message-state-update — Public HTTP endpoint 'NemhandelWebhookController.webhook_nemhandel_message_update' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| l10n_dk_nemhandel | route-public-sudo | /nemhandel/webhook/message-state-update — Unauthenticated endpoint 'NemhandelWebhookController.webhook_nemhandel_message_update' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| l10n_dk_nemhandel | route-public-csrf-off | /nemhandel/webhook/user-state-update — Public HTTP endpoint 'NemhandelWebhookController.webhook_nemhandel_user_update' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| l10n_dk_nemhandel | route-public-sudo | /nemhandel/webhook/user-state-update — Unauthenticated endpoint 'NemhandelWebhookController.webhook_nemhandel_user_update' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| l10n_es_aeat_mod347 | route-public-sudo | /mod347/accept — Unauthenticated endpoint 'Mod347Controller.mod347_accept' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| l10n_es_aeat_mod347 | route-public-sudo | /mod347/reject — Unauthenticated endpoint 'Mod347Controller.mod347_reject' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| l10n_fr_pdp | route-public-csrf-off | /api/signaturit_authentication_status/1/webhooks — Public HTTP endpoint 'IapAuthenticationWebhook.notify_authentication_status' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| l10n_fr_pdp | route-public-sudo | /api/signaturit_authentication_status/1/webhooks — Unauthenticated endpoint 'IapAuthenticationWebhook.notify_authentication_status' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| l10n_fr_pdp | route-public-csrf-off | /peppol/webhook/new-regulatory-message — Public HTTP endpoint 'PdpWebhookController.webhook_regulatory_message' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| l10n_fr_pdp | route-public-sudo | /peppol/webhook/new-regulatory-message — Unauthenticated endpoint 'PdpWebhookController.webhook_regulatory_message' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| l10n_pe | route-public-sudo | /portal/state_infos/<model("res.country.state"):state> — Unauthenticated endpoint 'L10nPEPortalAccount.state_infos' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| l10n_pe | route-public-sudo | /portal/city_infos/<model("res.city"):city> — Unauthenticated endpoint 'L10nPEPortalAccount.city_infos' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| l10n_tw_edi_ecpay | route-public-csrf-off | /invoice/ecpay/agreed_invoice_allowance/<int:invoice_id> — Public HTTP endpoint 'EcpayInvoiceController.agreed_invoice_allowance' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| link_tracker | route-public-sudo | /r/<string:code> — Unauthenticated endpoint 'LinkTracker.full_url_redirect' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| acl-public-write | access_mail_message_portal — Access rule grants write/create/unlink on 'model_mail_message' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
|
| acl-public-write | access_discuss_channel_member_public — Access rule grants write/create/unlink on 'model_discuss_channel_member' to the portal/public group 'base.group_public' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
|
| acl-public-write | access_discuss_channel_member_portal — Access rule grants write/create/unlink on 'model_discuss_channel_member' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
|
| route-public-sudo | /mail/guest/update_name — Unauthenticated endpoint 'GuestController.mail_guest_update_name' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/message/reaction — Unauthenticated endpoint 'MessageReactionController.mail_message_reaction' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/link_preview — Unauthenticated endpoint 'LinkPreviewController.mail_link_preview' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/link_preview/hide — Unauthenticated endpoint 'LinkPreviewController.mail_link_preview_hide' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/message/post — Unauthenticated endpoint 'ThreadController.mail_message_post' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/message/update_content — Unauthenticated endpoint 'ThreadController.mail_message_update_content' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/view — Unauthenticated endpoint 'MailController.mail_action_view' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-csrf-off | /mail/unfollow — Public HTTP endpoint 'MailController.mail_action_unfollow' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
|
| route-public-sudo | /mail/unfollow — Unauthenticated endpoint 'MailController.mail_action_unfollow' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-auth-none | /web_editor/font_to_img/<icon>, /web_editor/font_to_img/<icon>/<color>, /web_editor/font_to_img/<icon>/<color>/<int:size>, /web_editor/font_to_img/<icon>/<color>/<int:width>x<int:height>, /web_editor/font_to_img/<icon>/<color>/<int:size>/<int:alpha>, /web_editor/font_to_img/<icon>/<color>/<int:width>x<int:height>/<int:alpha>, /web_editor/font_to_img/<icon>/<color>/<bg>, /web_editor/font_to_img/<icon>/<color>/<bg>/<int:size>, /web_editor/font_to_img/<icon>/<color>/<bg>/<int:width>x<int:height>, /web_editor/font_to_img/<icon>/<color>/<bg>/<int:width>x<int:height>/<int:alpha>, /mail/font_to_img/<icon>, /mail/font_to_img/<icon>/<color>, /mail/font_to_img/<icon>/<color>/<int:size>, /mail/font_to_img/<icon>/<color>/<int:width>x<int:height>, /mail/font_to_img/<icon>/<color>/<int:size>/<int:alpha>, /mail/font_to_img/<icon>/<color>/<int:width>x<int:height>/<int:alpha>, /mail/font_to_img/<icon>/<color>/<bg>, /mail/font_to_img/<icon>/<color>/<bg>/<int:size>, /mail/font_to_img/<icon>/<color>/<bg>/<int:width>x<int:height>, /mail/font_to_img/<icon>/<color>/<bg>/<int:width>x<int:height>/<int:alpha> — Endpoint 'MailController.export_icon_to_png' uses auth="none": it runs with no user/session at all |
|
| route-public-sudo | /mail/attachment/upload — Unauthenticated endpoint 'AttachmentController.mail_attachment_upload' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/attachment/delete — Unauthenticated endpoint 'AttachmentController.mail_attachment_delete' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/attachment/pdf_first_page/<int:attachment_id> — Unauthenticated endpoint 'AttachmentController.mail_attachment_pdf_first_page' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/attachment/update_thumbnail — Unauthenticated endpoint 'AttachmentController.mail_attachement_update_thumbnail' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /chat/<int:channel_id>/<string:invitation_token> — Unauthenticated endpoint 'PublicPageController.discuss_channel_invitation' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/rtc/session/notify_call_members — Unauthenticated endpoint 'RtcController.session_call_notify' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/rtc/session/update_and_broadcast — Unauthenticated endpoint 'RtcController.session_update_and_broadcast' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/rtc/channel/join_call — Unauthenticated endpoint 'RtcController.channel_call_join' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/rtc/channel/leave_call — Unauthenticated endpoint 'RtcController.channel_call_leave' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /mail/rtc/channel/cancel_call_invitation — Unauthenticated endpoint 'RtcController.channel_call_cancel_invitation' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /discuss/channel/ping — Unauthenticated endpoint 'RtcController.channel_ping' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| route-public-sudo | /discuss/channel/attachments — Unauthenticated endpoint 'ChannelController.load_attachments' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
|
| mail_group | route-public-sudo | /groups — Unauthenticated endpoint 'PortalMailGroup.groups_index' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mail_group | route-public-sudo | /groups/<model("mail.group"):group>, /groups/<model("mail.group"):group>/page/<int:page> — Unauthenticated endpoint 'PortalMailGroup.group_view_messages' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mail_group | route-public-sudo | /groups/<model("mail.group"):group>/<model("mail.group.message"):message> — Unauthenticated endpoint 'PortalMailGroup.group_view_message' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mail_group | route-public-sudo | /groups/<model("mail.group"):group>/<model("mail.group.message"):message>/get_replies — Unauthenticated endpoint 'PortalMailGroup.group_message_get_replies' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mail_group | route-public-csrf-off | /group/<int:group_id>/unsubscribe_oneclick — Public HTTP endpoint 'PortalMailGroup.group_unsubscribe_oneclick' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| mail_group | route-public-sudo | /group/<int:group_id>/unsubscribe_oneclick — Unauthenticated endpoint 'PortalMailGroup.group_unsubscribe_oneclick' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mail_group | route-public-sudo | /group/subscribe-confirm — Unauthenticated endpoint 'PortalMailGroup.group_subscribe_confirm' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mail_plugin | route-auth-none | /mail_plugin/auth/check_version — Endpoint 'Authenticate.auth_check_version' uses auth="none": it runs with no user/session at all |
| mail_plugin | route-auth-none | /mail_client_extension/auth/access_token, /mail_plugin/auth/access_token — Endpoint 'Authenticate.auth_access_token' uses auth="none": it runs with no user/session at all |
| mail_tracking | route-public-sudo | /mail/tracking/open/<string:db>/<int:tracking_email_id>/blank.gif, /mail/tracking/open/<string:db>/<int:tracking_email_id>/<string:token>/blank.gif — Unauthenticated endpoint 'MailTrackingController.mail_tracking_open' (auth="none") calls .sudo(): privileged code reachable without login, review what it exposes |
| mail_tracking | route-auth-none | /mail/tracking/open/<string:db>/<int:tracking_email_id>/blank.gif, /mail/tracking/open/<string:db>/<int:tracking_email_id>/<string:token>/blank.gif — Endpoint 'MailTrackingController.mail_tracking_open' uses auth="none": it runs with no user/session at all |
| mail_tracking_mailgun | route-public-sudo | /mail/tracking/mailgun/all — Unauthenticated endpoint 'MailTrackingController.mail_tracking_mailgun_webhook' (auth="none") calls .sudo(): privileged code reachable without login, review what it exposes |
| mail_tracking_mailgun | route-auth-none | /mail/tracking/mailgun/all — Endpoint 'MailTrackingController.mail_tracking_mailgun_webhook' uses auth="none": it runs with no user/session at all |
| marketing_card | route-public-sudo | /cards/<string:card_slug>/card.jpg, /cards/<int:card_id>/card.jpg — Unauthenticated endpoint 'MarketingCardController.card_campaign_image' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| marketing_card | route-public-sudo | /cards/<string:card_slug>/preview, /cards/<int:card_id>/preview — Unauthenticated endpoint 'MarketingCardController.card_campaign_preview' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| marketing_card | route-public-sudo | /cards/<string:card_slug>/redirect, /cards/<int:card_id>/redirect — Unauthenticated endpoint 'MarketingCardController.card_campaign_redirect' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing | route-public-csrf-off | /mailing/<int:mailing_id>/unsubscribe_oneclick — Public HTTP endpoint 'MassMailController.mailing_unsubscribe_oneclick' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| mass_mailing | route-public-sudo | /mailing/<int:mailing_id>/confirm_unsubscribe — Unauthenticated endpoint 'MassMailController.mailing_confirm_unsubscribe' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing | route-public-sudo | /mailing/list/update — Unauthenticated endpoint 'MassMailController.mailing_update_list_subscription' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing | route-public-sudo | /mailing/feedback — Unauthenticated endpoint 'MassMailController.mailing_send_feedback' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing | route-public-sudo | /mail/track/<int:mail_id>/<string:token>/blank.gif — Unauthenticated endpoint 'MassMailController.track_mail_open' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing | route-public-sudo | /r/<string:code>/m/<int:mailing_trace_id> — Unauthenticated endpoint 'MassMailController.full_url_redirect' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing | route-public-sudo | /mailing/report/unsubscribe — Unauthenticated endpoint 'MassMailController.mailing_report_deactivate' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing | route-public-sudo | /mailing/<int:mailing_id>/view — Unauthenticated endpoint 'MassMailController.mailing_view_in_browser' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing | route-public-sudo | /mailing/blocklist/add — Unauthenticated endpoint 'MassMailController.mail_blocklist_add' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing | route-public-sudo | /mailing/blocklist/remove — Unauthenticated endpoint 'MassMailController.mail_blocklist_remove' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing_sms | route-public-sudo | /sms/<int:mailing_id>/<string:trace_code> — Unauthenticated endpoint 'MailingSMSController.blacklist_page' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing_sms | route-public-sudo | /sms/<int:mailing_id>/unsubscribe/<string:trace_code> — Unauthenticated endpoint 'MailingSMSController.blacklist_number' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mass_mailing_sms | route-public-sudo | /r/<string:code>/s/<int:sms_id_int> — Unauthenticated endpoint 'MailingSMSController.sms_short_link_redirect' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| mrp_subcontracting | acl-public-write | access_subcontracting_portal_stock_move — Access rule grants write/create on 'stock.model_stock_move' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| mrp_subcontracting | acl-public-write | access_subcontracting_portal_stock_move_line — Access rule grants write/create/unlink on 'stock.model_stock_move_line' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| mrp_subcontracting | acl-public-write | access_subcontracting_portal_lot — Access rule grants create on 'stock.model_stock_lot' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| mrp_subcontracting | acl-public-write | access_subcontracting_portal_production — Access rule grants write on 'mrp.model_mrp_production' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| mrp_subcontracting | acl-public-write | access_subcontracting_portal_consumption_warning — Access rule grants write/create on 'mrp.model_mrp_consumption_warning' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| mrp_subcontracting | acl-public-write | access_subcontracting_portal_consumption_warning_line — Access rule grants write/create on 'mrp.model_mrp_consumption_warning_line' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| mrp_subcontracting | acl-public-write | access_subcontracting_portal_mrp_production_serials — Access rule grants write/create on 'mrp.model_mrp_production_serials' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| mrp_subcontracting_account | acl-public-write | access_subcontracting_portal_analytic_line — Access rule grants write on 'mrp_account.model_account_analytic_line' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| payment | route-public-sudo | /payment/pay — Unauthenticated endpoint 'PaymentPortal.payment_pay' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment | route-public-sudo | /payment/confirmation — Unauthenticated endpoint 'PaymentPortal.payment_confirm' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_adyen | route-public-sudo | /payment/adyen/payment_methods — Unauthenticated endpoint 'AdyenController.adyen_payment_methods' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_adyen | route-public-sudo | /payment/adyen/payments — Unauthenticated endpoint 'AdyenController.adyen_payments' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_adyen | route-public-sudo | /payment/adyen/payments/details — Unauthenticated endpoint 'AdyenController.adyen_payment_details' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_adyen | route-public-csrf-off | /payment/adyen/return — Public HTTP endpoint 'AdyenController.adyen_return_from_3ds_auth' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_adyen | route-public-sudo | /payment/adyen/return — Unauthenticated endpoint 'AdyenController.adyen_return_from_3ds_auth' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_adyen | route-public-csrf-off | AdyenController.adyen_webhook — Public HTTP endpoint 'AdyenController.adyen_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_adyen | route-public-sudo | AdyenController.adyen_webhook — Unauthenticated endpoint 'AdyenController.adyen_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_aps | route-public-csrf-off | APSController.aps_return_from_checkout — Public HTTP endpoint 'APSController.aps_return_from_checkout' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_aps | route-public-sudo | APSController.aps_return_from_checkout — Unauthenticated endpoint 'APSController.aps_return_from_checkout' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_aps | route-public-csrf-off | APSController.aps_webhook — Public HTTP endpoint 'APSController.aps_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_aps | route-public-sudo | APSController.aps_webhook — Unauthenticated endpoint 'APSController.aps_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_asiapay | route-public-csrf-off | AsiaPayController.asiapay_webhook — Public HTTP endpoint 'AsiaPayController.asiapay_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_asiapay | route-public-sudo | AsiaPayController.asiapay_webhook — Unauthenticated endpoint 'AsiaPayController.asiapay_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_authorize | route-public-sudo | /payment/authorize/payment — Unauthenticated endpoint 'AuthorizeController.authorize_payment' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_buckaroo | route-public-csrf-off | BuckarooController.buckaroo_return_from_checkout — Public HTTP endpoint 'BuckarooController.buckaroo_return_from_checkout' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_buckaroo | route-public-sudo | BuckarooController.buckaroo_return_from_checkout — Unauthenticated endpoint 'BuckarooController.buckaroo_return_from_checkout' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_buckaroo | route-public-csrf-off | BuckarooController.buckaroo_webhook — Public HTTP endpoint 'BuckarooController.buckaroo_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_buckaroo | route-public-sudo | BuckarooController.buckaroo_webhook — Unauthenticated endpoint 'BuckarooController.buckaroo_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_custom | route-public-csrf-off | CustomController.custom_process_transaction — Public HTTP endpoint 'CustomController.custom_process_transaction' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_custom | route-public-sudo | CustomController.custom_process_transaction — Unauthenticated endpoint 'CustomController.custom_process_transaction' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_demo | route-public-sudo | PaymentDemoController.demo_simulate_payment — Unauthenticated endpoint 'PaymentDemoController.demo_simulate_payment' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_ecpay | route-public-csrf-off | EcpayController.ecpay_return_from_checkout — Public HTTP endpoint 'EcpayController.ecpay_return_from_checkout' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_ecpay | route-public-sudo | EcpayController.ecpay_return_from_checkout — Unauthenticated endpoint 'EcpayController.ecpay_return_from_checkout' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_ecpay | route-public-csrf-off | EcpayController.ecpay_webhook — Public HTTP endpoint 'EcpayController.ecpay_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_ecpay | route-public-sudo | EcpayController.ecpay_webhook — Unauthenticated endpoint 'EcpayController.ecpay_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_flutterwave | route-public-csrf-off | FlutterwaveController.flutterwave_webhook — Public HTTP endpoint 'FlutterwaveController.flutterwave_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_flutterwave | route-public-sudo | FlutterwaveController.flutterwave_webhook — Unauthenticated endpoint 'FlutterwaveController.flutterwave_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_iyzico | route-public-csrf-off | IyzicoController.iyzico_return_from_payment — Public HTTP endpoint 'IyzicoController.iyzico_return_from_payment' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_iyzico | route-public-csrf-off | IyzicoController.iyzico_webhook — Public HTTP endpoint 'IyzicoController.iyzico_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_mercado_pago | route-public-sudo | /payment/mercado_pago/payments — Unauthenticated endpoint 'MercadoPagoPaymentController.mercado_pago_payment' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_mercado_pago | route-public-csrf-off | MercadoPagoPaymentController.mercado_pago_webhook — Public HTTP endpoint 'MercadoPagoPaymentController.mercado_pago_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_mollie | route-public-csrf-off | MollieController.mollie_return_from_checkout — Public HTTP endpoint 'MollieController.mollie_return_from_checkout' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_mollie | route-public-csrf-off | MollieController.mollie_webhook — Public HTTP endpoint 'MollieController.mollie_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_nuvei | route-public-sudo | NuveiController.nuvei_return_from_checkout — Unauthenticated endpoint 'NuveiController.nuvei_return_from_checkout' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_nuvei | route-public-csrf-off | NuveiController.nuvei_webhook — Public HTTP endpoint 'NuveiController.nuvei_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_nuvei | route-public-sudo | NuveiController.nuvei_webhook — Unauthenticated endpoint 'NuveiController.nuvei_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_paymob | route-public-sudo | PaymobController.paymob_return_from_checkout — Unauthenticated endpoint 'PaymobController.paymob_return_from_checkout' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_paymob | route-public-csrf-off | PaymobController.paymob_webhook — Public HTTP endpoint 'PaymobController.paymob_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_paymob | route-public-sudo | PaymobController.paymob_webhook — Unauthenticated endpoint 'PaymobController.paymob_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_paypal | route-public-sudo | PaypalController.paypal_complete_order — Unauthenticated endpoint 'PaypalController.paypal_complete_order' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_paypal | route-public-csrf-off | PaypalController.paypal_webhook — Public HTTP endpoint 'PaypalController.paypal_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_paypal | route-public-sudo | PaypalController.paypal_webhook — Unauthenticated endpoint 'PaypalController.paypal_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_payu | route-public-csrf-off | PayuController.payu_return_from_checkout — Public HTTP endpoint 'PayuController.payu_return_from_checkout' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_payu | route-public-sudo | PayuController.payu_return_from_checkout — Unauthenticated endpoint 'PayuController.payu_return_from_checkout' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_payu | route-public-csrf-off | PayuController.payu_webhook — Public HTTP endpoint 'PayuController.payu_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_payu | route-public-sudo | PayuController.payu_webhook — Unauthenticated endpoint 'PayuController.payu_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_razorpay | route-public-csrf-off | RazorpayController.razorpay_return_from_checkout — Public HTTP endpoint 'RazorpayController.razorpay_return_from_checkout' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_razorpay | route-public-sudo | RazorpayController.razorpay_return_from_checkout — Unauthenticated endpoint 'RazorpayController.razorpay_return_from_checkout' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_razorpay | route-public-csrf-off | RazorpayController.razorpay_webhook — Public HTTP endpoint 'RazorpayController.razorpay_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_razorpay | route-public-sudo | RazorpayController.razorpay_webhook — Unauthenticated endpoint 'RazorpayController.razorpay_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_redsys | route-public-sudo | RedsysController.redsys_return_from_checkout — Unauthenticated endpoint 'RedsysController.redsys_return_from_checkout' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_redsys | route-public-csrf-off | RedsysController.redsys_webhook — Public HTTP endpoint 'RedsysController.redsys_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_redsys | route-public-sudo | RedsysController.redsys_webhook — Unauthenticated endpoint 'RedsysController.redsys_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_stripe | route-public-sudo | StripeController.stripe_return — Unauthenticated endpoint 'StripeController.stripe_return' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_stripe | route-public-csrf-off | StripeController.stripe_webhook — Public HTTP endpoint 'StripeController.stripe_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_stripe | route-public-sudo | StripeController.stripe_webhook — Unauthenticated endpoint 'StripeController.stripe_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_stripe | route-public-csrf-off | StripeController.stripe_apple_pay_get_domain_association_file — Public HTTP endpoint 'StripeController.stripe_apple_pay_get_domain_association_file' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_toss_payments | route-public-sudo | TossPaymentsController._toss_payments_success_return — Unauthenticated endpoint 'TossPaymentsController._toss_payments_success_return' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_toss_payments | route-public-sudo | TossPaymentsController._toss_payments_failure_return — Unauthenticated endpoint 'TossPaymentsController._toss_payments_failure_return' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_toss_payments | route-public-csrf-off | TossPaymentsController._toss_payments_webhook — Public HTTP endpoint 'TossPaymentsController._toss_payments_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_toss_payments | route-public-sudo | TossPaymentsController._toss_payments_webhook — Unauthenticated endpoint 'TossPaymentsController._toss_payments_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_worldline | route-public-sudo | WorldlineController.worldline_return_from_checkout — Unauthenticated endpoint 'WorldlineController.worldline_return_from_checkout' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_worldline | route-public-csrf-off | WorldlineController.worldline_webhook — Public HTTP endpoint 'WorldlineController.worldline_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_worldline | route-public-sudo | WorldlineController.worldline_webhook — Unauthenticated endpoint 'WorldlineController.worldline_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_xendit | route-public-sudo | /payment/xendit/payment — Unauthenticated endpoint 'XenditController.xendit_payment' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_xendit | route-public-csrf-off | XenditController.xendit_webhook — Public HTTP endpoint 'XenditController.xendit_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| payment_xendit | route-public-sudo | XenditController.xendit_webhook — Unauthenticated endpoint 'XenditController.xendit_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| payment_xendit | route-public-sudo | XenditController.xendit_return — Unauthenticated endpoint 'XenditController.xendit_return' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pms_website | acl-public-write | access_pms_property_public — Access rule grants write/create/unlink on 'pms_base.model_pms_property' to the portal/public group 'base.group_public' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| pms_website_sale | route-public-sudo | /property/<int:property_id>/check_availability — Unauthenticated endpoint 'PmsWebsiteSale.check_availability' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pms_website_sale | route-public-sudo | /property/<int:property_id>/add_to_cart — Unauthenticated endpoint 'PmsWebsiteSale.property_add_to_cart' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| point_of_sale | rule-group-bypass | rule_pos_bank_statement_account_user — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| point_of_sale | rule-group-bypass | rule_pos_bank_statement_line_account_user — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| point_of_sale | route-public-sudo | /pos/ticket — Unauthenticated endpoint 'PosController.invoice_request_screen' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| point_of_sale | route-public-sudo | /pos/ticket/validate — Unauthenticated endpoint 'PosController.show_ticket_validation_screen' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| point_of_sale | route-public-sudo | /pos_customer_display/<id_>/<device_uuid> — Unauthenticated endpoint 'PosCustomerDisplay.pos_customer_display' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| portal | route-public-sudo | /my/address/country_info/<model("res.country"):country> — Unauthenticated endpoint 'CustomerPortal.portal_address_country_info' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| portal | route-public-sudo | /mail/avatar/mail.message/<int:res_id>/author_avatar/<int:width>x<int:height> — Unauthenticated endpoint 'PortalChatter.portal_avatar' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| portal | route-public-sudo | /portal/chatter_init — Unauthenticated endpoint 'PortalChatter.portal_chatter_init' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| portal | route-public-sudo | /mail/chatter_fetch — Unauthenticated endpoint 'PortalChatter.portal_message_fetch' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_adyen | route-public-sudo | /pos_adyen/notification — Unauthenticated endpoint 'PosAdyenController.notification' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_mercado_pago | route-public-csrf-off | /pos_mercado_pago/notification — Public HTTP endpoint 'PosMercadoPagoWebhook.notification' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| pos_mercado_pago | route-public-sudo | /pos_mercado_pago/notification — Unauthenticated endpoint 'PosMercadoPagoWebhook.notification' (auth="none") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_mercado_pago | route-auth-none | /pos_mercado_pago/notification — Endpoint 'PosMercadoPagoWebhook.notification' uses auth="none": it runs with no user/session at all |
| pos_mollie | route-public-csrf-off | /pos_mollie/webhook — Public HTTP endpoint 'PosMollie.mollie_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| pos_mollie | route-public-sudo | /pos_mollie/webhook — Unauthenticated endpoint 'PosMollie.mollie_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_online_payment | route-public-sudo | /pos/pay/<int:pos_order_id> — Unauthenticated endpoint 'PaymentPortal.pos_order_pay' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_online_payment | route-public-sudo | /pos/pay/confirmation/<int:pos_order_id> — Unauthenticated endpoint 'PaymentPortal.pos_order_pay_confirmation' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_qfpay | route-public-csrf-off | /qfpay/notify — Public HTTP endpoint 'QFPayNotificationController.qfpay_notify' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| pos_qfpay | route-public-sudo | /qfpay/notify — Unauthenticated endpoint 'QFPayNotificationController.qfpay_notify' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_safaricom | route-public-csrf-off | /pos_safaricom/callback — Public HTTP endpoint 'SafaricomController.safaricom_callback' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| pos_safaricom | route-public-sudo | /pos_safaricom/callback — Unauthenticated endpoint 'SafaricomController.safaricom_callback' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_safaricom | route-public-csrf-off | /c2b/validation/callback — Public HTTP endpoint 'SafaricomController.c2b_validation_callback' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| pos_safaricom | route-public-sudo | /c2b/validation/callback — Unauthenticated endpoint 'SafaricomController.c2b_validation_callback' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_safaricom | route-public-csrf-off | /c2b/confirmation/callback — Public HTTP endpoint 'SafaricomController.c2b_confirmation_callback' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| pos_safaricom | route-public-sudo | /c2b/confirmation/callback — Unauthenticated endpoint 'SafaricomController.c2b_confirmation_callback' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_self_order | route-public-sudo | /pos-self-order/process-order/<device_type>/ — Unauthenticated endpoint 'PosSelfOrderController.process_order' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_self_order | route-public-sudo | /pos-self-order/validate-partner — Unauthenticated endpoint 'PosSelfOrderController.validate_partner' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_self_order | route-public-sudo | /pos-self/<config_id>, /pos-self/<config_id>/<path:subpath> — Unauthenticated endpoint 'PosSelfKiosk.start_self_ordering' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_viva_com | route-public-csrf-off | /pos_viva_com/notification — Public HTTP endpoint 'PosVivaComController.notification' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| pos_viva_com | route-public-sudo | /pos_viva_com/notification — Unauthenticated endpoint 'PosVivaComController.notification' (auth="none") calls .sudo(): privileged code reachable without login, review what it exposes |
| pos_viva_com | route-auth-none | /pos_viva_com/notification — Endpoint 'PosVivaComController.notification' uses auth="none": it runs with no user/session at all |
| project | acl-public-write | access_project_sharing_task_portal — Access rule grants write/create on 'model_project_task' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| queue_job | route-auth-none | /queue_job/runjob — Endpoint 'RunJobController.runjob' uses auth="none": it runs with no user/session at all |
| rpc | route-auth-none | /web/version, /json/version — Endpoint 'RPC.version' uses auth="none": it runs with no user/session at all |
| rpc | route-auth-none | /jsonrpc — Endpoint 'JSONRPC.jsonrpc' uses auth="none": it runs with no user/session at all |
| rpc | route-public-csrf-off | /xmlrpc/<service> — Public HTTP endpoint 'XMLRPC.xmlrpc_1' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| rpc | route-auth-none | /xmlrpc/<service> — Endpoint 'XMLRPC.xmlrpc_1' uses auth="none": it runs with no user/session at all |
| rpc | route-public-csrf-off | /xmlrpc/2/<service> — Public HTTP endpoint 'XMLRPC.xmlrpc_2' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| rpc | route-auth-none | /xmlrpc/2/<service> — Endpoint 'XMLRPC.xmlrpc_2' uses auth="none": it runs with no user/session at all |
| sale | rule-group-bypass | payment_transaction_salesman_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| sale | rule-group-bypass | payment_token_salesman_rule — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| sale_gelato | route-public-csrf-off | GelatoController.gelato_webhook — Public HTTP endpoint 'GelatoController.gelato_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| sale_gelato | route-public-sudo | GelatoController.gelato_webhook — Unauthenticated endpoint 'GelatoController.gelato_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| sale_stock | route-public-sudo | /my/picking/pdf/<int:picking_id> — Unauthenticated endpoint 'SaleStockPortal.portal_my_picking_report' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| sale_stock | route-public-sudo | /my/picking/return/pdf/<int:picking_id> — Unauthenticated endpoint 'SaleStockPortal.portal_my_picking_return_report' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| shopify_connector | route-public-csrf-off | /shopify/webhook/<int:instance_id> — Public HTTP endpoint 'ShopifyWebhookController.shopify_webhook' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| shopify_connector | route-public-sudo | /shopify/webhook/<int:instance_id> — Unauthenticated endpoint 'ShopifyWebhookController.shopify_webhook' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| shopify_connector | route-public-sudo | /shopify/product-image/<int:instance_id>/<string:model_name>/<int:record_id>/<string:checksum>/<string:signature> — Unauthenticated endpoint 'ShopifyProductImageController.shopify_product_image' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| sms | route-public-sudo | /sms/status — Unauthenticated endpoint 'SmsController.update_sms_status' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| sms_twilio | route-public-csrf-off | /sms_twilio/status/<string:uuid> — Public HTTP endpoint 'SmsTwilioController.update_sms_status' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| sms_twilio | route-public-sudo | /sms_twilio/status/<string:uuid> — Unauthenticated endpoint 'SmsTwilioController.update_sms_status' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| spreadsheet_dashboard | route-public-sudo | /dashboard/share/<int:share_id>/<token> — Unauthenticated endpoint 'DashboardShareRoute.share_portal' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| spreadsheet_dashboard | route-public-sudo | /dashboard/data/<int:share_id>/<token> — Unauthenticated endpoint 'DashboardShareRoute.get_shared_dashboard_data' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| survey | route-public-sudo | /survey/start/<string:survey_token> — Unauthenticated endpoint 'Survey.survey_start' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| survey | route-public-sudo | /survey/get_question_image/<string:survey_token>/<string:answer_token>/<int:question_id>/<int:suggested_answer_id> — Unauthenticated endpoint 'Survey.survey_get_question_image' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| survey | route-public-sudo | /survey/submit/<string:survey_token>/<string:answer_token> — Unauthenticated endpoint 'Survey.survey_submit' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| test_access_rights | acl-public-write | access_test_access_right_some_obj_public — Access rule grants write/create/unlink on 'model_test_access_right_some_obj' to the portal/public group 'base.group_public' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| test_access_rights | acl-public-write | access_test_access_right_container_public — Access rule grants write/create/unlink on 'model_test_access_right_container' to the portal/public group 'base.group_public' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| test_access_rights | acl-public-write | access_test_access_right_inherits_public — Access rule grants write/create/unlink on 'model_test_access_right_inherits' to the portal/public group 'base.group_public' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| test_access_rights | acl-public-write | access_test_access_right_child_public — Access rule grants write/create/unlink on 'model_test_access_right_child' to the portal/public group 'base.group_public' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| test_http | route-auth-none | /test_http/greeting, /test_http/greeting-none — Endpoint 'TestHttp.greeting_none' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/wsgi_environ — Endpoint 'TestHttp.wsgi_environ' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/echo-http-get — Endpoint 'TestHttp.echo_http_get' uses auth="none": it runs with no user/session at all |
| test_http | route-public-csrf-off | /test_http/echo-http-post — Public HTTP endpoint 'TestHttp.echo_http_post' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| test_http | route-auth-none | /test_http/echo-http-post — Endpoint 'TestHttp.echo_http_post' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/echo-http-csrf — Endpoint 'TestHttp.echo_http_csrf' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/echo-json — Endpoint 'TestHttp.echo_json' uses auth="none": it runs with no user/session at all |
| test_http | route-public-csrf-off | /test_http/echo-json-over-http — Public HTTP endpoint 'TestHttp.echo_json_over_http' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| test_http | route-auth-none | /test_http/echo-json-over-http — Endpoint 'TestHttp.echo_json_over_http' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/cors_http_default — Endpoint 'TestHttp.cors_http' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/cors_http_methods — Endpoint 'TestHttp.cors_http_verbs' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/cors_json — Endpoint 'TestHttp.cors_json' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/ensure_db — Endpoint 'TestHttp.ensure_db_endpoint' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/geoip — Endpoint 'TestHttp.geoip' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/save_session — Endpoint 'TestHttp.touch' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/fail — Endpoint 'TestHttp.fail' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/json_value_error — Endpoint 'TestHttp.json_value_error' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/hide_errors/decorator — Endpoint 'TestHttp.hide_errors_decorator' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/hide_errors/context-manager — Endpoint 'TestHttp.hide_errors_context_manager' uses auth="none": it runs with no user/session at all |
| test_http | route-public-csrf-off | /test_http/upload_file — Public HTTP endpoint 'TestHttp.upload_file_retry' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| test_http | route-auth-none | /test_http/upload_file — Endpoint 'TestHttp.upload_file_retry' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/concurrency_error — Endpoint 'TestHttp.concurrency_error' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/httprequest_attrs — Endpoint 'TestHttp.request_attrs' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/httprequest_environ — Endpoint 'TestHttp.request_environ' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/f2qs/step1/no-operation-to-perform — Endpoint 'TestHttp.f2qs_test' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/f2qs/step2/1-var-in-fragment — Endpoint 'TestHttp.f2qs_test_simple_fragment' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/f2qs/step3/3-var-in-fragment — Endpoint 'TestHttp.f2qs_test_3_args_fragment' uses auth="none": it runs with no user/session at all |
| test_http | route-auth-none | /test_http/f2qs/step4/empty-query-3-var-in-frag — Endpoint 'TestHttp.f2qs_test_empty_query_with_fragment' uses auth="none": it runs with no user/session at all |
| test_mail | acl-public-write | access_mail_test_access_portal — Access rule grants write on 'model_mail_test_access' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| test_mail | acl-public-write | access_mail_test_access_public_public — Access rule grants write on 'model_mail_test_access_public' to the portal/public group 'base.group_public' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| test_mail | acl-public-write | access_mail_test_access_public_portal — Access rule grants write on 'model_mail_test_access_public' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| test_website | route-public-sudo | /test_website/model_item_sudo/<int:record_id> — Unauthenticated endpoint 'WebsiteTest.test_model_item_sudo' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| web | route-auth-none | /web/database/selector — Endpoint 'Database.selector' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web/database/manager — Endpoint 'Database.manager' uses auth="none": it runs with no user/session at all |
| web | route-public-csrf-off | /web/database/create — Public HTTP endpoint 'Database.create' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| web | route-auth-none | /web/database/create — Endpoint 'Database.create' uses auth="none": it runs with no user/session at all |
| web | route-public-csrf-off | /web/database/duplicate — Public HTTP endpoint 'Database.duplicate' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| web | route-auth-none | /web/database/duplicate — Endpoint 'Database.duplicate' uses auth="none": it runs with no user/session at all |
| web | route-public-csrf-off | /web/database/drop — Public HTTP endpoint 'Database.drop' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| web | route-auth-none | /web/database/drop — Endpoint 'Database.drop' uses auth="none": it runs with no user/session at all |
| web | route-public-csrf-off | /web/database/backup — Public HTTP endpoint 'Database.backup' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| web | route-auth-none | /web/database/backup — Endpoint 'Database.backup' uses auth="none": it runs with no user/session at all |
| web | route-public-csrf-off | /web/database/restore — Public HTTP endpoint 'Database.restore' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| web | route-auth-none | /web/database/restore — Endpoint 'Database.restore' uses auth="none": it runs with no user/session at all |
| web | route-public-csrf-off | /web/database/change_password — Public HTTP endpoint 'Database.change_password' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| web | route-auth-none | /web/database/change_password — Endpoint 'Database.change_password' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web/database/list — Endpoint 'Database.list' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web/filestore/<path:_path> — Endpoint 'Binary.content_filestore' uses auth="none": it runs with no user/session at all |
| web | route-public-sudo | /web/assets/<string:unique>/<string:filename> — Unauthenticated endpoint 'Binary.content_assets' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| web | route-public-sudo | /web/image, /web/image/<string:xmlid>, /web/image/<string:xmlid>/<string:filename>, /web/image/<string:xmlid>/<int:width>x<int:height>, /web/image/<string:xmlid>/<int:width>x<int:height>/<string:filename>, /web/image/<string:model>/<int:id>/<string:field>, /web/image/<string:model>/<int:id>/<string:field>/<string:filename>, /web/image/<string:model>/<int:id>/<string:field>/<int:width>x<int:height>, /web/image/<string:model>/<int:id>/<string:field>/<int:width>x<int:height>/<string:filename>, /web/image/<int:id>, /web/image/<int:id>/<string:filename>, /web/image/<int:id>/<int:width>x<int:height>, /web/image/<int:id>/<int:width>x<int:height>/<string:filename>, /web/image/<int:id>-<string:unique>, /web/image/<int:id>-<string:unique>/<string:filename>, /web/image/<int:id>-<string:unique>/<int:width>x<int:height>, /web/image/<int:id>-<string:unique>/<int:width>x<int:height>/<string:filename> — Unauthenticated endpoint 'Binary.content_image' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| web | route-auth-none | /web/binary/company_logo, /logo, /logo.png — Endpoint 'Binary.company_logo' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web/sign/get_fonts, /web/sign/get_fonts/<string:fontname> — Endpoint 'Binary.get_fonts' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web/session/authenticate — Endpoint 'Session.authenticate' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web/session/get_lang_list — Endpoint 'Session.get_lang_list' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web/session/logout — Endpoint 'Session.logout' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web/webclient/bootstrap_translations — Endpoint 'WebClient.bootstrap_translations' uses auth="none": it runs with no user/session at all |
| web | route-public-sudo | /web/webclient/translations — Unauthenticated endpoint 'WebClient.translations' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| web | route-auth-none | /web/webclient/version_info — Endpoint 'WebClient.version_info' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | / — Endpoint 'Home.index' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web, /odoo, /odoo/<path:subpath>, /scoped_app/<path:subpath> — Endpoint 'Home.web_client' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web/login — Endpoint 'Home.web_login' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /web/health — Endpoint 'Home.health' uses auth="none": it runs with no user/session at all |
| web | route-auth-none | /robots.txt — Endpoint 'Home.robots' uses auth="none": it runs with no user/session at all |
| web_pwa_customize | route-public-sudo | /web/manifest.webmanifest — Unauthenticated endpoint 'WebManifest.webmanifest' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| web_unsplash | route-public-sudo | /web_unsplash/get_app_id — Unauthenticated endpoint 'Web_Unsplash.get_unsplash_app_id' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| webservice | route-public-csrf-off | /webservice/<int:backend_id>/oauth2/redirect — Public HTTP endpoint 'OAuth2Controller.redirect' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| webservice | route-public-sudo | /webservice/<int:backend_id>/oauth2/redirect — Unauthenticated endpoint 'OAuth2Controller.redirect' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website | route-public-sudo | /sitemap.xml — Unauthenticated endpoint 'Website.sitemap_xml_index' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website | route-public-sudo | /website/info — Unauthenticated endpoint 'Website.website_info' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website | route-public-sudo | /website/snippet/filters — Unauthenticated endpoint 'Website.get_dynamic_filter' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website | route-public-sudo | /website/snippet/filter_templates — Unauthenticated endpoint 'Website.get_dynamic_snippet_templates' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website | route-public-sudo | /website/snippet/autocomplete — Unauthenticated endpoint 'Website.autocomplete' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website | route-public-sudo | /google<string(length=16):key>.html — Unauthenticated endpoint 'Website.google_console_search' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website | route-public-sudo | /website/action/<path_or_xml_id_or_id>, /website/action/<path_or_xml_id_or_id>/<path:path> — Unauthenticated endpoint 'Website.actions_server' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website | route-public-sudo | /model/<string:page_name_slugified>, /model/<string:page_name_slugified>/page/<int:page_number>, /model/<string:page_name_slugified>/<string:record_slug> — Unauthenticated endpoint 'ModelPageController.generic_model' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website | route-public-csrf-off | /website/form/<string:model_name> — Public HTTP endpoint 'WebsiteForm.website_form' disables CSRF protection (fine for webhooks/callbacks, worth a review otherwise) |
| website_customer | route-public-sudo | /customers, /customers/page/<int:page>, /customers/country/<model("res.country"):country>, /customers/country/<model("res.country"):country>/page/<int:page>, /customers/industry/<model("res.partner.industry"):industry>, /customers/industry/<model("res.partner.industry"):industry>/page/<int:page>, /customers/industry/<model("res.partner.industry"):industry>/country/<model("res.country"):country>, /customers/industry/<model("res.partner.industry"):industry>/country/<model("res.country"):country>/page/<int:page> — Unauthenticated endpoint 'WebsiteCustomer.customers' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_customer | route-public-sudo | /customers/<partner_id> — Unauthenticated endpoint 'WebsiteCustomer.customers_detail' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event | route-public-sudo | WebsiteEventController.events — Unauthenticated endpoint 'WebsiteEventController.events' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event | route-public-sudo | /event/<model("event.event"):event>/page/<path:page> — Unauthenticated endpoint 'WebsiteEventController.event_page' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event | route-public-sudo | /event/<model("event.event"):event>/registration/success — Unauthenticated endpoint 'WebsiteEventController.event_registration_success' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event_booth | route-public-sudo | /event/booth/check_availability — Unauthenticated endpoint 'WebsiteEventBoothController.check_booths_availability' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event_booth | route-public-sudo | /event/booth_category/get_available_booths — Unauthenticated endpoint 'WebsiteEventBoothController.get_booth_category_available_booths' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event_exhibitor | route-public-sudo | /event/<model("event.event", "[('exhibitor_menu', '=', True)]"):event>/exhibitor/<model("event.sponsor", "[('event_id', '=', event.id)]"):sponsor> — Unauthenticated endpoint 'ExhibitorController.event_exhibitor' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event_exhibitor | route-public-sudo | /event_sponsor/<int:sponsor_id>/read — Unauthenticated endpoint 'ExhibitorController.event_sponsor_read' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event_track | route-public-sudo | /event/<model("event.event", "[('website_track', '=', True)]"):event>/track/<model("event.track", "[('event_id', '=', event.id)]"):track> — Unauthenticated endpoint 'EventTrackController.event_track_page' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event_track | route-public-sudo | /event/track/send_email_reminder — Unauthenticated endpoint 'EventTrackController.send_email_reminder' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event_track | route-public-sudo | /event/<model("event.event"):event>/track_proposal/post — Unauthenticated endpoint 'EventTrackController.event_track_proposal_post' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event_track_live | route-public-sudo | /event_track/get_track_suggestion — Unauthenticated endpoint 'EventTrackLiveController.get_next_track_suggestion' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event_track_quiz | route-public-sudo | /event_track/quiz/submit — Unauthenticated endpoint 'WebsiteEventTrackQuiz.event_track_quiz_submit' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_event_track_quiz | route-public-sudo | /event_track/quiz/reset — Unauthenticated endpoint 'WebsiteEventTrackQuiz.quiz_reset' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_forum | acl-public-write | access_forum_post_portal — Access rule grants write/create/unlink on 'model_forum_post' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| website_forum | acl-public-write | access_forum_post_vote_portal — Access rule grants write/create on 'model_forum_post_vote' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| website_forum | acl-public-write | access_forum_tag_public — Access rule grants create on 'model_forum_tag' to the portal/public group 'base.group_public' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| website_forum | acl-public-write | access_forum_tag_portal — Access rule grants create on 'model_forum_tag' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| website_forum | rule-group-bypass | website_forum_create_website_designer — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| website_forum | route-public-sudo | /forum/<model("forum.forum"):forum>/<model("forum.post"):question> — Unauthenticated endpoint 'WebsiteForum.question' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_forum | route-public-sudo | /forum/<model("forum.forum"):forum>/partner/<int:partner_id> — Unauthenticated endpoint 'WebsiteForum.open_partner' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_google_map | route-public-sudo | /google_map — Unauthenticated endpoint 'GoogleMap.google_map' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_hr_recruitment | route-public-sudo | /jobs, /jobs/page/<int:page> — Unauthenticated endpoint 'WebsiteHrRecruitment.jobs' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_hr_recruitment | route-public-sudo | /website_hr_recruitment/check_recent_application — Unauthenticated endpoint 'WebsiteHrRecruitment.check_recent_application' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_mail | route-public-sudo | /website_mail/follow — Unauthenticated endpoint 'WebsiteMail.website_message_subscribe' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_mail | route-public-sudo | /website_mail/is_follower — Unauthenticated endpoint 'WebsiteMail.is_follower' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_mail_group | route-public-sudo | /group/is_member — Unauthenticated endpoint 'WebsiteMailGroup.group_is_member' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_mass_mailing | route-public-sudo | /website_mass_mailing/is_subscriber — Unauthenticated endpoint 'MassMailController.is_subscriber' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_membership | route-public-sudo | /members, /members/page/<int:page>, /members/association/<membership_id>, /members/association/<membership_id>/page/<int:page>, /members/country/<int:country_id>, /members/country/<country_name>-<int:country_id>, /members/country/<int:country_id>/page/<int:page>, /members/country/<country_name>-<int:country_id>/page/<int:page>, /members/association/<membership_id>/country/<country_name>-<int:country_id>, /members/association/<membership_id>/country/<int:country_id>, /members/association/<membership_id>/country/<country_name>-<int:country_id>/page/<int:page>, /members/association/<membership_id>/country/<int:country_id>/page/<int:page> — Unauthenticated endpoint 'WebsiteMembership.members' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_membership | route-public-sudo | /members/<partner_id> — Unauthenticated endpoint 'WebsiteMembership.partners_detail' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_partner | route-public-sudo | /partners/<partner_id> — Unauthenticated endpoint 'WebsitePartnerPage.partners_detail' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_payment | route-public-sudo | /website_payment/snippet/supported_payment_methods — Unauthenticated endpoint 'PaymentPortal.get_supported_payment_methods' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_profile | route-public-sudo | /profile/avatar/<int:user_id> — Unauthenticated endpoint 'WebsiteProfile.get_user_profile_avatar' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_profile | route-public-sudo | /profile/users, /profile/users/page/<int:page> — Unauthenticated endpoint 'WebsiteProfile.view_all_users_page' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_profile | route-public-sudo | /profile/validate_email — Unauthenticated endpoint 'WebsiteProfile.validate_email' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | WebsiteSale.shop — Unauthenticated endpoint 'WebsiteSale.shop' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /shop/<model("product.template"):product_template>/document/<int:document_id> — Unauthenticated endpoint 'WebsiteSale.product_document' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /shop/product/is_add_to_cart_allowed — Unauthenticated endpoint 'WebsiteSale.is_add_to_cart_allowed' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /shop/pricelist — Unauthenticated endpoint 'WebsiteSale.pricelist' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /shop/update_address — Unauthenticated endpoint 'WebsiteSale.shop_update_address' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /shop/payment/validate — Unauthenticated endpoint 'WebsiteSale.shop_payment_validate' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /shop/confirmation — Unauthenticated endpoint 'WebsiteSale.shop_payment_confirmation' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /shop/print — Unauthenticated endpoint 'WebsiteSale.print_saleorder' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /shop/products/recently_viewed_delete — Unauthenticated endpoint 'WebsiteSale.products_recently_viewed_delete' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /shop/set_delivery_method — Unauthenticated endpoint 'Delivery.shop_set_delivery_method' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /shop/get_delivery_rate — Unauthenticated endpoint 'Delivery.shop_get_delivery_rate' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | Cart.cart — Unauthenticated endpoint 'Cart.cart' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | Cart.add_to_cart — Unauthenticated endpoint 'Cart.add_to_cart' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale | route-public-sudo | /website/form/shop.sale.order — Unauthenticated endpoint 'WebsiteSaleForm.website_form_saleorder' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale_charge_payment_fee | route-public-sudo | /shop/payment — Unauthenticated endpoint 'WebsiteSaleFee.shop_payment' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale_collect | route-public-sudo | /shop/set_click_and_collect_location — Unauthenticated endpoint 'InStoreDelivery.shop_set_click_and_collect_location' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale_loyalty | route-public-sudo | /shop/claimreward — Unauthenticated endpoint 'WebsiteSale.claim_reward' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale_mondialrelay | route-public-sudo | /website_sale_mondialrelay/update_shipping — Unauthenticated endpoint 'MondialRelay.mondial_relay_update_shipping' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale_one_time_delivery_address | route-public-sudo | /shop/update_address — Unauthenticated endpoint 'WebsiteSaleOneTimeDeliveryAddress.shop_update_address' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale_product_brand | route-public-sudo | /page/product_brands — Unauthenticated endpoint 'WebsiteSale.product_brands' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale_stock | route-public-sudo | /shop/add/stock_notification — Unauthenticated endpoint 'WebsiteSaleStock.add_stock_email_notification' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale_wishlist | acl-public-write | access_product_wishlist_portal — Access rule grants write/create/unlink on 'model_product_wishlist' to the portal/public group 'base.group_portal' (naming names its own group, likely a deliberate self-service grant - verify a companion ir.rule scopes it to the user's own records) |
| website_sale_wishlist | route-public-sudo | /shop/wishlist/add — Unauthenticated endpoint 'WebsiteSaleWishlist.add_to_wishlist' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_sale_wishlist | route-public-sudo | /shop/wishlist/remove/<int:wish_id> — Unauthenticated endpoint 'WebsiteSaleWishlist.remove_from_wishlist' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_slides | route-public-sudo | /slides/<int:channel_id>, /slides/<int:channel_id>/category/<int:category_id>, /slides/<int:channel_id>/category/<int:category_id>/page/<int:page>, /slides/<model("slide.channel"):channel>, /slides/<model("slide.channel"):channel>/page/<int:page>, /slides/<model("slide.channel"):channel>/tag/<model("slide.tag"):tag>, /slides/<model("slide.channel"):channel>/tag/<model("slide.tag"):tag>/page/<int:page>, /slides/<model("slide.channel"):channel>/category/<model("slide.slide"):category>, /slides/<model("slide.channel"):channel>/category/<model("slide.slide"):category>/page/<int:page> — Unauthenticated endpoint 'WebsiteSlides.channel' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_slides | route-public-sudo | /slides/channel/join — Unauthenticated endpoint 'WebsiteSlides.slide_channel_join' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_slides | route-public-sudo | /slides/slide/<model("slide.slide"):slide> — Unauthenticated endpoint 'WebsiteSlides.slide_view' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_slides | route-public-sudo | /slides/slide/like — Unauthenticated endpoint 'WebsiteSlides.slide_like' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_slides | route-public-sudo | /slides/slide/quiz/submit — Unauthenticated endpoint 'WebsiteSlides.slide_quiz_submit' (auth="public") calls .sudo(): privileged code reachable without login, review what it exposes |
| website_slides_forum | rule-group-bypass | website_slides_forum_website_slides_officer — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| website_slides_forum | rule-group-bypass | website_slides_forum_website_slides_officer_post — Record rule with an always-true domain bypasses every other record rule of its model for its group |
| website_slides_forum | rule-group-bypass | website_slides_forum_website_slides_officer_tag — Record rule with an always-true domain bypasses every other record rule of its model for its group |
Migration Considerations
Found by automated static analysis: patterns worth a look before/after upgrading a module to a newer Odoo version, not a guarantee.
Warnings 2
| Module | Code | Message |
|---|---|---|
| l10n_ro_stock_report | migration-template-t-raw | report_storage_sheet_report_base — Template 'report_storage_sheet_report_base' uses `t-raw`: removed in Odoo 17.0, replace with `t-out` (auto-escaped) or `Markup`. |
| stock_analytic | migration-view-attrs-states | account_analytic_plan_form_view — View 'account_analytic_plan_form_view' uses the deprecated `attrs=`/`states=` syntax: removed in Odoo 17.0+, replace with direct `invisible`/`readonly`/`required` domain expressions. |
Info 68
| Module | Code | Message |
|---|---|---|
| account | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `update ir_model_data set noupdate = 't' where id in %s` - re-check the table/column names still match after upgrading. |
| account | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_attachment SET res_id = NULL WHERE id IN %s` - re-check the table/column names still match after upgrading. |
| account | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE res_partner SET invoice_edi_format_store = invoice_edi_format_store - res_company.id::char FROM res_company WHERE res_partner.invoice_edi_format_store ->> res_company.id::char IN %s` - re-check the table/column names still match after upgrading. |
| account_peppol | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_attachment SET res_id = NULL WHERE id IN %s` - re-check the table/column names still match after upgrading. |
| attachment_unindex_content | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_attachment SET index_content=NULL WHERE index_content IS NOT NULL` - re-check the table/column names still match after upgrading. |
| auth_totp | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE res_users SET totp_secret = %s WHERE id=%s` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE res_partner SET is_company = NULL, parent_id = NULL WHERE parent_id = id` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE res_partner SET is_company = NULL WHERE parent_id IS NOT NULL AND is_company IS NOT NULL` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_cron SET failure_count = %s, first_failure_date = %s, active = %s WHERE id = %s` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `DELETE FROM ir_cron_trigger WHERE cron_id = %s AND call_at <= %s` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_cron SET nextcall = %s, lastcall = %s WHERE id = %s` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `INSERT INTO ir_cron_trigger(call_at, cron_id) VALUES (%s, %s)` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_cron_progress SET timed_out_counter = 0 WHERE id = %s` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `DELETE FROM res_users_log log1 WHERE EXISTS ( SELECT 1 FROM res_users_log log2 WHERE log1.create_uid = log2.create_uid AND log1.create_date < log2.create_date )` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE res_users SET password=%s WHERE id=%s` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_module_module_dependency SET auto_install_required = (name = any(%s)) WHERE module_id = %s` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `SELECT FROM ir_cron FOR UPDATE` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `INSERT INTO ir_module_module_dependency (module_id, name) values (%s, %s)` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `DELETE FROM ir_module_module_dependency WHERE module_id = %s and name = %s` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `INSERT INTO module_country (module_id, country_id) values (%s, %s)` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `DELETE FROM module_country WHERE module_id = %s and country_id = %s` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `INSERT INTO ir_module_module_exclusion (module_id, name) VALUES (%s, %s)` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `DELETE FROM ir_module_module_exclusion WHERE module_id=%s AND name=%s` - re-check the table/column names still match after upgrading. |
| base | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `INSERT INTO ir_logging(create_date, create_uid, type, dbname, name, level, message, path, line, func) VALUES (NOW() at time zone 'UTC', %s, %s, %s, %s, %s, %s, %s, %s, %s)` - re-check the table/column names still match after upgrading. |
| bus | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `DELETE FROM bus_bus WHERE create_date < %s` - re-check the table/column names still match after upgrading. |
| cloud_storage_migration | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_config_parameter SET value = %s WHERE key = 'cloud_storage_migration_min_attachment_id'` - re-check the table/column names still match after upgrading. |
| database_cleanup | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_attachment SET res_model = NULL WHERE id in %s` - re-check the table/column names still match after upgrading. |
| fieldservice_timeline | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_act_window SET view_mode=replace(view_mode, ',timeline', '')WHERE view_mode LIKE '%,timeline%';` - re-check the table/column names still match after upgrading. |
| fieldservice_timeline | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_act_window SET view_mode=replace(view_mode, 'timeline,', '')WHERE view_mode LIKE '%timeline,%';` - re-check the table/column names still match after upgrading. |
| hr_attendance_report_theoretical_time | migration-sql-view | hr.attendance.theoretical.time.report — Model 'hr.attendance.theoretical.time.report' has `_auto = False` and its init() (re)creates a SQL VIEW: the standard reporting-model pattern, but its raw SQL isn't checked by the ORM - verify it against renamed/removed tables and columns in the target version. |
| hr_expense | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE product_template SET can_be_expensed = false WHERE type NOT IN ('consu', 'service')` - re-check the table/column names still match after upgrading. |
| hr_holidays | migration-sql-view | hr.leave.employee.type.report — Model 'hr.leave.employee.type.report' has `_auto = False` and its init() (re)creates a SQL VIEW: the standard reporting-model pattern, but its raw SQL isn't checked by the ORM - verify it against renamed/removed tables and columns in the target version. |
| hr_holidays | migration-sql-view | hr.leave.report — Model 'hr.leave.report' has `_auto = False` and its init() (re)creates a SQL VIEW: the standard reporting-model pattern, but its raw SQL isn't checked by the ORM - verify it against renamed/removed tables and columns in the target version. |
| hr_holidays | migration-sql-view | hr.leave.report.calendar — Model 'hr.leave.report.calendar' has `_auto = False` and its init() (re)creates a SQL VIEW: the standard reporting-model pattern, but its raw SQL isn't checked by the ORM - verify it against renamed/removed tables and columns in the target version. |
| hr_holidays | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_rule r SET domain_force = '["|", ("employee_id", "=", False), ("employee_id.company_id", "in", company_ids), "|", ("holiday_status_id.company_id", "=", False), ("holiday_status_id.company_id", "in", company_ids)]' FROM ir_model_data d WHERE d.res_id = r.id AND d.model = 'ir.rule' AND d.module = 'hr_holidays' AND d.name = 'hr_leave_allocation_rule_multicompany'` - re-check the table/column names still match after upgrading. |
| l10n_es_aeat | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE account_move SET thirdparty_invoice = False` - re-check the table/column names still match after upgrading. |
| l10n_es_aeat | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE account_journal SET thirdparty_invoice = False` - re-check the table/column names still match after upgrading. |
| l10n_es_aeat_sii_oca | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE account_move SET sii_registration_key = %s WHERE move_type IN ('in_invoice', 'in_refund');` - re-check the table/column names still match after upgrading. |
| l10n_es_aeat_sii_oca | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE account_move SET sii_registration_key = %s WHERE move_type IN ('out_invoice', 'out_refund');` - re-check the table/column names still match after upgrading. |
| l10n_ro_stock_account | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE stock_move sm SET l10n_ro_transfer_account_id = (sl.l10n_ro_property_stock_valuation_account_id->>'sm.company_id')::integer FROM stock_location sl, stock_location sld WHERE sm.location_id = sl.id AND sm.location_dest_id = sld.id AND sl.usage = 'internal' AND sld.usage = 'internal' AND sl.l10n_ro_property_stock_valuation_account_id IS NOT NULL` - re-check the table/column names still match after upgrading. |
| migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE mail_canned_response SET last_used=%(last_used)s WHERE id IN ( SELECT id from mail_canned_response WHERE id IN %(ids)s FOR NO KEY UPDATE SKIP LOCKED )` - re-check the table/column names still match after upgrading. | |
| migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE mail_message SET pinned_at=%s WHERE id=%s` - re-check the table/column names still match after upgrading. | |
| mass_mailing | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `INSERT INTO mailing_subscription (contact_id, list_id) SELECT st.contact_id AS contact_id, %s AS list_id FROM ( SELECT contact.id AS contact_id, contact.email AS email, list.id AS list_id, row_number() OVER (PARTITION BY email ORDER BY email) AS rn FROM mailing_contact contact, mailing_subscription contact_list_rel, mailing_list list WHERE contact.id=contact_list_rel.contact_id AND COALESCE(contact_list_rel.opt_out,FALSE) = FALSE AND contact.email_normalized NOT IN (select email from mail_blacklist where active = TRUE) AND list.id=contact_list_rel.list_id AND list.id IN %s AND NOT EXISTS ( SELECT 1 FROM mailing_contact contact2, mailing_subscription contact_list_rel2 WHERE contact2.email = contact.email AND contact_list_rel2.contact_id = contact2.id AND contact_list_rel2.list_id = %s ) ) st WHERE st.rn = 1;` - re-check the table/column names still match after upgrading. |
| payment_authorize | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `SELECT 1 FROM payment_transaction WHERE id = %s FOR NO KEY UPDATE` - re-check the table/column names still match after upgrading. |
| point_of_sale | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `SELECT id FROM pos_config WHERE id = %s FOR UPDATE NOWAIT` - re-check the table/column names still match after upgrading. |
| pos_online_payment_self_order | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `SELECT id FROM pos_order WHERE id = %s FOR UPDATE NOWAIT` - re-check the table/column names still match after upgrading. |
| product_code_mandatory | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE product_product SET default_code = 'DEFAULT' || nextval('ir_default_id_seq') WHERE default_code is NULL OR LENGTH(default_code) = 0` - re-check the table/column names still match after upgrading. |
| product_sequence | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE product_product SET default_code = '!!mig!!' || id WHERE default_code IS NULL OR default_code = '/';` - re-check the table/column names still match after upgrading. |
| project | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_model_access a SET perm_read = true FROM ir_model_data d WHERE d.res_id = a.id AND d.model = 'ir.model.access' AND d.module = 'project' AND d.name = 'access_project_milestone_portal'` - re-check the table/column names still match after upgrading. |
| project_sms | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_rule r SET domain_force = '[(''model'', ''in'', (''project.task'', ''project.project''))]' FROM ir_model_data d WHERE d.res_id = r.id AND r.domain_force = '[(''model_id.model'', ''in'', (''project.task.type'', ''project.project.stage''))]' AND d.model = 'ir.rule' AND d.module = 'project_sms' AND d.name = 'ir_rule_sms_template_project_manager'` - re-check the table/column names still match after upgrading. |
| purchase | migration-sql-view | purchase.bill.union — Model 'purchase.bill.union' has `_auto = False` and its init() (re)creates a SQL VIEW: the standard reporting-model pattern, but its raw SQL isn't checked by the ORM - verify it against renamed/removed tables and columns in the target version. |
| purchase_stock | migration-sql-view | vendor.delay.report — Model 'vendor.delay.report' has `_auto = False` and its init() (re)creates a SQL VIEW: the standard reporting-model pattern, but its raw SQL isn't checked by the ORM - verify it against renamed/removed tables and columns in the target version. |
| queue_job | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `DROP TRIGGER IF EXISTS queue_job_notify ON queue_job; CREATE OR REPLACE FUNCTION queue_job_notify() RETURNS trigger AS $$ BEGIN IF TG_OP = 'DELETE' THEN IF OLD.state != 'done' THEN PERFORM pg_notify('queue_job', OLD.uuid); END IF; ELSE PERFORM pg_notify('queue_job', NEW.uuid); END IF; RETURN NULL; END; $$ LANGUAGE plpgsql; CREATE TRIGGER queue_job_notify AFTER INSERT OR UPDATE OR DELETE ON queue_job FOR EACH ROW EXECUTE PROCEDURE queue_job_notify();` - re-check the table/column names still match after upgrading. |
| queue_job | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `INSERT INTO queue_job_lock (id, queue_job_id) SELECT id, id FROM queue_job WHERE uuid = %s ON CONFLICT(id) DO NOTHING;` - re-check the table/column names still match after upgrading. |
| queue_job | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `SELECT * FROM queue_job_lock WHERE queue_job_id in ( SELECT id FROM queue_job WHERE uuid = %s AND state = %s ) FOR NO KEY UPDATE SKIP LOCKED;` - re-check the table/column names still match after upgrading. |
| queue_job | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE queue_job SET state=%s, date_enqueued=date_trunc('seconds', now() at time zone 'utc') WHERE uuid=%s` - re-check the table/column names still match after upgrading. |
| queue_job | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `SELECT uuid FROM queue_job WHERE uuid=%s AND state=%s FOR NO KEY UPDATE SKIP LOCKED` - re-check the table/column names still match after upgrading. |
| report_async | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_attachment SET create_uid = %s, write_uid = %s WHERE id = %s` - re-check the table/column names still match after upgrading. |
| sale_financial_risk | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE sale_order_line sol SET risk_partner_id = p.commercial_partner_id FROM sale_order so LEFT JOIN res_partner p ON p.id = so.partner_invoice_id WHERE so.id = sol.order_id and sol.risk_partner_id IS DISTINCT FROM p.commercial_partner_id;` - re-check the table/column names still match after upgrading. |
| sale_loyalty | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `SELECT id FROM loyalty_program WHERE id=%s FOR UPDATE NOWAIT` - re-check the table/column names still match after upgrading. |
| sale_variant_configurator | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE sale_order_line AS line SET product_tmpl_id = product_product.product_tmpl_id FROM product_product WHERE line.product_id = product_product.id;` - re-check the table/column names still match after upgrading. |
| sms | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `DELETE FROM sms_sms WHERE to_delete = TRUE` - re-check the table/column names still match after upgrading. |
| stock_delivery | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE stock_move move SET weight = move.product_qty * product.weight FROM product_product product WHERE move.product_id = product.id AND move.state != 'cancel'` - re-check the table/column names still match after upgrading. |
| webservice | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `SELECT oauth2_token FROM webservice_backend WHERE id=%s FOR NO KEY UPDATE` - re-check the table/column names still match after upgrading. |
| webservice | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE webservice_backend SET oauth2_token=%s WHERE id=%s` - re-check the table/column names still match after upgrading. |
| website | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_model_fields SET website_form_blacklisted=true WHERE website_form_blacklisted IS NULL` - re-check the table/column names still match after upgrading. |
| website | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE ir_model_fields SET website_form_blacklisted=false WHERE model=%s AND name in %s` - re-check the table/column names still match after upgrading. |
| website | migration-raw-sql-write | Raw `cr.execute()` INSERT/UPDATE/DELETE bypasses the ORM (no compute/constrains/tracking/mail): `UPDATE website_visitor SET access_token = partner_id WHERE partner_id::int != access_token::int AND partner_id = %s;` - re-check the table/column names still match after upgrading. |
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…