)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e6f313a3fcde21ce1c1b7b97386e2cf335294992","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ronald De Rose \u003cronald.de.rose@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-01-26 20:29:56 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"PCI-DSS Force users to change password upon first use"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\"PCI-DSS 8.2.6 Set passwords/passphrases for first-time use and"},{"line_number":10,"context_line":"upon reset to a unique value for each user, and change immediately after"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a461143_799be972","line":7,"updated":"2017-01-26 21:14:40.000000000","message":"I don\u0027t think this is true. It appears that the first auth is successful and it forces a password change after that.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ronald De Rose \u003cronald.de.rose@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-01-26 20:29:56 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"PCI-DSS Force users to change password upon first use"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\"PCI-DSS 8.2.6 Set passwords/passphrases for first-time use and"},{"line_number":10,"context_line":"upon reset to a unique value for each user, and change immediately after"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a461143_bdba96df","line":7,"in_reply_to":"3a461143_799be972","updated":"2017-01-27 00:13:22.000000000","message":"Changed this so that passwords expire during create/update.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ronald De Rose \u003cronald.de.rose@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-01-26 20:29:56 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"PCI-DSS Force users to change password upon first use"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\"PCI-DSS 8.2.6 Set passwords/passphrases for first-time use and"},{"line_number":10,"context_line":"upon reset to a unique value for each user, and change immediately after"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a461143_7954c920","line":7,"in_reply_to":"3a461143_799be972","updated":"2017-01-26 21:36:28.000000000","message":"Isn\u0027t this by design so that users can use first auth as an opportunity to get a new token to change their password with?","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7a0e80fdc1a2f2e3d28f159c057475de53972cf","unresolved":false,"context_lines":[{"line_number":15,"context_line":"[1] https://www.pcisecuritystandards.org/documents/PCI_DSS_v3-1.pdf"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-Bug: #1645487"},{"line_number":18,"context_line":"Depends-On: I90875ce2c3cf899557bb1f215fa1bda9576cbe83"},{"line_number":19,"context_line":"Change-Id: I5575dbd6d63d41014a7468acd6bdf0175d791618"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3a461143_9e6f7ec4","line":18,"updated":"2017-01-27 13:24:24.000000000","message":"You don\u0027t need this for changes in the same repository. It\u0027s meant for cross repository relationships.","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7986a53f9ace19a29f115113fd9b3130911eb445","unresolved":false,"context_lines":[{"line_number":15,"context_line":"[1] https://www.pcisecuritystandards.org/documents/PCI_DSS_v3-1.pdf"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-Bug: #1645487"},{"line_number":18,"context_line":"Depends-On: I90875ce2c3cf899557bb1f215fa1bda9576cbe83"},{"line_number":19,"context_line":"Change-Id: I5575dbd6d63d41014a7468acd6bdf0175d791618"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3a461143_3455c91c","line":18,"in_reply_to":"3a461143_9e6f7ec4","updated":"2017-01-27 14:15:11.000000000","message":"Done","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"}],"keystone/conf/security_compliance.py":[{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"2cf1185dbe4db975984b282c04d9a11f851455c2","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."},{"line_number":138,"context_line":"All users, unless specified in the user options attribute"},{"line_number":139,"context_line":"`ignore_password_expiry` is set, will expire upon a successful authentication."},{"line_number":140,"context_line":"This feature is disabled by default. This feature is only applicable with the"},{"line_number":141,"context_line":"`sql` backend for the `[identity] driver`."},{"line_number":142,"context_line":"\"\"\"))"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_f6a8c6dd","line":139,"range":{"start_line":138,"start_character":11,"end_line":139,"end_character":31},"updated":"2017-01-26 20:37:05.000000000","message":"two verbs in this phrase, \"specified\" and \"set\"","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."},{"line_number":138,"context_line":"All users, unless specified in the user options attribute"},{"line_number":139,"context_line":"`ignore_password_expiry` is set, will expire upon a successful authentication."},{"line_number":140,"context_line":"This feature is disabled by default. This feature is only applicable with the"},{"line_number":141,"context_line":"`sql` backend for the `[identity] driver`."},{"line_number":142,"context_line":"\"\"\"))"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_7dc90e78","line":139,"in_reply_to":"3a461143_b902b107","updated":"2017-01-27 00:13:22.000000000","message":"Reworded this in the latest patch.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e6f313a3fcde21ce1c1b7b97386e2cf335294992","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."},{"line_number":138,"context_line":"All users, unless specified in the user options attribute"},{"line_number":139,"context_line":"`ignore_password_expiry` is set, will expire upon a successful authentication."},{"line_number":140,"context_line":"This feature is disabled by default. This feature is only applicable with the"},{"line_number":141,"context_line":"`sql` backend for the `[identity] driver`."},{"line_number":142,"context_line":"\"\"\"))"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_b902b107","line":139,"in_reply_to":"3a461143_f6a8c6dd","updated":"2017-01-26 21:14:40.000000000","message":"++ This sentence doesn\u0027t read right.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":138,"context_line":"All users, unless specified in the user options attribute"},{"line_number":139,"context_line":"`ignore_password_expiry` is set, will expire upon a successful authentication."},{"line_number":140,"context_line":"This feature is disabled by default. This feature is only applicable with the"},{"line_number":141,"context_line":"`sql` backend for the `[identity] driver`."},{"line_number":142,"context_line":"\"\"\"))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_3908812d","line":141,"updated":"2017-01-26 21:36:28.000000000","message":"I thought previous iterations has wording that operators need to be careful enabling this, with a strong emphasis on coordinating it with users.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":138,"context_line":"All users, unless specified in the user options attribute"},{"line_number":139,"context_line":"`ignore_password_expiry` is set, will expire upon a successful authentication."},{"line_number":140,"context_line":"This feature is disabled by default. This feature is only applicable with the"},{"line_number":141,"context_line":"`sql` backend for the `[identity] driver`."},{"line_number":142,"context_line":"\"\"\"))"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_3dcf8680","line":141,"in_reply_to":"3a461143_3908812d","updated":"2017-01-27 00:13:22.000000000","message":"Steve over write that text based on feedback from Dolph.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d0d6c1957bf0a5a286a22d2f04821dd435db7a44","unresolved":false,"context_lines":[{"line_number":131,"context_line":"\"\"\"))"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"change_password_after_first_use \u003d cfg.BoolOpt("},{"line_number":134,"context_line":"    \u0027change_password_after_first_use\u0027,"},{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_88baf3be","line":134,"range":{"start_line":134,"start_character":5,"end_line":134,"end_character":36},"updated":"2017-01-27 06:49:53.000000000","message":"I think this name is incorrect now, perhaps the commit message and everything else needs to be updated to reflect the new code saying it is on admin set.","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3c702092128232508549bba2dafd2d793bc34fac","unresolved":false,"context_lines":[{"line_number":131,"context_line":"\"\"\"))"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"change_password_after_first_use \u003d cfg.BoolOpt("},{"line_number":134,"context_line":"    \u0027change_password_after_first_use\u0027,"},{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_d9b12091","line":134,"range":{"start_line":134,"start_character":5,"end_line":134,"end_character":36},"in_reply_to":"3a461143_88baf3be","updated":"2017-01-27 14:09:30.000000000","message":"Done","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7a0e80fdc1a2f2e3d28f159c057475de53972cf","unresolved":false,"context_lines":[{"line_number":131,"context_line":"\"\"\"))"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"change_password_after_first_use \u003d cfg.BoolOpt("},{"line_number":134,"context_line":"    \u0027change_password_after_first_use\u0027,"},{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_be451a18","line":134,"in_reply_to":"3a461143_88baf3be","updated":"2017-01-27 13:24:24.000000000","message":"s/after/before/ or s/after/upon/ ?","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3c702092128232508549bba2dafd2d793bc34fac","unresolved":false,"context_lines":[{"line_number":131,"context_line":"\"\"\"))"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"change_password_after_first_use \u003d cfg.BoolOpt("},{"line_number":134,"context_line":"    \u0027change_password_after_first_use\u0027,"},{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_f9ac1c37","line":134,"in_reply_to":"3a461143_be451a18","updated":"2017-01-27 14:09:30.000000000","message":"Done","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7a0e80fdc1a2f2e3d28f159c057475de53972cf","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."},{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset, will be"},{"line_number":139,"context_line":"required to change their password before accessing any services. To ignore this"},{"line_number":140,"context_line":"check for specific users, such as service users, set the `options` attribute"},{"line_number":141,"context_line":"`ignore_password_expiry` via the user API. This feature is disabled by default."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_be5c3aee","line":138,"updated":"2017-01-27 13:24:24.000000000","message":"reset by admin","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3c702092128232508549bba2dafd2d793bc34fac","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."},{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset, will be"},{"line_number":139,"context_line":"required to change their password before accessing any services. To ignore this"},{"line_number":140,"context_line":"check for specific users, such as service users, set the `options` attribute"},{"line_number":141,"context_line":"`ignore_password_expiry` via the user API. This feature is disabled by default."}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_19ac8833","line":138,"in_reply_to":"3a461143_be5c3aee","updated":"2017-01-27 14:09:30.000000000","message":"Done","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9d796719aa35c8ee83fe90c436b7efad7055a3","unresolved":false,"context_lines":[{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset by an"},{"line_number":139,"context_line":"administrator, will be required to change their password before accessing any"},{"line_number":140,"context_line":"services. To ignore this check for specific users, such as service users, set"},{"line_number":141,"context_line":"the `options` attribute `ignore_password_expiry` via the user API. This feature"},{"line_number":142,"context_line":"is disabled by default. This feature is only applicable with the `sql` backend"},{"line_number":143,"context_line":"for the `[identity] driver`."},{"line_number":144,"context_line":"\"\"\"))"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_ba8a83bd","line":141,"range":{"start_line":141,"start_character":3,"end_line":141,"end_character":4},"updated":"2017-01-27 14:54:15.000000000","message":"the specific user\u0027s `options` attribute ....\n\nwould sound clearer to me, I had a hard time reading this :)","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e77d4a7b421f428d5d8ebed48f158bd963591565","unresolved":false,"context_lines":[{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset by an"},{"line_number":139,"context_line":"administrator, will be required to change their password before accessing any"},{"line_number":140,"context_line":"services. To ignore this check for specific users, such as service users, set"},{"line_number":141,"context_line":"the `options` attribute `ignore_password_expiry` via the user API. This feature"},{"line_number":142,"context_line":"is disabled by default. This feature is only applicable with the `sql` backend"},{"line_number":143,"context_line":"for the `[identity] driver`."},{"line_number":144,"context_line":"\"\"\"))"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_7da01544","line":141,"range":{"start_line":141,"start_character":3,"end_line":141,"end_character":4},"in_reply_to":"3a461143_ba8a83bd","updated":"2017-01-27 16:21:39.000000000","message":"Done","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4088041cc99ab5ebc002156385e9d5c4dcd2fb4b","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    \u0027change_password_upon_first_use\u0027,"},{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."},{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset by an"},{"line_number":139,"context_line":"administrator, will be required to change their password before accessing any"},{"line_number":140,"context_line":"services. To ignore this check for specific users, such as service users, set"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a461143_a473417f","line":137,"range":{"start_line":137,"start_character":61,"end_line":137,"end_character":75},"updated":"2017-01-27 17:57:31.000000000","message":"when the user is created, or upon administrative reset.","commit_id":"5deea27bbf92ae06e30a93263000dfd7580a64f2"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"004a241ac5095fda00f8a78ad56f85fa171bb188","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    \u0027change_password_upon_first_use\u0027,"},{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."},{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset by an"},{"line_number":139,"context_line":"administrator, will be required to change their password before accessing any"},{"line_number":140,"context_line":"services. To ignore this check for specific users, such as service users, set"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a461143_a4550151","line":137,"range":{"start_line":137,"start_character":61,"end_line":137,"end_character":75},"in_reply_to":"3a461143_a473417f","updated":"2017-01-27 18:08:51.000000000","message":"Done","commit_id":"5deea27bbf92ae06e30a93263000dfd7580a64f2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4088041cc99ab5ebc002156385e9d5c4dcd2fb4b","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."},{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset by an"},{"line_number":139,"context_line":"administrator, will be required to change their password before accessing any"},{"line_number":140,"context_line":"services. To ignore this check for specific users, such as service users, set"},{"line_number":141,"context_line":"the `options` attribute `ignore_password_expiry` for the user via the API. This"},{"line_number":142,"context_line":"feature is disabled by default. This feature is only applicable with the `sql`"},{"line_number":143,"context_line":"backend for the `[identity] driver`."}],"source_content_type":"text/x-python","patch_set":15,"id":"3a461143_e4f2a9d1","line":140,"range":{"start_line":138,"start_character":0,"end_line":140,"end_character":9},"updated":"2017-01-27 17:57:31.000000000","message":"Replace this whole sentence with:\n\n\"Before accessing any services, affected users will have to change their password.","commit_id":"5deea27bbf92ae06e30a93263000dfd7580a64f2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4088041cc99ab5ebc002156385e9d5c4dcd2fb4b","unresolved":false,"context_lines":[{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."},{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset by an"},{"line_number":139,"context_line":"administrator, will be required to change their password before accessing any"},{"line_number":140,"context_line":"services. To ignore this check for specific users, such as service users, set"},{"line_number":141,"context_line":"the `options` attribute `ignore_password_expiry` for the user via the API. This"},{"line_number":142,"context_line":"feature is disabled by default. This feature is only applicable with the `sql`"},{"line_number":143,"context_line":"backend for the `[identity] driver`."}],"source_content_type":"text/x-python","patch_set":15,"id":"3a461143_e4c9c979","line":140,"range":{"start_line":140,"start_character":25,"end_line":140,"end_character":30},"updated":"2017-01-27 17:57:31.000000000","message":"s/check/requirement","commit_id":"5deea27bbf92ae06e30a93263000dfd7580a64f2"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"004a241ac5095fda00f8a78ad56f85fa171bb188","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    default\u003dFalse,"},{"line_number":136,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":137,"context_line":"Enabling this option requires users to change their password upon first use."},{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset by an"},{"line_number":139,"context_line":"administrator, will be required to change their password before accessing any"},{"line_number":140,"context_line":"services. To ignore this check for specific users, such as service users, set"},{"line_number":141,"context_line":"the `options` attribute `ignore_password_expiry` for the user via the API. This"},{"line_number":142,"context_line":"feature is disabled by default. This feature is only applicable with the `sql`"},{"line_number":143,"context_line":"backend for the `[identity] driver`."}],"source_content_type":"text/x-python","patch_set":15,"id":"3a461143_044b35b1","line":140,"range":{"start_line":138,"start_character":0,"end_line":140,"end_character":9},"in_reply_to":"3a461143_e4f2a9d1","updated":"2017-01-27 18:08:51.000000000","message":"Done","commit_id":"5deea27bbf92ae06e30a93263000dfd7580a64f2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4088041cc99ab5ebc002156385e9d5c4dcd2fb4b","unresolved":false,"context_lines":[{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset by an"},{"line_number":139,"context_line":"administrator, will be required to change their password before accessing any"},{"line_number":140,"context_line":"services. To ignore this check for specific users, such as service users, set"},{"line_number":141,"context_line":"the `options` attribute `ignore_password_expiry` for the user via the API. This"},{"line_number":142,"context_line":"feature is disabled by default. This feature is only applicable with the `sql`"},{"line_number":143,"context_line":"backend for the `[identity] driver`."},{"line_number":144,"context_line":"\"\"\"))"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a461143_64831905","line":141,"range":{"start_line":141,"start_character":13,"end_line":141,"end_character":48},"updated":"2017-01-27 17:57:31.000000000","message":"s/ attribute `ignore_password_expiry`/  attribute `ignore_password_expiry` to `True` for the desired user via the update user API.","commit_id":"5deea27bbf92ae06e30a93263000dfd7580a64f2"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"004a241ac5095fda00f8a78ad56f85fa171bb188","unresolved":false,"context_lines":[{"line_number":138,"context_line":"This means that new users or users that have had their passwords reset by an"},{"line_number":139,"context_line":"administrator, will be required to change their password before accessing any"},{"line_number":140,"context_line":"services. To ignore this check for specific users, such as service users, set"},{"line_number":141,"context_line":"the `options` attribute `ignore_password_expiry` for the user via the API. This"},{"line_number":142,"context_line":"feature is disabled by default. This feature is only applicable with the `sql`"},{"line_number":143,"context_line":"backend for the `[identity] driver`."},{"line_number":144,"context_line":"\"\"\"))"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a461143_e49469e3","line":141,"range":{"start_line":141,"start_character":13,"end_line":141,"end_character":48},"in_reply_to":"3a461143_64831905","updated":"2017-01-27 18:08:51.000000000","message":"Done","commit_id":"5deea27bbf92ae06e30a93263000dfd7580a64f2"}],"keystone/identity/backends/resource_options.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"078417fcc47c15d9ff19f24ec17f21a8dcd30a66","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"USER_OPTIONS_REGISTRY \u003d resource_options.ResourceOptionRegistry(\u0027USER\u0027)"},{"line_number":17,"context_line":"USER_OPTIONS_LIST \u003d ["},{"line_number":18,"context_line":"    # NOTE(notmorgan): This placeholder options can be removed once more"},{"line_number":19,"context_line":"    # options are populated. This forces iteration on possible options for"},{"line_number":20,"context_line":"    # complete test purposes in unit/functional/gate tests outside of the"},{"line_number":21,"context_line":"    # explicit test cases that test resource options. This option is never"},{"line_number":22,"context_line":"    # expected to be set."},{"line_number":23,"context_line":"    resource_options.ResourceOption(\u0027_TST\u0027, \u0027__PLACEHOLDER__\u0027),"},{"line_number":24,"context_line":"    resource_options.ResourceOption(\u00271000\u0027, \u0027ignore_password_expiry\u0027)"},{"line_number":25,"context_line":"]"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_054c646f","line":23,"range":{"start_line":18,"start_character":1,"end_line":23,"end_character":63},"updated":"2017-01-26 04:50:21.000000000","message":"we may want to drop the placeholder option with the first option that merges.","commit_id":"14f530b88163eb9942ac35a1ac39994bcd398b16"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9b7e08444b0ba49709fbaf1ed0a841f685a64733","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"USER_OPTIONS_REGISTRY \u003d resource_options.ResourceOptionRegistry(\u0027USER\u0027)"},{"line_number":17,"context_line":"USER_OPTIONS_LIST \u003d ["},{"line_number":18,"context_line":"    # NOTE(notmorgan): This placeholder options can be removed once more"},{"line_number":19,"context_line":"    # options are populated. This forces iteration on possible options for"},{"line_number":20,"context_line":"    # complete test purposes in unit/functional/gate tests outside of the"},{"line_number":21,"context_line":"    # explicit test cases that test resource options. This option is never"},{"line_number":22,"context_line":"    # expected to be set."},{"line_number":23,"context_line":"    resource_options.ResourceOption(\u0027_TST\u0027, \u0027__PLACEHOLDER__\u0027),"},{"line_number":24,"context_line":"    resource_options.ResourceOption(\u00271000\u0027, \u0027ignore_password_expiry\u0027)"},{"line_number":25,"context_line":"]"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_5799bf6d","line":23,"range":{"start_line":18,"start_character":1,"end_line":23,"end_character":63},"in_reply_to":"3a461143_054c646f","updated":"2017-01-26 05:57:09.000000000","message":"++","commit_id":"14f530b88163eb9942ac35a1ac39994bcd398b16"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"66abcd598a68ff227b058f50f265174d568a82ba","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # explicit test cases that test resource options. This option is never"},{"line_number":22,"context_line":"    # expected to be set."},{"line_number":23,"context_line":"    resource_options.ResourceOption(\u0027_TST\u0027, \u0027__PLACEHOLDER__\u0027),"},{"line_number":24,"context_line":"    resource_options.ResourceOption(\u00271000\u0027, \u0027ignore_password_expiry\u0027)"},{"line_number":25,"context_line":"]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_653c4894","line":24,"range":{"start_line":24,"start_character":36,"end_line":24,"end_character":42},"updated":"2017-01-26 04:58:08.000000000","message":"If you would like to use a non-int string, you can, as shown above. In either case make sure you always reference this option object when looking up the data in the mapper or when inspecting the user\u0027s option dict. ID is:\n\n  option_obj_instance.option_id\n\nName is:\n\n  option_obj_instance.option_name\n\n\nYou may want a validator for this as well that ensures the value is a boolean:\n\n  def _boolean_validator(value):\n    \u003ccheck is boolean and raise if not\u003e\n\nthen\n\n  resource_options.ResourceOption(\u00271000\u0027, \u0027ignore_password_expiry\u0027, _boolean_validator)","commit_id":"14f530b88163eb9942ac35a1ac39994bcd398b16"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ff8504779ef0b140875e89912f5e1e4b2f95f53a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # explicit test cases that test resource options. This option is never"},{"line_number":22,"context_line":"    # expected to be set."},{"line_number":23,"context_line":"    resource_options.ResourceOption(\u0027_TST\u0027, \u0027__PLACEHOLDER__\u0027),"},{"line_number":24,"context_line":"    resource_options.ResourceOption(\u00271000\u0027, \u0027ignore_password_expiry\u0027)"},{"line_number":25,"context_line":"]"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_24ceaab4","line":24,"range":{"start_line":24,"start_character":36,"end_line":24,"end_character":42},"in_reply_to":"3a461143_653c4894","updated":"2017-01-26 15:31:13.000000000","message":"Nice! I\u0027ll add that in the next patch.","commit_id":"14f530b88163eb9942ac35a1ac39994bcd398b16"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e6f313a3fcde21ce1c1b7b97386e2cf335294992","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # explicit test cases that test resource options. This option is never"},{"line_number":22,"context_line":"    # expected to be set."},{"line_number":23,"context_line":"    resource_options.ResourceOption(\u0027_TST\u0027, \u0027__PLACEHOLDER__\u0027),"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"# NOTE(notmorgan): wrap this in a function for testing purposes."}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_f97fd963","side":"PARENT","line":24,"updated":"2017-01-26 21:14:40.000000000","message":"It would be nice if \u0027ignore_password_expiry\u0027 was a constant so the string isn\u0027t all over the code.","commit_id":"1896d1ba0d24d3780ce8c7652fa4c4378a02255d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # explicit test cases that test resource options. This option is never"},{"line_number":22,"context_line":"    # expected to be set."},{"line_number":23,"context_line":"    resource_options.ResourceOption(\u0027_TST\u0027, \u0027__PLACEHOLDER__\u0027),"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"# NOTE(notmorgan): wrap this in a function for testing purposes."}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_dda4c2ba","side":"PARENT","line":24,"in_reply_to":"3a461143_7cb5972f","updated":"2017-01-27 00:13:22.000000000","message":"Made this a constant in the latest patch.","commit_id":"1896d1ba0d24d3780ce8c7652fa4c4378a02255d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # explicit test cases that test resource options. This option is never"},{"line_number":22,"context_line":"    # expected to be set."},{"line_number":23,"context_line":"    resource_options.ResourceOption(\u0027_TST\u0027, \u0027__PLACEHOLDER__\u0027),"},{"line_number":24,"context_line":"]"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"# NOTE(notmorgan): wrap this in a function for testing purposes."}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_7cb5972f","side":"PARENT","line":24,"in_reply_to":"3a461143_f97fd963","updated":"2017-01-26 21:36:28.000000000","message":"I agreed, but I wonder where it should live. I don\u0027t really like the idea of creating another constants module for something we might be able to derive from the registered configuration option. Especially since we will be using options to deprecate other configuration options (ignore password users for example).","commit_id":"1896d1ba0d24d3780ce8c7652fa4c4378a02255d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e6f313a3fcde21ce1c1b7b97386e2cf335294992","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"USER_OPTIONS_REGISTRY \u003d resource_options.ResourceOptionRegistry(\u0027USER\u0027)"},{"line_number":17,"context_line":"USER_OPTIONS_LIST \u003d ["},{"line_number":18,"context_line":"    resource_options.ResourceOption(\u00271000\u0027, \u0027ignore_password_expiry\u0027)"},{"line_number":19,"context_line":"]"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_393de1bb","line":18,"updated":"2017-01-26 21:14:40.000000000","message":"(nit) i usually like ending each element of a list with a comma, even if it\u0027s the last one.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"USER_OPTIONS_REGISTRY \u003d resource_options.ResourceOptionRegistry(\u0027USER\u0027)"},{"line_number":17,"context_line":"USER_OPTIONS_LIST \u003d ["},{"line_number":18,"context_line":"    resource_options.ResourceOption(\u00271000\u0027, \u0027ignore_password_expiry\u0027)"},{"line_number":19,"context_line":"]"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_79c0492b","line":18,"updated":"2017-01-26 21:36:28.000000000","message":"This there a convention for \u00271000\u0027? If there is we should document it in our developer documentation.\n\nThis is why I would opt for something *not* abbreviated. Even if we only need 4 characters, it makes things easier for maintainers.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"d8e6299025a088e15c671e5a994a863ceee524f3","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"USER_OPTIONS_REGISTRY \u003d resource_options.ResourceOptionRegistry(\u0027USER\u0027)"},{"line_number":17,"context_line":"USER_OPTIONS_LIST \u003d ["},{"line_number":18,"context_line":"    resource_options.ResourceOption(\u00271000\u0027, \u0027ignore_password_expiry\u0027)"},{"line_number":19,"context_line":"]"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_3c914f53","line":18,"range":{"start_line":18,"start_character":37,"end_line":18,"end_character":41},"updated":"2017-01-26 21:27:47.000000000","message":"You don\u0027t have to use numbers here. I think we should stick to abbreviations or something more meaningful.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"USER_OPTIONS_REGISTRY \u003d resource_options.ResourceOptionRegistry(\u0027USER\u0027)"},{"line_number":17,"context_line":"USER_OPTIONS_LIST \u003d ["},{"line_number":18,"context_line":"    resource_options.ResourceOption(\u00271000\u0027, \u0027ignore_password_expiry\u0027)"},{"line_number":19,"context_line":"]"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_bd88d623","line":18,"in_reply_to":"3a461143_79c0492b","updated":"2017-01-27 00:13:22.000000000","message":"Agree, left this as a number.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"}],"keystone/identity/backends/resource_options_constants.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ec437976cde9b6ea9fb80827f9b7dd88b765cc07","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3a461143_a7743f9c","updated":"2017-01-27 04:31:08.000000000","message":"probably doesn\u0027t belong in backends, maybe one higher?","commit_id":"91557f50976d47ab4021cfe33e4a1f2c43d8b17c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"740fe0a67e2f2ea1b6a592c47e83aa0377e37801","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3a461143_025b412f","in_reply_to":"3a461143_a7743f9c","updated":"2017-01-27 05:31:45.000000000","message":"It\u0027s mostly used in the backend and wanted to keep it close to resource_options.py\n\nBut open to suggestions.","commit_id":"91557f50976d47ab4021cfe33e4a1f2c43d8b17c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9d796719aa35c8ee83fe90c436b7efad7055a3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"3a461143_1d48f15a","line":14,"updated":"2017-01-27 14:54:15.000000000","message":"this looks weird to have a file to just hold constants, I\u0027ve never seen this in Python :(\n\nhowever I do not have any suggestions, I was going to suggest you declared the name hardcoded when defining the option in resource_options.py .\n\nhowever you need the names in other places to retrieve the config option by name :(","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e77d4a7b421f428d5d8ebed48f158bd963591565","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"3a461143_ddaca937","line":14,"in_reply_to":"3a461143_1d48f15a","updated":"2017-01-27 16:21:39.000000000","message":"https://github.com/openstack/keystone/blob/master/keystone/federation/constants.py","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"66abcd598a68ff227b058f50f265174d568a82ba","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        ignore_password_expiry \u003d False"},{"line_number":129,"context_line":"        if (user._resource_option_mapper and"},{"line_number":130,"context_line":"                user._resource_option_mapper[\u00271000\u0027] and"},{"line_number":131,"context_line":"                user._resource_option_mapper[\u00271000\u0027].option_value is True):"},{"line_number":132,"context_line":"            ignore_password_expiry \u003d True"},{"line_number":133,"context_line":"        return ("},{"line_number":134,"context_line":"            CONF.security_compliance.change_password_after_first_use and"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_65a0c8f5","line":131,"range":{"start_line":131,"start_character":45,"end_line":131,"end_character":51},"updated":"2017-01-26 04:58:08.000000000","message":"suggest referencing the option.option_id (in identity.resource_options or via the registry) rather than magic numbers/strings here.\n\nIt ensures that we\u0027re using the same ID/Name that the rest of the system is. As terrible as it would be if the option id/name changed, if it does change you\u0027ll follow that value.","commit_id":"14f530b88163eb9942ac35a1ac39994bcd398b16"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ff8504779ef0b140875e89912f5e1e4b2f95f53a","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        ignore_password_expiry \u003d False"},{"line_number":129,"context_line":"        if (user._resource_option_mapper and"},{"line_number":130,"context_line":"                user._resource_option_mapper[\u00271000\u0027] and"},{"line_number":131,"context_line":"                user._resource_option_mapper[\u00271000\u0027].option_value is True):"},{"line_number":132,"context_line":"            ignore_password_expiry \u003d True"},{"line_number":133,"context_line":"        return ("},{"line_number":134,"context_line":"            CONF.security_compliance.change_password_after_first_use and"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_443bb6d1","line":131,"range":{"start_line":131,"start_character":45,"end_line":131,"end_character":51},"in_reply_to":"3a461143_65a0c8f5","updated":"2017-01-26 15:31:13.000000000","message":"Yeah, for readability too. Will do that in a follow up patch.","commit_id":"14f530b88163eb9942ac35a1ac39994bcd398b16"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e6f313a3fcde21ce1c1b7b97386e2cf335294992","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def _change_password_required(self, user):"},{"line_number":128,"context_line":"        ignore_option \u003d (user.resource_options_registry"},{"line_number":129,"context_line":"                             .get_option_by_name(\u0027ignore_password_expiry\u0027))"},{"line_number":130,"context_line":"        user_options \u003d user._resource_option_mapper"},{"line_number":131,"context_line":"        ignore_password_expiry \u003d False"},{"line_number":132,"context_line":"        if (ignore_option.option_id in user_options and"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_798cc97f","line":129,"updated":"2017-01-26 21:14:40.000000000","message":"You could use the constant here.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def _change_password_required(self, user):"},{"line_number":128,"context_line":"        ignore_option \u003d (user.resource_options_registry"},{"line_number":129,"context_line":"                             .get_option_by_name(\u0027ignore_password_expiry\u0027))"},{"line_number":130,"context_line":"        user_options \u003d user._resource_option_mapper"},{"line_number":131,"context_line":"        ignore_password_expiry \u003d False"},{"line_number":132,"context_line":"        if (ignore_option.option_id in user_options and"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_bcec5f2a","line":129,"in_reply_to":"3a461143_798cc97f","updated":"2017-01-26 21:36:28.000000000","message":"++","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def _change_password_required(self, user):"},{"line_number":128,"context_line":"        ignore_option \u003d (user.resource_options_registry"},{"line_number":129,"context_line":"                             .get_option_by_name(\u0027ignore_password_expiry\u0027))"},{"line_number":130,"context_line":"        user_options \u003d user._resource_option_mapper"},{"line_number":131,"context_line":"        ignore_password_expiry \u003d False"},{"line_number":132,"context_line":"        if (ignore_option.option_id in user_options and"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_fd825eff","line":129,"in_reply_to":"3a461143_bcec5f2a","updated":"2017-01-27 00:13:22.000000000","message":"Done","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e6f313a3fcde21ce1c1b7b97386e2cf335294992","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    def _change_password_required(self, user):"},{"line_number":128,"context_line":"        ignore_option \u003d (user.resource_options_registry"},{"line_number":129,"context_line":"                             .get_option_by_name(\u0027ignore_password_expiry\u0027))"},{"line_number":130,"context_line":"        user_options \u003d user._resource_option_mapper"},{"line_number":131,"context_line":"        ignore_password_expiry \u003d False"},{"line_number":132,"context_line":"        if (ignore_option.option_id in user_options and"},{"line_number":133,"context_line":"                user_options[ignore_option.option_id].option_value is True):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_99d09555","line":130,"updated":"2017-01-26 21:14:40.000000000","message":"I hate that this has to use private instance attributes","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"7f3458382646f872f4048617c00c9307098eff08","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    def _change_password_required(self, user):"},{"line_number":128,"context_line":"        ignore_option \u003d (user.resource_options_registry"},{"line_number":129,"context_line":"                             .get_option_by_name(\u0027ignore_password_expiry\u0027))"},{"line_number":130,"context_line":"        user_options \u003d user._resource_option_mapper"},{"line_number":131,"context_line":"        ignore_password_expiry \u003d False"},{"line_number":132,"context_line":"        if (ignore_option.option_id in user_options and"},{"line_number":133,"context_line":"                user_options[ignore_option.option_id].option_value is True):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_1fcba554","line":130,"in_reply_to":"3a461143_99d09555","updated":"2017-01-26 21:47:59.000000000","message":"The key is the resource_option_mapper is super touchy, i wouldn\u0027t be opposed to implementing a .get_option() on the model to make this go away.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    def _change_password_required(self, user):"},{"line_number":128,"context_line":"        ignore_option \u003d (user.resource_options_registry"},{"line_number":129,"context_line":"                             .get_option_by_name(\u0027ignore_password_expiry\u0027))"},{"line_number":130,"context_line":"        user_options \u003d user._resource_option_mapper"},{"line_number":131,"context_line":"        ignore_password_expiry \u003d False"},{"line_number":132,"context_line":"        if (ignore_option.option_id in user_options and"},{"line_number":133,"context_line":"                user_options[ignore_option.option_id].option_value is True):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_9cd08355","line":130,"in_reply_to":"3a461143_99d09555","updated":"2017-01-26 21:36:28.000000000","message":"Yeah, whenever I have to do this, it makes me feel like I\u0027m doing something I shouldn\u0027t be. Not because python doesn\u0027t allow it, but because the convention suggests it should be private.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e6f313a3fcde21ce1c1b7b97386e2cf335294992","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                             .get_option_by_name(\u0027ignore_password_expiry\u0027))"},{"line_number":130,"context_line":"        user_options \u003d user._resource_option_mapper"},{"line_number":131,"context_line":"        ignore_password_expiry \u003d False"},{"line_number":132,"context_line":"        if (ignore_option.option_id in user_options and"},{"line_number":133,"context_line":"                user_options[ignore_option.option_id].option_value is True):"},{"line_number":134,"context_line":"            ignore_password_expiry \u003d True"},{"line_number":135,"context_line":"        return ("}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_f9a2794a","line":132,"updated":"2017-01-26 21:14:40.000000000","message":"Is this selecting all of a user\u0027s options in order to find one?","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                             .get_option_by_name(\u0027ignore_password_expiry\u0027))"},{"line_number":130,"context_line":"        user_options \u003d user._resource_option_mapper"},{"line_number":131,"context_line":"        ignore_password_expiry \u003d False"},{"line_number":132,"context_line":"        if (ignore_option.option_id in user_options and"},{"line_number":133,"context_line":"                user_options[ignore_option.option_id].option_value is True):"},{"line_number":134,"context_line":"            ignore_password_expiry \u003d True"},{"line_number":135,"context_line":"        return ("}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_dc584bfd","line":132,"in_reply_to":"3a461143_f9a2794a","updated":"2017-01-26 21:36:28.000000000","message":"What about something:\n\n  if user_options.get(ignore_option.option_id).option_value:\n\nNot sure if that works though (?).","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ec437976cde9b6ea9fb80827f9b7dd88b765cc07","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                user_ref, model.UserOption)"},{"line_number":135,"context_line":"            return base.filter_user(user_ref.to_dict())"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _change_password_required(self, user):"},{"line_number":138,"context_line":"        return ("},{"line_number":139,"context_line":"            CONF.security_compliance.change_password_after_first_use and"},{"line_number":140,"context_line":"            not self._ignore_password_expiry(user)"},{"line_number":141,"context_line":"        )"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _ignore_password_expiry(self, user):"},{"line_number":144,"context_line":"        ignore_option \u003d ("},{"line_number":145,"context_line":"            user.resource_options_registry"},{"line_number":146,"context_line":"                .get_option_by_name(constants.IGNORE_PASSWORD_EXPIRY))"},{"line_number":147,"context_line":"        user_options \u003d user._resource_option_mapper"},{"line_number":148,"context_line":"        return ("},{"line_number":149,"context_line":"            ignore_option.option_id in user_options and"},{"line_number":150,"context_line":"            user_options[ignore_option.option_id].option_value is True"},{"line_number":151,"context_line":"        )"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _create_password_expires_query(self, session, query, hints):"},{"line_number":154,"context_line":"        for filter_ in hints.filters:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_67917799","line":151,"range":{"start_line":137,"start_character":4,"end_line":151,"end_character":9},"updated":"2017-01-27 04:31:08.000000000","message":"ugh to single-use functions, just make one with a short-circuit instead\n\ndef _change_password_required(self, user):\n        if CONF.security_compliance.change_password_after_first_use\n            return True\n        else:\n             ignore_option \u003d (\n                 user.resource_options_registry\n                .get_option_by_name(constants.IGNORE_PASSWORD_EXPIRY))\n             user_options \u003d user._resource_option_mapper\n        return not (ignore_option.option_id in user_options and\n            user_options[ignore_option.option_id].option_value is True)","commit_id":"91557f50976d47ab4021cfe33e4a1f2c43d8b17c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"740fe0a67e2f2ea1b6a592c47e83aa0377e37801","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                user_ref, model.UserOption)"},{"line_number":135,"context_line":"            return base.filter_user(user_ref.to_dict())"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _change_password_required(self, user):"},{"line_number":138,"context_line":"        return ("},{"line_number":139,"context_line":"            CONF.security_compliance.change_password_after_first_use and"},{"line_number":140,"context_line":"            not self._ignore_password_expiry(user)"},{"line_number":141,"context_line":"        )"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _ignore_password_expiry(self, user):"},{"line_number":144,"context_line":"        ignore_option \u003d ("},{"line_number":145,"context_line":"            user.resource_options_registry"},{"line_number":146,"context_line":"                .get_option_by_name(constants.IGNORE_PASSWORD_EXPIRY))"},{"line_number":147,"context_line":"        user_options \u003d user._resource_option_mapper"},{"line_number":148,"context_line":"        return ("},{"line_number":149,"context_line":"            ignore_option.option_id in user_options and"},{"line_number":150,"context_line":"            user_options[ignore_option.option_id].option_value is True"},{"line_number":151,"context_line":"        )"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _create_password_expires_query(self, session, query, hints):"},{"line_number":154,"context_line":"        for filter_ in hints.filters:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3a461143_027261ad","line":151,"range":{"start_line":137,"start_character":4,"end_line":151,"end_character":9},"in_reply_to":"3a461143_67917799","updated":"2017-01-27 05:31:45.000000000","message":"Done. But my version was way more readable. Come on...","commit_id":"91557f50976d47ab4021cfe33e4a1f2c43d8b17c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7a0e80fdc1a2f2e3d28f159c057475de53972cf","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    def _change_password_required(self, user):"},{"line_number":138,"context_line":"        if not CONF.security_compliance.change_password_after_first_use:"},{"line_number":139,"context_line":"            return False"},{"line_number":140,"context_line":"        else:"},{"line_number":141,"context_line":"            ignore_option \u003d ("},{"line_number":142,"context_line":"                user.resource_options_registry"},{"line_number":143,"context_line":"                    .get_option_by_name(constants.IGNORE_PASSWORD_EXPIRY))"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_1ef38ed7","line":140,"updated":"2017-01-27 13:24:24.000000000","message":"(nit) \u0027else\u0027 isn\u0027t needed as you can just tab over the remain statements in this method","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3c702092128232508549bba2dafd2d793bc34fac","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    def _change_password_required(self, user):"},{"line_number":138,"context_line":"        if not CONF.security_compliance.change_password_after_first_use:"},{"line_number":139,"context_line":"            return False"},{"line_number":140,"context_line":"        else:"},{"line_number":141,"context_line":"            ignore_option \u003d ("},{"line_number":142,"context_line":"                user.resource_options_registry"},{"line_number":143,"context_line":"                    .get_option_by_name(constants.IGNORE_PASSWORD_EXPIRY))"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_9945d871","line":140,"in_reply_to":"3a461143_1ef38ed7","updated":"2017-01-27 14:09:30.000000000","message":"Done","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"538e6e68c9c49e4af4da684a1c7887ce3b71e004","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        with sql.session_for_write() as session:"},{"line_number":127,"context_line":"            user_ref \u003d model.User.from_dict(user)"},{"line_number":128,"context_line":"            if self._change_password_required(user_ref):"},{"line_number":129,"context_line":"                user_ref.password_ref.expires_at \u003d datetime.datetime.utcnow()"},{"line_number":130,"context_line":"            user_ref.created_at \u003d datetime.datetime.utcnow()"},{"line_number":131,"context_line":"            session.add(user_ref)"},{"line_number":132,"context_line":"            # Set resource options passed on creation"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_956e6d2d","line":129,"range":{"start_line":129,"start_character":51,"end_line":129,"end_character":77},"updated":"2017-01-27 19:17:36.000000000","message":"As said in IRC, this should be a hard-set value like \"Epoch start\" (Dec 1969) or similar. A value that has no business every being valid. UTCNow could result in auth possibilities based upon NTP drive, hard clock shifts in an update/fix, etc.\n\nWe could also explicitly validate the time instead of just \u003e Now, something like\n\nIf not \u003d\u003d specified time and \u003c\u003d Now.\n\nthis doesn\u0027t need to be changed here, but perhaps a followup patch","commit_id":"0b3e59e0411c546539d8f17e81af3a04c5f46f90"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"538e6e68c9c49e4af4da684a1c7887ce3b71e004","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            return False"},{"line_number":140,"context_line":"        ignore_option \u003d user.get_resource_option("},{"line_number":141,"context_line":"            options.IGNORE_CHANGE_PASSWORD_OPT.option_id)"},{"line_number":142,"context_line":"        return not (ignore_option and ignore_option.option_value is True)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _create_password_expires_query(self, session, query, hints):"},{"line_number":145,"context_line":"        for filter_ in hints.filters:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_b5fe0936","line":142,"range":{"start_line":142,"start_character":20,"end_line":142,"end_character":64},"updated":"2017-01-27 19:17:36.000000000","message":"Cool. I\u0027ll do an update for the options (future) that lets you evaluate the value directly with an __eq__ and with the is-true magic method.\n\nNo change needed here, just an additional thing that will make this type of code better in the future.","commit_id":"0b3e59e0411c546539d8f17e81af3a04c5f46f90"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ceb0eaf74424ee59a36e29ee6369ca185597fb90","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            return False"},{"line_number":140,"context_line":"        ignore_option \u003d user.get_resource_option("},{"line_number":141,"context_line":"            options.IGNORE_CHANGE_PASSWORD_OPT.option_id)"},{"line_number":142,"context_line":"        return not (ignore_option and ignore_option.option_value is True)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _create_password_expires_query(self, session, query, hints):"},{"line_number":145,"context_line":"        for filter_ in hints.filters:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_90b03b45","line":142,"range":{"start_line":142,"start_character":20,"end_line":142,"end_character":64},"in_reply_to":"3a461143_b5fe0936","updated":"2017-01-27 19:25:36.000000000","message":"++","commit_id":"0b3e59e0411c546539d8f17e81af3a04c5f46f90"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"538e6e68c9c49e4af4da684a1c7887ce3b71e004","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                user_ref, model.UserOption)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"            if \u0027password\u0027 in user and self._change_password_required(user_ref):"},{"line_number":216,"context_line":"                user_ref.password_ref.expires_at \u003d datetime.datetime.utcnow()"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"            user_ref.extra \u003d new_user.extra"},{"line_number":219,"context_line":"            return base.filter_user("}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_f5f8914b","line":216,"range":{"start_line":216,"start_character":51,"end_line":216,"end_character":77},"updated":"2017-01-27 19:17:36.000000000","message":"See above.","commit_id":"0b3e59e0411c546539d8f17e81af3a04c5f46f90"}],"keystone/identity/schema.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"9a433edfc12a715ffd13c772226b51b87e72296b","unresolved":false,"context_lines":[{"line_number":65,"context_line":"_user_options \u003d {"},{"line_number":66,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":67,"context_line":"    \u0027properties\u0027: {"},{"line_number":68,"context_line":"        \u0027ignore_password_expiry\u0027: parameter_types.boolean,"},{"line_number":69,"context_line":"    },"},{"line_number":70,"context_line":"    \u0027additionalProperties\u0027: False"},{"line_number":71,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_3c36afe7","line":68,"updated":"2017-01-26 21:18:38.000000000","message":"Could use the constant here too.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":65,"context_line":"_user_options \u003d {"},{"line_number":66,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":67,"context_line":"    \u0027properties\u0027: {"},{"line_number":68,"context_line":"        \u0027ignore_password_expiry\u0027: parameter_types.boolean,"},{"line_number":69,"context_line":"    },"},{"line_number":70,"context_line":"    \u0027additionalProperties\u0027: False"},{"line_number":71,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_3d7dc61c","line":68,"in_reply_to":"3a461143_3c36afe7","updated":"2017-01-27 00:13:22.000000000","message":"Done","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"538e6e68c9c49e4af4da684a1c7887ce3b71e004","unresolved":false,"context_lines":[{"line_number":66,"context_line":"_user_options \u003d {"},{"line_number":67,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":68,"context_line":"    \u0027properties\u0027: {"},{"line_number":69,"context_line":"        ro.IGNORE_CHANGE_PASSWORD_OPT.option_name: parameter_types.boolean,"},{"line_number":70,"context_line":"    },"},{"line_number":71,"context_line":"    \u0027additionalProperties\u0027: False"},{"line_number":72,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_f58fb1c9","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":75},"updated":"2017-01-27 19:17:36.000000000","message":"Are we allowing None here? or in a followup?","commit_id":"0b3e59e0411c546539d8f17e81af3a04c5f46f90"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ceb0eaf74424ee59a36e29ee6369ca185597fb90","unresolved":false,"context_lines":[{"line_number":66,"context_line":"_user_options \u003d {"},{"line_number":67,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":68,"context_line":"    \u0027properties\u0027: {"},{"line_number":69,"context_line":"        ro.IGNORE_CHANGE_PASSWORD_OPT.option_name: parameter_types.boolean,"},{"line_number":70,"context_line":"    },"},{"line_number":71,"context_line":"    \u0027additionalProperties\u0027: False"},{"line_number":72,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":18,"id":"3a461143_90975b8f","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":75},"in_reply_to":"3a461143_f58fb1c9","updated":"2017-01-27 19:25:36.000000000","message":"No, we\u0027re not allowing None. We could change this in a follow up if we decide to allow users to unset the option.","commit_id":"0b3e59e0411c546539d8f17e81af3a04c5f46f90"}],"keystone/tests/unit/identity/test_backend_sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":818,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":819,"context_line":"            \u0027password\u0027: self.initial_password"},{"line_number":820,"context_line":"        }"},{"line_number":821,"context_line":"        self.user \u003d self.identity_api.create_user(self.user_dict)"},{"line_number":822,"context_line":"        self.config_fixture.config("},{"line_number":823,"context_line":"            group\u003d\u0027security_compliance\u0027,"},{"line_number":824,"context_line":"            change_password_after_first_use\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_fce0a7fc","line":821,"updated":"2017-01-26 21:36:28.000000000","message":"I know we have a self.user somewhere else, too. To avoid confusing, we could use another name.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":826,"context_line":"    def assertPasswordExpiresAfterFirstAuth(self, user_id, password):"},{"line_number":827,"context_line":"        self.identity_api.authenticate(self.make_request(),"},{"line_number":828,"context_line":"                                       user_id\u003duser_id,"},{"line_number":829,"context_line":"                                       password\u003dpassword)"},{"line_number":830,"context_line":"        self.assertRaises(exception.PasswordExpired,"},{"line_number":831,"context_line":"                          self.identity_api.authenticate,"},{"line_number":832,"context_line":"                          self.make_request(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_bcb9bfcd","line":829,"updated":"2017-01-26 21:36:28.000000000","message":"I\u0027m sure this would be backwards incompatible in some way, but it would be nice if there was *something* about this request the signified that the next auth was going to fail.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":826,"context_line":"    def assertPasswordExpiresAfterFirstAuth(self, user_id, password):"},{"line_number":827,"context_line":"        self.identity_api.authenticate(self.make_request(),"},{"line_number":828,"context_line":"                                       user_id\u003duser_id,"},{"line_number":829,"context_line":"                                       password\u003dpassword)"},{"line_number":830,"context_line":"        self.assertRaises(exception.PasswordExpired,"},{"line_number":831,"context_line":"                          self.identity_api.authenticate,"},{"line_number":832,"context_line":"                          self.make_request(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_3dcb0655","line":829,"in_reply_to":"3a461143_bcb9bfcd","updated":"2017-01-27 00:13:22.000000000","message":"The logic has changed now where I\u0027m setting the password to expire on create/update user. No longer during auth.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":878,"context_line":"    def test_user_required_to_change_password_after_admin_reset(self):"},{"line_number":879,"context_line":"        new_password \u003d uuid.uuid4().hex"},{"line_number":880,"context_line":"        self.user[\u0027password\u0027] \u003d new_password"},{"line_number":881,"context_line":"        self.identity_api.update_user(self.user[\u0027id\u0027], self.user)"},{"line_number":882,"context_line":"        self.assertPasswordExpiresAfterFirstAuth(self.user[\u0027id\u0027], new_password)"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"    def test_user_not_required_to_change_password_when_feature_disabled(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_bc2e1ff8","line":881,"updated":"2017-01-26 21:36:28.000000000","message":"We don\u0027t need to use freezegun here? Is this because we are interacting with the identity API directly and not going through the token provider, which will compare the issued_at time of the token to the revocation list?","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":878,"context_line":"    def test_user_required_to_change_password_after_admin_reset(self):"},{"line_number":879,"context_line":"        new_password \u003d uuid.uuid4().hex"},{"line_number":880,"context_line":"        self.user[\u0027password\u0027] \u003d new_password"},{"line_number":881,"context_line":"        self.identity_api.update_user(self.user[\u0027id\u0027], self.user)"},{"line_number":882,"context_line":"        self.assertPasswordExpiresAfterFirstAuth(self.user[\u0027id\u0027], new_password)"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"    def test_user_not_required_to_change_password_when_feature_disabled(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_5dc6124a","line":881,"in_reply_to":"3a461143_bc2e1ff8","updated":"2017-01-27 00:13:22.000000000","message":"Yes, correct.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7a0e80fdc1a2f2e3d28f159c057475de53972cf","unresolved":false,"context_lines":[{"line_number":845,"context_line":"                                          new_password)"},{"line_number":846,"context_line":"        self.assertPasswordIsNotExpired(self.user[\u0027id\u0027], new_password)"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"    def test_password_expired_after_reset(self):"},{"line_number":849,"context_line":"        # admin reset"},{"line_number":850,"context_line":"        admin_password \u003d uuid.uuid4().hex"},{"line_number":851,"context_line":"        self.user[\u0027password\u0027] \u003d admin_password"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_7ef2d270","line":848,"updated":"2017-01-27 13:24:24.000000000","message":"This doesn\u0027t prove that reset works. As shown in the previous test the user is created in this state. You should change the password first (and prove auth works) so that we can be sure that reset expires the password.","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3c702092128232508549bba2dafd2d793bc34fac","unresolved":false,"context_lines":[{"line_number":845,"context_line":"                                          new_password)"},{"line_number":846,"context_line":"        self.assertPasswordIsNotExpired(self.user[\u0027id\u0027], new_password)"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"    def test_password_expired_after_reset(self):"},{"line_number":849,"context_line":"        # admin reset"},{"line_number":850,"context_line":"        admin_password \u003d uuid.uuid4().hex"},{"line_number":851,"context_line":"        self.user[\u0027password\u0027] \u003d admin_password"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_d4148545","line":848,"in_reply_to":"3a461143_7ef2d270","updated":"2017-01-27 14:09:30.000000000","message":"When you change the password, you create a new password which is not affected by create user, so it would show that reset creates a password that is expired.","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"1525a539c8b558061b5c25206cd8ea2dd975347f","unresolved":false,"context_lines":[{"line_number":845,"context_line":"                                          new_password)"},{"line_number":846,"context_line":"        self.assertPasswordIsNotExpired(self.user[\u0027id\u0027], new_password)"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"    def test_password_expired_after_reset(self):"},{"line_number":849,"context_line":"        # admin reset"},{"line_number":850,"context_line":"        admin_password \u003d uuid.uuid4().hex"},{"line_number":851,"context_line":"        self.user[\u0027password\u0027] \u003d admin_password"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_da502f61","line":848,"in_reply_to":"3a461143_d4148545","updated":"2017-01-27 14:38:52.000000000","message":"That\u0027s only because the implementation is correct now. I can change that and this test may still pass (depending on what i do).","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c7a0e80fdc1a2f2e3d28f159c057475de53972cf","unresolved":false,"context_lines":[{"line_number":878,"context_line":"        # admin reset"},{"line_number":879,"context_line":"        admin_password \u003d uuid.uuid4().hex"},{"line_number":880,"context_line":"        self.user[\u0027password\u0027] \u003d admin_password"},{"line_number":881,"context_line":"        self.identity_api.update_user(self.user[\u0027id\u0027], self.user)"},{"line_number":882,"context_line":"        # user id should be ignored for this check"},{"line_number":883,"context_line":"        self.assertPasswordIsNotExpired(self.user[\u0027id\u0027], admin_password)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_1e954edd","line":881,"updated":"2017-01-27 13:24:24.000000000","message":"Can both of these updates be done at once?","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3c702092128232508549bba2dafd2d793bc34fac","unresolved":false,"context_lines":[{"line_number":878,"context_line":"        # admin reset"},{"line_number":879,"context_line":"        admin_password \u003d uuid.uuid4().hex"},{"line_number":880,"context_line":"        self.user[\u0027password\u0027] \u003d admin_password"},{"line_number":881,"context_line":"        self.identity_api.update_user(self.user[\u0027id\u0027], self.user)"},{"line_number":882,"context_line":"        # user id should be ignored for this check"},{"line_number":883,"context_line":"        self.assertPasswordIsNotExpired(self.user[\u0027id\u0027], admin_password)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_345f890f","line":881,"in_reply_to":"3a461143_1e954edd","updated":"2017-01-27 14:09:30.000000000","message":"Done","commit_id":"3f1dcb1f5cabdafe0e50a9b1cb7d17836d6e82ab"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9d796719aa35c8ee83fe90c436b7efad7055a3","unresolved":false,"context_lines":[{"line_number":864,"context_line":"        self.config_fixture.config("},{"line_number":865,"context_line":"            group\u003d\u0027security_compliance\u0027,"},{"line_number":866,"context_line":"            change_password_upon_first_use\u003dFalse)"},{"line_number":867,"context_line":"        # admin reset"},{"line_number":868,"context_line":"        admin_password \u003d uuid.uuid4().hex"},{"line_number":869,"context_line":"        self.user[\u0027password\u0027] \u003d admin_password"},{"line_number":870,"context_line":"        self.identity_api.update_user(self.user[\u0027id\u0027], self.user)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_1d69d18b","line":867,"updated":"2017-01-27 14:54:15.000000000","message":"add this before the admin reset: \n\n    self.assertPasswordIsNotExpired(self.user[\u0027id\u0027], self.initial_password)","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e77d4a7b421f428d5d8ebed48f158bd963591565","unresolved":false,"context_lines":[{"line_number":864,"context_line":"        self.config_fixture.config("},{"line_number":865,"context_line":"            group\u003d\u0027security_compliance\u0027,"},{"line_number":866,"context_line":"            change_password_upon_first_use\u003dFalse)"},{"line_number":867,"context_line":"        # admin reset"},{"line_number":868,"context_line":"        admin_password \u003d uuid.uuid4().hex"},{"line_number":869,"context_line":"        self.user[\u0027password\u0027] \u003d admin_password"},{"line_number":870,"context_line":"        self.identity_api.update_user(self.user[\u0027id\u0027], self.user)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_2e4e556f","line":867,"in_reply_to":"3a461143_1d69d18b","updated":"2017-01-27 16:21:39.000000000","message":"Done","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9d796719aa35c8ee83fe90c436b7efad7055a3","unresolved":false,"context_lines":[{"line_number":874,"context_line":"    def test_password_not_expired_for_ignore_user(self):"},{"line_number":875,"context_line":"        # ignore password expiry"},{"line_number":876,"context_line":"        self.user[\u0027options\u0027][constants.IGNORE_PASSWORD_EXPIRY] \u003d True"},{"line_number":877,"context_line":"        # admin reset"},{"line_number":878,"context_line":"        admin_password \u003d uuid.uuid4().hex"},{"line_number":879,"context_line":"        self.user[\u0027password\u0027] \u003d admin_password"},{"line_number":880,"context_line":"        self.identity_api.update_user(self.user[\u0027id\u0027], self.user)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_bdfa7dbb","line":877,"updated":"2017-01-27 14:54:15.000000000","message":"add this before the admin reset: \n\n    self.assertPasswordIsNotExpired(self.user[\u0027id\u0027], self.initial_password)","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e77d4a7b421f428d5d8ebed48f158bd963591565","unresolved":false,"context_lines":[{"line_number":874,"context_line":"    def test_password_not_expired_for_ignore_user(self):"},{"line_number":875,"context_line":"        # ignore password expiry"},{"line_number":876,"context_line":"        self.user[\u0027options\u0027][constants.IGNORE_PASSWORD_EXPIRY] \u003d True"},{"line_number":877,"context_line":"        # admin reset"},{"line_number":878,"context_line":"        admin_password \u003d uuid.uuid4().hex"},{"line_number":879,"context_line":"        self.user[\u0027password\u0027] \u003d admin_password"},{"line_number":880,"context_line":"        self.identity_api.update_user(self.user[\u0027id\u0027], self.user)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_6e585d33","line":877,"in_reply_to":"3a461143_bdfa7dbb","updated":"2017-01-27 16:21:39.000000000","message":"Done","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"}],"keystone/tests/unit/test_v3_identity.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"    def test_change_password_allowed_after_first_use(self):"},{"line_number":1003,"context_line":"        time \u003d datetime.datetime.utcnow()"},{"line_number":1004,"context_line":"        with freezegun.freeze_time(time) as frozen_datetime:"},{"line_number":1005,"context_line":"            self.config_fixture.config("},{"line_number":1006,"context_line":"                group\u003d\u0027security_compliance\u0027,"},{"line_number":1007,"context_line":"                change_password_after_first_use\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_3c506f5e","line":1004,"updated":"2017-01-26 21:36:28.000000000","message":"We must need clock controller here because the token provider API is checking issued_at times of the token against the revocation event\u0027s issued_before times (which should be when the password is changed).","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"    def test_change_password_allowed_after_first_use(self):"},{"line_number":1003,"context_line":"        time \u003d datetime.datetime.utcnow()"},{"line_number":1004,"context_line":"        with freezegun.freeze_time(time) as frozen_datetime:"},{"line_number":1005,"context_line":"            self.config_fixture.config("},{"line_number":1006,"context_line":"                group\u003d\u0027security_compliance\u0027,"},{"line_number":1007,"context_line":"                change_password_after_first_use\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_7ddcae12","line":1004,"in_reply_to":"3a461143_3c506f5e","updated":"2017-01-27 00:13:22.000000000","message":"Yes, however because we\u0027ve changed the business logic, this no longer applies.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"336da5aab5c6733a7574b8c0ee8c56315e239e3f","unresolved":false,"context_lines":[{"line_number":975,"context_line":"                             original_password\u003dpassword,"},{"line_number":976,"context_line":"                             expected_status\u003dhttp_client.UNAUTHORIZED)"},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"    def test_change_password_required_upon_first_use(self):"},{"line_number":979,"context_line":"        self.config_fixture.config(group\u003d\u0027security_compliance\u0027,"},{"line_number":980,"context_line":"                                   change_password_upon_first_use\u003dTrue)"},{"line_number":981,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_c073e07e","line":978,"updated":"2017-01-27 15:16:57.000000000","message":"If we do add another test that exercises the create path - we could update the name of this to be more specific:\n\n  def test_change_password_required_after_admin_updates_user(self):\n      ...\n  def test_change_password_required_after_create_user(self):\n      ...","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e77d4a7b421f428d5d8ebed48f158bd963591565","unresolved":false,"context_lines":[{"line_number":975,"context_line":"                             original_password\u003dpassword,"},{"line_number":976,"context_line":"                             expected_status\u003dhttp_client.UNAUTHORIZED)"},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"    def test_change_password_required_upon_first_use(self):"},{"line_number":979,"context_line":"        self.config_fixture.config(group\u003d\u0027security_compliance\u0027,"},{"line_number":980,"context_line":"                                   change_password_upon_first_use\u003dTrue)"},{"line_number":981,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_a9d23ffe","line":978,"in_reply_to":"3a461143_c073e07e","updated":"2017-01-27 16:21:39.000000000","message":"Done","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"336da5aab5c6733a7574b8c0ee8c56315e239e3f","unresolved":false,"context_lines":[{"line_number":982,"context_line":"        # admin reset"},{"line_number":983,"context_line":"        reset_password \u003d uuid.uuid4().hex"},{"line_number":984,"context_line":"        user_password \u003d {\u0027password\u0027: reset_password}"},{"line_number":985,"context_line":"        self.identity_api.update_user(self.user_ref[\u0027id\u0027], user_password)"},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"        # attempt to authenticate with admin reset password"},{"line_number":988,"context_line":"        self.get_request_token(reset_password,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_e0c0dc7e","line":985,"updated":"2017-01-27 15:16:57.000000000","message":"We could add this same test but change this to create_user.","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e77d4a7b421f428d5d8ebed48f158bd963591565","unresolved":false,"context_lines":[{"line_number":982,"context_line":"        # admin reset"},{"line_number":983,"context_line":"        reset_password \u003d uuid.uuid4().hex"},{"line_number":984,"context_line":"        user_password \u003d {\u0027password\u0027: reset_password}"},{"line_number":985,"context_line":"        self.identity_api.update_user(self.user_ref[\u0027id\u0027], user_password)"},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"        # attempt to authenticate with admin reset password"},{"line_number":988,"context_line":"        self.get_request_token(reset_password,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_e9dc4714","line":985,"in_reply_to":"3a461143_e0c0dc7e","updated":"2017-01-27 16:21:39.000000000","message":"Done","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9d796719aa35c8ee83fe90c436b7efad7055a3","unresolved":false,"context_lines":[{"line_number":995,"context_line":"                             expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":996,"context_line":""},{"line_number":997,"context_line":"        # authenticate with the new password"},{"line_number":998,"context_line":"        self.token \u003d self.get_request_token(new_password, http_client.CREATED)"},{"line_number":999,"context_line":""},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"class PasswordValidationTestCase(ChangePasswordTestCase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_9d806148","line":998,"updated":"2017-01-27 14:54:15.000000000","message":"great test, very easy to read","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e77d4a7b421f428d5d8ebed48f158bd963591565","unresolved":false,"context_lines":[{"line_number":995,"context_line":"                             expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":996,"context_line":""},{"line_number":997,"context_line":"        # authenticate with the new password"},{"line_number":998,"context_line":"        self.token \u003d self.get_request_token(new_password, http_client.CREATED)"},{"line_number":999,"context_line":""},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"class PasswordValidationTestCase(ChangePasswordTestCase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_09d8b31c","line":998,"in_reply_to":"3a461143_9d806148","updated":"2017-01-27 16:21:39.000000000","message":"Thanks :)","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"}],"keystone/tests/unit/test_validation.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c5bea92d19865129bff73c204af4b4d4eefa4370","unresolved":false,"context_lines":[{"line_number":1812,"context_line":"        request_to_validate \u003d {"},{"line_number":1813,"context_line":"            \u0027name\u0027: self.user_name,"},{"line_number":1814,"context_line":"            \u0027options\u0027: {"},{"line_number":1815,"context_line":"                \u0027whatever\u0027: True"},{"line_number":1816,"context_line":"            }"},{"line_number":1817,"context_line":"        }"},{"line_number":1818,"context_line":"        self.assertRaises(exception.SchemaValidationError,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_bcbfff5e","line":1815,"updated":"2017-01-26 21:36:28.000000000","message":"This fails because `whatever` isn\u0027t registered as an option, right?","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f53650dc561aa6079f7b53bed225af8ca26c4bf","unresolved":false,"context_lines":[{"line_number":1812,"context_line":"        request_to_validate \u003d {"},{"line_number":1813,"context_line":"            \u0027name\u0027: self.user_name,"},{"line_number":1814,"context_line":"            \u0027options\u0027: {"},{"line_number":1815,"context_line":"                \u0027whatever\u0027: True"},{"line_number":1816,"context_line":"            }"},{"line_number":1817,"context_line":"        }"},{"line_number":1818,"context_line":"        self.assertRaises(exception.SchemaValidationError,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_dd07627f","line":1815,"in_reply_to":"3a461143_bcbfff5e","updated":"2017-01-27 00:13:22.000000000","message":"Yes, and we don\u0027t allow additional attributes in options.","commit_id":"3e3e646b9c535d7a27332368ad9cdcc20f4bb805"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7e9d796719aa35c8ee83fe90c436b7efad7055a3","unresolved":false,"context_lines":[{"line_number":1808,"context_line":"                          self.create_user_validator.validate,"},{"line_number":1809,"context_line":"                          request_to_validate)"},{"line_number":1810,"context_line":""},{"line_number":1811,"context_line":"    def test_user_create_options_fails_invalid_name(self):"},{"line_number":1812,"context_line":"        request_to_validate \u003d {"},{"line_number":1813,"context_line":"            \u0027name\u0027: self.user_name,"},{"line_number":1814,"context_line":"            \u0027options\u0027: {"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_7df495f1","line":1811,"range":{"start_line":1811,"start_character":47,"end_line":1811,"end_character":51},"updated":"2017-01-27 14:54:15.000000000","message":"option","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e77d4a7b421f428d5d8ebed48f158bd963591565","unresolved":false,"context_lines":[{"line_number":1808,"context_line":"                          self.create_user_validator.validate,"},{"line_number":1809,"context_line":"                          request_to_validate)"},{"line_number":1810,"context_line":""},{"line_number":1811,"context_line":"    def test_user_create_options_fails_invalid_name(self):"},{"line_number":1812,"context_line":"        request_to_validate \u003d {"},{"line_number":1813,"context_line":"            \u0027name\u0027: self.user_name,"},{"line_number":1814,"context_line":"            \u0027options\u0027: {"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a461143_bd5fdd3f","line":1811,"range":{"start_line":1811,"start_character":47,"end_line":1811,"end_character":51},"in_reply_to":"3a461143_7df495f1","updated":"2017-01-27 16:21:39.000000000","message":"Done","commit_id":"38c8f8375a7ed6391bfdfb79ab2cb35b30f58553"}],"releasenotes/notes/pci-force-password-change-after-reset-ca22c216ec26cc9b.yaml":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4088041cc99ab5ebc002156385e9d5c4dcd2fb4b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"3a461143_21190389","updated":"2017-01-27 17:57:31.000000000","message":"rename this to bug-1645487-ca22c216ec26cc9b.yaml","commit_id":"5deea27bbf92ae06e30a93263000dfd7580a64f2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4088041cc99ab5ebc002156385e9d5c4dcd2fb4b","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    Added a new PCI-DSS feature that will require users to immediately change"},{"line_number":6,"context_line":"    their password upon first use for new users and after an administrative"},{"line_number":7,"context_line":"    password reset. The new feature can be enabled by setting"},{"line_number":8,"context_line":"    ``[security_compliance] change_password_upon_first_use`` in"},{"line_number":9,"context_line":"    ``keystone.conf``."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"3a461143_640a3923","line":9,"range":{"start_line":8,"start_character":61,"end_line":9,"end_character":21},"updated":"2017-01-27 17:57:31.000000000","message":"s/in ``keystone.conf``/ to ``True``\n\ni think the square brackets are enough to indicate keystone.conf needs to be changed, we\u0027ve been doing that in many places","commit_id":"5deea27bbf92ae06e30a93263000dfd7580a64f2"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"004a241ac5095fda00f8a78ad56f85fa171bb188","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    Added a new PCI-DSS feature that will require users to immediately change"},{"line_number":6,"context_line":"    their password upon first use for new users and after an administrative"},{"line_number":7,"context_line":"    password reset. The new feature can be enabled by setting"},{"line_number":8,"context_line":"    ``[security_compliance] change_password_upon_first_use`` in"},{"line_number":9,"context_line":"    ``keystone.conf``."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"3a461143_973bd5d0","line":9,"range":{"start_line":8,"start_character":61,"end_line":9,"end_character":21},"in_reply_to":"3a461143_640a3923","updated":"2017-01-27 18:08:51.000000000","message":"Done","commit_id":"5deea27bbf92ae06e30a93263000dfd7580a64f2"}]}
