)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c12471306e395bbf9074b3ef1912b0040282094","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Brad Topol \u003cbtopol@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-08-14 15:35:42 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add audit support to keystone federation"},{"line_number":8,"context_line":"implements bp audit-support-for-federation"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"Change-Id: Ifb1d8b593e8f387afd404367bd6c458243aa2695"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7ac7a964_51de8c40","line":7,"updated":"2014-08-14 20:48:45.000000000","message":"add a new line between this line and the next","commit_id":"7dbd3b795434cc90674f0b062234abe61e568f0c"}],"keystone/auth/plugins/mapped.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"40f42d47fff0246c1fe77fc68b4e3a33311383bb","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        _federation \u003d token_ref[\u0027user\u0027][federation.FEDERATION]"},{"line_number":52,"context_line":"        identity_provider \u003d _federation[\u0027identity_provider\u0027][\u0027id\u0027]"},{"line_number":53,"context_line":"        protocol \u003d _federation[\u0027protocol\u0027][\u0027id\u0027]"},{"line_number":54,"context_line":"        user_id \u003d token_ref[\u0027user_id\u0027]"},{"line_number":55,"context_line":"        group_ids \u003d [group[\u0027id\u0027] for group in _federation[\u0027groups\u0027]]"},{"line_number":56,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":57,"context_line":"                                                   user_id, group_ids,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_56074081","line":54,"updated":"2014-08-26 20:19:29.000000000","message":"why does a token_ref have a \u0027user\u0027 and a \u0027user_id\u0027 attribute? this isn\u0027t supposed to be [\u0027user\u0027][\u0027id\u0027] ?","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"312ba13b70b9f5864e96871f8b238b13b875d892","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        _federation \u003d token_ref[\u0027user\u0027][federation.FEDERATION]"},{"line_number":52,"context_line":"        identity_provider \u003d _federation[\u0027identity_provider\u0027][\u0027id\u0027]"},{"line_number":53,"context_line":"        protocol \u003d _federation[\u0027protocol\u0027][\u0027id\u0027]"},{"line_number":54,"context_line":"        user_id \u003d token_ref[\u0027user_id\u0027]"},{"line_number":55,"context_line":"        group_ids \u003d [group[\u0027id\u0027] for group in _federation[\u0027groups\u0027]]"},{"line_number":56,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":57,"context_line":"                                                   user_id, group_ids,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_67e728e5","line":54,"in_reply_to":"1abeadc6_56074081","updated":"2014-08-27 06:04:10.000000000","message":"Done","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"28c3f40dfd9d9fbbf09a946dc6e70079053534fd","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        protocol \u003d _federation[\u0027protocol\u0027][\u0027id\u0027]"},{"line_number":54,"context_line":"        user_id \u003d token_ref[\u0027user_id\u0027]"},{"line_number":55,"context_line":"        group_ids \u003d [group[\u0027id\u0027] for group in _federation[\u0027groups\u0027]]"},{"line_number":56,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":57,"context_line":"                                                   user_id, group_ids,"},{"line_number":58,"context_line":"                                                   identity_provider, protocol,"},{"line_number":59,"context_line":"                                                   taxonomy.OUTCOME_PENDING)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_746b7d85","line":56,"updated":"2014-08-26 01:48:59.000000000","message":"probably still worth using functools.partial https://docs.python.org/2/library/functools.html","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"312ba13b70b9f5864e96871f8b238b13b875d892","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        protocol \u003d _federation[\u0027protocol\u0027][\u0027id\u0027]"},{"line_number":54,"context_line":"        user_id \u003d token_ref[\u0027user_id\u0027]"},{"line_number":55,"context_line":"        group_ids \u003d [group[\u0027id\u0027] for group in _federation[\u0027groups\u0027]]"},{"line_number":56,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":57,"context_line":"                                                   user_id, group_ids,"},{"line_number":58,"context_line":"                                                   identity_provider, protocol,"},{"line_number":59,"context_line":"                                                   taxonomy.OUTCOME_PENDING)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_a7d060f8","line":56,"in_reply_to":"1abeadc6_746b7d85","updated":"2014-08-27 06:04:10.000000000","message":"Done.  THANKS DOLPH","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"28c3f40dfd9d9fbbf09a946dc6e70079053534fd","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            assertion[\u0027user_id\u0027] \u003d user_id"},{"line_number":90,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":91,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":92,"context_line":"        user_id \u003d None"},{"line_number":93,"context_line":"        group_ids \u003d None"},{"line_number":94,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":95,"context_line":"                                                   user_id, group_ids,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_341f450b","line":92,"updated":"2014-08-26 01:48:59.000000000","message":"you\u0027re re-setting it to None, it should already have a default value (or None) from line 87.","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"312ba13b70b9f5864e96871f8b238b13b875d892","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            assertion[\u0027user_id\u0027] \u003d user_id"},{"line_number":90,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":91,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":92,"context_line":"        user_id \u003d None"},{"line_number":93,"context_line":"        group_ids \u003d None"},{"line_number":94,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":95,"context_line":"                                                   user_id, group_ids,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_e7c33836","line":92,"in_reply_to":"1abeadc6_341f450b","updated":"2014-08-27 06:04:10.000000000","message":"doh!  done. accidentally got in there when I rebased","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"40f42d47fff0246c1fe77fc68b4e3a33311383bb","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            assertion[\u0027user_id\u0027] \u003d user_id"},{"line_number":90,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":91,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":92,"context_line":"        user_id \u003d None"},{"line_number":93,"context_line":"        group_ids \u003d None"},{"line_number":94,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":95,"context_line":"                                                   user_id, group_ids,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_f6accc8e","line":92,"in_reply_to":"1abeadc6_341f450b","updated":"2014-08-26 20:19:29.000000000","message":"eek ++","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"8b5f76a5710e1c89476531542409f9afbf2e4dc5","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        _federation \u003d token_ref[\u0027user\u0027][federation.FEDERATION]"},{"line_number":54,"context_line":"        identity_provider \u003d _federation[\u0027identity_provider\u0027][\u0027id\u0027]"},{"line_number":55,"context_line":"        protocol \u003d _federation[\u0027protocol\u0027][\u0027id\u0027]"},{"line_number":56,"context_line":"        user_id \u003d token_ref[\u0027user_id\u0027]"},{"line_number":57,"context_line":"        group_ids \u003d [group[\u0027id\u0027] for group in _federation[\u0027groups\u0027]]"},{"line_number":58,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":59,"context_line":"                                                   user_id, group_ids,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_a13e9027","line":56,"updated":"2014-08-26 20:19:21.000000000","message":"should this not be token_ref[\u0027user\u0027][\u0027id\u0027] ?","commit_id":"ac29b644f025d6a6b288c72ea01489421b280246"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"df2d888f1f900cc3b940666608268140c4ee5d92","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        _federation \u003d token_ref[\u0027user\u0027][federation.FEDERATION]"},{"line_number":54,"context_line":"        identity_provider \u003d _federation[\u0027identity_provider\u0027][\u0027id\u0027]"},{"line_number":55,"context_line":"        protocol \u003d _federation[\u0027protocol\u0027][\u0027id\u0027]"},{"line_number":56,"context_line":"        user_id \u003d token_ref[\u0027user_id\u0027]"},{"line_number":57,"context_line":"        group_ids \u003d [group[\u0027id\u0027] for group in _federation[\u0027groups\u0027]]"},{"line_number":58,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":59,"context_line":"                                                   user_id, group_ids,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_c1aaac19","line":56,"in_reply_to":"1abeadc6_a13e9027","updated":"2014-08-26 20:24:00.000000000","message":"yes, it should be.","commit_id":"ac29b644f025d6a6b288c72ea01489421b280246"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"395b3032aa21482e093d57af4a86456efa71c447","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        _federation \u003d token_ref[\u0027user\u0027][federation.FEDERATION]"},{"line_number":54,"context_line":"        identity_provider \u003d _federation[\u0027identity_provider\u0027][\u0027id\u0027]"},{"line_number":55,"context_line":"        protocol \u003d _federation[\u0027protocol\u0027][\u0027id\u0027]"},{"line_number":56,"context_line":"        user_id \u003d token_ref[\u0027user_id\u0027]"},{"line_number":57,"context_line":"        group_ids \u003d [group[\u0027id\u0027] for group in _federation[\u0027groups\u0027]]"},{"line_number":58,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":59,"context_line":"                                                   user_id, group_ids,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_6e5e1378","line":56,"in_reply_to":"1abeadc6_c1aaac19","updated":"2014-08-27 06:03:54.000000000","message":"Done","commit_id":"ac29b644f025d6a6b288c72ea01489421b280246"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"8b5f76a5710e1c89476531542409f9afbf2e4dc5","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            assertion[\u0027user_id\u0027] \u003d user_id"},{"line_number":92,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":93,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":94,"context_line":"        user_id \u003d None"},{"line_number":95,"context_line":"        group_ids \u003d None"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        send_notification \u003d functools.partial("}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_61355845","line":94,"updated":"2014-08-26 20:19:21.000000000","message":"as noted by stevemar in previous patchset, you\u0027re stomping on the value of user_id above here\n\nunscoped tokens *do* have user IDs, even if they might be meaningless","commit_id":"ac29b644f025d6a6b288c72ea01489421b280246"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"395b3032aa21482e093d57af4a86456efa71c447","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            assertion[\u0027user_id\u0027] \u003d user_id"},{"line_number":92,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":93,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":94,"context_line":"        user_id \u003d None"},{"line_number":95,"context_line":"        group_ids \u003d None"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        send_notification \u003d functools.partial("}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_cefc8741","line":94,"in_reply_to":"1abeadc6_61355845","updated":"2014-08-27 06:03:54.000000000","message":"this should now be fixed","commit_id":"ac29b644f025d6a6b288c72ea01489421b280246"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1af816a58ed2be83d9a1df4a238988d5a933bbe2","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":64,"context_line":"                identity_provider, protocol)"},{"line_number":65,"context_line":"            utils.validate_groups(group_ids, mapping[\u0027id\u0027], self.identity_api)"},{"line_number":66,"context_line":"            outcome \u003d taxonomy.OUTCOME_SUCCESS"},{"line_number":67,"context_line":"            send_notification(outcome)"},{"line_number":68,"context_line":"        except Exception:"},{"line_number":69,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_53e9007f","line":66,"updated":"2014-08-27 05:20:22.000000000","message":"nit, you can just write taxonomy.OUTCOME_SUCESS in the line below.","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"c7e3bc67dafef7a359b83a47d3567696faa4bd98","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":64,"context_line":"                identity_provider, protocol)"},{"line_number":65,"context_line":"            utils.validate_groups(group_ids, mapping[\u0027id\u0027], self.identity_api)"},{"line_number":66,"context_line":"            outcome \u003d taxonomy.OUTCOME_SUCCESS"},{"line_number":67,"context_line":"            send_notification(outcome)"},{"line_number":68,"context_line":"        except Exception:"},{"line_number":69,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_ae84abb1","line":66,"in_reply_to":"1abeadc6_53e9007f","updated":"2014-08-27 06:03:40.000000000","message":"Done","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1af816a58ed2be83d9a1df4a238988d5a933bbe2","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":71,"context_line":"            # after sending the notification"},{"line_number":72,"context_line":"            outcome \u003d taxonomy.OUTCOME_FAILURE"},{"line_number":73,"context_line":"            send_notification(outcome)"},{"line_number":74,"context_line":"            raise"},{"line_number":75,"context_line":"        return {"},{"line_number":76,"context_line":"            \u0027user_id\u0027: token_ref[\u0027user_id\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_73ec3c90","line":73,"updated":"2014-08-27 05:20:22.000000000","message":"same comment as above","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"c7e3bc67dafef7a359b83a47d3567696faa4bd98","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":71,"context_line":"            # after sending the notification"},{"line_number":72,"context_line":"            outcome \u003d taxonomy.OUTCOME_FAILURE"},{"line_number":73,"context_line":"            send_notification(outcome)"},{"line_number":74,"context_line":"            raise"},{"line_number":75,"context_line":"        return {"},{"line_number":76,"context_line":"            \u0027user_id\u0027: token_ref[\u0027user_id\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_ce93a7f8","line":73,"in_reply_to":"1abeadc6_73ec3c90","updated":"2014-08-27 06:03:40.000000000","message":"Done","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"535a8f8f869fcb0d3b533ee1aab5667d997a4bb4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        send_notification \u003d functools.partial("},{"line_number":59,"context_line":"            notifications.send_saml_audit_notification, \u0027authenticate\u0027,"},{"line_number":60,"context_line":"            context, user_id, group_ids, identity_provider, protocol,"},{"line_number":61,"context_line":"            auth_payload[\u0027id\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        try:"},{"line_number":64,"context_line":"            mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("}],"source_content_type":"text/x-python","patch_set":10,"id":"1abeadc6_cef2c799","line":61,"updated":"2014-08-27 06:17:55.000000000","message":"nit, you can define token_id \u003d auth_payload[\u0027id\u0027] at line 51, and use token_id. But this works.","commit_id":"0074d0fbcdfa3c54f9b33815c5afca250beeca56"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e24f3b9307f153058ecce74c26eea30c5b21c30a","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                identity_provider, protocol)"},{"line_number":66,"context_line":"            utils.validate_groups(group_ids, mapping[\u0027id\u0027], self.identity_api)"},{"line_number":67,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":68,"context_line":"        except Exception:"},{"line_number":69,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":70,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":71,"context_line":"            # after sending the notification"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_db641ebb","line":68,"updated":"2014-08-28 00:15:44.000000000","message":"it\u0027s possible that the send_notification(SUCCESS) raise, then it would get to here and try to send the failure. So then you\u0027d potentially see a success and a failure for the same event. This is a place where\n\n except Exception:\n    send_notification(FAILURE)\n    raise\n else:\n    send_notification(SUCCESS)\n\nmakes more sense.","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e1112f57fb45f3d6cc804246b934db6e7483b8bc","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                identity_provider, protocol)"},{"line_number":66,"context_line":"            utils.validate_groups(group_ids, mapping[\u0027id\u0027], self.identity_api)"},{"line_number":67,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":68,"context_line":"        except Exception:"},{"line_number":69,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":70,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":71,"context_line":"            # after sending the notification"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_bb14bde9","line":68,"in_reply_to":"1abeadc6_d6531515","updated":"2014-08-28 04:40:00.000000000","message":"++","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"9197a1077be549d4a475b2c1cd922918dddbfe10","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                identity_provider, protocol)"},{"line_number":66,"context_line":"            utils.validate_groups(group_ids, mapping[\u0027id\u0027], self.identity_api)"},{"line_number":67,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":68,"context_line":"        except Exception:"},{"line_number":69,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":70,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":71,"context_line":"            # after sending the notification"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_d6531515","line":68,"in_reply_to":"1abeadc6_db641ebb","updated":"2014-08-28 00:59:04.000000000","message":"++ good call. perfect use of try/else","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a42451be4a48156b76aaa5c528d33143dfefe8e0","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                identity_provider, protocol)"},{"line_number":66,"context_line":"            utils.validate_groups(group_ids, mapping[\u0027id\u0027], self.identity_api)"},{"line_number":67,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":68,"context_line":"        except Exception:"},{"line_number":69,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":70,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":71,"context_line":"            # after sending the notification"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_24d15757","line":68,"in_reply_to":"1abeadc6_db641ebb","updated":"2014-08-28 20:27:09.000000000","message":"Great Catch Brant!!! I sleep very well at night knowing you reviewed the code!!! Done in next patch","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e24f3b9307f153058ecce74c26eea30c5b21c30a","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        send_notification \u003d functools.partial("},{"line_number":91,"context_line":"            notifications.send_saml_audit_notification, \u0027authenticate\u0027,"},{"line_number":92,"context_line":"            context, user_id, group_ids, identity_provider, protocol, token_id)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            mapped_properties \u003d self._apply_mapping_filter(identity_provider,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_bb0682cc","line":92,"updated":"2014-08-28 00:15:44.000000000","message":"this needs to be moved down after where group_ids and user_ids is set. The way it is now user_id and group_ids will always be None when this is called.","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a42451be4a48156b76aaa5c528d33143dfefe8e0","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        send_notification \u003d functools.partial("},{"line_number":91,"context_line":"            notifications.send_saml_audit_notification, \u0027authenticate\u0027,"},{"line_number":92,"context_line":"            context, user_id, group_ids, identity_provider, protocol, token_id)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            mapped_properties \u003d self._apply_mapping_filter(identity_provider,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_621a5ac7","line":92,"in_reply_to":"1abeadc6_bb0682cc","updated":"2014-08-28 20:27:09.000000000","message":"Done","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"9197a1077be549d4a475b2c1cd922918dddbfe10","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        send_notification \u003d functools.partial("},{"line_number":91,"context_line":"            notifications.send_saml_audit_notification, \u0027authenticate\u0027,"},{"line_number":92,"context_line":"            context, user_id, group_ids, identity_provider, protocol, token_id)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            mapped_properties \u003d self._apply_mapping_filter(identity_provider,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_f6a2d1fa","line":92,"in_reply_to":"1abeadc6_bb0682cc","updated":"2014-08-28 00:59:04.000000000","message":"user_id is defined in L82, but i\u0027d sort of expect group_ids to be None on the first call... maybe that should be removed from the partial? (and use mostly kwargs instead)","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e1112f57fb45f3d6cc804246b934db6e7483b8bc","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        send_notification \u003d functools.partial("},{"line_number":91,"context_line":"            notifications.send_saml_audit_notification, \u0027authenticate\u0027,"},{"line_number":92,"context_line":"            context, user_id, group_ids, identity_provider, protocol, token_id)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            mapped_properties \u003d self._apply_mapping_filter(identity_provider,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_bbebddda","line":92,"in_reply_to":"1abeadc6_f6a2d1fa","updated":"2014-08-28 04:40:00.000000000","message":"is there a way to get the group_ids from line 99 to be put into the partial function?","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"eacb3279da1866f42b2c599c54d26b6cdc429a52","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            group_ids \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":100,"context_line":"            if not user_id:"},{"line_number":101,"context_line":"                user_id \u003d parse.quote(mapped_properties[\u0027name\u0027])"},{"line_number":102,"context_line":"            user_id \u003d parse.quote(mapped_properties[\u0027name\u0027])"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":105,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_f0e3a231","line":102,"updated":"2014-08-28 13:30:20.000000000","message":"This seems to be repeated, I\u0027d remove this line, and put the send notification in the conditional.","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a42451be4a48156b76aaa5c528d33143dfefe8e0","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            group_ids \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":100,"context_line":"            if not user_id:"},{"line_number":101,"context_line":"                user_id \u003d parse.quote(mapped_properties[\u0027name\u0027])"},{"line_number":102,"context_line":"            user_id \u003d parse.quote(mapped_properties[\u0027name\u0027])"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":105,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_a27f12df","line":102,"in_reply_to":"1abeadc6_f0e3a231","updated":"2014-08-28 20:27:09.000000000","message":"Done","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6282,"name":"Wu Wenxiang","email":"wu.wenxiang@algoblu.com","username":"wu-wenxiang"},"change_message_id":"66f49e1826860e9691e18e3fe464cef943d9a291","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            if not user_id:"},{"line_number":101,"context_line":"                user_id \u003d parse.quote(mapped_properties[\u0027name\u0027])"},{"line_number":102,"context_line":"            user_id \u003d parse.quote(mapped_properties[\u0027name\u0027])"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":105,"context_line":"        except Exception:"},{"line_number":106,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_fb18f5d4","line":103,"updated":"2014-08-28 04:55:43.000000000","message":"why use \"if not\" here if always set user_id \u003d parse.quote(mapped_properties[\u0027name\u0027]) ?","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a42451be4a48156b76aaa5c528d33143dfefe8e0","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            if not user_id:"},{"line_number":101,"context_line":"                user_id \u003d parse.quote(mapped_properties[\u0027name\u0027])"},{"line_number":102,"context_line":"            user_id \u003d parse.quote(mapped_properties[\u0027name\u0027])"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":105,"context_line":"        except Exception:"},{"line_number":106,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_e2858acf","line":103,"in_reply_to":"1abeadc6_fb18f5d4","updated":"2014-08-28 20:27:09.000000000","message":"Done","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e24f3b9307f153058ecce74c26eea30c5b21c30a","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            user_id \u003d parse.quote(mapped_properties[\u0027name\u0027])"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":105,"context_line":"        except Exception:"},{"line_number":106,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":107,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":108,"context_line":"            # after sending the notification"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_3b735281","line":105,"updated":"2014-08-28 00:15:44.000000000","message":"same comment here.","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a42451be4a48156b76aaa5c528d33143dfefe8e0","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            user_id \u003d parse.quote(mapped_properties[\u0027name\u0027])"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":105,"context_line":"        except Exception:"},{"line_number":106,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":107,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":108,"context_line":"            # after sending the notification"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_026e062f","line":105,"in_reply_to":"1abeadc6_3b735281","updated":"2014-08-28 20:27:09.000000000","message":"Done","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"65085e0349d72ca6f52fd1522b299c7cd1530ba4","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":88,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":89,"context_line":"        group_ids \u003d None"},{"line_number":90,"context_line":"        token_id \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        try:"},{"line_number":93,"context_line":"            mapped_properties \u003d self._apply_mapping_filter(identity_provider,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_ed02db3c","line":90,"updated":"2014-08-28 20:55:54.000000000","message":"Nit, for a follow up patch, we should comment on why we set token_id to None here (because the user is coming in from an idp)","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"21bd0237d19851776d7b0d363d0d8da1bb02b769","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":88,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":89,"context_line":"        group_ids \u003d None"},{"line_number":90,"context_line":"        token_id \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        try:"},{"line_number":93,"context_line":"            mapped_properties \u003d self._apply_mapping_filter(identity_provider,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_16bb9f0f","line":90,"in_reply_to":"1abeadc6_13cf3657","updated":"2014-08-29 01:24:49.000000000","message":"Agreed. Will add a Note in my next patch","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"cfe7ee209bfc1f92c03ccc2c125a9907f2e49263","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":88,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":89,"context_line":"        group_ids \u003d None"},{"line_number":90,"context_line":"        token_id \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        try:"},{"line_number":93,"context_line":"            mapped_properties \u003d self._apply_mapping_filter(identity_provider,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_ffa0aff5","line":90,"in_reply_to":"1abeadc6_ed02db3c","updated":"2014-08-29 04:27:53.000000000","message":"Done","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"db3a047582da51a4371e320491a9c461f379c2df","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":88,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":89,"context_line":"        group_ids \u003d None"},{"line_number":90,"context_line":"        token_id \u003d None"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        try:"},{"line_number":93,"context_line":"            mapped_properties \u003d self._apply_mapping_filter(identity_provider,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_13cf3657","line":90,"in_reply_to":"1abeadc6_ed02db3c","updated":"2014-08-28 22:03:08.000000000","message":"coming in from an IdP with a SAML doc instead of a token, i assume? i\u0027d like an explanation in a comment as well","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"65085e0349d72ca6f52fd1522b299c7cd1530ba4","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":103,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":104,"context_line":"            # after sending the notification"},{"line_number":105,"context_line":"            send_notification \u003d functools.partial("},{"line_number":106,"context_line":"                notifications.send_saml_audit_notification, \u0027authenticate\u0027,"},{"line_number":107,"context_line":"                context, user_id, group_ids, identity_provider, protocol,"},{"line_number":108,"context_line":"                token_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_cdb8bf77","line":105,"updated":"2014-08-28 20:55:54.000000000","message":"I think you want:\n\n  send_notification \u003d functools.partial(notifications.send_saml_audit_notification, \n  \u0027authenticate\u0027, context, user_id, group_ids, \n  identity_provider, protocol,\ttoken_id)\n\nat line 100, then you don\u0027t have to call it twice, (i think).","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"21bd0237d19851776d7b0d363d0d8da1bb02b769","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":103,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":104,"context_line":"            # after sending the notification"},{"line_number":105,"context_line":"            send_notification \u003d functools.partial("},{"line_number":106,"context_line":"                notifications.send_saml_audit_notification, \u0027authenticate\u0027,"},{"line_number":107,"context_line":"                context, user_id, group_ids, identity_provider, protocol,"},{"line_number":108,"context_line":"                token_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_f6ac63ef","line":105,"in_reply_to":"1abeadc6_0ecc6d88","updated":"2014-08-29 01:24:49.000000000","message":"me too. CURSE YOU Partials.... :-).  I\u0027m glad I learned how to use them though","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"db3a047582da51a4371e320491a9c461f379c2df","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":103,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":104,"context_line":"            # after sending the notification"},{"line_number":105,"context_line":"            send_notification \u003d functools.partial("},{"line_number":106,"context_line":"                notifications.send_saml_audit_notification, \u0027authenticate\u0027,"},{"line_number":107,"context_line":"                context, user_id, group_ids, identity_provider, protocol,"},{"line_number":108,"context_line":"                token_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_73130ab8","line":105,"in_reply_to":"1abeadc6_28bbe10f","updated":"2014-08-28 22:03:08.000000000","message":"well that sucks. in that case, redefining the partial right before you use it defeats the point of having the re-usable shortcut (you\u0027re not re-using it). abandon partials in _handle_unscoped_token()?","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1f7c236d24292a55a90c91b06b2f05cd3cebdf71","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":103,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":104,"context_line":"            # after sending the notification"},{"line_number":105,"context_line":"            send_notification \u003d functools.partial("},{"line_number":106,"context_line":"                notifications.send_saml_audit_notification, \u0027authenticate\u0027,"},{"line_number":107,"context_line":"                context, user_id, group_ids, identity_provider, protocol,"},{"line_number":108,"context_line":"                token_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_0ecc6d88","line":105,"in_reply_to":"1abeadc6_73130ab8","updated":"2014-08-28 22:22:45.000000000","message":"i agree","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"3a3971954500dc18126bf699c2b3d43d6373307a","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":103,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":104,"context_line":"            # after sending the notification"},{"line_number":105,"context_line":"            send_notification \u003d functools.partial("},{"line_number":106,"context_line":"                notifications.send_saml_audit_notification, \u0027authenticate\u0027,"},{"line_number":107,"context_line":"                context, user_id, group_ids, identity_provider, protocol,"},{"line_number":108,"context_line":"                token_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_28bbe10f","line":105,"in_reply_to":"1abeadc6_cdb8bf77","updated":"2014-08-28 21:10:01.000000000","message":"I believe I tried that and you will get the following error:\nUnboundLocalError: local variable \u0027send_notification\u0027 referenced before assignment. I believe being in the try is at a different scope than what is in the else","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6155349e2fac727ee51f56b53a9ab6c39b66b3d9","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        utils.validate_expiration(token_ref)"},{"line_number":58,"context_line":"        identity_provider \u003d token_ref.federation_idp_id"},{"line_number":59,"context_line":"        protocol \u003d token_ref.federation_protocol_id"},{"line_number":60,"context_line":"        user_id \u003d token_ref[\u0027user\u0027][\u0027id\u0027]"},{"line_number":61,"context_line":"        group_ids \u003d token_ref.federation_group_ids"},{"line_number":62,"context_line":"        send_notification \u003d functools.partial("},{"line_number":63,"context_line":"            notifications.send_saml_audit_notification, \u0027authenticate\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1abeadc6_72659a1c","line":60,"updated":"2014-08-29 15:48:53.000000000","message":"from L80, this should probably be token_ref.user_id","commit_id":"55a51603e6cfb732818593e3a4e8ff045ae6a189"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dab4658d83f9c1acb007ba29a9ec76624aef5ec7","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            send_notification(taxonomy.OUTCOME_SUCCESS)"},{"line_number":79,"context_line":"        return {"},{"line_number":80,"context_line":"            \u0027user_id\u0027: token_ref.user_id,"},{"line_number":81,"context_line":"            \u0027group_ids\u0027: token_ref.federation_group_ids,"},{"line_number":82,"context_line":"            federation.IDENTITY_PROVIDER: token_ref.federation_idp_id,"},{"line_number":83,"context_line":"            federation.PROTOCOL: token_ref.federation_protocol_id"},{"line_number":84,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":15,"id":"1abeadc6_1251c661","line":81,"updated":"2014-08-29 15:45:06.000000000","message":"these are already referenced above, just use those (lines 58-61)","commit_id":"55a51603e6cfb732818593e3a4e8ff045ae6a189"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6155349e2fac727ee51f56b53a9ab6c39b66b3d9","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":92,"context_line":"        group_ids \u003d None"},{"line_number":93,"context_line":"        # NOTE(topol): Since the user is coming in from an IdP with a SAML doc"},{"line_number":94,"context_line":"        # instead of from a token we set token_id to None"},{"line_number":95,"context_line":"        token_id \u003d None"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1abeadc6_92ccf636","line":94,"updated":"2014-08-29 15:48:53.000000000","message":".\n\n  token, so we","commit_id":"55a51603e6cfb732818593e3a4e8ff045ae6a189"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d68c6368908b30f091055ed9bfe57ff2afbd3343","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        token_audit_id \u003d token_ref.audit_id"},{"line_number":59,"context_line":"        identity_provider \u003d token_ref.federation_idp_id"},{"line_number":60,"context_line":"        protocol \u003d token_ref.federation_protocol_id"},{"line_number":61,"context_line":"        user_id \u003d token_ref[\u0027user\u0027][\u0027id\u0027]"},{"line_number":62,"context_line":"        group_ids \u003d token_ref.federation_group_ids"},{"line_number":63,"context_line":"        send_notification \u003d functools.partial("},{"line_number":64,"context_line":"            notifications.send_saml_audit_notification, \u0027authenticate\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_75bca4dc","line":61,"updated":"2014-08-29 16:01:08.000000000","message":"this could/should be token_ref.user_id but as-is, it won\u0027t fail until we introduce v4","commit_id":"a64bb889292f07bd155fdf264933056b6e010ad0"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"9f30815902cddec110e1b45ab8a3a2ad205aac80","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        token_audit_id \u003d token_ref.audit_id"},{"line_number":59,"context_line":"        identity_provider \u003d token_ref.federation_idp_id"},{"line_number":60,"context_line":"        protocol \u003d token_ref.federation_protocol_id"},{"line_number":61,"context_line":"        user_id \u003d token_ref[\u0027user\u0027][\u0027id\u0027]"},{"line_number":62,"context_line":"        group_ids \u003d token_ref.federation_group_ids"},{"line_number":63,"context_line":"        send_notification \u003d functools.partial("},{"line_number":64,"context_line":"            notifications.send_saml_audit_notification, \u0027authenticate\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_e9a0dd43","line":61,"in_reply_to":"1abeadc6_757bc4f4","updated":"2014-08-29 18:03:06.000000000","message":"Yep. Happy to do it!","commit_id":"a64bb889292f07bd155fdf264933056b6e010ad0"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a9a28090f4464ddbe9c6e9f4c58ecd8b23ba8073","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        token_audit_id \u003d token_ref.audit_id"},{"line_number":59,"context_line":"        identity_provider \u003d token_ref.federation_idp_id"},{"line_number":60,"context_line":"        protocol \u003d token_ref.federation_protocol_id"},{"line_number":61,"context_line":"        user_id \u003d token_ref[\u0027user\u0027][\u0027id\u0027]"},{"line_number":62,"context_line":"        group_ids \u003d token_ref.federation_group_ids"},{"line_number":63,"context_line":"        send_notification \u003d functools.partial("},{"line_number":64,"context_line":"            notifications.send_saml_audit_notification, \u0027authenticate\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_757bc4f4","line":61,"in_reply_to":"1abeadc6_75bca4dc","updated":"2014-08-29 16:10:18.000000000","message":"++ a follow up patch to cleanup would be good","commit_id":"a64bb889292f07bd155fdf264933056b6e010ad0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d68c6368908b30f091055ed9bfe57ff2afbd3343","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":94,"context_line":"        group_ids \u003d None"},{"line_number":95,"context_line":"        # NOTE(topol): Since the user is coming in from an IdP with a SAML doc"},{"line_number":96,"context_line":"        # instead of from a token we set token_id to None"},{"line_number":97,"context_line":"        token_id \u003d None"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_f596f44a","line":96,"updated":"2014-08-29 16:01:08.000000000","message":".\n  token, so we","commit_id":"a64bb889292f07bd155fdf264933056b6e010ad0"}],"keystone/auth/plugins/saml2.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c12471306e395bbf9074b3ef1912b0040282094","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7ac7a964_51592cfd","updated":"2014-08-14 20:48:45.000000000","message":"run pep8 to clean up any errors","commit_id":"7dbd3b795434cc90674f0b062234abe61e568f0c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c12471306e395bbf9074b3ef1912b0040282094","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":72,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":73,"context_line":"        import pdb; pdb.set_trace()"},{"line_number":74,"context_line":"        notifications.send_saml_audit_notification(context,"},{"line_number":75,"context_line":"                                                   None,"},{"line_number":76,"context_line":"                                                   None,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ac7a964_d190dc97","line":73,"updated":"2014-08-14 20:48:45.000000000","message":"remove this line","commit_id":"7dbd3b795434cc90674f0b062234abe61e568f0c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c12471306e395bbf9074b3ef1912b0040282094","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                                                      identity_provider, "},{"line_number":97,"context_line":"                                                      protocol, "},{"line_number":98,"context_line":"                                                      taxonomy.OUTCOME_SUCCESS)"},{"line_number":99,"context_line":"        except Exception:"},{"line_number":100,"context_line":"            notifications.send_saml_audit_notification(context,"},{"line_number":101,"context_line":"                                                       user_id,"},{"line_number":102,"context_line":"                                                       group_ids,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ac7a964_916824bc","line":99,"updated":"2014-08-14 20:48:45.000000000","message":"except Exception as e:\n\nalso make a comment above the catch saying why you are re-raising the exception\n\n  # NOTE(topol): Diaper defense to catch any exception, so we can send off failed\n  # authentication notification, raise the exception after sending the notification","commit_id":"7dbd3b795434cc90674f0b062234abe61e568f0c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c12471306e395bbf9074b3ef1912b0040282094","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                                                       identity_provider, "},{"line_number":104,"context_line":"                                                       protocol, "},{"line_number":105,"context_line":"                                                       taxonomy.OUTCOME_FAILURE)"},{"line_number":106,"context_line":"            raise"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        return {"},{"line_number":109,"context_line":"            \u0027user_id\u0027: parse.quote(mapped_properties[\u0027name\u0027]),"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ac7a964_d1629cd7","line":106,"updated":"2014-08-14 20:48:45.000000000","message":"raise e","commit_id":"7dbd3b795434cc90674f0b062234abe61e568f0c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"271ec3b27332ab6c409b5233cb8c56e927af94f1","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        identity_provider \u003d _federation[\u0027identity_provider\u0027][\u0027id\u0027]"},{"line_number":56,"context_line":"        protocol \u003d _federation[\u0027protocol\u0027][\u0027id\u0027]"},{"line_number":57,"context_line":"        notifications.send_saml_audit_notification(context,"},{"line_number":58,"context_line":"                                                   None,"},{"line_number":59,"context_line":"                                                   None,"},{"line_number":60,"context_line":"                                                   identity_provider,"},{"line_number":61,"context_line":"                                                   protocol,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ac7a964_c7e71311","line":58,"updated":"2014-08-15 19:00:38.000000000","message":"the user id is actually in the token_ref\n\n  user_id \u003d token_ref[\u0027user_id\u0027]\n\nyou can pass this to all three calls of send_saml_notifications","commit_id":"a5403d2c5d2588b11ddc9bc14f2c25e50c169148"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"2f4964bb0936e9293f8989e8c8ea168d971b7895","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        identity_provider \u003d _federation[\u0027identity_provider\u0027][\u0027id\u0027]"},{"line_number":56,"context_line":"        protocol \u003d _federation[\u0027protocol\u0027][\u0027id\u0027]"},{"line_number":57,"context_line":"        notifications.send_saml_audit_notification(context,"},{"line_number":58,"context_line":"                                                   None,"},{"line_number":59,"context_line":"                                                   None,"},{"line_number":60,"context_line":"                                                   identity_provider,"},{"line_number":61,"context_line":"                                                   protocol,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ac7a964_f34e836e","line":58,"in_reply_to":"7ac7a964_c7e71311","updated":"2014-08-27 06:05:38.000000000","message":"Done","commit_id":"a5403d2c5d2588b11ddc9bc14f2c25e50c169148"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"271ec3b27332ab6c409b5233cb8c56e927af94f1","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            outcome \u003d taxonomy.OUTCOME_SUCCESS"},{"line_number":70,"context_line":"            notifications.send_saml_audit_notification(context,"},{"line_number":71,"context_line":"                                                       None,"},{"line_number":72,"context_line":"                                                       group_ids,"},{"line_number":73,"context_line":"                                                       identity_provider,"},{"line_number":74,"context_line":"                                                       protocol,"},{"line_number":75,"context_line":"                                                       outcome)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ac7a964_a7869711","line":72,"updated":"2014-08-15 19:00:38.000000000","message":"try to squeeze these into as few lines as possible","commit_id":"a5403d2c5d2588b11ddc9bc14f2c25e50c169148"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"2f4964bb0936e9293f8989e8c8ea168d971b7895","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            outcome \u003d taxonomy.OUTCOME_SUCCESS"},{"line_number":70,"context_line":"            notifications.send_saml_audit_notification(context,"},{"line_number":71,"context_line":"                                                       None,"},{"line_number":72,"context_line":"                                                       group_ids,"},{"line_number":73,"context_line":"                                                       identity_provider,"},{"line_number":74,"context_line":"                                                       protocol,"},{"line_number":75,"context_line":"                                                       outcome)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ac7a964_13521f13","line":72,"in_reply_to":"7ac7a964_a7869711","updated":"2014-08-27 06:05:38.000000000","message":"Done","commit_id":"a5403d2c5d2588b11ddc9bc14f2c25e50c169148"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"271ec3b27332ab6c409b5233cb8c56e927af94f1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                                                       outcome)"},{"line_number":87,"context_line":"            raise e"},{"line_number":88,"context_line":"        return {"},{"line_number":89,"context_line":"            \u0027user_id\u0027: token_ref[\u0027user_id\u0027],"},{"line_number":90,"context_line":"            \u0027group_ids\u0027: group_ids,"},{"line_number":91,"context_line":"            federation.IDENTITY_PROVIDER: identity_provider,"},{"line_number":92,"context_line":"            federation.PROTOCOL: protocol"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ac7a964_c7ce3383","line":89,"updated":"2014-08-15 19:00:38.000000000","message":"consider updating this line if you create a local user_id variable","commit_id":"a5403d2c5d2588b11ddc9bc14f2c25e50c169148"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"2f4964bb0936e9293f8989e8c8ea168d971b7895","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                                                       outcome)"},{"line_number":87,"context_line":"            raise e"},{"line_number":88,"context_line":"        return {"},{"line_number":89,"context_line":"            \u0027user_id\u0027: token_ref[\u0027user_id\u0027],"},{"line_number":90,"context_line":"            \u0027group_ids\u0027: group_ids,"},{"line_number":91,"context_line":"            federation.IDENTITY_PROVIDER: identity_provider,"},{"line_number":92,"context_line":"            federation.PROTOCOL: protocol"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ac7a964_3359db36","line":89,"in_reply_to":"7ac7a964_c7ce3383","updated":"2014-08-27 06:05:38.000000000","message":"Done","commit_id":"a5403d2c5d2588b11ddc9bc14f2c25e50c169148"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"db44c36ffd317032b08fe4865a65e000e4b84a3f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        are set as well."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        if \u0027id\u0027 in auth_payload:"},{"line_number":44,"context_line":"            fields \u003d self._handle_scoped_token(auth_payload)"},{"line_number":45,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_f5332bf4","side":"PARENT","line":42,"updated":"2014-08-18 03:33:06.000000000","message":"add this new line back?","commit_id":"2ea3006dc015675dcf20da8ddd6a8f7436b90113"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"db44c36ffd317032b08fe4865a65e000e4b84a3f","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _handle_unscoped_token(self, context, auth_payload):"},{"line_number":68,"context_line":"        assertion \u003d dict(utils.get_assertion_params_from_env(context))"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":71,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_75571b03","side":"PARENT","line":69,"updated":"2014-08-18 03:33:06.000000000","message":"add this new line back?","commit_id":"2ea3006dc015675dcf20da8ddd6a8f7436b90113"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"937c6510831a7a493a108a5c74d43eb9b441ea08","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1abeadc6_15e53008","updated":"2014-08-22 18:36:01.000000000","message":"heads up, as https://review.openstack.org/#/c/105597/ has been approved, the changes here will have to be moved to: keystone/auth/plugins/mapped.py","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":60,"context_line":"                                                   user_id, group_ids,"},{"line_number":61,"context_line":"                                                   identity_provider, protocol,"},{"line_number":62,"context_line":"                                                   taxonomy.OUTCOME_PENDING)"},{"line_number":63,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":64,"context_line":"            identity_provider, protocol)"},{"line_number":65,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_097a2ff1","line":62,"updated":"2014-08-18 20:38:04.000000000","message":"since this function is called multiple times with the same args except for the outcome, could use functools.partial.\n\n send_audit \u003d functools.partial(notifications.send_saml_audit_notification, \u0027authenticate\u0027, context, ...)\n  send_audit(taxonomy.OUTCOME_PENDING)\n\n  send_audit(taxonomy.OUTCOME_SUCCESS)\n\n send_audit(taxonomy.OUTCOME_FAILURE)","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                                                   user_id, group_ids,"},{"line_number":61,"context_line":"                                                   identity_provider, protocol,"},{"line_number":62,"context_line":"                                                   taxonomy.OUTCOME_PENDING)"},{"line_number":63,"context_line":"        mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":64,"context_line":"            identity_provider, protocol)"},{"line_number":65,"context_line":"        try:"},{"line_number":66,"context_line":"            utils.validate_groups(group_ids, mapping[\u0027id\u0027], self.identity_api)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_c94917d2","line":63,"updated":"2014-08-18 20:38:04.000000000","message":"this method call could fail, then the result notification wouldn\u0027t be set. The try/exception should also include this.\n\nA context would probably work best here.","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"db44c36ffd317032b08fe4865a65e000e4b84a3f","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":69,"context_line":"                                                       user_id, group_ids,"},{"line_number":70,"context_line":"                                                       identity_provider,"},{"line_number":71,"context_line":"                                                       protocol,"},{"line_number":72,"context_line":"                                                       outcome)"},{"line_number":73,"context_line":"        except Exception as e:"},{"line_number":74,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_352683bb","line":71,"updated":"2014-08-18 03:33:06.000000000","message":"you could put outcome on this line","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"1e98ad25af4c54685e0157ebb07d06a9e625987d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":69,"context_line":"                                                       user_id, group_ids,"},{"line_number":70,"context_line":"                                                       identity_provider,"},{"line_number":71,"context_line":"                                                       protocol,"},{"line_number":72,"context_line":"                                                       outcome)"},{"line_number":73,"context_line":"        except Exception as e:"},{"line_number":74,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_4d2ffdf6","line":71,"in_reply_to":"1abeadc6_352683bb","updated":"2014-08-27 06:04:28.000000000","message":"Done","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"db44c36ffd317032b08fe4865a65e000e4b84a3f","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":79,"context_line":"                                                       user_id, group_ids,"},{"line_number":80,"context_line":"                                                       identity_provider,"},{"line_number":81,"context_line":"                                                       protocol,"},{"line_number":82,"context_line":"                                                       outcome)"},{"line_number":83,"context_line":"            raise e"},{"line_number":84,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_7520fb9b","line":81,"updated":"2014-08-18 03:33:06.000000000","message":"you could put outcome on this line","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"1e98ad25af4c54685e0157ebb07d06a9e625987d","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":79,"context_line":"                                                       user_id, group_ids,"},{"line_number":80,"context_line":"                                                       identity_provider,"},{"line_number":81,"context_line":"                                                       protocol,"},{"line_number":82,"context_line":"                                                       outcome)"},{"line_number":83,"context_line":"            raise e"},{"line_number":84,"context_line":"        return {"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_2d2ac1e7","line":81,"in_reply_to":"1abeadc6_7520fb9b","updated":"2014-08-27 06:04:28.000000000","message":"Done","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                                                       identity_provider,"},{"line_number":81,"context_line":"                                                       protocol,"},{"line_number":82,"context_line":"                                                       outcome)"},{"line_number":83,"context_line":"            raise e"},{"line_number":84,"context_line":"        return {"},{"line_number":85,"context_line":"            \u0027user_id\u0027: user_id,"},{"line_number":86,"context_line":"            \u0027group_ids\u0027: group_ids,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_298e0b2f","line":83,"updated":"2014-08-18 20:38:04.000000000","message":"remove \"e\".","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"1e98ad25af4c54685e0157ebb07d06a9e625987d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                                                       identity_provider,"},{"line_number":81,"context_line":"                                                       protocol,"},{"line_number":82,"context_line":"                                                       outcome)"},{"line_number":83,"context_line":"            raise e"},{"line_number":84,"context_line":"        return {"},{"line_number":85,"context_line":"            \u0027user_id\u0027: user_id,"},{"line_number":86,"context_line":"            \u0027group_ids\u0027: group_ids,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_0deee5b4","line":83,"in_reply_to":"1abeadc6_298e0b2f","updated":"2014-08-27 06:04:28.000000000","message":"Done","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":94,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":95,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":96,"context_line":"                                                   None, None,"},{"line_number":97,"context_line":"                                                   identity_provider, protocol,"},{"line_number":98,"context_line":"                                                   taxonomy.OUTCOME_PENDING)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_e9f9734e","line":96,"updated":"2014-08-18 20:38:04.000000000","message":"give a name to the \"None\" parameters so that we know what it\u0027s for... user_id\u003dNone, group_ids\u003dNone","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"1e98ad25af4c54685e0157ebb07d06a9e625987d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        identity_provider \u003d auth_payload[\u0027identity_provider\u0027]"},{"line_number":94,"context_line":"        protocol \u003d auth_payload[\u0027protocol\u0027]"},{"line_number":95,"context_line":"        notifications.send_saml_audit_notification(\u0027authenticate\u0027, context,"},{"line_number":96,"context_line":"                                                   None, None,"},{"line_number":97,"context_line":"                                                   identity_provider, protocol,"},{"line_number":98,"context_line":"                                                   taxonomy.OUTCOME_PENDING)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_edab6973","line":96,"in_reply_to":"1abeadc6_e9f9734e","updated":"2014-08-27 06:04:28.000000000","message":"Done","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"db44c36ffd317032b08fe4865a65e000e4b84a3f","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        try:"},{"line_number":101,"context_line":"            user_id \u003d None"},{"line_number":102,"context_line":"            group_ids \u003d None"},{"line_number":103,"context_line":"            mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":104,"context_line":"                identity_provider, protocol)"},{"line_number":105,"context_line":"            rules \u003d jsonutils.loads(mapping[\u0027rules\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_3574c39b","line":102,"updated":"2014-08-18 03:33:06.000000000","message":"I would put these earlier than line 95,\nso instead of sending None, None to send_saml_auth... you can send user_id and group_ids. \n\nPassing in None parameters is not obvious, and non-pythonic.","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"1e98ad25af4c54685e0157ebb07d06a9e625987d","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        try:"},{"line_number":101,"context_line":"            user_id \u003d None"},{"line_number":102,"context_line":"            group_ids \u003d None"},{"line_number":103,"context_line":"            mapping \u003d self.federation_api.get_mapping_from_idp_and_protocol("},{"line_number":104,"context_line":"                identity_provider, protocol)"},{"line_number":105,"context_line":"            rules \u003d jsonutils.loads(mapping[\u0027rules\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_cd9ead54","line":102,"in_reply_to":"1abeadc6_3574c39b","updated":"2014-08-27 06:04:28.000000000","message":"Done","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                                                       identity_provider,"},{"line_number":117,"context_line":"                                                       protocol, outcome)"},{"line_number":118,"context_line":"        except Exception as e:"},{"line_number":119,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":120,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":121,"context_line":"            # after sending the notification"},{"line_number":122,"context_line":"            outcome \u003d taxonomy.OUTCOME_FAILURE"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_e99093ee","line":119,"updated":"2014-08-18 20:38:04.000000000","message":"this code is pretty much the same as the other function. The code should be shared.","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5c7b6e5cd1b8f2ae7daa6e2f349adcfb816693dc","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                                                       identity_provider,"},{"line_number":117,"context_line":"                                                       protocol, outcome)"},{"line_number":118,"context_line":"        except Exception as e:"},{"line_number":119,"context_line":"            # NOTE(topol): Diaper defense to catch any exception, so we can"},{"line_number":120,"context_line":"            # send off failed authentication notification, raise the exception"},{"line_number":121,"context_line":"            # after sending the notification"},{"line_number":122,"context_line":"            outcome \u003d taxonomy.OUTCOME_FAILURE"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_c6a7394e","line":119,"in_reply_to":"1abeadc6_e99093ee","updated":"2014-08-19 03:50:19.000000000","message":"++","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"db44c36ffd317032b08fe4865a65e000e4b84a3f","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            # after sending the notification"},{"line_number":122,"context_line":"            outcome \u003d taxonomy.OUTCOME_FAILURE"},{"line_number":123,"context_line":"            notifications.send_saml_audit_notification(\u0027authenticate\u0027,"},{"line_number":124,"context_line":"                                                       context,"},{"line_number":125,"context_line":"                                                       user_id,"},{"line_number":126,"context_line":"                                                       group_ids,"},{"line_number":127,"context_line":"                                                       identity_provider,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_55793f92","line":124,"updated":"2014-08-18 03:33:06.000000000","message":"condense these!","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"1e98ad25af4c54685e0157ebb07d06a9e625987d","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            # after sending the notification"},{"line_number":122,"context_line":"            outcome \u003d taxonomy.OUTCOME_FAILURE"},{"line_number":123,"context_line":"            notifications.send_saml_audit_notification(\u0027authenticate\u0027,"},{"line_number":124,"context_line":"                                                       context,"},{"line_number":125,"context_line":"                                                       user_id,"},{"line_number":126,"context_line":"                                                       group_ids,"},{"line_number":127,"context_line":"                                                       identity_provider,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_adf6d18e","line":124,"in_reply_to":"1abeadc6_55793f92","updated":"2014-08-27 06:04:28.000000000","message":"Done","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                                                       identity_provider,"},{"line_number":128,"context_line":"                                                       protocol,"},{"line_number":129,"context_line":"                                                       outcome)"},{"line_number":130,"context_line":"            raise e"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        return {"},{"line_number":133,"context_line":"            \u0027user_id\u0027: parse.quote(mapped_properties[\u0027name\u0027]),"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_e94b33ae","line":130,"updated":"2014-08-18 20:38:04.000000000","message":"remove \"e\"","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"1e98ad25af4c54685e0157ebb07d06a9e625987d","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                                                       identity_provider,"},{"line_number":128,"context_line":"                                                       protocol,"},{"line_number":129,"context_line":"                                                       outcome)"},{"line_number":130,"context_line":"            raise e"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        return {"},{"line_number":133,"context_line":"            \u0027user_id\u0027: parse.quote(mapped_properties[\u0027name\u0027]),"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_8d02f56d","line":130,"in_reply_to":"1abeadc6_e94b33ae","updated":"2014-08-27 06:04:28.000000000","message":"Done","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"}],"keystone/notifications.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c12471306e395bbf9074b3ef1912b0040282094","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                                          name\u003duser_id, host\u003dhost)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    _send_audit_notification(\u0027authenticate\u0027, initiator,"},{"line_number":292,"context_line":"                                     taxonomy.OUTCOME_PENDING)"},{"line_number":293,"context_line":"    "},{"line_number":294,"context_line":"def _send_audit_notification(action, initiator, outcome):"},{"line_number":295,"context_line":"    \"\"\"Send CADF notification to inform observers about the affected resource."}],"source_content_type":"text/x-python","patch_set":2,"id":"7ac7a964_310bd0d7","line":292,"updated":"2014-08-14 20:48:45.000000000","message":"unnecessary tabbing","commit_id":"7dbd3b795434cc90674f0b062234abe61e568f0c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"def send_saml_audit_notification(action, context, user_id, group_ids,"},{"line_number":275,"context_line":"                                 identity_provider, protocol, outcome):"},{"line_number":276,"context_line":"    remote_addr \u003d None"},{"line_number":277,"context_line":"    http_user_agent \u003d None"},{"line_number":278,"context_line":"    environment \u003d context.get(\u0027environment\u0027)"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_2950cb31","line":276,"updated":"2014-08-18 20:38:04.000000000","message":"this is a copy of the code at line 245. Rather than copy-pasting, create a function and share it.","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"937c6510831a7a493a108a5c74d43eb9b441ea08","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":"def send_saml_audit_notification(action, context, user_id, group_ids,"},{"line_number":275,"context_line":"                                 identity_provider, protocol, outcome):"},{"line_number":276,"context_line":"    remote_addr \u003d None"},{"line_number":277,"context_line":"    http_user_agent \u003d None"},{"line_number":278,"context_line":"    environment \u003d context.get(\u0027environment\u0027)"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_3575cc31","line":276,"in_reply_to":"1abeadc6_2950cb31","updated":"2014-08-22 18:36:01.000000000","message":"@Brad you could copy what i\u0027ve done here: https://review.openstack.org/#/c/112204/33/keystone/notifications.py","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"db44c36ffd317032b08fe4865a65e000e4b84a3f","unresolved":false,"context_lines":[{"line_number":290,"context_line":"    # audit the user_id from the IDP which in itself will be helpful to know"},{"line_number":291,"context_line":"    initiator \u003d resource.Resource(typeURI\u003dtaxonomy.ACCOUNT_USER,"},{"line_number":292,"context_line":"                                  name\u003duser_id, host\u003dhost)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    _send_audit_notification(action, initiator,"},{"line_number":295,"context_line":"                             taxonomy.OUTCOME_PENDING)"},{"line_number":296,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_f5616bd4","line":293,"updated":"2014-08-18 03:33:06.000000000","message":"sigh, -1 until this is resolved... i think, unless we want to put it in and wait for pycadf?","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":290,"context_line":"    # audit the user_id from the IDP which in itself will be helpful to know"},{"line_number":291,"context_line":"    initiator \u003d resource.Resource(typeURI\u003dtaxonomy.ACCOUNT_USER,"},{"line_number":292,"context_line":"                                  name\u003duser_id, host\u003dhost)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    _send_audit_notification(action, initiator,"},{"line_number":295,"context_line":"                             taxonomy.OUTCOME_PENDING)"},{"line_number":296,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_a9ce9b58","line":293,"in_reply_to":"1abeadc6_f5616bd4","updated":"2014-08-18 20:38:04.000000000","message":"I\u0027m fine with adding this in once pycadf is updated.","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"28c3f40dfd9d9fbbf09a946dc6e70079053534fd","unresolved":false,"context_lines":[{"line_number":262,"context_line":"            user_id \u003d environment.get(\u0027KEYSTONE_AUTH_CONTEXT\u0027,"},{"line_number":263,"context_line":"                                      {}).get(\u0027user_id\u0027)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    # TODO(topol)  Ideally here we should also create a pycadf credential"},{"line_number":266,"context_line":"    # object and store group_ids, identity_provider, and protocol as"},{"line_number":267,"context_line":"    # extra well known key value pairs as part of the credential"},{"line_number":268,"context_line":"    # object and pass it into resource.Resource. This requires the pycadf"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_8f02c409","line":265,"updated":"2014-08-26 01:48:59.000000000","message":"add a : after (topol)","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"312ba13b70b9f5864e96871f8b238b13b875d892","unresolved":false,"context_lines":[{"line_number":262,"context_line":"            user_id \u003d environment.get(\u0027KEYSTONE_AUTH_CONTEXT\u0027,"},{"line_number":263,"context_line":"                                      {}).get(\u0027user_id\u0027)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    # TODO(topol)  Ideally here we should also create a pycadf credential"},{"line_number":266,"context_line":"    # object and store group_ids, identity_provider, and protocol as"},{"line_number":267,"context_line":"    # extra well known key value pairs as part of the credential"},{"line_number":268,"context_line":"    # object and pass it into resource.Resource. This requires the pycadf"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_ce772701","line":265,"in_reply_to":"1abeadc6_8f02c409","updated":"2014-08-27 06:04:10.000000000","message":"todo is removed cause its done","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"28c3f40dfd9d9fbbf09a946dc6e70079053534fd","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    # credential object to be updated to be extensible. For now we will just"},{"line_number":270,"context_line":"    # audit the user_id from the IDP which in itself will be helpful to know"},{"line_number":271,"context_line":"    host \u003d pycadf.host.Host(address\u003dremote_addr, agent\u003dhttp_user_agent)"},{"line_number":272,"context_line":"    initiator \u003d resource.Resource(typeURI\u003dtaxonomy.ACCOUNT_USER,"},{"line_number":273,"context_line":"                                  name\u003duser_id, host\u003dhost)"},{"line_number":274,"context_line":"    return initiator"},{"line_number":275,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_6a3396f6","line":272,"updated":"2014-08-26 01:48:59.000000000","message":"so we create a credential object here, and attach it to where? My guess is to the initiator? If so, I\u0027d recommend doing all this in the send_saml_audit_notification method","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"312ba13b70b9f5864e96871f8b238b13b875d892","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    # credential object to be updated to be extensible. For now we will just"},{"line_number":270,"context_line":"    # audit the user_id from the IDP which in itself will be helpful to know"},{"line_number":271,"context_line":"    host \u003d pycadf.host.Host(address\u003dremote_addr, agent\u003dhttp_user_agent)"},{"line_number":272,"context_line":"    initiator \u003d resource.Resource(typeURI\u003dtaxonomy.ACCOUNT_USER,"},{"line_number":273,"context_line":"                                  name\u003duser_id, host\u003dhost)"},{"line_number":274,"context_line":"    return initiator"},{"line_number":275,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_4e5b1787","line":272,"in_reply_to":"1abeadc6_6a3396f6","updated":"2014-08-27 06:04:10.000000000","message":"Done","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"8b5f76a5710e1c89476531542409f9afbf2e4dc5","unresolved":false,"context_lines":[{"line_number":267,"context_line":"    # extra well known key value pairs as part of the credential"},{"line_number":268,"context_line":"    # object and pass it into resource.Resource. This requires the pycadf"},{"line_number":269,"context_line":"    # credential object to be updated to be extensible. For now we will just"},{"line_number":270,"context_line":"    # audit the user_id from the IDP which in itself will be helpful to know"},{"line_number":271,"context_line":"    host \u003d pycadf.host.Host(address\u003dremote_addr, agent\u003dhttp_user_agent)"},{"line_number":272,"context_line":"    initiator \u003d resource.Resource(typeURI\u003dtaxonomy.ACCOUNT_USER,"},{"line_number":273,"context_line":"                                  name\u003duser_id, host\u003dhost)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_2160c034","line":270,"updated":"2014-08-26 20:19:21.000000000","message":"pycadf 0.6.0 support what you need, right?","commit_id":"ac29b644f025d6a6b288c72ea01489421b280246"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"395b3032aa21482e093d57af4a86456efa71c447","unresolved":false,"context_lines":[{"line_number":267,"context_line":"    # extra well known key value pairs as part of the credential"},{"line_number":268,"context_line":"    # object and pass it into resource.Resource. This requires the pycadf"},{"line_number":269,"context_line":"    # credential object to be updated to be extensible. For now we will just"},{"line_number":270,"context_line":"    # audit the user_id from the IDP which in itself will be helpful to know"},{"line_number":271,"context_line":"    host \u003d pycadf.host.Host(address\u003dremote_addr, agent\u003dhttp_user_agent)"},{"line_number":272,"context_line":"    initiator \u003d resource.Resource(typeURI\u003dtaxonomy.ACCOUNT_USER,"},{"line_number":273,"context_line":"                                  name\u003duser_id, host\u003dhost)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_4ea07743","line":270,"in_reply_to":"1abeadc6_2160c034","updated":"2014-08-27 06:03:54.000000000","message":"yep its perfect, thanks!","commit_id":"ac29b644f025d6a6b288c72ea01489421b280246"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"8b5f76a5710e1c89476531542409f9afbf2e4dc5","unresolved":false,"context_lines":[{"line_number":390,"context_line":""},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"def send_saml_audit_notification(action, context, user_id, group_ids,"},{"line_number":393,"context_line":"                                 identity_provider, protocol, outcome):"},{"line_number":394,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    _send_audit_notification(action, initiator,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_e14de8c5","line":393,"updated":"2014-08-26 20:19:21.000000000","message":"you never use most of these??","commit_id":"ac29b644f025d6a6b288c72ea01489421b280246"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"395b3032aa21482e093d57af4a86456efa71c447","unresolved":false,"context_lines":[{"line_number":390,"context_line":""},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"def send_saml_audit_notification(action, context, user_id, group_ids,"},{"line_number":393,"context_line":"                                 identity_provider, protocol, outcome):"},{"line_number":394,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    _send_audit_notification(action, initiator,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_0e967ff0","line":393,"in_reply_to":"1abeadc6_c171ccdf","updated":"2014-08-27 06:03:54.000000000","message":"Done","commit_id":"ac29b644f025d6a6b288c72ea01489421b280246"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"df2d888f1f900cc3b940666608268140c4ee5d92","unresolved":false,"context_lines":[{"line_number":390,"context_line":""},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"def send_saml_audit_notification(action, context, user_id, group_ids,"},{"line_number":393,"context_line":"                                 identity_provider, protocol, outcome):"},{"line_number":394,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"    _send_audit_notification(action, initiator,"}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_c171ccdf","line":393,"in_reply_to":"1abeadc6_e14de8c5","updated":"2014-08-26 20:24:00.000000000","message":"the pycadf federated credential should be created here, and that\u0027ll use the other args.\n\nthen attach that to the initiator.","commit_id":"ac29b644f025d6a6b288c72ea01489421b280246"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1af816a58ed2be83d9a1df4a238988d5a933bbe2","unresolved":false,"context_lines":[{"line_number":265,"context_line":"            user_id \u003d environment.get(\u0027KEYSTONE_AUTH_CONTEXT\u0027,"},{"line_number":266,"context_line":"                                      {}).get(\u0027user_id\u0027)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    # TODO(topol)  Ideally here we should also create a pycadf credential"},{"line_number":269,"context_line":"    # object and store group_ids, identity_provider, and protocol as"},{"line_number":270,"context_line":"    # extra well known key value pairs as part of the credential"},{"line_number":271,"context_line":"    # object and pass it into resource.Resource. This requires the pycadf"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_137a28f1","line":268,"updated":"2014-08-27 05:20:22.000000000","message":"remove this comment","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"c7e3bc67dafef7a359b83a47d3567696faa4bd98","unresolved":false,"context_lines":[{"line_number":265,"context_line":"            user_id \u003d environment.get(\u0027KEYSTONE_AUTH_CONTEXT\u0027,"},{"line_number":266,"context_line":"                                      {}).get(\u0027user_id\u0027)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    # TODO(topol)  Ideally here we should also create a pycadf credential"},{"line_number":269,"context_line":"    # object and store group_ids, identity_provider, and protocol as"},{"line_number":270,"context_line":"    # extra well known key value pairs as part of the credential"},{"line_number":271,"context_line":"    # object and pass it into resource.Resource. This requires the pycadf"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_4eb79786","line":268,"in_reply_to":"1abeadc6_137a28f1","updated":"2014-08-27 06:03:40.000000000","message":"Done","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1af816a58ed2be83d9a1df4a238988d5a933bbe2","unresolved":false,"context_lines":[{"line_number":395,"context_line":"def send_saml_audit_notification(action, context, user_id, group_ids,"},{"line_number":396,"context_line":"                                 identity_provider, protocol, outcome):"},{"line_number":397,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":398,"context_line":"    token \u003d identifier.generate_uuid()"},{"line_number":399,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":400,"context_line":"    if user_id is None:"},{"line_number":401,"context_line":"        user_id \u003d taxonomy.UNKNOWN"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_d34ef0c0","line":398,"updated":"2014-08-27 05:20:22.000000000","message":"token? what token?","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"c7e3bc67dafef7a359b83a47d3567696faa4bd98","unresolved":false,"context_lines":[{"line_number":395,"context_line":"def send_saml_audit_notification(action, context, user_id, group_ids,"},{"line_number":396,"context_line":"                                 identity_provider, protocol, outcome):"},{"line_number":397,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":398,"context_line":"    token \u003d identifier.generate_uuid()"},{"line_number":399,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":400,"context_line":"    if user_id is None:"},{"line_number":401,"context_line":"        user_id \u003d taxonomy.UNKNOWN"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_eea5c347","line":398,"in_reply_to":"1abeadc6_d34ef0c0","updated":"2014-08-27 06:03:40.000000000","message":"Done","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1af816a58ed2be83d9a1df4a238988d5a933bbe2","unresolved":false,"context_lines":[{"line_number":397,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":398,"context_line":"    token \u003d identifier.generate_uuid()"},{"line_number":399,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":400,"context_line":"    if user_id is None:"},{"line_number":401,"context_line":"        user_id \u003d taxonomy.UNKNOWN"},{"line_number":402,"context_line":"    if group_ids is None:"},{"line_number":403,"context_line":"        group_ids \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_b3d6d4c1","line":400,"updated":"2014-08-27 05:20:22.000000000","message":"++ nice","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1af816a58ed2be83d9a1df4a238988d5a933bbe2","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        user_id \u003d taxonomy.UNKNOWN"},{"line_number":402,"context_line":"    if group_ids is None:"},{"line_number":403,"context_line":"        group_ids \u003d []"},{"line_number":404,"context_line":"    cred \u003d credential.FederatedCredential(token\u003dtoken, type\u003daudit_type,"},{"line_number":405,"context_line":"                                          identity_provider\u003didentity_provider,"},{"line_number":406,"context_line":"                                          user\u003duser_id, groups\u003dgroup_ids)"},{"line_number":407,"context_line":"    initiator.credential \u003d cred"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_53d2e0d2","line":404,"updated":"2014-08-27 05:20:22.000000000","message":"i think token is a required parameter for Credential, not FederatedCredential","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"c7e3bc67dafef7a359b83a47d3567696faa4bd98","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        user_id \u003d taxonomy.UNKNOWN"},{"line_number":402,"context_line":"    if group_ids is None:"},{"line_number":403,"context_line":"        group_ids \u003d []"},{"line_number":404,"context_line":"    cred \u003d credential.FederatedCredential(token\u003dtoken, type\u003daudit_type,"},{"line_number":405,"context_line":"                                          identity_provider\u003didentity_provider,"},{"line_number":406,"context_line":"                                          user\u003duser_id, groups\u003dgroup_ids)"},{"line_number":407,"context_line":"    initiator.credential \u003d cred"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_6e71b3df","line":404,"in_reply_to":"1abeadc6_53d2e0d2","updated":"2014-08-27 06:03:40.000000000","message":"required for both and fixed to get the correct value","commit_id":"4e07f7c5e598ff5a442fffa9f67af8b80449f6b6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e24f3b9307f153058ecce74c26eea30c5b21c30a","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        if not user_id:"},{"line_number":280,"context_line":"            user_id \u003d environment.get(\u0027KEYSTONE_AUTH_CONTEXT\u0027,"},{"line_number":281,"context_line":"                                      {}).get(\u0027user_id\u0027)"},{"line_number":282,"context_line":"    host \u003d pycadf.host.Host(address\u003dremote_addr, agent\u003dhttp_user_agent)"},{"line_number":283,"context_line":"    initiator \u003d resource.Resource(typeURI\u003dtaxonomy.ACCOUNT_USER,"},{"line_number":284,"context_line":"                                  name\u003duser_id, host\u003dhost)"},{"line_number":285,"context_line":"    return initiator"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_1b293637","line":282,"updated":"2014-08-28 00:15:44.000000000","message":"revert the whitespace change on the previous line.","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e24f3b9307f153058ecce74c26eea30c5b21c30a","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                                          user\u003duser_id, groups\u003dgroup_ids)"},{"line_number":417,"context_line":"    initiator.credential \u003d cred"},{"line_number":418,"context_line":"    _send_audit_notification(action, initiator,"},{"line_number":419,"context_line":"                             taxonomy.OUTCOME_PENDING)"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"def _send_audit_notification(action, initiator, outcome, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_5b1e4e0d","line":419,"updated":"2014-08-28 00:15:44.000000000","message":"I assume this is supposed to be outcome and not OUTCOME_PENDING.","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e1112f57fb45f3d6cc804246b934db6e7483b8bc","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                                          user\u003duser_id, groups\u003dgroup_ids)"},{"line_number":417,"context_line":"    initiator.credential \u003d cred"},{"line_number":418,"context_line":"    _send_audit_notification(action, initiator,"},{"line_number":419,"context_line":"                             taxonomy.OUTCOME_PENDING)"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"def _send_audit_notification(action, initiator, outcome, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_3b298d37","line":419,"in_reply_to":"1abeadc6_5b1e4e0d","updated":"2014-08-28 04:40:00.000000000","message":"!! good catch","commit_id":"75fa7a353492f7c7350694d0ab66fc5763037727"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f7e183630f68c4965e01ad3a5bcb39d883e17614","unresolved":false,"context_lines":[{"line_number":404,"context_line":"def send_saml_audit_notification(action, context, user_id, group_ids,"},{"line_number":405,"context_line":"                                 identity_provider, protocol, token_id,"},{"line_number":406,"context_line":"                                 outcome):"},{"line_number":407,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":408,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":409,"context_line":"    if user_id is None:"},{"line_number":410,"context_line":"        user_id \u003d taxonomy.UNKNOWN"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_36fdfbb1","line":407,"updated":"2014-08-29 01:32:29.000000000","message":"remove user_id\u003dNone since that\u0027s the default.","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"cfe7ee209bfc1f92c03ccc2c125a9907f2e49263","unresolved":false,"context_lines":[{"line_number":404,"context_line":"def send_saml_audit_notification(action, context, user_id, group_ids,"},{"line_number":405,"context_line":"                                 identity_provider, protocol, token_id,"},{"line_number":406,"context_line":"                                 outcome):"},{"line_number":407,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":408,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":409,"context_line":"    if user_id is None:"},{"line_number":410,"context_line":"        user_id \u003d taxonomy.UNKNOWN"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_d42d9aff","line":407,"in_reply_to":"1abeadc6_36fdfbb1","updated":"2014-08-29 04:27:53.000000000","message":"Done","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"db3a047582da51a4371e320491a9c461f379c2df","unresolved":false,"context_lines":[{"line_number":407,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":408,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":409,"context_line":"    if user_id is None:"},{"line_number":410,"context_line":"        user_id \u003d taxonomy.UNKNOWN"},{"line_number":411,"context_line":"    if group_ids is None:"},{"line_number":412,"context_line":"        group_ids \u003d []"},{"line_number":413,"context_line":"    if token_id is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_13d9f6f2","line":410,"updated":"2014-08-28 22:03:08.000000000","message":"(unnecessary fun fact)\n\n  user_id \u003d user_id or taxonomy.UNKNOWN\n\nthe result of a boolean expression is the short circuited value.\n\nbut is \u0027unknown\u0027 actually appropriate in these cases? it seems null is much more correct than \"i don\u0027t know.\" there *is* no token, and you *know* that. it\u0027s not \"unknown\" (by my definition/understanding, anyway). thoughts?","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1f7c236d24292a55a90c91b06b2f05cd3cebdf71","unresolved":false,"context_lines":[{"line_number":407,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":408,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":409,"context_line":"    if user_id is None:"},{"line_number":410,"context_line":"        user_id \u003d taxonomy.UNKNOWN"},{"line_number":411,"context_line":"    if group_ids is None:"},{"line_number":412,"context_line":"        group_ids \u003d []"},{"line_number":413,"context_line":"    if token_id is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_6ea241af","line":410,"in_reply_to":"1abeadc6_13d9f6f2","updated":"2014-08-28 22:22:45.000000000","message":"null will make pycadf explode","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"cfe7ee209bfc1f92c03ccc2c125a9907f2e49263","unresolved":false,"context_lines":[{"line_number":407,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":408,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":409,"context_line":"    if user_id is None:"},{"line_number":410,"context_line":"        user_id \u003d taxonomy.UNKNOWN"},{"line_number":411,"context_line":"    if group_ids is None:"},{"line_number":412,"context_line":"        group_ids \u003d []"},{"line_number":413,"context_line":"    if token_id is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_f4bb76c1","line":410,"in_reply_to":"1abeadc6_1648ff5a","updated":"2014-08-29 04:27:53.000000000","message":"But I will use the fun fact cause I see all the cool python programmers do it that way :-)","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"21bd0237d19851776d7b0d363d0d8da1bb02b769","unresolved":false,"context_lines":[{"line_number":407,"context_line":"    initiator \u003d _get_request_audit_info(context, user_id\u003dNone)"},{"line_number":408,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":409,"context_line":"    if user_id is None:"},{"line_number":410,"context_line":"        user_id \u003d taxonomy.UNKNOWN"},{"line_number":411,"context_line":"    if group_ids is None:"},{"line_number":412,"context_line":"        group_ids \u003d []"},{"line_number":413,"context_line":"    if token_id is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_1648ff5a","line":410,"in_reply_to":"1abeadc6_6ea241af","updated":"2014-08-29 01:24:49.000000000","message":"Yep it will.... fire in the hole :-)","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"df3abfd00cc5106ee53c67837dec06fdad22bc64","unresolved":false,"context_lines":[{"line_number":408,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":409,"context_line":"    user_id \u003d user_id or taxonomy.UNKNOWN"},{"line_number":410,"context_line":"    token_id \u003d token_id or taxonomy.UNKNOWN"},{"line_number":411,"context_line":"    if group_ids is None:"},{"line_number":412,"context_line":"        group_ids \u003d []"},{"line_number":413,"context_line":"    cred \u003d credential.FederatedCredential(token\u003dtoken_id, type\u003daudit_type,"},{"line_number":414,"context_line":"                                          identity_provider\u003didentity_provider,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_5ad0d11e","line":411,"updated":"2014-08-29 04:44:39.000000000","message":"nit:\n\n  group_ids \u003d group_ids or []","commit_id":"3d43483c975014bb4098098f5b29e6c49ce16c38"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"85172415631d22b278c47c7f69df3df25bff9451","unresolved":false,"context_lines":[{"line_number":408,"context_line":"    audit_type \u003d SAML_AUDIT_TYPE"},{"line_number":409,"context_line":"    user_id \u003d user_id or taxonomy.UNKNOWN"},{"line_number":410,"context_line":"    token_id \u003d token_id or taxonomy.UNKNOWN"},{"line_number":411,"context_line":"    if group_ids is None:"},{"line_number":412,"context_line":"        group_ids \u003d []"},{"line_number":413,"context_line":"    cred \u003d credential.FederatedCredential(token\u003dtoken_id, type\u003daudit_type,"},{"line_number":414,"context_line":"                                          identity_provider\u003didentity_provider,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1abeadc6_e54ca2a0","line":411,"in_reply_to":"1abeadc6_5ad0d11e","updated":"2014-08-29 05:18:01.000000000","message":"Done","commit_id":"3d43483c975014bb4098098f5b29e6c49ce16c38"}],"keystone/tests/test_v3_federation.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c12471306e395bbf9074b3ef1912b0040282094","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"        * Scope token to a one of available projects"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"        \"\"\""},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        r \u003d self._issue_unscoped_token()"},{"line_number":1074,"context_line":"        employee_unscoped_token_id \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":1075,"context_line":"        r \u003d self.get(\u0027/OS-FEDERATION/projects\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ac7a964_11d4141f","side":"PARENT","line":1072,"updated":"2014-08-14 20:48:45.000000000","message":"unnecessary change","commit_id":"2ea3006dc015675dcf20da8ddd6a8f7436b90113"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"fa4de6cad9eda23af7e577ed350ac7874e2bf172","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from oslotest import mockpatch"},{"line_number":14,"context_line":"import random"},{"line_number":15,"context_line":"import uuid"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7ac7a964_5f4ca042","line":13,"updated":"2014-08-16 07:20:47.000000000","message":"this should go between uuid and the keystone imports, separated by new lines","commit_id":"4989df65175a849c931642259be6082438802f6c"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"d097469840ff939d81bc69e69cb380acf2b0586e","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from oslotest import mockpatch"},{"line_number":14,"context_line":"import random"},{"line_number":15,"context_line":"import uuid"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7ac7a964_535c9725","line":13,"in_reply_to":"7ac7a964_5f4ca042","updated":"2014-08-27 06:05:06.000000000","message":"Done","commit_id":"4989df65175a849c931642259be6082438802f6c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":767,"context_line":"                \u0027action\u0027: action,"},{"line_number":768,"context_line":"                \u0027identity_provider\u0027: identity_provider,"},{"line_number":769,"context_line":"                \u0027protocol\u0027: protocol,"},{"line_number":770,"context_line":"                # NOTE(topol): outcome has 2 stages, pending and success"},{"line_number":771,"context_line":"                # so we are ignoring it for now."},{"line_number":772,"context_line":"                # \u0027outcome\u0027: outcome,"},{"line_number":773,"context_line":"                \u0027send_notification_called\u0027: True}"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_8c264d15","line":770,"updated":"2014-08-18 20:38:04.000000000","message":"this should be a TODO if there\u0027s more to do. Also, is this a work in progress? not sure why it wouldn\u0027t be done now.","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5c7b6e5cd1b8f2ae7daa6e2f349adcfb816693dc","unresolved":false,"context_lines":[{"line_number":769,"context_line":"                \u0027protocol\u0027: protocol,"},{"line_number":770,"context_line":"                # NOTE(topol): outcome has 2 stages, pending and success"},{"line_number":771,"context_line":"                # so we are ignoring it for now."},{"line_number":772,"context_line":"                # \u0027outcome\u0027: outcome,"},{"line_number":773,"context_line":"                \u0027send_notification_called\u0027: True}"},{"line_number":774,"context_line":"            self._notifications.append(note)"},{"line_number":775,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_668905ca","line":772,"updated":"2014-08-19 03:50:19.000000000","message":"if you actually add this line, you should be able to verify the pending status, too.","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":769,"context_line":"                \u0027protocol\u0027: protocol,"},{"line_number":770,"context_line":"                # NOTE(topol): outcome has 2 stages, pending and success"},{"line_number":771,"context_line":"                # so we are ignoring it for now."},{"line_number":772,"context_line":"                # \u0027outcome\u0027: outcome,"},{"line_number":773,"context_line":"                \u0027send_notification_called\u0027: True}"},{"line_number":774,"context_line":"            self._notifications.append(note)"},{"line_number":775,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_0c131db9","line":772,"updated":"2014-08-18 20:38:04.000000000","message":"remove commented-out code.","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"db44c36ffd317032b08fe4865a65e000e4b84a3f","unresolved":false,"context_lines":[{"line_number":784,"context_line":"    AUTH_METHOD \u003d \u0027saml2\u0027"},{"line_number":785,"context_line":"    USER \u003d \u0027user@ORGANIZATION\u0027"},{"line_number":786,"context_line":"    ASSERTION_PREFIX \u003d \u0027PREFIX_\u0027"},{"line_number":787,"context_line":"    _notifications \u003d []"},{"line_number":788,"context_line":""},{"line_number":789,"context_line":"    UNSCOPED_V3_SAML2_REQ \u003d {"},{"line_number":790,"context_line":"        \"identity\": {"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_359be3ca","line":787,"updated":"2014-08-18 03:33:06.000000000","message":"not sure why you need this, as it\u0027s declared on line 762.\ndelete one of them","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":784,"context_line":"    AUTH_METHOD \u003d \u0027saml2\u0027"},{"line_number":785,"context_line":"    USER \u003d \u0027user@ORGANIZATION\u0027"},{"line_number":786,"context_line":"    ASSERTION_PREFIX \u003d \u0027PREFIX_\u0027"},{"line_number":787,"context_line":"    _notifications \u003d []"},{"line_number":788,"context_line":""},{"line_number":789,"context_line":"    UNSCOPED_V3_SAML2_REQ \u003d {"},{"line_number":790,"context_line":"        \"identity\": {"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_0c895d26","line":787,"in_reply_to":"1abeadc6_359be3ca","updated":"2014-08-18 20:38:04.000000000","message":"remove this line.","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"937c6510831a7a493a108a5c74d43eb9b441ea08","unresolved":false,"context_lines":[{"line_number":796,"context_line":"        }"},{"line_number":797,"context_line":"    }"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"    def _assertLastNotify(self, action, identity_provider, protocol):"},{"line_number":800,"context_line":"        self.assertTrue(self._notifications)"},{"line_number":801,"context_line":"        note \u003d self._notifications[-1]"},{"line_number":802,"context_line":"        self.assertEqual(note[\u0027action\u0027], action)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_75d66429","line":799,"updated":"2014-08-22 18:36:01.000000000","message":"use python convention for method names:\n_assert_last_note() instead of assertLastNotify","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"db44c36ffd317032b08fe4865a65e000e4b84a3f","unresolved":false,"context_lines":[{"line_number":801,"context_line":"        note \u003d self._notifications[-1]"},{"line_number":802,"context_line":"        self.assertEqual(note[\u0027action\u0027], action)"},{"line_number":803,"context_line":"        self.assertEqual(note[\u0027identity_provider\u0027], identity_provider)"},{"line_number":804,"context_line":"        self.assertEqual(note[\u0027protocol\u0027], protocol)"},{"line_number":805,"context_line":"        self.assertTrue(note[\u0027send_notification_called\u0027])"},{"line_number":806,"context_line":""},{"line_number":807,"context_line":"    def load_fixtures(self, fixtures):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_75a55b03","line":804,"updated":"2014-08-18 03:33:06.000000000","message":"what about asserting use_id and group_ids?","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"272d330260e167c06d32bee477e638c0600d6d10","unresolved":false,"context_lines":[{"line_number":909,"context_line":""},{"line_number":910,"context_line":"    def test_issue_unscoped_token_notify(self):"},{"line_number":911,"context_line":"        self._issue_unscoped_token()"},{"line_number":912,"context_line":"        self._assertLastNotify(self.ACTION, self.IDP, self.PROTOCOL)"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"    def test_issue_unscoped_token(self):"},{"line_number":915,"context_line":"        r \u003d self._issue_unscoped_token()"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_4c36f553","line":912,"updated":"2014-08-18 20:38:04.000000000","message":"shouldn\u0027t the code be able to assert that both the pending and success notifications were sent?","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5c7b6e5cd1b8f2ae7daa6e2f349adcfb816693dc","unresolved":false,"context_lines":[{"line_number":909,"context_line":""},{"line_number":910,"context_line":"    def test_issue_unscoped_token_notify(self):"},{"line_number":911,"context_line":"        self._issue_unscoped_token()"},{"line_number":912,"context_line":"        self._assertLastNotify(self.ACTION, self.IDP, self.PROTOCOL)"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"    def test_issue_unscoped_token(self):"},{"line_number":915,"context_line":"        r \u003d self._issue_unscoped_token()"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_26a0ed42","line":912,"in_reply_to":"1abeadc6_4c36f553","updated":"2014-08-19 03:50:19.000000000","message":"You could probably create a specific method for testing this, something that grabs the last 2 notifications\n\n  note \u003d self._notifications[-2]\n  self.assertEqual(note[\u0027outcome\u0027], expectedvalue)","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5c7b6e5cd1b8f2ae7daa6e2f349adcfb816693dc","unresolved":false,"context_lines":[{"line_number":936,"context_line":"        if not token_resp[\u0027token\u0027].get(\u0027extras\u0027):"},{"line_number":937,"context_line":"            token_resp[\u0027token\u0027].pop(\u0027extras\u0027)"},{"line_number":938,"context_line":"        self._assertSerializeToXML(token_resp)"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"    def test_issue_unscoped_token_no_groups(self):"},{"line_number":941,"context_line":"        self.assertRaises(exception.Unauthorized,"},{"line_number":942,"context_line":"                          self._issue_unscoped_token,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1abeadc6_26b70d88","line":939,"updated":"2014-08-19 03:50:19.000000000","message":"A test where the failed to authN notification is sent would be good too, you can mimic this test case.","commit_id":"7489bf8946a505c36f5462310fb8b64cce44fcde"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"28c3f40dfd9d9fbbf09a946dc6e70079053534fd","unresolved":false,"context_lines":[{"line_number":784,"context_line":"    AUTH_METHOD \u003d \u0027saml2\u0027"},{"line_number":785,"context_line":"    USER \u003d \u0027user@ORGANIZATION\u0027"},{"line_number":786,"context_line":"    ASSERTION_PREFIX \u003d \u0027PREFIX_\u0027"},{"line_number":787,"context_line":"    _notifications \u003d []"},{"line_number":788,"context_line":""},{"line_number":789,"context_line":"    UNSCOPED_V3_SAML2_REQ \u003d {"},{"line_number":790,"context_line":"        \"identity\": {"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_0a5ce224","line":787,"updated":"2014-08-26 01:48:59.000000000","message":"remove this line, it\u0027s already in the setup","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"312ba13b70b9f5864e96871f8b238b13b875d892","unresolved":false,"context_lines":[{"line_number":784,"context_line":"    AUTH_METHOD \u003d \u0027saml2\u0027"},{"line_number":785,"context_line":"    USER \u003d \u0027user@ORGANIZATION\u0027"},{"line_number":786,"context_line":"    ASSERTION_PREFIX \u003d \u0027PREFIX_\u0027"},{"line_number":787,"context_line":"    _notifications \u003d []"},{"line_number":788,"context_line":""},{"line_number":789,"context_line":"    UNSCOPED_V3_SAML2_REQ \u003d {"},{"line_number":790,"context_line":"        \"identity\": {"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_e72ed8a4","line":787,"in_reply_to":"1abeadc6_0a5ce224","updated":"2014-08-27 06:04:10.000000000","message":"Done","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"28c3f40dfd9d9fbbf09a946dc6e70079053534fd","unresolved":false,"context_lines":[{"line_number":796,"context_line":"        }"},{"line_number":797,"context_line":"    }"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"    def _assertLastNotify(self, action, identity_provider, protocol):"},{"line_number":800,"context_line":"        self.assertTrue(self._notifications)"},{"line_number":801,"context_line":"        note \u003d self._notifications[-1]"},{"line_number":802,"context_line":"        self.assertEqual(note[\u0027action\u0027], action)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_2a40be34","line":799,"updated":"2014-08-26 01:48:59.000000000","message":"use python convention, _assert_last_note","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"312ba13b70b9f5864e96871f8b238b13b875d892","unresolved":false,"context_lines":[{"line_number":796,"context_line":"        }"},{"line_number":797,"context_line":"    }"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"    def _assertLastNotify(self, action, identity_provider, protocol):"},{"line_number":800,"context_line":"        self.assertTrue(self._notifications)"},{"line_number":801,"context_line":"        note \u003d self._notifications[-1]"},{"line_number":802,"context_line":"        self.assertEqual(note[\u0027action\u0027], action)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_2718d083","line":799,"in_reply_to":"1abeadc6_2a40be34","updated":"2014-08-27 06:04:10.000000000","message":"Done","commit_id":"dbeb1ba244c28a8b145cec4ce346e4f486ae033b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f7e183630f68c4965e01ad3a5bcb39d883e17614","unresolved":false,"context_lines":[{"line_number":793,"context_line":"        }"},{"line_number":794,"context_line":"    }"},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"    def _assert_last_notify(self, action, identity_provider, protocol,"},{"line_number":797,"context_line":"                            user_id\u003dNone):"},{"line_number":798,"context_line":"        self.assertTrue(self._notifications)"},{"line_number":799,"context_line":"        note \u003d self._notifications[-1]"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_16aabf70","line":796,"updated":"2014-08-29 01:32:29.000000000","message":"(suggestion) this is always called with self.ACTION, self.IDP, self.PROTOCOL, so might as well not pass them in.","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f7e183630f68c4965e01ad3a5bcb39d883e17614","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            self.TOKEN_SCOPE_PROJECT_EMPLOYEE_FROM_EMPLOYEE)"},{"line_number":970,"context_line":"        user_id \u003d r.json[\u0027token\u0027][\u0027user\u0027][\u0027id\u0027]"},{"line_number":971,"context_line":"        self._assert_last_notify(self.ACTION, self.IDP, self.PROTOCOL, user_id)"},{"line_number":972,"context_line":""},{"line_number":973,"context_line":"    def test_scope_to_project_once(self):"},{"line_number":974,"context_line":"        r \u003d self.v3_authenticate_token("},{"line_number":975,"context_line":"            self.TOKEN_SCOPE_PROJECT_EMPLOYEE_FROM_EMPLOYEE)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_56def711","line":972,"updated":"2014-08-29 01:32:29.000000000","message":"would be nice to see a test for a failing outcome.","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"cfe7ee209bfc1f92c03ccc2c125a9907f2e49263","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            self.TOKEN_SCOPE_PROJECT_EMPLOYEE_FROM_EMPLOYEE)"},{"line_number":970,"context_line":"        user_id \u003d r.json[\u0027token\u0027][\u0027user\u0027][\u0027id\u0027]"},{"line_number":971,"context_line":"        self._assert_last_notify(self.ACTION, self.IDP, self.PROTOCOL, user_id)"},{"line_number":972,"context_line":""},{"line_number":973,"context_line":"    def test_scope_to_project_once(self):"},{"line_number":974,"context_line":"        r \u003d self.v3_authenticate_token("},{"line_number":975,"context_line":"            self.TOKEN_SCOPE_PROJECT_EMPLOYEE_FROM_EMPLOYEE)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1abeadc6_7f93bfa2","line":972,"in_reply_to":"1abeadc6_56def711","updated":"2014-08-29 04:27:53.000000000","message":"will look at adding this in a subsequent patch","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"}],"requirements.txt":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"65085e0349d72ca6f52fd1522b299c7cd1530ba4","unresolved":false,"context_lines":[{"line_number":23,"context_line":"oauthlib\u003e\u003d0.6"},{"line_number":24,"context_line":"dogpile.cache\u003e\u003d0.5.3"},{"line_number":25,"context_line":"jsonschema\u003e\u003d2.0.0,\u003c3.0.0"},{"line_number":26,"context_line":"pycadf\u003e\u003d0.6.0"},{"line_number":27,"context_line":"posix_ipc"}],"source_content_type":"text/plain","patch_set":12,"id":"1abeadc6_ad6aa3ea","line":26,"updated":"2014-08-28 20:55:54.000000000","message":"note sure if we should wait until: https://review.openstack.org/#/c/111620/29 is merged, so you don\u0027t have to edit this file by hand.","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"21bd0237d19851776d7b0d363d0d8da1bb02b769","unresolved":false,"context_lines":[{"line_number":23,"context_line":"oauthlib\u003e\u003d0.6"},{"line_number":24,"context_line":"dogpile.cache\u003e\u003d0.5.3"},{"line_number":25,"context_line":"jsonschema\u003e\u003d2.0.0,\u003c3.0.0"},{"line_number":26,"context_line":"pycadf\u003e\u003d0.6.0"},{"line_number":27,"context_line":"posix_ipc"}],"source_content_type":"text/plain","patch_set":12,"id":"1abeadc6_1631dfec","line":26,"in_reply_to":"1abeadc6_13ae562e","updated":"2014-08-29 01:24:49.000000000","message":"Yay!!!","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"db3a047582da51a4371e320491a9c461f379c2df","unresolved":false,"context_lines":[{"line_number":23,"context_line":"oauthlib\u003e\u003d0.6"},{"line_number":24,"context_line":"dogpile.cache\u003e\u003d0.5.3"},{"line_number":25,"context_line":"jsonschema\u003e\u003d2.0.0,\u003c3.0.0"},{"line_number":26,"context_line":"pycadf\u003e\u003d0.6.0"},{"line_number":27,"context_line":"posix_ipc"}],"source_content_type":"text/plain","patch_set":12,"id":"1abeadc6_13ae562e","line":26,"in_reply_to":"1abeadc6_ad6aa3ea","updated":"2014-08-28 22:03:08.000000000","message":"they\u0027ll merge together cleanly. doesn\u0027t matter at all","commit_id":"804181f8358afa4f6d4ab609e29193ad988ede15"}]}
