)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f657ad79da721c409c52f27d138b9c7931ac5939","unresolved":false,"context_lines":[{"line_number":20,"context_line":"Since all three are necessary, a single configuration value ensures"},{"line_number":21,"context_line":"that the change is synchronized across all three calls."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"To test the calls on a live server:"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"curl -H \"X-Auth-Token: $AUTH_TOKEN\"    $OS_AUTH_URL/users/$USERID/groups"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"and"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"openstack user list  --group"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: Ia66f81f86d7c43fbc5ba7f18ada91c77d047f7a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba5da102_97a6900e","line":29,"range":{"start_line":23,"start_character":0,"end_line":29,"end_character":28},"updated":"2016-11-01 00:30:12.000000000","message":"remove this as it\u0027s not necessary to the change","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b0b4e9e51937781cac630d157dae8ace8d204100","unresolved":false,"context_lines":[{"line_number":20,"context_line":"Since all three are necessary, a single configuration value ensures"},{"line_number":21,"context_line":"that the change is synchronized across all three calls."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"To test the calls on a live server:"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"curl -H \"X-Auth-Token: $AUTH_TOKEN\"    $OS_AUTH_URL/users/$USERID/groups"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"and"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"openstack user list  --group"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: Ia66f81f86d7c43fbc5ba7f18ada91c77d047f7a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba5da102_8aa2a997","line":29,"range":{"start_line":23,"start_character":0,"end_line":29,"end_character":28},"in_reply_to":"ba5da102_97a6900e","updated":"2016-11-03 02:31:10.000000000","message":"Done","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f657ad79da721c409c52f27d138b9c7931ac5939","unresolved":false,"context_lines":[{"line_number":27,"context_line":"and"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"openstack user list  --group"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: Ia66f81f86d7c43fbc5ba7f18ada91c77d047f7a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba5da102_f7ab4cd4","line":30,"updated":"2016-11-01 00:30:12.000000000","message":"Open a bug for this issue","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b0b4e9e51937781cac630d157dae8ace8d204100","unresolved":false,"context_lines":[{"line_number":27,"context_line":"and"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"openstack user list  --group"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: Ia66f81f86d7c43fbc5ba7f18ada91c77d047f7a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba5da102_aaabed73","line":30,"in_reply_to":"ba5da102_dff3b69c","updated":"2016-11-03 02:31:10.000000000","message":"Done","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78ed42f93b3a12c0db906129f3996683f741fedb","unresolved":false,"context_lines":[{"line_number":27,"context_line":"and"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"openstack user list  --group"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: Ia66f81f86d7c43fbc5ba7f18ada91c77d047f7a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba5da102_dff3b69c","line":30,"in_reply_to":"ba5da102_f7ab4cd4","updated":"2016-11-01 11:03:01.000000000","message":"++","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ecee0a8fbbb73e6df71701f40e7edcfcd2d3f82a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support AD Nested groups"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Closed-Bug: #1638603"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Active Directory has a very specific mechanism to"},{"line_number":12,"context_line":"handle nested groups.  LDAP queries need to look like this:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"9a629dbe_0910be00","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":20},"updated":"2016-11-08 22:22:47.000000000","message":"nit: move this to the bottom","commit_id":"3e0d74dccc9fa1e7e16095b83b10b0c3eb3ebccf"}],"keystone/conf/ldap.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f657ad79da721c409c52f27d138b9c7931ac5939","unresolved":false,"context_lines":[{"line_number":446,"context_line":"group_ad_nesting \u003d cfg.BoolOpt("},{"line_number":447,"context_line":"    \u0027group_ad_nesting\u0027,"},{"line_number":448,"context_line":"    default\u003dFalse,"},{"line_number":449,"context_line":"    deprecated_for_removal\u003dFalse,"},{"line_number":450,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":451,"context_line":"If enabled, groups queries will use Active Directory specific filters for"},{"line_number":452,"context_line":"nested groups."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_176440e2","line":449,"range":{"start_line":449,"start_character":4,"end_line":449,"end_character":33},"updated":"2016-11-01 00:30:12.000000000","message":"remove this line","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b0b4e9e51937781cac630d157dae8ace8d204100","unresolved":false,"context_lines":[{"line_number":446,"context_line":"group_ad_nesting \u003d cfg.BoolOpt("},{"line_number":447,"context_line":"    \u0027group_ad_nesting\u0027,"},{"line_number":448,"context_line":"    default\u003dFalse,"},{"line_number":449,"context_line":"    deprecated_for_removal\u003dFalse,"},{"line_number":450,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":451,"context_line":"If enabled, groups queries will use Active Directory specific filters for"},{"line_number":452,"context_line":"nested groups."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_6aa555a0","line":449,"range":{"start_line":449,"start_character":4,"end_line":449,"end_character":33},"in_reply_to":"ba5da102_176440e2","updated":"2016-11-03 02:31:10.000000000","message":"Done","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78ed42f93b3a12c0db906129f3996683f741fedb","unresolved":false,"context_lines":[{"line_number":448,"context_line":"    default\u003dFalse,"},{"line_number":449,"context_line":"    deprecated_for_removal\u003dFalse,"},{"line_number":450,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":451,"context_line":"If enabled, groups queries will use Active Directory specific filters for"},{"line_number":452,"context_line":"nested groups."},{"line_number":453,"context_line":"\"\"\"))"},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_7fd54ab7","line":451,"range":{"start_line":451,"start_character":36,"end_line":451,"end_character":52},"updated":"2016-11-01 11:03:01.000000000","message":"Can\u0027t this be used for LDAP queries as well ? Or is it very specific to AD ?","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b0b4e9e51937781cac630d157dae8ace8d204100","unresolved":false,"context_lines":[{"line_number":448,"context_line":"    default\u003dFalse,"},{"line_number":449,"context_line":"    deprecated_for_removal\u003dFalse,"},{"line_number":450,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":451,"context_line":"If enabled, groups queries will use Active Directory specific filters for"},{"line_number":452,"context_line":"nested groups."},{"line_number":453,"context_line":"\"\"\"))"},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_aa74cd35","line":451,"range":{"start_line":451,"start_character":36,"end_line":451,"end_character":52},"in_reply_to":"ba5da102_7fd54ab7","updated":"2016-11-03 02:31:10.000000000","message":"Specific (very) to AD","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"192bb2034d92aebf27febf1f9577df728f8ceac1","unresolved":false,"context_lines":[{"line_number":447,"context_line":"    \u0027group_ad_nesting\u0027,"},{"line_number":448,"context_line":"    default\u003dFalse,"},{"line_number":449,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":450,"context_line":"If enabled, groups queries will use Active Directory specific filters for"},{"line_number":451,"context_line":"nested groups."},{"line_number":452,"context_line":"\"\"\"))"},{"line_number":453,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a629dbe_8612cf07","line":450,"range":{"start_line":450,"start_character":12,"end_line":450,"end_character":18},"updated":"2016-11-09 19:04:20.000000000","message":"group","commit_id":"c6a6e2adb5d8f4281bf73bebec24fe771be4544f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f3c42205bed03fd8f426b246a3aec3244fd29939","unresolved":false,"context_lines":[{"line_number":447,"context_line":"    \u0027group_ad_nesting\u0027,"},{"line_number":448,"context_line":"    default\u003dFalse,"},{"line_number":449,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":450,"context_line":"If enabled, groups queries will use Active Directory specific filters for"},{"line_number":451,"context_line":"nested groups."},{"line_number":452,"context_line":"\"\"\"))"},{"line_number":453,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a629dbe_22f1e695","line":450,"range":{"start_line":450,"start_character":12,"end_line":450,"end_character":18},"in_reply_to":"9a629dbe_8612cf07","updated":"2016-11-09 23:30:52.000000000","message":"No, groups...ones for listing groups","commit_id":"c6a6e2adb5d8f4281bf73bebec24fe771be4544f"}],"keystone/identity/backends/ldap/core.py":[{"author":{"_account_id":9098,"name":"Nathan Kinder","email":"nkinder@redhat.com","username":"nkinder"},"change_message_id":"def98233e830ff716a0482e5049af1fb3ca38702","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        \"\"\"Return a list of groups for which the user is a member.\"\"\""},{"line_number":388,"context_line":"        user_dn_esc \u003d ldap.filter.escape_filter_chars(user_dn)"},{"line_number":389,"context_line":"        if self.conf.group_ad_nesting:"},{"line_number":390,"context_line":"            query \u003d \u0027(%s:1.2.840.113556.1.4.1941:\u003d%s)%s\u0027 % ("},{"line_number":391,"context_line":"                self.member_attribute,"},{"line_number":392,"context_line":"                user_dn_esc)"},{"line_number":393,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6895a0_4d6a191c","line":390,"range":{"start_line":390,"start_character":44,"end_line":390,"end_character":48},"updated":"2016-10-20 20:36:20.000000000","message":"It would be nice to define the OID globally (like we do for CONTROL_TREEDELETE) instead of pasting it in 3 places.  The MSDN docs call this LDAP_MATCHING_RULE_IN_CHAIN.","commit_id":"4242d7b0696341880f4bafe02bc676d04ad16d92"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f657ad79da721c409c52f27d138b9c7931ac5939","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                     \u0027the Mitaka release in favor of read-only identity LDAP \u0027"},{"line_number":36,"context_line":"                     \u0027access. It will be removed in the \"O\" release.\u0027)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LDAP_MATCHING_RULE_IN_CHAIN \u003d \"1.2.840.113556.1.4.1941\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class Identity(base.IdentityDriverBase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_37ef84b1","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":27},"updated":"2016-11-01 00:30:12.000000000","message":"rename this to something GROUP_AD_NESTING_something? add a NOTE as well.","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78ed42f93b3a12c0db906129f3996683f741fedb","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                     \u0027the Mitaka release in favor of read-only identity LDAP \u0027"},{"line_number":36,"context_line":"                     \u0027access. It will be removed in the \"O\" release.\u0027)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LDAP_MATCHING_RULE_IN_CHAIN \u003d \"1.2.840.113556.1.4.1941\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class Identity(base.IdentityDriverBase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_dffd763b","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":27},"in_reply_to":"ba5da102_37ef84b1","updated":"2016-11-01 11:03:01.000000000","message":"Is this a constant for any AD deployment ?","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b0b4e9e51937781cac630d157dae8ace8d204100","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                     \u0027the Mitaka release in favor of read-only identity LDAP \u0027"},{"line_number":36,"context_line":"                     \u0027access. It will be removed in the \"O\" release.\u0027)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LDAP_MATCHING_RULE_IN_CHAIN \u003d \"1.2.840.113556.1.4.1941\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class Identity(base.IdentityDriverBase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_8ad0e9f7","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":27},"in_reply_to":"ba5da102_37ef84b1","updated":"2016-11-03 02:31:10.000000000","message":"This is what the Microsoft control is called, which means it will show up in Google searches.","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b0b4e9e51937781cac630d157dae8ace8d204100","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                     \u0027the Mitaka release in favor of read-only identity LDAP \u0027"},{"line_number":36,"context_line":"                     \u0027access. It will be removed in the \"O\" release.\u0027)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LDAP_MATCHING_RULE_IN_CHAIN \u003d \"1.2.840.113556.1.4.1941\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class Identity(base.IdentityDriverBase):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_4a017169","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":27},"in_reply_to":"ba5da102_dffd763b","updated":"2016-11-03 02:31:10.000000000","message":"Yes.","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f657ad79da721c409c52f27d138b9c7931ac5939","unresolved":false,"context_lines":[{"line_number":403,"context_line":"        \"\"\"Return a filtered list of groups for which the user is a member.\"\"\""},{"line_number":404,"context_line":"        user_dn_esc \u003d ldap.filter.escape_filter_chars(user_dn)"},{"line_number":405,"context_line":"        if self.group_ad_nesting:"},{"line_number":406,"context_line":"            query \u003d \u0027(member:%s:\u003d%s)\u0027 % ("},{"line_number":407,"context_line":"                LDAP_MATCHING_RULE_IN_CHAIN,"},{"line_number":408,"context_line":"                user_dn_esc)"},{"line_number":409,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_5705d877","line":406,"range":{"start_line":406,"start_character":22,"end_line":406,"end_character":28},"updated":"2016-11-01 00:30:12.000000000","message":"use the member attribute here?\n\n  (%s:%s:\u003d%s) %\n  (self.member_attribute, LDAP_MATCHING_RULE_IN_CHAIN, user_dn_esc)","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78ed42f93b3a12c0db906129f3996683f741fedb","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        try:"},{"line_number":420,"context_line":"            if self.group_ad_nesting:"},{"line_number":421,"context_line":"                # NOTE(ayoung): LDAP_SCOPE is used here instead of hard-"},{"line_number":422,"context_line":"                # coding to SCOPE_SUBTREE to get through the unit tests."},{"line_number":423,"context_line":"                # However, it is also probably more correct."},{"line_number":424,"context_line":"                attrs \u003d self._ldap_get_list("},{"line_number":425,"context_line":"                    self.tree_dn, self.LDAP_SCOPE,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_df9496e3","line":422,"range":{"start_line":422,"start_character":42,"end_line":422,"end_character":72},"updated":"2016-11-01 11:03:01.000000000","message":"We should probably fix our unit tests then ?","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f657ad79da721c409c52f27d138b9c7931ac5939","unresolved":false,"context_lines":[{"line_number":424,"context_line":"                attrs \u003d self._ldap_get_list("},{"line_number":425,"context_line":"                    self.tree_dn, self.LDAP_SCOPE,"},{"line_number":426,"context_line":"                    query_params\u003d{"},{"line_number":427,"context_line":"                        \"member:%s:\" % LDAP_MATCHING_RULE_IN_CHAIN:"},{"line_number":428,"context_line":"                        group_dn},"},{"line_number":429,"context_line":"                    attrlist\u003d[self.member_attribute])"},{"line_number":430,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_97ff7066","line":427,"range":{"start_line":427,"start_character":25,"end_line":427,"end_character":31},"updated":"2016-11-01 00:30:12.000000000","message":"again, this should be self.member_attribute, not just \"member\"","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"7f9bf8b79c018ad71ba470d60e7af819ce8b2f96","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        \"\"\"Return a list of groups for which the user is a member.\"\"\""},{"line_number":391,"context_line":"        user_dn_esc \u003d ldap.filter.escape_filter_chars(user_dn)"},{"line_number":392,"context_line":"        if self.group_ad_nesting:"},{"line_number":393,"context_line":"            query \u003d \u0027(%s:%s:\u003d%s)%s\u0027 % ("},{"line_number":394,"context_line":"                self.member_attribute,"},{"line_number":395,"context_line":"                LDAP_MATCHING_RULE_IN_CHAIN,"},{"line_number":396,"context_line":"                user_dn_esc)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5da102_464b1359","line":393,"updated":"2016-11-03 03:19:26.000000000","message":"Extra %s, this should throw a runtime error.","commit_id":"3fdc5d646854a4db1dceed90293eb59cb2d4e3d4"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"60f1c62b033a0bcb356dc8091362683159ed9b1f","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        \"\"\"Return a list of groups for which the user is a member.\"\"\""},{"line_number":391,"context_line":"        user_dn_esc \u003d ldap.filter.escape_filter_chars(user_dn)"},{"line_number":392,"context_line":"        if self.group_ad_nesting:"},{"line_number":393,"context_line":"            query \u003d \u0027(%s:%s:\u003d%s)%s\u0027 % ("},{"line_number":394,"context_line":"                self.member_attribute,"},{"line_number":395,"context_line":"                LDAP_MATCHING_RULE_IN_CHAIN,"},{"line_number":396,"context_line":"                user_dn_esc)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5da102_9859f837","line":393,"in_reply_to":"ba5da102_464b1359","updated":"2016-11-03 12:02:01.000000000","message":"+1, i am surprised it doesn\u0027t fail","commit_id":"3fdc5d646854a4db1dceed90293eb59cb2d4e3d4"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"3ec38e525c6ec788486d994640955075935b0540","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            query \u003d \u0027(%s:%s:\u003d%s)%s\u0027 % ("},{"line_number":394,"context_line":"                self.member_attribute,"},{"line_number":395,"context_line":"                LDAP_MATCHING_RULE_IN_CHAIN,"},{"line_number":396,"context_line":"                user_dn_esc)"},{"line_number":397,"context_line":"        else:"},{"line_number":398,"context_line":"            query \u003d \u0027(%s\u003d%s)\u0027 % (self.member_attribute,"},{"line_number":399,"context_line":"                                 user_dn_esc)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5da102_583200a8","line":396,"updated":"2016-11-03 12:06:11.000000000","message":"this is indeed untested. I inserted \"assert False\" and it didn\u0027t fail.","commit_id":"3fdc5d646854a4db1dceed90293eb59cb2d4e3d4"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"e424b7134c293c577443ed21191197653be6c643","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            # member_of elsewhere, so they are not the same."},{"line_number":409,"context_line":"            query \u003d \u0027(member:%s:\u003d%s)\u0027 % ("},{"line_number":410,"context_line":"                LDAP_MATCHING_RULE_IN_CHAIN,"},{"line_number":411,"context_line":"                user_dn_esc)"},{"line_number":412,"context_line":"        else:"},{"line_number":413,"context_line":"            query \u003d \u0027(%s\u003d%s)\u0027 % (self.member_attribute,"},{"line_number":414,"context_line":"                                 user_dn_esc)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_07c17d80","line":411,"updated":"2016-11-09 06:47:43.000000000","message":"this is untested","commit_id":"c969655986b7f88eedb08043e3c942d33e759d24"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"50d6a38f2ecc18031794f71cf922d8bef3314df8","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            # member_of elsewhere, so they are not the same."},{"line_number":409,"context_line":"            query \u003d \u0027(member:%s:\u003d%s)\u0027 % ("},{"line_number":410,"context_line":"                LDAP_MATCHING_RULE_IN_CHAIN,"},{"line_number":411,"context_line":"                user_dn_esc)"},{"line_number":412,"context_line":"        else:"},{"line_number":413,"context_line":"            query \u003d \u0027(%s\u003d%s)\u0027 % (self.member_attribute,"},{"line_number":414,"context_line":"                                 user_dn_esc)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a629dbe_a66a73b1","line":411,"in_reply_to":"9a629dbe_07c17d80","updated":"2016-11-09 18:58:07.000000000","message":"Done","commit_id":"c969655986b7f88eedb08043e3c942d33e759d24"}],"keystone/tests/unit/test_backend_ldap.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f657ad79da721c409c52f27d138b9c7931ac5939","unresolved":false,"context_lines":[{"line_number":3291,"context_line":"    def config_overrides(self):"},{"line_number":3292,"context_line":"        super(LDAPMatchingRuleInChainTests, self).config_overrides()"},{"line_number":3293,"context_line":"        self.config_fixture.config(group\u003d\u0027identity\u0027, driver\u003d\u0027ldap\u0027)"},{"line_number":3294,"context_line":"        self.config_fixture.config(group\u003d\u0027ldap\u0027,"},{"line_number":3295,"context_line":"                                   group_ad_nesting\u003dTrue,"},{"line_number":3296,"context_line":"                                   url\u003d\u0027fake://memory\u0027,"},{"line_number":3297,"context_line":"                                   chase_referrals\u003dFalse)"},{"line_number":3298,"context_line":""},{"line_number":3299,"context_line":"        self.config_fixture.config("},{"line_number":3300,"context_line":"            group\u003d\u0027ldap\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_174b60ca","line":3297,"range":{"start_line":3294,"start_character":0,"end_line":3297,"end_character":57},"updated":"2016-11-01 00:30:12.000000000","message":"self.config_fixture.config(group\u003d\u0027ldap\u0027,\n                         group_ad_nesting\u003dTrue,\n                         url\u003d\u0027fake://memory\u0027,\n                         chase_referrals\u003dFalse,\n                         query_scope\u003d\u0027one\u0027,\n                    group_tree_dn\u003d\u0027cn\u003dUserGroups,cn\u003dexample,cn\u003dcom\u0027)","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f657ad79da721c409c52f27d138b9c7931ac5939","unresolved":false,"context_lines":[{"line_number":3298,"context_line":""},{"line_number":3299,"context_line":"        self.config_fixture.config("},{"line_number":3300,"context_line":"            group\u003d\u0027ldap\u0027,"},{"line_number":3301,"context_line":"            group_tree_dn\u003d\u0027cn\u003dUserGroups,cn\u003dexample,cn\u003dcom\u0027)"},{"line_number":3302,"context_line":"        self.config_fixture.config(group\u003d\u0027ldap\u0027, query_scope\u003d\u0027one\u0027)"},{"line_number":3303,"context_line":""},{"line_number":3304,"context_line":"    def config_files(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_b739d443","line":3301,"range":{"start_line":3301,"start_character":12,"end_line":3301,"end_character":58},"updated":"2016-11-01 00:30:12.000000000","message":"add this to the fixture a few lines up","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f657ad79da721c409c52f27d138b9c7931ac5939","unresolved":false,"context_lines":[{"line_number":3299,"context_line":"        self.config_fixture.config("},{"line_number":3300,"context_line":"            group\u003d\u0027ldap\u0027,"},{"line_number":3301,"context_line":"            group_tree_dn\u003d\u0027cn\u003dUserGroups,cn\u003dexample,cn\u003dcom\u0027)"},{"line_number":3302,"context_line":"        self.config_fixture.config(group\u003d\u0027ldap\u0027, query_scope\u003d\u0027one\u0027)"},{"line_number":3303,"context_line":""},{"line_number":3304,"context_line":"    def config_files(self):"},{"line_number":3305,"context_line":"        config_files \u003d super(LDAPMatchingRuleInChainTests, self).config_files()"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_d74008a8","line":3302,"range":{"start_line":3302,"start_character":49,"end_line":3302,"end_character":67},"updated":"2016-11-01 00:30:12.000000000","message":"this one too","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78ed42f93b3a12c0db906129f3996683f741fedb","unresolved":false,"context_lines":[{"line_number":3306,"context_line":"        config_files.append(unit.dirs.tests_conf(\u0027backend_ldap.conf\u0027))"},{"line_number":3307,"context_line":"        return config_files"},{"line_number":3308,"context_line":""},{"line_number":3309,"context_line":"    def test_nested_group_operations(self):"},{"line_number":3310,"context_line":""},{"line_number":3311,"context_line":"        group \u003d unit.new_group_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":3312,"context_line":"        group \u003d self.identity_api.create_group(group)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_9f0dbe40","line":3309,"range":{"start_line":3309,"start_character":13,"end_line":3309,"end_character":25},"updated":"2016-11-01 11:03:01.000000000","message":"I can\u0027t see how groups are nested in LDAP in this test","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f657ad79da721c409c52f27d138b9c7931ac5939","unresolved":false,"context_lines":[{"line_number":3306,"context_line":"        config_files.append(unit.dirs.tests_conf(\u0027backend_ldap.conf\u0027))"},{"line_number":3307,"context_line":"        return config_files"},{"line_number":3308,"context_line":""},{"line_number":3309,"context_line":"    def test_nested_group_operations(self):"},{"line_number":3310,"context_line":""},{"line_number":3311,"context_line":"        group \u003d unit.new_group_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":3312,"context_line":"        group \u003d self.identity_api.create_group(group)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_b78714d6","line":3309,"updated":"2016-11-01 00:30:12.000000000","message":"you\u0027re not testing the other operations: list_groups, and check_user_in_group.\n\nalso, i question how much these tests are exercising the specific behaviour you\u0027re adding, is there anyway to check the query string for \"1.2.840.113556.1.4.1941\"","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b0b4e9e51937781cac630d157dae8ace8d204100","unresolved":false,"context_lines":[{"line_number":3306,"context_line":"        config_files.append(unit.dirs.tests_conf(\u0027backend_ldap.conf\u0027))"},{"line_number":3307,"context_line":"        return config_files"},{"line_number":3308,"context_line":""},{"line_number":3309,"context_line":"    def test_nested_group_operations(self):"},{"line_number":3310,"context_line":""},{"line_number":3311,"context_line":"        group \u003d unit.new_group_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":3312,"context_line":"        group \u003d self.identity_api.create_group(group)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_0a6a19ee","line":3309,"range":{"start_line":3309,"start_character":13,"end_line":3309,"end_character":25},"in_reply_to":"ba5da102_9f0dbe40","updated":"2016-11-03 02:31:10.000000000","message":"they are not, as all that logic is in the AD server.  This is merely making sure the code continues to execute without syntax error.","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b0b4e9e51937781cac630d157dae8ace8d204100","unresolved":false,"context_lines":[{"line_number":3306,"context_line":"        config_files.append(unit.dirs.tests_conf(\u0027backend_ldap.conf\u0027))"},{"line_number":3307,"context_line":"        return config_files"},{"line_number":3308,"context_line":""},{"line_number":3309,"context_line":"    def test_nested_group_operations(self):"},{"line_number":3310,"context_line":""},{"line_number":3311,"context_line":"        group \u003d unit.new_group_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":3312,"context_line":"        group \u003d self.identity_api.create_group(group)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_8aaf0929","line":3309,"in_reply_to":"ba5da102_b78714d6","updated":"2016-11-03 02:31:10.000000000","message":"They are merely running through the code, to make sure it does not explode.","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78ed42f93b3a12c0db906129f3996683f741fedb","unresolved":false,"context_lines":[{"line_number":3311,"context_line":"        group \u003d unit.new_group_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":3312,"context_line":"        group \u003d self.identity_api.create_group(group)"},{"line_number":3313,"context_line":""},{"line_number":3314,"context_line":"        group_ref \u003d self.identity_api.get_group(group[\u0027id\u0027])"},{"line_number":3315,"context_line":"        self.assertDictEqual(group, group_ref)"},{"line_number":3316,"context_line":""},{"line_number":3317,"context_line":"        group_ref \u003d self.identity_api.get_group(group[\u0027id\u0027])"},{"line_number":3318,"context_line":"        self.assertDictEqual(group, group_ref)"},{"line_number":3319,"context_line":""},{"line_number":3320,"context_line":"        self.identity_api.delete_group(group[\u0027id\u0027])"},{"line_number":3321,"context_line":"        self.assertRaises(exception.GroupNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_7f3f0ad6","line":3318,"range":{"start_line":3314,"start_character":0,"end_line":3318,"end_character":46},"updated":"2016-11-01 11:03:01.000000000","message":"Why doing the same twice?","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b0b4e9e51937781cac630d157dae8ace8d204100","unresolved":false,"context_lines":[{"line_number":3311,"context_line":"        group \u003d unit.new_group_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":3312,"context_line":"        group \u003d self.identity_api.create_group(group)"},{"line_number":3313,"context_line":""},{"line_number":3314,"context_line":"        group_ref \u003d self.identity_api.get_group(group[\u0027id\u0027])"},{"line_number":3315,"context_line":"        self.assertDictEqual(group, group_ref)"},{"line_number":3316,"context_line":""},{"line_number":3317,"context_line":"        group_ref \u003d self.identity_api.get_group(group[\u0027id\u0027])"},{"line_number":3318,"context_line":"        self.assertDictEqual(group, group_ref)"},{"line_number":3319,"context_line":""},{"line_number":3320,"context_line":"        self.identity_api.delete_group(group[\u0027id\u0027])"},{"line_number":3321,"context_line":"        self.assertRaises(exception.GroupNotFound,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5da102_6a79d5c7","line":3318,"range":{"start_line":3314,"start_character":0,"end_line":3318,"end_character":46},"in_reply_to":"ba5da102_7f3f0ad6","updated":"2016-11-03 02:31:10.000000000","message":"Done","commit_id":"0392e669661f47e362732eba8d03be0e2d0759fe"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"3ec38e525c6ec788486d994640955075935b0540","unresolved":false,"context_lines":[{"line_number":3281,"context_line":"        super(LdapFilterTests, self).test_list_users_in_group_exact_filtered()"},{"line_number":3282,"context_line":""},{"line_number":3283,"context_line":""},{"line_number":3284,"context_line":"class LDAPMatchingRuleInChainTests(LDAPTestSetup):"},{"line_number":3285,"context_line":""},{"line_number":3286,"context_line":"    def setUp(self):"},{"line_number":3287,"context_line":"        self.useFixture(database.Database())"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5da102_18e2482f","line":3284,"range":{"start_line":3284,"start_character":6,"end_line":3284,"end_character":34},"updated":"2016-11-03 12:06:11.000000000","message":"i suggest to rename this to something like NestedGroupTests","commit_id":"3fdc5d646854a4db1dceed90293eb59cb2d4e3d4"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"192bb2034d92aebf27febf1f9577df728f8ceac1","unresolved":false,"context_lines":[{"line_number":3324,"context_line":"    def test_list_groups_for_user(self):"},{"line_number":3325,"context_line":"        groups_ref \u003d self.identity_api.list_groups_for_user(self.user[\u0027id\u0027])"},{"line_number":3326,"context_line":"        self.assertEqual(0, len(groups_ref))"},{"line_number":3327,"context_line":"        "},{"line_number":3328,"context_line":"    def test_list_groups(self):"},{"line_number":3329,"context_line":"        groups_refs \u003d self.identity_api.list_groups()"},{"line_number":3330,"context_line":"        self.assertEqual(1, len(groups_refs))"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a629dbe_266023a5","line":3327,"range":{"start_line":3327,"start_character":0,"end_line":3327,"end_character":8},"updated":"2016-11-09 19:04:20.000000000","message":"trailing spaces","commit_id":"c6a6e2adb5d8f4281bf73bebec24fe771be4544f"}],"releasenotes/notes/bug-1638603-354ee4167e6e.yaml":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ecee0a8fbbb73e6df71701f40e7edcfcd2d3f82a","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - \u003e"},{"line_number":4,"context_line":"    [`bug 1638603 \u003chttps://bugs.launchpad.net/keystone/+bug/1638603\u003e`_]"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    handle nested groups.  LDAP queries need to look like this:"},{"line_number":7,"context_line":"    \"(\u0026(objectClass\u003dgroup)"},{"line_number":8,"context_line":"       (member\u003dmember:1.2.840.113556.1.4.1941:\u003dCN\u003dnwalnut,OU\u003dUsers,DC\u003dEXAMPLE,DC\u003dCOM))\""},{"line_number":9,"context_line":"    "}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9a629dbe_e92f0a3c","line":6,"range":{"start_line":6,"start_character":4,"end_line":6,"end_character":24},"updated":"2016-11-08 22:22:47.000000000","message":"Support nested groups in Active Directory. A new boolean option ``[ldap] group_ad_nesting`` has been added, it defaults to ``False``. Enable the option is using Active Directory with nested groups. This option will impact the ``list_users_in_group``, ``list_groups_for_user``, and ``check_user_in_group`` operations.","commit_id":"3e0d74dccc9fa1e7e16095b83b10b0c3eb3ebccf"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ecee0a8fbbb73e6df71701f40e7edcfcd2d3f82a","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - \u003e"},{"line_number":4,"context_line":"    [`bug 1638603 \u003chttps://bugs.launchpad.net/keystone/+bug/1638603\u003e`_]"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    handle nested groups.  LDAP queries need to look like this:"},{"line_number":7,"context_line":"    \"(\u0026(objectClass\u003dgroup)"},{"line_number":8,"context_line":"       (member\u003dmember:1.2.840.113556.1.4.1941:\u003dCN\u003dnwalnut,OU\u003dUsers,DC\u003dEXAMPLE,DC\u003dCOM))\""},{"line_number":9,"context_line":"    "},{"line_number":10,"context_line":"    If a deployment is using nested groups, three queries need to be"},{"line_number":11,"context_line":"    modified to support it:  list users in a group, list groups for a"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9a629dbe_a9ffd2a8","line":8,"range":{"start_line":6,"start_character":27,"end_line":8,"end_character":87},"updated":"2016-11-08 22:22:47.000000000","message":"this is redundant to a deployer","commit_id":"3e0d74dccc9fa1e7e16095b83b10b0c3eb3ebccf"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ecee0a8fbbb73e6df71701f40e7edcfcd2d3f82a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    modified to support it:  list users in a group, list groups for a"},{"line_number":12,"context_line":"    user, check if a user is in a group"},{"line_number":13,"context_line":"    "},{"line_number":14,"context_line":"    Since all three are necessary, a single configuration value"},{"line_number":15,"context_line":"    ensures that the change is synchronized across all three calls."},{"line_number":16,"context_line":"    "}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9a629dbe_a916f2ee","line":14,"range":{"start_line":14,"start_character":35,"end_line":14,"end_character":63},"updated":"2016-11-08 22:22:47.000000000","message":"whats the config option?","commit_id":"3e0d74dccc9fa1e7e16095b83b10b0c3eb3ebccf"}],"releasenotes/notes/bug-1638603-354ee4167e6e.yaml~":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ecee0a8fbbb73e6df71701f40e7edcfcd2d3f82a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"9a629dbe_e908eadb","updated":"2016-11-08 22:22:47.000000000","message":"delete this file, its a dupe of the other","commit_id":"3e0d74dccc9fa1e7e16095b83b10b0c3eb3ebccf"}]}
