)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"fd1780fc96a7c70c3b7265e83da76f6f423d5f1c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"- Passwords/phrases must meet the specificed regex"},{"line_number":18,"context_line":"- User attempting to change password early"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Partially-Implements: bp pci-dss-notifications"},{"line_number":21,"context_line":"Co-Authored-By: Tin Lam \u003ctinlam@gmail.com\u003e"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: Ia678d25bdfa151c95483f5fcb77853184fbecfd1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"3a71b18c_e362a3d7","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":46},"updated":"2016-12-09 18:29:20.000000000","message":"Doesn\u0027t it complete the implementation of the bp? If so, please replace with \"Implements: bp pci-dss-notifications\"","commit_id":"505283ed9ae4d3e458d07ba9e350b609f8de339e"}],"doc/source/event_notifications.rst":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6084ee74f88a2bd96424a48438908ad657274f7a","unresolved":false,"context_lines":[{"line_number":175,"context_line":"* ``\u003caction\u003e``: The action being performed, typically:"},{"line_number":176,"context_line":"  ``\u003coperation\u003e``. ``\u003cresource_type\u003e``"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"There is also a specific ``\u003creason\u003e`` key that is present for the following"},{"line_number":179,"context_line":"various PCI-DSS related events:"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* ``PCI-DSS 8.1.6``: Limit repeated access attempts by locking out the user"},{"line_number":182,"context_line":"  after more than X attempts."}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_0f13245c","line":179,"range":{"start_line":178,"start_character":66,"end_line":179,"end_character":7},"updated":"2016-11-17 13:47:31.000000000","message":"s/following various/following","commit_id":"588738aef7f81df3a7c425404387b00ae3d824e9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6084ee74f88a2bd96424a48438908ad657274f7a","unresolved":false,"context_lines":[{"line_number":179,"context_line":"various PCI-DSS related events:"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"* ``PCI-DSS 8.1.6``: Limit repeated access attempts by locking out the user"},{"line_number":182,"context_line":"  after more than X attempts."},{"line_number":183,"context_line":"* ``PCI-DSS 8.2.3``: Passwords must meet the established criteria."},{"line_number":184,"context_line":"* ``PCI-DSS 8.2.4``: Password must be changed every X days."},{"line_number":185,"context_line":"* ``PCI-DSS 8.2.5``: Do not let users reuse the last X passwords."}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a77a97e_efb18848","line":182,"range":{"start_line":182,"start_character":20,"end_line":182,"end_character":28},"updated":"2016-11-17 13:47:31.000000000","message":"failed attempts.","commit_id":"588738aef7f81df3a7c425404387b00ae3d824e9"}],"keystone/exception.py":[{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"83e7364275bb052154d9bcf5f893be2019df7997","unresolved":false,"context_lines":[{"line_number":105,"context_line":"class PasswordHistoryValidationError(PasswordValidationError):"},{"line_number":106,"context_line":"    message_format \u003d _(\"The new password cannot be identical to a \""},{"line_number":107,"context_line":"                       \"previous password. The number of previous \""},{"line_number":108,"context_line":"                       \"passwords that must be unique is: \""},{"line_number":109,"context_line":"                       \"%(unique_count)s\")"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class PasswordAgeValidationError(PasswordValidationError):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a77a97e_c9494562","line":109,"range":{"start_line":108,"start_character":55,"end_line":109,"end_character":42},"updated":"2016-11-17 01:29:00.000000000","message":"Typically sentences structure with a \":\" then a variable do not translate well. Not every language can end with an \"is\"","commit_id":"3e7a42dfdd5f1254e2a4f8e655618b8b26fd56b8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"261d1321db99b49003557022ed4ca72c01e5081e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"1a6eadb0_42b84375","updated":"2016-12-16 19:43:01.000000000","message":"the changes in sql, exception and validators could/should have gone into a separate change.","commit_id":"c3735e4880de533bbcd21d07739141125048a5e3"}],"keystone/identity/core.py":[{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"83e7364275bb052154d9bcf5f893be2019df7997","unresolved":false,"context_lines":[{"line_number":1287,"context_line":"        try:"},{"line_number":1288,"context_line":"            validators.validate_password(new_password)"},{"line_number":1289,"context_line":"            driver.change_password(entity_id, new_password)"},{"line_number":1290,"context_line":"        except Exception as ex:"},{"line_number":1291,"context_line":"            reason \u003d {\u0027reasonCode\u0027: ex.code,"},{"line_number":1292,"context_line":"                      \u0027reasonType\u0027: str(ex)}"},{"line_number":1293,"context_line":"            notifications.Audit.updated(self._USER, user_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a77a97e_09eb3d14","line":1290,"range":{"start_line":1290,"start_character":15,"end_line":1290,"end_character":24},"updated":"2016-11-17 01:29:00.000000000","message":"catch only the specific exceptions raised","commit_id":"3e7a42dfdd5f1254e2a4f8e655618b8b26fd56b8"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a593f8ca495ff13e91403c15d57b0791391b4dfb","unresolved":false,"context_lines":[{"line_number":1295,"context_line":"            validators.validate_password(new_password)"},{"line_number":1296,"context_line":"            driver.change_password(entity_id, new_password)"},{"line_number":1297,"context_line":"        except exception.PasswordValidationError as ex:"},{"line_number":1298,"context_line":"            audit_reason \u003d reason.Reason(str(ex), str(ex.code))"},{"line_number":1299,"context_line":"            notifications.Audit.updated(self._USER, user_id,"},{"line_number":1300,"context_line":"                                        initiator, reason\u003daudit_reason)"},{"line_number":1301,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_6883d2cc","line":1298,"range":{"start_line":1298,"start_character":45,"end_line":1298,"end_character":47},"updated":"2016-12-09 18:25:04.000000000","message":"isn\u0027t there a ex.message or something like that allowing you to get the message?","commit_id":"505283ed9ae4d3e458d07ba9e350b609f8de339e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"2e333732082657165d211e1411d80d6f5177fa68","unresolved":false,"context_lines":[{"line_number":1295,"context_line":"            validators.validate_password(new_password)"},{"line_number":1296,"context_line":"            driver.change_password(entity_id, new_password)"},{"line_number":1297,"context_line":"        except exception.PasswordValidationError as ex:"},{"line_number":1298,"context_line":"            audit_reason \u003d reason.Reason(str(ex), str(ex.code))"},{"line_number":1299,"context_line":"            notifications.Audit.updated(self._USER, user_id,"},{"line_number":1300,"context_line":"                                        initiator, reason\u003daudit_reason)"},{"line_number":1301,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_843bb6d0","line":1298,"range":{"start_line":1298,"start_character":45,"end_line":1298,"end_character":47},"in_reply_to":"3a71b18c_636e93ca","updated":"2016-12-09 19:28:38.000000000","message":"Tested with both default ex.message and ex.message_format. ex.message causes 10 tests to fail with deprecation warnings about using BaseException.message and ex.message_format causes the details to be left out:\n\nhttp://i.imgur.com/WCkEeYG.png","commit_id":"505283ed9ae4d3e458d07ba9e350b609f8de339e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"bc956b32d08e1c78c171ea10502476793967b60b","unresolved":false,"context_lines":[{"line_number":1295,"context_line":"            validators.validate_password(new_password)"},{"line_number":1296,"context_line":"            driver.change_password(entity_id, new_password)"},{"line_number":1297,"context_line":"        except exception.PasswordValidationError as ex:"},{"line_number":1298,"context_line":"            audit_reason \u003d reason.Reason(str(ex), str(ex.code))"},{"line_number":1299,"context_line":"            notifications.Audit.updated(self._USER, user_id,"},{"line_number":1300,"context_line":"                                        initiator, reason\u003daudit_reason)"},{"line_number":1301,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_636e93ca","line":1298,"range":{"start_line":1298,"start_character":45,"end_line":1298,"end_character":47},"in_reply_to":"3a71b18c_6883d2cc","updated":"2016-12-09 18:34:58.000000000","message":"I believe when I was first testing this, doing ex.message_format just got me the message without the details. I can double check again and make sure.","commit_id":"505283ed9ae4d3e458d07ba9e350b609f8de339e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"261d1321db99b49003557022ed4ca72c01e5081e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from oslo_config import cfg"},{"line_number":23,"context_line":"from oslo_log import log"},{"line_number":24,"context_line":"from oslo_log import versionutils"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from pycadf import reason"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from keystone import assignment  # TODO(lbragstad): Decouple this dependency"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_c28d33d4","line":25,"updated":"2016-12-16 19:43:01.000000000","message":"group pycadf with oslo libs","commit_id":"c3735e4880de533bbcd21d07739141125048a5e3"}],"keystone/notifications.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"da72a9f1cf832db7f012454b32c836e9fb9d8c1f","unresolved":false,"context_lines":[{"line_number":486,"context_line":"            try:"},{"line_number":487,"context_line":"                result \u003d f(wrapped_self, request, user_id, *args, **kwargs)"},{"line_number":488,"context_line":"            except Exception:"},{"line_number":489,"context_line":"                # For authentication failure send a cadf event as well"},{"line_number":490,"context_line":"                _send_audit_notification(self.action, request.audit_initiator,"},{"line_number":491,"context_line":"                                         taxonomy.OUTCOME_FAILURE,"},{"line_number":492,"context_line":"                                         target, self.event_type)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_52d93921","side":"PARENT","line":489,"range":{"start_line":489,"start_character":16,"end_line":489,"end_character":70},"updated":"2016-11-28 05:53:26.000000000","message":"keep this comment in the block it was in, and add one for the new block","commit_id":"613c048b6f4bda91de1c0e9618abd0bda78ccc50"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0da44ac28ca1261a4a9432ac10b45530f5c803c2","unresolved":false,"context_lines":[{"line_number":486,"context_line":"            try:"},{"line_number":487,"context_line":"                result \u003d f(wrapped_self, request, user_id, *args, **kwargs)"},{"line_number":488,"context_line":"            except Exception:"},{"line_number":489,"context_line":"                # For authentication failure send a cadf event as well"},{"line_number":490,"context_line":"                _send_audit_notification(self.action, request.audit_initiator,"},{"line_number":491,"context_line":"                                         taxonomy.OUTCOME_FAILURE,"},{"line_number":492,"context_line":"                                         target, self.event_type)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_b9089229","side":"PARENT","line":489,"range":{"start_line":489,"start_character":16,"end_line":489,"end_character":70},"in_reply_to":"5a74a57a_52d93921","updated":"2016-11-28 17:26:07.000000000","message":"will do, I don\u0027t think I meant to delete it","commit_id":"613c048b6f4bda91de1c0e9618abd0bda78ccc50"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"da72a9f1cf832db7f012454b32c836e9fb9d8c1f","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        target\u003dtarget,"},{"line_number":683,"context_line":"        observer\u003dresource.Resource(typeURI\u003dtaxonomy.SERVICE_SECURITY))"},{"line_number":684,"context_line":""},{"line_number":685,"context_line":"    if service_id is not None:"},{"line_number":686,"context_line":"        event.observer.id \u003d service_id"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    for key, value in kwargs.items():"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_12d34105","side":"PARENT","line":685,"range":{"start_line":685,"start_character":4,"end_line":685,"end_character":30},"updated":"2016-11-28 05:53:26.000000000","message":"why change this?","commit_id":"613c048b6f4bda91de1c0e9618abd0bda78ccc50"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0da44ac28ca1261a4a9432ac10b45530f5c803c2","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        target\u003dtarget,"},{"line_number":683,"context_line":"        observer\u003dresource.Resource(typeURI\u003dtaxonomy.SERVICE_SECURITY))"},{"line_number":684,"context_line":""},{"line_number":685,"context_line":"    if service_id is not None:"},{"line_number":686,"context_line":"        event.observer.id \u003d service_id"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    for key, value in kwargs.items():"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_ccb2eae4","side":"PARENT","line":685,"range":{"start_line":685,"start_character":4,"end_line":685,"end_character":30},"in_reply_to":"5a74a57a_12d34105","updated":"2016-11-28 17:26:07.000000000","message":"I thought the `is not none` was redundant.","commit_id":"613c048b6f4bda91de1c0e9618abd0bda78ccc50"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"808612ddb3eb04e36f69438aeec966bead026624","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        target\u003dtarget,"},{"line_number":683,"context_line":"        observer\u003dresource.Resource(typeURI\u003dtaxonomy.SERVICE_SECURITY))"},{"line_number":684,"context_line":""},{"line_number":685,"context_line":"    if service_id is not None:"},{"line_number":686,"context_line":"        event.observer.id \u003d service_id"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    for key, value in kwargs.items():"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_4a9f9a5e","side":"PARENT","line":685,"range":{"start_line":685,"start_character":4,"end_line":685,"end_character":30},"in_reply_to":"5a74a57a_ccb2eae4","updated":"2016-11-28 17:50:42.000000000","message":"I can add it back and remove it in a later patch as well if that works better.","commit_id":"613c048b6f4bda91de1c0e9618abd0bda78ccc50"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"830facd72872ab0b27d01c516e532f4fb6390c40","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"def _create_cadf_payload(operation, resource_type, resource_id,"},{"line_number":341,"context_line":"                         outcome, initiator, reason\u003dNone):"},{"line_number":342,"context_line":"    \"\"\"Prepare data for CADF audit notifier."},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    Transform the arguments into content to be consumed by the function that"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_aa490533","line":341,"updated":"2016-11-28 21:40:34.000000000","message":"We should add this to the method documentation strings","commit_id":"faf5a02bd4ebc178fed71c67899f1c7678e9b9c3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"830facd72872ab0b27d01c516e532f4fb6390c40","unresolved":false,"context_lines":[{"line_number":658,"context_line":""},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"def _send_audit_notification(action, initiator, outcome, target,"},{"line_number":661,"context_line":"                             event_type, reason\u003dNone, **kwargs):"},{"line_number":662,"context_line":"    \"\"\"Send CADF notification to inform observers about the affected resource."},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    This method logs an exception when sending the notification fails."}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_aa702573","line":661,"updated":"2016-11-28 21:40:34.000000000","message":"Same comment here as above.","commit_id":"faf5a02bd4ebc178fed71c67899f1c7678e9b9c3"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a593f8ca495ff13e91403c15d57b0791391b4dfb","unresolved":false,"context_lines":[{"line_number":682,"context_line":"        target\u003dtarget,"},{"line_number":683,"context_line":"        observer\u003dresource.Resource(typeURI\u003dtaxonomy.SERVICE_SECURITY))"},{"line_number":684,"context_line":""},{"line_number":685,"context_line":"    if service_id is not None:"},{"line_number":686,"context_line":"        event.observer.id \u003d service_id"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    for key, value in kwargs.items():"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_e881a290","side":"PARENT","line":685,"range":{"start_line":685,"start_character":17,"end_line":685,"end_character":30},"updated":"2016-12-09 18:25:04.000000000","message":"unrelated please revert","commit_id":"e274a474e89b6d316ca13dbc8399bced97d2e671"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a593f8ca495ff13e91403c15d57b0791391b4dfb","unresolved":false,"context_lines":[{"line_number":731,"context_line":""},{"line_number":732,"context_line":""},{"line_number":733,"context_line":"emit_event \u003d CadfNotificationWrapper"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":""},{"line_number":736,"context_line":"role_assignment \u003d CadfRoleAssignmentNotificationWrapper"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_284aba83","side":"PARENT","line":734,"updated":"2016-12-09 18:25:04.000000000","message":"same here","commit_id":"e274a474e89b6d316ca13dbc8399bced97d2e671"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a593f8ca495ff13e91403c15d57b0791391b4dfb","unresolved":false,"context_lines":[{"line_number":496,"context_line":"                    exception.PasswordRequirementsValidationError,"},{"line_number":497,"context_line":"                    exception.PasswordHistoryValidationError,"},{"line_number":498,"context_line":"                    exception.PasswordAgeValidationError) as ex:"},{"line_number":499,"context_line":"                # Send a cadf event with a reason for pci-dss related"},{"line_number":500,"context_line":"                # authentication failures"},{"line_number":501,"context_line":"                audit_reason \u003d reason.Reason(str(ex), str(ex.code))"},{"line_number":502,"context_line":"                _send_audit_notification(self.action, request.audit_initiator,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_e8e522a8","line":499,"range":{"start_line":499,"start_character":25,"end_line":499,"end_character":29},"updated":"2016-12-09 18:25:04.000000000","message":"(nit) CADF","commit_id":"505283ed9ae4d3e458d07ba9e350b609f8de339e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a593f8ca495ff13e91403c15d57b0791391b4dfb","unresolved":false,"context_lines":[{"line_number":496,"context_line":"                    exception.PasswordRequirementsValidationError,"},{"line_number":497,"context_line":"                    exception.PasswordHistoryValidationError,"},{"line_number":498,"context_line":"                    exception.PasswordAgeValidationError) as ex:"},{"line_number":499,"context_line":"                # Send a cadf event with a reason for pci-dss related"},{"line_number":500,"context_line":"                # authentication failures"},{"line_number":501,"context_line":"                audit_reason \u003d reason.Reason(str(ex), str(ex.code))"},{"line_number":502,"context_line":"                _send_audit_notification(self.action, request.audit_initiator,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_08e17e9a","line":499,"range":{"start_line":499,"start_character":54,"end_line":499,"end_character":61},"updated":"2016-12-09 18:25:04.000000000","message":"(nit) PCI-DSS","commit_id":"505283ed9ae4d3e458d07ba9e350b609f8de339e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"2e333732082657165d211e1411d80d6f5177fa68","unresolved":false,"context_lines":[{"line_number":496,"context_line":"                    exception.PasswordRequirementsValidationError,"},{"line_number":497,"context_line":"                    exception.PasswordHistoryValidationError,"},{"line_number":498,"context_line":"                    exception.PasswordAgeValidationError) as ex:"},{"line_number":499,"context_line":"                # Send a cadf event with a reason for pci-dss related"},{"line_number":500,"context_line":"                # authentication failures"},{"line_number":501,"context_line":"                audit_reason \u003d reason.Reason(str(ex), str(ex.code))"},{"line_number":502,"context_line":"                _send_audit_notification(self.action, request.audit_initiator,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_5e124c63","line":499,"range":{"start_line":499,"start_character":25,"end_line":499,"end_character":29},"in_reply_to":"3a71b18c_e8e522a8","updated":"2016-12-09 19:28:38.000000000","message":"Done and Done","commit_id":"505283ed9ae4d3e458d07ba9e350b609f8de339e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"a593f8ca495ff13e91403c15d57b0791391b4dfb","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                    exception.PasswordAgeValidationError) as ex:"},{"line_number":499,"context_line":"                # Send a cadf event with a reason for pci-dss related"},{"line_number":500,"context_line":"                # authentication failures"},{"line_number":501,"context_line":"                audit_reason \u003d reason.Reason(str(ex), str(ex.code))"},{"line_number":502,"context_line":"                _send_audit_notification(self.action, request.audit_initiator,"},{"line_number":503,"context_line":"                                         taxonomy.OUTCOME_FAILURE,"},{"line_number":504,"context_line":"                                         target, self.event_type,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a71b18c_28ee3a8b","line":501,"range":{"start_line":501,"start_character":49,"end_line":501,"end_character":51},"updated":"2016-12-09 18:25:04.000000000","message":"same comment as in previous file. can\u0027t we access the message via an attribute like ex.message ?","commit_id":"505283ed9ae4d3e458d07ba9e350b609f8de339e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"34db1815b9536fcaf6f38de801078709f9d36fc5","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        :param actor_dict: dictionary of actor information in the event of"},{"line_number":104,"context_line":"                           assignment notification"},{"line_number":105,"context_line":"        :param reason: Reason for the notification which contains the response"},{"line_number":106,"context_line":"                       code and message description"},{"line_number":107,"context_line":"        \"\"\""},{"line_number":108,"context_line":"        # NOTE(stevemar): the _send_notification function is"},{"line_number":109,"context_line":"        # overloaded, it\u0027s used to register callbacks and to actually"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_685f9475","line":106,"updated":"2016-12-19 20:41:54.000000000","message":"The reason variable is a pycadf object, right? We could elaborate on the docstring here to explicitly say what it is. This might help prevent people from doing something like: \n\n  reason \u003d \u0027Something broke!\u0027\n  _emit(reason\u003dreason)\n\nInstead of using the pycadf library to generate a Reason object.","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0767e1adadf2e751c302ccb5e2bf1f5e702eb638","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        :param actor_dict: dictionary of actor information in the event of"},{"line_number":104,"context_line":"                           assignment notification"},{"line_number":105,"context_line":"        :param reason: Reason for the notification which contains the response"},{"line_number":106,"context_line":"                       code and message description"},{"line_number":107,"context_line":"        \"\"\""},{"line_number":108,"context_line":"        # NOTE(stevemar): the _send_notification function is"},{"line_number":109,"context_line":"        # overloaded, it\u0027s used to register callbacks and to actually"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_04d36460","line":106,"in_reply_to":"1a6eadb0_685f9475","updated":"2016-12-20 01:44:15.000000000","message":"Done","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"34db1815b9536fcaf6f38de801078709f9d36fc5","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    def created(cls, resource_type, resource_id, initiator\u003dNone,"},{"line_number":127,"context_line":"                public\u003dTrue, reason\u003dNone):"},{"line_number":128,"context_line":"        cls._emit(ACTIONS.created, resource_type, resource_id, initiator,"},{"line_number":129,"context_line":"                  public, actor_dict\u003dNone, reason\u003dreason)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    @classmethod"},{"line_number":132,"context_line":"    def updated(cls, resource_type, resource_id, initiator\u003dNone,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_a8344c4a","line":129,"updated":"2016-12-19 20:41:54.000000000","message":"In the method signature for _emit() `actor_dict` already defaults to None. For the sake of simplicity, I would opt to not specify this at all and let the default in the method signature do it\u0027s thing. Otherwise there could be a slight chance of inconsistency if the default changes in one place but not the other. If for some reason the default in the _emit() method changes, then we\u0027ll have a reason to override it in this methods, if we need to.\n\nThis comment applies to the other methods in this module that call _emit().","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0767e1adadf2e751c302ccb5e2bf1f5e702eb638","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    def created(cls, resource_type, resource_id, initiator\u003dNone,"},{"line_number":127,"context_line":"                public\u003dTrue, reason\u003dNone):"},{"line_number":128,"context_line":"        cls._emit(ACTIONS.created, resource_type, resource_id, initiator,"},{"line_number":129,"context_line":"                  public, actor_dict\u003dNone, reason\u003dreason)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    @classmethod"},{"line_number":132,"context_line":"    def updated(cls, resource_type, resource_id, initiator\u003dNone,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_24ca20a2","line":129,"in_reply_to":"1a6eadb0_a8344c4a","updated":"2016-12-20 01:44:15.000000000","message":"Done","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"34db1815b9536fcaf6f38de801078709f9d36fc5","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    @classmethod"},{"line_number":132,"context_line":"    def updated(cls, resource_type, resource_id, initiator\u003dNone,"},{"line_number":133,"context_line":"                public\u003dTrue, reason\u003dNone):"},{"line_number":134,"context_line":"        cls._emit(ACTIONS.updated, resource_type, resource_id, initiator,"},{"line_number":135,"context_line":"                  public, actor_dict\u003dNone, reason\u003dreason)"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_28203cf7","line":133,"updated":"2016-12-19 20:41:54.000000000","message":"Same comment here.","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d465c0ccbc07129daeb9141aa9afa825ca141576","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                    exception.PasswordExpired,"},{"line_number":496,"context_line":"                    exception.PasswordRequirementsValidationError,"},{"line_number":497,"context_line":"                    exception.PasswordHistoryValidationError,"},{"line_number":498,"context_line":"                    exception.PasswordAgeValidationError) as ex:"},{"line_number":499,"context_line":"                # Send a CADF event with a reason for PCI-DSS related"},{"line_number":500,"context_line":"                # authentication failures"},{"line_number":501,"context_line":"                audit_reason \u003d reason.Reason(str(ex), str(ex.code))"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a6eadb0_6ea69354","line":498,"updated":"2016-12-20 15:03:40.000000000","message":"We can assert that a notification is only being sent for PCI-cases because these exceptions are only raised when PCI is enabled, right?","commit_id":"7fe14c8da0d9ba8cf2a8a29df5786362716f9e46"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1d3e96a08f5f552ecdfe355081ee257a66915c4b","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                    exception.PasswordExpired,"},{"line_number":496,"context_line":"                    exception.PasswordRequirementsValidationError,"},{"line_number":497,"context_line":"                    exception.PasswordHistoryValidationError,"},{"line_number":498,"context_line":"                    exception.PasswordAgeValidationError) as ex:"},{"line_number":499,"context_line":"                # Send a CADF event with a reason for PCI-DSS related"},{"line_number":500,"context_line":"                # authentication failures"},{"line_number":501,"context_line":"                audit_reason \u003d reason.Reason(str(ex), str(ex.code))"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a6eadb0_de5e7044","line":498,"in_reply_to":"1a6eadb0_6ea69354","updated":"2016-12-20 16:30:54.000000000","message":"Yes, I believe so. These exceptions were added by either rderose\u0027s patch sets or this one, and they are specific to the new PCI-DSS events.","commit_id":"7fe14c8da0d9ba8cf2a8a29df5786362716f9e46"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"862ffa71e23c64738b177a7dbcea7e4d3559970c","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                    exception.PasswordExpired,"},{"line_number":496,"context_line":"                    exception.PasswordRequirementsValidationError,"},{"line_number":497,"context_line":"                    exception.PasswordHistoryValidationError,"},{"line_number":498,"context_line":"                    exception.PasswordAgeValidationError) as ex:"},{"line_number":499,"context_line":"                # Send a CADF event with a reason for PCI-DSS related"},{"line_number":500,"context_line":"                # authentication failures"},{"line_number":501,"context_line":"                audit_reason \u003d reason.Reason(str(ex), str(ex.code))"}],"source_content_type":"text/x-python","patch_set":35,"id":"1a6eadb0_134a91ac","line":498,"in_reply_to":"1a6eadb0_de5e7044","updated":"2016-12-21 00:34:25.000000000","message":"since we have a handful of exceptions related to this, would be more flexible if this was checked in a method.","commit_id":"7fe14c8da0d9ba8cf2a8a29df5786362716f9e46"}],"keystone/tests/unit/common/test_notifications.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6084ee74f88a2bd96424a48438908ad657274f7a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"7a77a97e_8f33b4aa","updated":"2016-11-17 13:47:31.000000000","message":"needs a test where the PCI rules are enforced and the notification is properly handled.","commit_id":"588738aef7f81df3a7c425404387b00ae3d824e9"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"633e07ce8d1044c5e4fd4b646a17a19ce8a78b02","unresolved":false,"context_lines":[{"line_number":41,"context_line":"DELETED_OPERATION \u003d notifications.ACTIONS.deleted"},{"line_number":42,"context_line":"DISABLED_OPERATION \u003d notifications.ACTIONS.disabled"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"PASSWORD_REGEX \u003d \u0027^(?\u003d.*\\d)(?\u003d.*[a-zA-Z]).{7,}$\u0027"},{"line_number":45,"context_line":"REGEX_DESC \u003d \u00271 letter, 1 digit, 7 chars\u0027"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class ArbitraryException(Exception):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_c20e388b","line":45,"range":{"start_line":44,"start_character":0,"end_line":45,"end_character":41},"updated":"2016-11-28 16:20:20.000000000","message":"These variables only appear to be used in the CADFNotificationsForPCIDSSEvents setup(). Why not set the config values directly?","commit_id":"2e4b6f1895e6cc5ab8e301830d2995485a14ac4d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"da72a9f1cf832db7f012454b32c836e9fb9d8c1f","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        self.assertEqual(target_uri, payload[\u0027target\u0027][\u0027typeURI\u0027])"},{"line_number":317,"context_line":"        if resource_id:"},{"line_number":318,"context_line":"            self.assertEqual(resource_id, payload[\u0027target\u0027][\u0027id\u0027])"},{"line_number":319,"context_line":"        event_type \u003d \u0027.\u0027.join(filter(None, [\u0027identity\u0027,"},{"line_number":320,"context_line":"                                            resource_type,"},{"line_number":321,"context_line":"                                            operation]))"},{"line_number":322,"context_line":"        self.assertEqual(event_type, audit[\u0027event_type\u0027])"},{"line_number":323,"context_line":"        if reason:"},{"line_number":324,"context_line":"            self.assertEqual(reason[\u0027reasonCode\u0027],"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_d2ad4985","line":321,"range":{"start_line":319,"start_character":8,"end_line":321,"end_character":56},"updated":"2016-11-28 05:53:26.000000000","message":"is this, and line 314 unrelated?","commit_id":"2e4b6f1895e6cc5ab8e301830d2995485a14ac4d"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0da44ac28ca1261a4a9432ac10b45530f5c803c2","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        self.assertEqual(target_uri, payload[\u0027target\u0027][\u0027typeURI\u0027])"},{"line_number":317,"context_line":"        if resource_id:"},{"line_number":318,"context_line":"            self.assertEqual(resource_id, payload[\u0027target\u0027][\u0027id\u0027])"},{"line_number":319,"context_line":"        event_type \u003d \u0027.\u0027.join(filter(None, [\u0027identity\u0027,"},{"line_number":320,"context_line":"                                            resource_type,"},{"line_number":321,"context_line":"                                            operation]))"},{"line_number":322,"context_line":"        self.assertEqual(event_type, audit[\u0027event_type\u0027])"},{"line_number":323,"context_line":"        if reason:"},{"line_number":324,"context_line":"            self.assertEqual(reason[\u0027reasonCode\u0027],"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_acaa0e83","line":321,"range":{"start_line":319,"start_character":8,"end_line":321,"end_character":56},"in_reply_to":"5a74a57a_d2ad4985","updated":"2016-11-28 17:26:07.000000000","message":"No, they are related. For a couple of the PCI-DSS events, the operation is authenticate and there is not a resource_type. I made this change so that it will work for both how it was before and can do authenticate events.","commit_id":"2e4b6f1895e6cc5ab8e301830d2995485a14ac4d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"da72a9f1cf832db7f012454b32c836e9fb9d8c1f","unresolved":false,"context_lines":[{"line_number":705,"context_line":"                               actor_operation\u003d\u0027removed\u0027)"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"class CADFNotificationsForPCIDSSEvents(BaseNotificationTest):"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"    def setUp(self):"},{"line_number":711,"context_line":"        super(CADFNotificationsForPCIDSSEvents, self).setUp()"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_92de710f","line":708,"range":{"start_line":708,"start_character":6,"end_line":708,"end_character":38},"updated":"2016-11-28 05:53:26.000000000","message":"cool tests!","commit_id":"2e4b6f1895e6cc5ab8e301830d2995485a14ac4d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"da72a9f1cf832db7f012454b32c836e9fb9d8c1f","unresolved":false,"context_lines":[{"line_number":710,"context_line":"    def setUp(self):"},{"line_number":711,"context_line":"        super(CADFNotificationsForPCIDSSEvents, self).setUp()"},{"line_number":712,"context_line":"        conf \u003d self.useFixture(config_fixture.Config(CONF))"},{"line_number":713,"context_line":"        conf.config(notification_format\u003d\u0027cadf\u0027)"},{"line_number":714,"context_line":"        conf.config(group\u003d\u0027security_compliance\u0027,"},{"line_number":715,"context_line":"                    password_expires_days\u003d2)"},{"line_number":716,"context_line":"        conf.config(group\u003d\u0027security_compliance\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_d296293d","line":713,"range":{"start_line":713,"start_character":8,"end_line":713,"end_character":47},"updated":"2016-11-28 05:53:26.000000000","message":"this is the default now :D","commit_id":"2e4b6f1895e6cc5ab8e301830d2995485a14ac4d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"da72a9f1cf832db7f012454b32c836e9fb9d8c1f","unresolved":false,"context_lines":[{"line_number":727,"context_line":"    def test_password_expired_sends_notification(self):"},{"line_number":728,"context_line":"        password \u003d uuid.uuid4().hex"},{"line_number":729,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027401\u0027,"},{"line_number":730,"context_line":"                           \u0027reasonType\u0027: \u0027blah\u0027}"},{"line_number":731,"context_line":"        password_time \u003d ("},{"line_number":732,"context_line":"            datetime.datetime.utcnow() -"},{"line_number":733,"context_line":"            datetime.timedelta("}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_32a2fd99","line":730,"range":{"start_line":730,"start_character":42,"end_line":730,"end_character":46},"updated":"2016-11-28 05:53:26.000000000","message":"nit: i\u0027d prefer a uuid hex be used, or something like \u0027foo\u0027 or \u0027bar\u0027","commit_id":"2e4b6f1895e6cc5ab8e301830d2995485a14ac4d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"633e07ce8d1044c5e4fd4b646a17a19ce8a78b02","unresolved":false,"context_lines":[{"line_number":727,"context_line":"    def test_password_expired_sends_notification(self):"},{"line_number":728,"context_line":"        password \u003d uuid.uuid4().hex"},{"line_number":729,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027401\u0027,"},{"line_number":730,"context_line":"                           \u0027reasonType\u0027: \u0027blah\u0027}"},{"line_number":731,"context_line":"        password_time \u003d ("},{"line_number":732,"context_line":"            datetime.datetime.utcnow() -"},{"line_number":733,"context_line":"            datetime.timedelta("}],"source_content_type":"text/x-python","patch_set":17,"id":"5a74a57a_a2c93cae","line":730,"range":{"start_line":730,"start_character":42,"end_line":730,"end_character":46},"in_reply_to":"5a74a57a_32a2fd99","updated":"2016-11-28 16:20:20.000000000","message":"++","commit_id":"2e4b6f1895e6cc5ab8e301830d2995485a14ac4d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"830facd72872ab0b27d01c516e532f4fb6390c40","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import datetime"},{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from freezegun import freeze_time"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import fixtures"},{"line_number":21,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_aac82556","line":18,"updated":"2016-11-28 21:40:34.000000000","message":"We typically don\u0027t import functions for the sake of namespacing the module. To maintain consistency, we could leave this as:\n\n  import freezegun\n\nand reference each utilities within freezegun from that namespace:\n\n  with freezegun.freeze_time(...)...","commit_id":"faf5a02bd4ebc178fed71c67899f1c7678e9b9c3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"830facd72872ab0b27d01c516e532f4fb6390c40","unresolved":false,"context_lines":[{"line_number":722,"context_line":"        password \u003d uuid.uuid4().hex"},{"line_number":723,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027401\u0027,"},{"line_number":724,"context_line":"                           \u0027reasonType\u0027: \u0027foo\u0027}"},{"line_number":725,"context_line":"        password_time \u003d ("},{"line_number":726,"context_line":"            datetime.datetime.utcnow() -"},{"line_number":727,"context_line":"            datetime.timedelta("},{"line_number":728,"context_line":"                days\u003dCONF.security_compliance.password_expires_days + 1)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_4a0b117d","line":725,"updated":"2016-11-28 21:40:34.000000000","message":"nit: password_creation_time","commit_id":"faf5a02bd4ebc178fed71c67899f1c7678e9b9c3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"830facd72872ab0b27d01c516e532f4fb6390c40","unresolved":false,"context_lines":[{"line_number":728,"context_line":"                days\u003dCONF.security_compliance.password_expires_days + 1)"},{"line_number":729,"context_line":"        )"},{"line_number":730,"context_line":"        freezer \u003d freeze_time(password_time)"},{"line_number":731,"context_line":"        freezer.start()"},{"line_number":732,"context_line":"        user_ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id,"},{"line_number":733,"context_line":"                                     password\u003dpassword,"},{"line_number":734,"context_line":"                                     password_created_at\u003dpassword_time)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_eaebfdd9","line":731,"updated":"2016-11-28 21:40:34.000000000","message":"Interesting - I\u0027ve never used freezegun this way. I\u0027ve always used it within it\u0027s context manager and incremented the clock manually using `tick` [0].\n\nAre there specific advantages to doing it this way? After reading the docs it doesn\u0027t look like `start` actually advances the clock, is just \"starts\" the time specified at `freeze_time`, right? \n\nThis might be a heavy handed test - but we could add the context manager here and start the clock when the password is still valid, authenticate, and assert a notification wasn\u0027t sent. Then we could advance the clock until the password has expired and then assert a notification was sent for the related PCI-DSS reason.\n\n[0] https://github.com/spulec/freezegun#manual-ticks","commit_id":"faf5a02bd4ebc178fed71c67899f1c7678e9b9c3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"830facd72872ab0b27d01c516e532f4fb6390c40","unresolved":false,"context_lines":[{"line_number":750,"context_line":"        expected_responses \u003d [AssertionError, AssertionError, AssertionError,"},{"line_number":751,"context_line":"                              exception.AccountLocked]"},{"line_number":752,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027401\u0027,"},{"line_number":753,"context_line":"                           \u0027reasonType\u0027: \u0027foo\u0027}"},{"line_number":754,"context_line":"        user_ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id,"},{"line_number":755,"context_line":"                                     password\u003dpassword)"},{"line_number":756,"context_line":"        user_ref \u003d self.identity_api.create_user(user_ref)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_0a667929","line":753,"updated":"2016-11-28 21:40:34.000000000","message":"This reason looks the same as the other test. I would expect it to give me a message about my account being locked.","commit_id":"faf5a02bd4ebc178fed71c67899f1c7678e9b9c3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"830facd72872ab0b27d01c516e532f4fb6390c40","unresolved":false,"context_lines":[{"line_number":793,"context_line":"        password \u003d uuid.uuid4().hex"},{"line_number":794,"context_line":"        invalid_password \u003d \u00271\u0027"},{"line_number":795,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027400\u0027,"},{"line_number":796,"context_line":"                           \u0027reasonType\u0027: \u0027bar\u0027}"},{"line_number":797,"context_line":"        user_ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id,"},{"line_number":798,"context_line":"                                     password\u003dpassword)"},{"line_number":799,"context_line":"        user_ref \u003d self.identity_api.create_user(user_ref)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_ca80018e","line":796,"updated":"2016-11-28 21:40:34.000000000","message":"Same comment here as above.","commit_id":"faf5a02bd4ebc178fed71c67899f1c7678e9b9c3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"830facd72872ab0b27d01c516e532f4fb6390c40","unresolved":false,"context_lines":[{"line_number":813,"context_line":"        new_password \u003d uuid.uuid4().hex"},{"line_number":814,"context_line":"        next_password \u003d uuid.uuid4().hex"},{"line_number":815,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027400\u0027,"},{"line_number":816,"context_line":"                           \u0027reasonType\u0027: \u0027bar\u0027}"},{"line_number":817,"context_line":"        user_ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id,"},{"line_number":818,"context_line":"                                     password\u003dpassword)"},{"line_number":819,"context_line":"        user_ref \u003d self.identity_api.create_user(user_ref)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a74a57a_0a4d9999","line":816,"updated":"2016-11-28 21:40:34.000000000","message":"Same comment here as above.","commit_id":"faf5a02bd4ebc178fed71c67899f1c7678e9b9c3"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ad38c576a2aa32c2eeec95943f0adf670d645248","unresolved":false,"context_lines":[{"line_number":744,"context_line":"                                       user_ref[\u0027id\u0027], password)"},{"line_number":745,"context_line":"        freezer.stop()"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027401\u0027,"},{"line_number":748,"context_line":"                           \u0027reasonType\u0027: \u0027The password is expired and \u0027"},{"line_number":749,"context_line":"                                         \u0027needs to be reset by an \u0027"},{"line_number":750,"context_line":"                                         \u0027administrator for user: \u0027 +"},{"line_number":751,"context_line":"                                         user_ref[\u0027id\u0027]}"},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        self.assertRaises(exception.PasswordExpired,"},{"line_number":754,"context_line":"                          self.identity_api.authenticate,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_8d992c22","line":751,"range":{"start_line":747,"start_character":0,"end_line":751,"end_character":56},"updated":"2016-12-14 14:02:28.000000000","message":"I\u0027m not a fan of using the exactly \"reason\" here, using a matcher that compares the reasonCode and that \"reasonType\" is not None is enough for me. This way, we can change the message wording without having to update the test. This is just a preference, I\u0027m fine either way.","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"37aa1645cff5dc9cb921c44b39c0f1313bbd9884","unresolved":false,"context_lines":[{"line_number":744,"context_line":"                                       user_ref[\u0027id\u0027], password)"},{"line_number":745,"context_line":"        freezer.stop()"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027401\u0027,"},{"line_number":748,"context_line":"                           \u0027reasonType\u0027: \u0027The password is expired and \u0027"},{"line_number":749,"context_line":"                                         \u0027needs to be reset by an \u0027"},{"line_number":750,"context_line":"                                         \u0027administrator for user: \u0027 +"},{"line_number":751,"context_line":"                                         user_ref[\u0027id\u0027]}"},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        self.assertRaises(exception.PasswordExpired,"},{"line_number":754,"context_line":"                          self.identity_api.authenticate,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_44d7e122","line":751,"range":{"start_line":747,"start_character":0,"end_line":751,"end_character":56},"in_reply_to":"1a6eadb0_8d992c22","updated":"2016-12-14 18:11:18.000000000","message":"Changed to use the actual exception message which is what I probably should have done in the first place.","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ad38c576a2aa32c2eeec95943f0adf670d645248","unresolved":false,"context_lines":[{"line_number":792,"context_line":"                           \u0027reasonType\u0027: \u0027The new password cannot be \u0027"},{"line_number":793,"context_line":"                                         \u0027identical to a previous password. \u0027"},{"line_number":794,"context_line":"                                         \u0027The number of previous passwords \u0027"},{"line_number":795,"context_line":"                                         \u0027that must be unique is 2\u0027}"},{"line_number":796,"context_line":"        user_ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id,"},{"line_number":797,"context_line":"                                     password\u003dpassword)"},{"line_number":798,"context_line":"        user_ref \u003d self.identity_api.create_user(user_ref)"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_0df51c82","line":795,"range":{"start_line":795,"start_character":64,"end_line":795,"end_character":66},"updated":"2016-12-14 14:02:28.000000000","message":"use a variable here, like you used \"used_ref[\u0027id\u0027]\" previously - it should be same variable to set the config and used here.","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"82cc3ee1e832696b0d07adf8764c7e98145d49f1","unresolved":false,"context_lines":[{"line_number":792,"context_line":"                           \u0027reasonType\u0027: \u0027The new password cannot be \u0027"},{"line_number":793,"context_line":"                                         \u0027identical to a previous password. \u0027"},{"line_number":794,"context_line":"                                         \u0027The number of previous passwords \u0027"},{"line_number":795,"context_line":"                                         \u0027that must be unique is 2\u0027}"},{"line_number":796,"context_line":"        user_ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id,"},{"line_number":797,"context_line":"                                     password\u003dpassword)"},{"line_number":798,"context_line":"        user_ref \u003d self.identity_api.create_user(user_ref)"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_64cbfda5","line":795,"range":{"start_line":795,"start_character":64,"end_line":795,"end_character":66},"in_reply_to":"1a6eadb0_0df51c82","updated":"2016-12-14 18:09:37.000000000","message":"++","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"37aa1645cff5dc9cb921c44b39c0f1313bbd9884","unresolved":false,"context_lines":[{"line_number":792,"context_line":"                           \u0027reasonType\u0027: \u0027The new password cannot be \u0027"},{"line_number":793,"context_line":"                                         \u0027identical to a previous password. \u0027"},{"line_number":794,"context_line":"                                         \u0027The number of previous passwords \u0027"},{"line_number":795,"context_line":"                                         \u0027that must be unique is 2\u0027}"},{"line_number":796,"context_line":"        user_ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id,"},{"line_number":797,"context_line":"                                     password\u003dpassword)"},{"line_number":798,"context_line":"        user_ref \u003d self.identity_api.create_user(user_ref)"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_c4e3f103","line":795,"range":{"start_line":795,"start_character":64,"end_line":795,"end_character":66},"in_reply_to":"1a6eadb0_0df51c82","updated":"2016-12-14 18:11:18.000000000","message":"Done","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ad38c576a2aa32c2eeec95943f0adf670d645248","unresolved":false,"context_lines":[{"line_number":817,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027400\u0027,"},{"line_number":818,"context_line":"                           \u0027reasonType\u0027: \u0027The password does not match the \u0027"},{"line_number":819,"context_line":"                                         \u0027requirements: \u0027"},{"line_number":820,"context_line":"                                         \u00271 letter, 1 digit, 7 chars\u0027}"},{"line_number":821,"context_line":"        user_ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id,"},{"line_number":822,"context_line":"                                     password\u003dpassword)"},{"line_number":823,"context_line":"        user_ref \u003d self.identity_api.create_user(user_ref)"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_6d2cd002","line":820,"range":{"start_line":820,"start_character":42,"end_line":820,"end_character":68},"updated":"2016-12-14 14:02:28.000000000","message":"same as above","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"37aa1645cff5dc9cb921c44b39c0f1313bbd9884","unresolved":false,"context_lines":[{"line_number":817,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027400\u0027,"},{"line_number":818,"context_line":"                           \u0027reasonType\u0027: \u0027The password does not match the \u0027"},{"line_number":819,"context_line":"                                         \u0027requirements: \u0027"},{"line_number":820,"context_line":"                                         \u00271 letter, 1 digit, 7 chars\u0027}"},{"line_number":821,"context_line":"        user_ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id,"},{"line_number":822,"context_line":"                                     password\u003dpassword)"},{"line_number":823,"context_line":"        user_ref \u003d self.identity_api.create_user(user_ref)"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_64b5bdec","line":820,"range":{"start_line":820,"start_character":42,"end_line":820,"end_character":68},"in_reply_to":"1a6eadb0_04e40939","updated":"2016-12-14 18:11:18.000000000","message":"Done","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"82cc3ee1e832696b0d07adf8764c7e98145d49f1","unresolved":false,"context_lines":[{"line_number":817,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027400\u0027,"},{"line_number":818,"context_line":"                           \u0027reasonType\u0027: \u0027The password does not match the \u0027"},{"line_number":819,"context_line":"                                         \u0027requirements: \u0027"},{"line_number":820,"context_line":"                                         \u00271 letter, 1 digit, 7 chars\u0027}"},{"line_number":821,"context_line":"        user_ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id,"},{"line_number":822,"context_line":"                                     password\u003dpassword)"},{"line_number":823,"context_line":"        user_ref \u003d self.identity_api.create_user(user_ref)"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_04e40939","line":820,"range":{"start_line":820,"start_character":42,"end_line":820,"end_character":68},"in_reply_to":"1a6eadb0_6d2cd002","updated":"2016-12-14 18:09:37.000000000","message":"++ use the passwrod regex description","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ad38c576a2aa32c2eeec95943f0adf670d645248","unresolved":false,"context_lines":[{"line_number":838,"context_line":"        next_password \u003d uuid.uuid4().hex"},{"line_number":839,"context_line":"        reason_type \u003d (\u0027You cannot change your password at this time due to \u0027"},{"line_number":840,"context_line":"                       \u0027the minimum password age. Once you change your \u0027"},{"line_number":841,"context_line":"                       \u0027password, it must be used for 2 day(s) before it can \u0027"},{"line_number":842,"context_line":"                       \u0027be changed. Please try again in 1 day(s) or contact \u0027"},{"line_number":843,"context_line":"                       \u0027your administrator to reset your password.\u0027)"},{"line_number":844,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027400\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_0d3c3c2e","line":841,"range":{"start_line":841,"start_character":54,"end_line":841,"end_character":55},"updated":"2016-12-14 14:02:28.000000000","message":"ditto","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"37aa1645cff5dc9cb921c44b39c0f1313bbd9884","unresolved":false,"context_lines":[{"line_number":838,"context_line":"        next_password \u003d uuid.uuid4().hex"},{"line_number":839,"context_line":"        reason_type \u003d (\u0027You cannot change your password at this time due to \u0027"},{"line_number":840,"context_line":"                       \u0027the minimum password age. Once you change your \u0027"},{"line_number":841,"context_line":"                       \u0027password, it must be used for 2 day(s) before it can \u0027"},{"line_number":842,"context_line":"                       \u0027be changed. Please try again in 1 day(s) or contact \u0027"},{"line_number":843,"context_line":"                       \u0027your administrator to reset your password.\u0027)"},{"line_number":844,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027400\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_c4ca116e","line":841,"range":{"start_line":841,"start_character":54,"end_line":841,"end_character":55},"in_reply_to":"1a6eadb0_0d3c3c2e","updated":"2016-12-14 18:11:18.000000000","message":"Done","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ad38c576a2aa32c2eeec95943f0adf670d645248","unresolved":false,"context_lines":[{"line_number":839,"context_line":"        reason_type \u003d (\u0027You cannot change your password at this time due to \u0027"},{"line_number":840,"context_line":"                       \u0027the minimum password age. Once you change your \u0027"},{"line_number":841,"context_line":"                       \u0027password, it must be used for 2 day(s) before it can \u0027"},{"line_number":842,"context_line":"                       \u0027be changed. Please try again in 1 day(s) or contact \u0027"},{"line_number":843,"context_line":"                       \u0027your administrator to reset your password.\u0027)"},{"line_number":844,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027400\u0027,"},{"line_number":845,"context_line":"                           \u0027reasonType\u0027: reason_type}"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_4d4634c0","line":842,"range":{"start_line":842,"start_character":56,"end_line":842,"end_character":57},"updated":"2016-12-14 14:02:28.000000000","message":"ditto","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"37aa1645cff5dc9cb921c44b39c0f1313bbd9884","unresolved":false,"context_lines":[{"line_number":839,"context_line":"        reason_type \u003d (\u0027You cannot change your password at this time due to \u0027"},{"line_number":840,"context_line":"                       \u0027the minimum password age. Once you change your \u0027"},{"line_number":841,"context_line":"                       \u0027password, it must be used for 2 day(s) before it can \u0027"},{"line_number":842,"context_line":"                       \u0027be changed. Please try again in 1 day(s) or contact \u0027"},{"line_number":843,"context_line":"                       \u0027your administrator to reset your password.\u0027)"},{"line_number":844,"context_line":"        expected_reason \u003d {\u0027reasonCode\u0027: \u0027400\u0027,"},{"line_number":845,"context_line":"                           \u0027reasonType\u0027: reason_type}"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a6eadb0_e4c9cd79","line":842,"range":{"start_line":842,"start_character":56,"end_line":842,"end_character":57},"in_reply_to":"1a6eadb0_4d4634c0","updated":"2016-12-14 18:11:18.000000000","message":"Done","commit_id":"0c6dfecdc3184dd2eb7b01a8a58968e0a59a99a0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"34db1815b9536fcaf6f38de801078709f9d36fc5","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import datetime"},{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import freezegun"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import fixtures"},{"line_number":21,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_6894f4e7","line":18,"updated":"2016-12-19 20:41:54.000000000","message":"freezegun is technically considered a third-party library, which we should be able to include in the second stanza of imports (starting at line 20 with fixtures):\n\n  import fixtures\n  import freezegun\n  import mock\n\nLike the examples here [0] we can see the first set of imports is reserved for standard library namespaces, then third-party libraries, and finally imports that are relative to the project (i.e. things within keystone).\n\n[0] http://docs.openstack.org/developer/hacking/#real-world-import-order-examples","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0767e1adadf2e751c302ccb5e2bf1f5e702eb638","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import datetime"},{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import freezegun"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import fixtures"},{"line_number":21,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_013a7698","line":18,"in_reply_to":"1a6eadb0_6894f4e7","updated":"2016-12-20 01:44:15.000000000","message":"Thanks for the link!","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"34db1815b9536fcaf6f38de801078709f9d36fc5","unresolved":false,"context_lines":[{"line_number":742,"context_line":"        user_ref \u003d self.identity_api.create_user(user_ref)"},{"line_number":743,"context_line":"        self.identity_api.authenticate(self.make_request(),"},{"line_number":744,"context_line":"                                       user_ref[\u0027id\u0027], password)"},{"line_number":745,"context_line":"        freezer.stop()"},{"line_number":746,"context_line":""},{"line_number":747,"context_line":"        reason_type \u003d (exception.PasswordExpired.message_format %"},{"line_number":748,"context_line":"                       {\u0027user_id\u0027: user_ref[\u0027id\u0027]})"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_8b9f8ab3","line":745,"updated":"2016-12-19 20:41:54.000000000","message":"Huh - interesting. This is what drops the time context all together, right? That\u0027s kind of a neat pattern. This is what I\u0027ve had to do in the past in order to get around weird issues with SQLite + freezegun [0]. Specifically when trying to advance the clock in freezegun by hours or days:\n\n  frozen_datetime.tick(delta\u003ddatetime.timedelta(days\u003d2))\n\nThis isn\u0027t really susceptible to that behavior because you\u0027re not using the context manager within freezegun to advance through large chunks of time. I\u0027ll have to keep this one in my back pocket. Thanks!\n\n[0] https://github.com/openstack/keystone/blob/c69df5bea9f27a508102b885ce1647e9e5d789ac/keystone/tests/unit/test_v3_auth.py#L299-L302","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"}],"releasenotes/notes/pci-dss-notifications-808a205a637bac25.yaml":[{"author":{"_account_id":18462,"name":"Rahul U Nair","email":"rahulunair@gmail.com","username":"rahulunair"},"change_message_id":"7a7534d72d2625f446089a4d4ff68b03b848547b","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    passwords/passphrases at least once every X days; (ii) Limit repeated"},{"line_number":6,"context_line":"    access attempts by locking out the user ID after not more than X"},{"line_number":7,"context_line":"    attempts; (iii) Do not allow an individual to submit a new"},{"line_number":8,"context_line":"    password/phrase that is the same as any of the last X passwords/phrases"},{"line_number":9,"context_line":"    he or she has used; (iv) Passwords/phrases must meet the specificed"},{"line_number":10,"context_line":"    regex; (v) User attempting to change password early."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5a74a57a_78907ded","line":8,"range":{"start_line":8,"start_character":13,"end_line":8,"end_character":19},"updated":"2016-11-22 22:30:26.000000000","message":"nit: passphrase","commit_id":"e807a318f7abf31c9e9bc031b2a387734f2dc835"},{"author":{"_account_id":18462,"name":"Rahul U Nair","email":"rahulunair@gmail.com","username":"rahulunair"},"change_message_id":"7a7534d72d2625f446089a4d4ff68b03b848547b","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    passwords/passphrases at least once every X days; (ii) Limit repeated"},{"line_number":6,"context_line":"    access attempts by locking out the user ID after not more than X"},{"line_number":7,"context_line":"    attempts; (iii) Do not allow an individual to submit a new"},{"line_number":8,"context_line":"    password/phrase that is the same as any of the last X passwords/phrases"},{"line_number":9,"context_line":"    he or she has used; (iv) Passwords/phrases must meet the specificed"},{"line_number":10,"context_line":"    regex; (v) User attempting to change password early."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5a74a57a_787ebdaf","line":8,"range":{"start_line":8,"start_character":68,"end_line":8,"end_character":75},"updated":"2016-11-22 22:30:26.000000000","message":"nit: passphrases","commit_id":"e807a318f7abf31c9e9bc031b2a387734f2dc835"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"e02c269fb315f290f38c9310ac0818e1dbda0988","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    passwords/passphrases at least once every X days; (ii) Limit repeated"},{"line_number":6,"context_line":"    access attempts by locking out the user ID after not more than X"},{"line_number":7,"context_line":"    attempts; (iii) Do not allow an individual to submit a new"},{"line_number":8,"context_line":"    password/phrase that is the same as any of the last X passwords/phrases"},{"line_number":9,"context_line":"    he or she has used; (iv) Passwords/phrases must meet the specificed"},{"line_number":10,"context_line":"    regex; (v) User attempting to change password early."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5a74a57a_16cc8888","line":8,"range":{"start_line":8,"start_character":68,"end_line":8,"end_character":75},"in_reply_to":"5a74a57a_787ebdaf","updated":"2016-11-23 22:19:37.000000000","message":"Done","commit_id":"e807a318f7abf31c9e9bc031b2a387734f2dc835"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"e02c269fb315f290f38c9310ac0818e1dbda0988","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    passwords/passphrases at least once every X days; (ii) Limit repeated"},{"line_number":6,"context_line":"    access attempts by locking out the user ID after not more than X"},{"line_number":7,"context_line":"    attempts; (iii) Do not allow an individual to submit a new"},{"line_number":8,"context_line":"    password/phrase that is the same as any of the last X passwords/phrases"},{"line_number":9,"context_line":"    he or she has used; (iv) Passwords/phrases must meet the specificed"},{"line_number":10,"context_line":"    regex; (v) User attempting to change password early."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5a74a57a_36c98479","line":8,"range":{"start_line":8,"start_character":13,"end_line":8,"end_character":19},"in_reply_to":"5a74a57a_78907ded","updated":"2016-11-23 22:19:37.000000000","message":"Done","commit_id":"e807a318f7abf31c9e9bc031b2a387734f2dc835"},{"author":{"_account_id":18462,"name":"Rahul U Nair","email":"rahulunair@gmail.com","username":"rahulunair"},"change_message_id":"7a7534d72d2625f446089a4d4ff68b03b848547b","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    access attempts by locking out the user ID after not more than X"},{"line_number":7,"context_line":"    attempts; (iii) Do not allow an individual to submit a new"},{"line_number":8,"context_line":"    password/phrase that is the same as any of the last X passwords/phrases"},{"line_number":9,"context_line":"    he or she has used; (iv) Passwords/phrases must meet the specificed"},{"line_number":10,"context_line":"    regex; (v) User attempting to change password early."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5a74a57a_f8480d8a","line":9,"range":{"start_line":9,"start_character":39,"end_line":9,"end_character":46},"updated":"2016-11-22 22:30:26.000000000","message":"nit: passphrases","commit_id":"e807a318f7abf31c9e9bc031b2a387734f2dc835"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"e02c269fb315f290f38c9310ac0818e1dbda0988","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    access attempts by locking out the user ID after not more than X"},{"line_number":7,"context_line":"    attempts; (iii) Do not allow an individual to submit a new"},{"line_number":8,"context_line":"    password/phrase that is the same as any of the last X passwords/phrases"},{"line_number":9,"context_line":"    he or she has used; (iv) Passwords/phrases must meet the specificed"},{"line_number":10,"context_line":"    regex; (v) User attempting to change password early."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5a74a57a_76a13ca9","line":9,"range":{"start_line":9,"start_character":39,"end_line":9,"end_character":46},"in_reply_to":"5a74a57a_f8480d8a","updated":"2016-11-23 22:19:37.000000000","message":"Done","commit_id":"e807a318f7abf31c9e9bc031b2a387734f2dc835"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"da72a9f1cf832db7f012454b32c836e9fb9d8c1f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - This adds a reason object to the CADF notifications that are emitted"},{"line_number":4,"context_line":"    for the following events related to PCI-DSS.  (i) Change user"},{"line_number":5,"context_line":"    passwords/passphrases at least once every X days; (ii) Limit repeated"},{"line_number":6,"context_line":"    access attempts by locking out the user ID after not more than X"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"5a74a57a_92891129","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":8},"updated":"2016-11-28 05:53:26.000000000","message":"Remember that these notes are compiled with all others in the same release (http://docs.openstack.org/releasenotes/keystone/unreleased.html) so writing \"This\" in this context makes sense, it won\u0027t mean much when rendered with 10 others. Make the opening statement a  declarative one.\n\nFor example, a simple change:\n\nfeatures:\n  - \u003e\nCADF notifications now extend to PCI-DSS events. A ``reason`` object is added to the following authentication related notifications:\n    * Change user passwords/passphrases at least once every X days\n    * and so forth","commit_id":"2e4b6f1895e6cc5ab8e301830d2995485a14ac4d"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0da44ac28ca1261a4a9432ac10b45530f5c803c2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - This adds a reason object to the CADF notifications that are emitted"},{"line_number":4,"context_line":"    for the following events related to PCI-DSS.  (i) Change user"},{"line_number":5,"context_line":"    passwords/passphrases at least once every X days; (ii) Limit repeated"},{"line_number":6,"context_line":"    access attempts by locking out the user ID after not more than X"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"5a74a57a_4f15ece2","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":8},"in_reply_to":"5a74a57a_92891129","updated":"2016-11-28 17:26:07.000000000","message":"ah ok, thanks","commit_id":"2e4b6f1895e6cc5ab8e301830d2995485a14ac4d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"da72a9f1cf832db7f012454b32c836e9fb9d8c1f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - This adds a reason object to the CADF notifications that are emitted"},{"line_number":4,"context_line":"    for the following events related to PCI-DSS.  (i) Change user"},{"line_number":5,"context_line":"    passwords/passphrases at least once every X days; (ii) Limit repeated"},{"line_number":6,"context_line":"    access attempts by locking out the user ID after not more than X"},{"line_number":7,"context_line":"    attempts; (iii) Do not allow an individual to submit a new"},{"line_number":8,"context_line":"    password/passphrase that is the same as any of the last X"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"5a74a57a_327bdd29","line":5,"range":{"start_line":4,"start_character":50,"end_line":5,"end_character":53},"updated":"2016-11-28 05:53:26.000000000","message":"you can list these out in bullets!","commit_id":"2e4b6f1895e6cc5ab8e301830d2995485a14ac4d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"830facd72872ab0b27d01c516e532f4fb6390c40","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - CADF notifications now extend to PCI-DSS events. A ``reason`` object"},{"line_number":4,"context_line":"    is added to the following authentication related notifications."},{"line_number":5,"context_line":"    * Change user passwords/passphrases at least once every X days"},{"line_number":6,"context_line":"    * Limit repeated access attempts by locking out the user ID after not"},{"line_number":7,"context_line":"      more than X attempts"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5a74a57a_55081628","line":4,"updated":"2016-11-28 21:40:34.000000000","message":"I think we have some documentation about what the reason looks like in a previous patch, but would we be able to link to it here?\n\nIf I were a deployer who was interested in these types of notifications, I\u0027d want to find some more documentation on how to consume them.","commit_id":"faf5a02bd4ebc178fed71c67899f1c7678e9b9c3"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"23c18e4630a3749eb7d50412e42422978a4c46e6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - CADF notifications now extend to PCI-DSS events. A ``reason`` object"},{"line_number":4,"context_line":"    is added to the following authentication related notifications."},{"line_number":5,"context_line":"    * Change user passwords/passphrases at least once every X days"},{"line_number":6,"context_line":"    * Limit repeated access attempts by locking out the user ID after not"},{"line_number":7,"context_line":"      more than X attempts"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"5a74a57a_ae36fdb1","line":4,"in_reply_to":"5a74a57a_55081628","updated":"2016-11-30 23:54:58.000000000","message":"will do!","commit_id":"faf5a02bd4ebc178fed71c67899f1c7678e9b9c3"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7fb3d70e349819a4eccf16fd9e0dd0593d0b1559","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - CADF notifications now extend to PCI-DSS events. A ``reason`` object"},{"line_number":4,"context_line":"    is added to the following authentication related notifications."},{"line_number":5,"context_line":"    * Change user passwords/passphrases at least once every X days"},{"line_number":6,"context_line":"    * Limit repeated access attempts by locking out the user ID after not"},{"line_number":7,"context_line":"      more than X attempts"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"1a6eadb0_44ba81c1","line":4,"range":{"start_line":4,"start_character":66,"end_line":4,"end_character":67},"updated":"2016-12-14 18:13:58.000000000","message":":","commit_id":"5a724e1228f2a98b2b406c20f9eae97a04a4f376"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7fb3d70e349819a4eccf16fd9e0dd0593d0b1559","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    * Do not allow an individual to submit a new password/passphrase that is"},{"line_number":9,"context_line":"      the same as any of the last X passwords/passphrases used"},{"line_number":10,"context_line":"    * Passwords/passphrases must meet the specificed regex"},{"line_number":11,"context_line":"    * User attempting to change password early"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"    See - http://docs.openstack.org/developer/pycadf/specification/reasons.html"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"1a6eadb0_24de6511","line":11,"range":{"start_line":11,"start_character":41,"end_line":11,"end_character":46},"updated":"2016-12-14 18:13:58.000000000","message":"too often","commit_id":"5a724e1228f2a98b2b406c20f9eae97a04a4f376"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"027856e633771ba2c02ecc9c5afdf735c2d4eddb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - CADF notifications now extend to PCI-DSS events. A ``reason`` object"},{"line_number":4,"context_line":"    is added to the list of authentication related notifications below."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    * Change user passwords/passphrases at least once every X days"},{"line_number":7,"context_line":"    * Limit repeated access attempts by locking out the user ID after not"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"1a6eadb0_36cd7bb7","line":4,"range":{"start_line":4,"start_character":70,"end_line":4,"end_character":71},"updated":"2016-12-15 19:47:53.000000000","message":"I have no idea why this keeps failing, there are multiple releasenotes that have the same format and they seemed fine, and the yaml syntax is valid. Reverting/changing the wording to avoid using a \u0027:\u0027 and hope this works.","commit_id":"c3735e4880de533bbcd21d07739141125048a5e3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"34db1815b9536fcaf6f38de801078709f9d36fc5","unresolved":false,"context_lines":[{"line_number":9,"context_line":""},{"line_number":10,"context_line":"     * If a user does not change their passwords at least once every X days."},{"line_number":11,"context_line":"       See ``[security_compliance] password_expires_days``."},{"line_number":12,"context_line":"     * If a user is locked out after many failued authentication attempts."},{"line_number":13,"context_line":"       See ``[security_compliance] lockout_failure_attempts``."},{"line_number":14,"context_line":"     * If a user submits a new password that was recently used. See"},{"line_number":15,"context_line":"       ``[security_compliance] unique_last_password_count``."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"1a6eadb0_0bc1ba80","line":12,"updated":"2016-12-19 20:41:54.000000000","message":"failed*","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0767e1adadf2e751c302ccb5e2bf1f5e702eb638","unresolved":false,"context_lines":[{"line_number":9,"context_line":""},{"line_number":10,"context_line":"     * If a user does not change their passwords at least once every X days."},{"line_number":11,"context_line":"       See ``[security_compliance] password_expires_days``."},{"line_number":12,"context_line":"     * If a user is locked out after many failued authentication attempts."},{"line_number":13,"context_line":"       See ``[security_compliance] lockout_failure_attempts``."},{"line_number":14,"context_line":"     * If a user submits a new password that was recently used. See"},{"line_number":15,"context_line":"       ``[security_compliance] unique_last_password_count``."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"1a6eadb0_84bf74fb","line":12,"in_reply_to":"1a6eadb0_0bc1ba80","updated":"2016-12-20 01:44:15.000000000","message":"Done","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"34db1815b9536fcaf6f38de801078709f9d36fc5","unresolved":false,"context_lines":[{"line_number":13,"context_line":"       See ``[security_compliance] lockout_failure_attempts``."},{"line_number":14,"context_line":"     * If a user submits a new password that was recently used. See"},{"line_number":15,"context_line":"       ``[security_compliance] unique_last_password_count``."},{"line_number":16,"context_line":"     * If a password does not meet the specificed criteria. See"},{"line_number":17,"context_line":"       ``[security_compliance] password_regex``."},{"line_number":18,"context_line":"     * If a user attempts to change their password too often. See"},{"line_number":19,"context_line":"       ``[security_compliance] minimum_password_age``."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"1a6eadb0_eb4abe26","line":16,"updated":"2016-12-19 20:41:54.000000000","message":"specified*","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0767e1adadf2e751c302ccb5e2bf1f5e702eb638","unresolved":false,"context_lines":[{"line_number":13,"context_line":"       See ``[security_compliance] lockout_failure_attempts``."},{"line_number":14,"context_line":"     * If a user submits a new password that was recently used. See"},{"line_number":15,"context_line":"       ``[security_compliance] unique_last_password_count``."},{"line_number":16,"context_line":"     * If a password does not meet the specificed criteria. See"},{"line_number":17,"context_line":"       ``[security_compliance] password_regex``."},{"line_number":18,"context_line":"     * If a user attempts to change their password too often. See"},{"line_number":19,"context_line":"       ``[security_compliance] minimum_password_age``."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"1a6eadb0_a4be30fd","line":16,"in_reply_to":"1a6eadb0_eb4abe26","updated":"2016-12-20 01:44:15.000000000","message":"Done","commit_id":"e68dd0a5d86aed977ed0c6a55613cd6697414bfb"}]}
