)]}'
{"keystone/identity/backends/ldap/common.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d044a320f5853f53a90f6bb49c2f0a9e86dd4d33","unresolved":true,"context_lines":[{"line_number":2191,"context_line":"    def create(self, values):"},{"line_number":2192,"context_line":"        if self.enabled_emulation:"},{"line_number":2193,"context_line":"            enabled_value \u003d values.pop(\u0027enabled\u0027, True)"},{"line_number":2194,"context_line":"            if enabled_value is None:"},{"line_number":2195,"context_line":"                enabled_value \u003d True"},{"line_number":2196,"context_line":"            ref \u003d super().create(values)"},{"line_number":2197,"context_line":"            if \u0027enabled\u0027 not in self.attribute_ignore:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ca34224b_76b000c5","line":2194,"updated":"2026-06-15 19:00:14.000000000","message":"No test added for this normalization. Please add a unit test exercising `EnabledEmuMixIn.create` with `enabled\u003dNone`.","commit_id":"21231a9ab6c0148409033334bbfcb5e66603093e"}],"keystone/identity/backends/ldap/core.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d044a320f5853f53a90f6bb49c2f0a9e86dd4d33","unresolved":true,"context_lines":[{"line_number":269,"context_line":"        obj \u003d super()._ldap_res_to_model(res)"},{"line_number":270,"context_line":"        # Normalize enabled\u003dNone to the configured default to prevent"},{"line_number":271,"context_line":"        # int(None) crashes and truthiness bugs downstream"},{"line_number":272,"context_line":"        if \u0027enabled\u0027 in obj and obj[\u0027enabled\u0027] is None:"},{"line_number":273,"context_line":"            obj[\u0027enabled\u0027] \u003d self.enabled_default"},{"line_number":274,"context_line":"        if self.enabled_mask !\u003d 0:"},{"line_number":275,"context_line":"            enabled \u003d int(obj.get(\u0027enabled\u0027, self.enabled_default))"}],"source_content_type":"text/x-python","patch_set":1,"id":"edd4dfff_71b82e6e","line":272,"updated":"2026-06-15 19:00:14.000000000","message":"No test added for this normalization or for the `int(None)` crash this is meant to prevent. A test in `tests/unit/identity/backends/test_ldap.py` (or `test_ldap_common.py`) that constructs an LDAP response with an empty enabled attribute list and calls `_ldap_res_to_model` would protect against regression.","commit_id":"21231a9ab6c0148409033334bbfcb5e66603093e"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d044a320f5853f53a90f6bb49c2f0a9e86dd4d33","unresolved":true,"context_lines":[{"line_number":270,"context_line":"        # Normalize enabled\u003dNone to the configured default to prevent"},{"line_number":271,"context_line":"        # int(None) crashes and truthiness bugs downstream"},{"line_number":272,"context_line":"        if \u0027enabled\u0027 in obj and obj[\u0027enabled\u0027] is None:"},{"line_number":273,"context_line":"            obj[\u0027enabled\u0027] \u003d self.enabled_default"},{"line_number":274,"context_line":"        if self.enabled_mask !\u003d 0:"},{"line_number":275,"context_line":"            enabled \u003d int(obj.get(\u0027enabled\u0027, self.enabled_default))"},{"line_number":276,"context_line":"            obj[\u0027enabled\u0027] \u003d (enabled \u0026 self.enabled_mask) !\u003d self.enabled_mask"}],"source_content_type":"text/x-python","patch_set":1,"id":"0ecc9a0d_b49d0496","line":273,"updated":"2026-06-15 19:00:14.000000000","message":"`self.enabled_default` is `cfg.StrOpt` (default `\u0027True\u0027`). Assigning it directly to `obj[\u0027enabled\u0027]` puts a string into the dict. Downstream the string-vs-bool path at line 283 handles strings, but other consumers of the user dict may expect a bool. The `int()` path at line 275 also breaks if `enabled_default\u003d\u0027True\u0027` and `enabled_mask !\u003d 0` (`int(\u0027True\u0027)` raises `ValueError`); this is a misconfiguration today, but the new normalisation makes it reachable for previously-NULL records too. I think it would be safer to coerce to a bool here.","commit_id":"21231a9ab6c0148409033334bbfcb5e66603093e"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d044a320f5853f53a90f6bb49c2f0a9e86dd4d33","unresolved":true,"context_lines":[{"line_number":320,"context_line":"        if self.enabled_mask or ("},{"line_number":321,"context_line":"            self.enabled_invert and not self.enabled_emulation"},{"line_number":322,"context_line":"        ):"},{"line_number":323,"context_line":"            values[\u0027enabled\u0027] \u003d ("},{"line_number":324,"context_line":"                orig_enabled"},{"line_number":325,"context_line":"                if orig_enabled is not None"},{"line_number":326,"context_line":"                else self.enabled_default"}],"source_content_type":"text/x-python","patch_set":1,"id":"4e4795a5_db0510eb","line":323,"updated":"2026-06-15 19:00:14.000000000","message":"No test added for this mask-restore fallback. Please add a unit test exercising `create()` with `orig_enabled\u003dNone` under `enabled_mask` or `enabled_invert` configuration.","commit_id":"21231a9ab6c0148409033334bbfcb5e66603093e"}],"keystone/resource/core.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d044a320f5853f53a90f6bb49c2f0a9e86dd4d33","unresolved":true,"context_lines":[{"line_number":567,"context_line":"            resource_id\u003dproject[\u0027id\u0027],"},{"line_number":568,"context_line":"        )"},{"line_number":569,"context_line":"        project_id \u003d project[\u0027id\u0027]"},{"line_number":570,"context_line":"        if project[\u0027is_domain\u0027] and project.get(\u0027enabled\u0027) is not False:"},{"line_number":571,"context_line":"            raise exception.ValidationError("},{"line_number":572,"context_line":"                message\u003d_("},{"line_number":573,"context_line":"                    \u0027cannot delete an enabled project acting as a \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"f5446b19_ae1a1c6d","line":570,"updated":"2026-06-15 19:00:14.000000000","message":"This change is meaningful for the case where `_delete_domain_contents` recursively deletes a child project that is itself a domain with `enabled\u003dNone`, but the new tests do not cover this scenario. Both new tests in `DeletionNullEnabledBypassTest` exercise the `_delete_domain` check at line 921, not this one. Could you please add a test where a parent domain contains a child `is_domain\u003dTrue` project with `enabled\u003dNone`, and assert the deletion is rejected?","commit_id":"21231a9ab6c0148409033334bbfcb5e66603093e"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"4c4a6081ec1bbc238ffc782c8b4f1e278a5ee507","unresolved":false,"context_lines":[{"line_number":567,"context_line":"            resource_id\u003dproject[\u0027id\u0027],"},{"line_number":568,"context_line":"        )"},{"line_number":569,"context_line":"        project_id \u003d project[\u0027id\u0027]"},{"line_number":570,"context_line":"        if project[\u0027is_domain\u0027] and project.get(\u0027enabled\u0027) is not False:"},{"line_number":571,"context_line":"            raise exception.ValidationError("},{"line_number":572,"context_line":"                message\u003d_("},{"line_number":573,"context_line":"                    \u0027cannot delete an enabled project acting as a \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"d712754c_cac9fb98","line":570,"in_reply_to":"f5446b19_ae1a1c6d","updated":"2026-06-15 19:04:08.000000000","message":"Please disregard this comment, it is silly.","commit_id":"21231a9ab6c0148409033334bbfcb5e66603093e"}],"keystone/tests/unit/identity/test_backend_sql.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d044a320f5853f53a90f6bb49c2f0a9e86dd4d33","unresolved":true,"context_lines":[{"line_number":525,"context_line":"class UserNullEnabledHybridPropertyTest(test_backend_sql.SqlTests):"},{"line_number":526,"context_line":"    \"\"\"Tests that the hybrid property returns True for enabled\u003dNone.\"\"\""},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    def setUp(self):"},{"line_number":529,"context_line":"        super().setUp()"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    def _set_user_enabled_null(self, user_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"74b99614_01727544","line":528,"updated":"2026-06-15 19:00:14.000000000","message":"The `setUp` method only calls `super().setUp()`. Could you please remove it? It\u0027s redundant.","commit_id":"21231a9ab6c0148409033334bbfcb5e66603093e"}]}
