)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"381b6d1915d9617ea0b9afb90e697b32be99a890","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"User options [1] can be set by making POST and PATCH"},{"line_number":10,"context_line":"request for /v3/users API calls but cannot by openstack"},{"line_number":11,"context_line":"CLI because of no \u0027options\u0027 parameter in create and update"},{"line_number":12,"context_line":"user CLI [2]. This patch add the \u0027options\u0027 parameter in"},{"line_number":13,"context_line":"create user and update user CLI."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"[1] https://docs.openstack.org/keystone/latest/admin/resource-options.html#multi-factor-auth-rules"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"1fa4df85_2355fd1d","line":12,"range":{"start_line":11,"start_character":4,"end_line":12,"end_character":52},"updated":"2020-02-27 18:53:48.000000000","message":"Please update this commit message.","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"0376169ad16f7a2791fc5d0b56924e823a8a79f8","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"User options [1] can be set by making POST and PATCH"},{"line_number":10,"context_line":"request for /v3/users API calls but cannot by openstack"},{"line_number":11,"context_line":"CLI because of no \u0027options\u0027 parameter in create and update"},{"line_number":12,"context_line":"user CLI [2]. This patch add the \u0027options\u0027 parameter in"},{"line_number":13,"context_line":"create user and update user CLI."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"[1] https://docs.openstack.org/keystone/latest/admin/resource-options.html#multi-factor-auth-rules"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"1fa4df85_71ad089a","line":12,"range":{"start_line":11,"start_character":4,"end_line":12,"end_character":52},"in_reply_to":"1fa4df85_2355fd1d","updated":"2020-03-16 06:48:31.000000000","message":"Done","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"}],"doc/source/cli/command-objects/user.rst":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a44c9cd9c1b101dea6f83c1fd20e2625a1d427a3","unresolved":false,"context_lines":[{"line_number":60,"context_line":".. option:: --options \u003coptions\u003e"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    A JSON-formatted list of user options, for example"},{"line_number":63,"context_line":"    \u0027{\"multi_factor_auth_enabled\": true,\"ignore_change_password_upon_first_use\": true}\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    Resource options for the user"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_e8497965","line":63,"updated":"2020-01-27 18:17:19.000000000","message":"It feels like we\u0027re letting the implementation in keystone bleed through to the client by having users put together strings of JSON, when we might do something like this.\n\n  --enable-multi-factor-auth | --disable-multi-factor-auth \\\n  --change-password-on-first-use True|False\n\nAlternatively, the current solutions will continue to work for new options and certainly isn\u0027t specific, which is nice.","commit_id":"8d2cfb0ba831e3eb66d23f01596514669dfd5533"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5c3504e3d2aed3bb34a1e028efdefae2010ec65c","unresolved":false,"context_lines":[{"line_number":60,"context_line":".. option:: --options \u003coptions\u003e"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    A JSON-formatted list of user options, for example"},{"line_number":63,"context_line":"    \u0027{\"multi_factor_auth_enabled\": true,\"ignore_change_password_upon_first_use\": true}\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    Resource options for the user"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_ba7d72c4","line":63,"in_reply_to":"3fa7e38b_b9897270","updated":"2020-02-06 11:08:30.000000000","message":"Done","commit_id":"8d2cfb0ba831e3eb66d23f01596514669dfd5533"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5c3504e3d2aed3bb34a1e028efdefae2010ec65c","unresolved":false,"context_lines":[{"line_number":60,"context_line":".. option:: --options \u003coptions\u003e"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    A JSON-formatted list of user options, for example"},{"line_number":63,"context_line":"    \u0027{\"multi_factor_auth_enabled\": true,\"ignore_change_password_upon_first_use\": true}\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    Resource options for the user"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_7a87fab4","line":63,"in_reply_to":"3fa7e38b_e8497965","updated":"2020-02-06 11:08:30.000000000","message":"Done","commit_id":"8d2cfb0ba831e3eb66d23f01596514669dfd5533"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"024e5f215c149ae4f57b86b5bbd6767b4466c5fb","unresolved":false,"context_lines":[{"line_number":60,"context_line":".. option:: --options \u003coptions\u003e"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    A JSON-formatted list of user options, for example"},{"line_number":63,"context_line":"    \u0027{\"multi_factor_auth_enabled\": true,\"ignore_change_password_upon_first_use\": true}\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    Resource options for the user"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_f26aaa4d","line":63,"in_reply_to":"3fa7e38b_e8497965","updated":"2020-01-29 04:38:52.000000000","message":"Totally agree. Options like what Lance commented are much better from the perspective of CLI. There is no need to mirror the API definition.\n\nIMHO at least CLI option should be per key of user options.\n\nFor keys whose values are complex like array, we can parse string and convert it into what the keystone API expects.\nFor example,\n\n  --multi-factor-auth-rules password:totp,password:u2f\n\nfor [1].\n\nFor key-value pair, osc-lib provides convenient parsers [2].\n\n[1] https://docs.openstack.org/keystone/latest/admin/resource-options.html#multi-factor-auth-rules\n[2] https://opendev.org/openstack/osc-lib/src/branch/master/osc_lib/cli/parseractions.py","commit_id":"8d2cfb0ba831e3eb66d23f01596514669dfd5533"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"f4ee5bb88828eefb148b3da55195af537310301e","unresolved":false,"context_lines":[{"line_number":60,"context_line":".. option:: --options \u003coptions\u003e"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    A JSON-formatted list of user options, for example"},{"line_number":63,"context_line":"    \u0027{\"multi_factor_auth_enabled\": true,\"ignore_change_password_upon_first_use\": true}\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    Resource options for the user"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_b9897270","line":63,"in_reply_to":"3fa7e38b_f26aaa4d","updated":"2020-01-29 14:42:12.000000000","message":"Agreed, especially since resource options aren\u0027t arbitrary json. They are known ahead of time since they\u0027re part of the keystone codebase. Hence we can make a change to OSC every time we add a new option, in tandem.","commit_id":"8d2cfb0ba831e3eb66d23f01596514669dfd5533"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5c3504e3d2aed3bb34a1e028efdefae2010ec65c","unresolved":false,"context_lines":[{"line_number":60,"context_line":".. option:: --options \u003coptions\u003e"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    A JSON-formatted list of user options, for example"},{"line_number":63,"context_line":"    \u0027{\"multi_factor_auth_enabled\": true,\"ignore_change_password_upon_first_use\": true}\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    Resource options for the user"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fa7e38b_5a8c7ed7","line":63,"in_reply_to":"3fa7e38b_f26aaa4d","updated":"2020-02-06 11:08:30.000000000","message":"Done","commit_id":"8d2cfb0ba831e3eb66d23f01596514669dfd5533"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3bc2bad9e8e67ebd319151f9102d0b659fcdf136","unresolved":false,"context_lines":[{"line_number":19,"context_line":"        [--password-prompt]"},{"line_number":20,"context_line":"        [--email \u003cemail-address\u003e]"},{"line_number":21,"context_line":"        [--description \u003cdescription\u003e]"},{"line_number":22,"context_line":"        [--multi_factor_auth_rule \u003crule\u003e]"},{"line_number":23,"context_line":"        [--enable-lockout-failure-attempts| --disable-lockout-failure-attempts]"},{"line_number":24,"context_line":"        [--enable-password-expiry| --disable-password-expiry]"},{"line_number":25,"context_line":"        [--enable-change-password-upon-first-use| --disable-change-password-upon-first-use]"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3fa7e38b_8f32fa0d","line":22,"range":{"start_line":22,"start_character":9,"end_line":22,"end_character":33},"updated":"2020-02-19 05:57:08.000000000","message":"--multi-factor-auth-rule","commit_id":"8e4785cf1e206b875cf3337ea3e7dba79fbbaa15"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"490ac02af36c46764236a582a6c52a2dcdbedb14","unresolved":false,"context_lines":[{"line_number":19,"context_line":"        [--password-prompt]"},{"line_number":20,"context_line":"        [--email \u003cemail-address\u003e]"},{"line_number":21,"context_line":"        [--description \u003cdescription\u003e]"},{"line_number":22,"context_line":"        [--multi_factor_auth_rule \u003crule\u003e]"},{"line_number":23,"context_line":"        [--enable-lockout-failure-attempts| --disable-lockout-failure-attempts]"},{"line_number":24,"context_line":"        [--enable-password-expiry| --disable-password-expiry]"},{"line_number":25,"context_line":"        [--enable-change-password-upon-first-use| --disable-change-password-upon-first-use]"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3fa7e38b_affa3d0d","line":22,"range":{"start_line":22,"start_character":9,"end_line":22,"end_character":33},"in_reply_to":"3fa7e38b_8f32fa0d","updated":"2020-02-20 10:26:12.000000000","message":"Done","commit_id":"8e4785cf1e206b875cf3337ea3e7dba79fbbaa15"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3bc2bad9e8e67ebd319151f9102d0b659fcdf136","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    Disables the MFA (Multi Factor Auth)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":".. option:: --multi_factor_auth_rule \u003crule\u003e"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    If user wants to define a rule set as [[\"password\", \"totp\"]],"},{"line_number":117,"context_line":"    It should be passed same as below,"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3fa7e38b_af37b6fd","line":114,"range":{"start_line":114,"start_character":11,"end_line":114,"end_character":36},"updated":"2020-02-19 05:57:08.000000000","message":"--multi-factor-auth-rule","commit_id":"8e4785cf1e206b875cf3337ea3e7dba79fbbaa15"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"490ac02af36c46764236a582a6c52a2dcdbedb14","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    Disables the MFA (Multi Factor Auth)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":".. option:: --multi_factor_auth_rule \u003crule\u003e"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    If user wants to define a rule set as [[\"password\", \"totp\"]],"},{"line_number":117,"context_line":"    It should be passed same as below,"}],"source_content_type":"text/x-rst","patch_set":17,"id":"3fa7e38b_4f014903","line":114,"range":{"start_line":114,"start_character":11,"end_line":114,"end_character":36},"in_reply_to":"3fa7e38b_af37b6fd","updated":"2020-02-20 10:26:12.000000000","message":"Done","commit_id":"8e4785cf1e206b875cf3337ea3e7dba79fbbaa15"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"381b6d1915d9617ea0b9afb90e697b32be99a890","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    .. versionadded:: 3"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. option:: --enable-lockout-failure-attempts"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    It will lock out the user after it has failed to authenticate the"},{"line_number":68,"context_line":"    maximum number of attempts, disabling the user (default)"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_fe63f8da","line":65,"range":{"start_line":65,"start_character":12,"end_line":65,"end_character":45},"updated":"2020-02-27 18:53:48.000000000","message":"The option is ignore_lockout_failure_attempts, the \"ignore\" is important. The action here isn\u0027t the lockout, it\u0027s the ignoring attempts.","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"21c45027bb85365b3596832a7073000992ba7c9d","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    .. versionadded:: 3"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. option:: --enable-lockout-failure-attempts"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    It will lock out the user after it has failed to authenticate the"},{"line_number":68,"context_line":"    maximum number of attempts, disabling the user (default)"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_b996b592","line":65,"range":{"start_line":65,"start_character":12,"end_line":65,"end_character":45},"in_reply_to":"1fa4df85_64467a52","updated":"2020-03-03 23:14:17.000000000","message":"I think --ignore-* and --no-ignore-* work best here.","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"0376169ad16f7a2791fc5d0b56924e823a8a79f8","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    .. versionadded:: 3"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. option:: --enable-lockout-failure-attempts"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    It will lock out the user after it has failed to authenticate the"},{"line_number":68,"context_line":"    maximum number of attempts, disabling the user (default)"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_318f902f","line":65,"range":{"start_line":65,"start_character":12,"end_line":65,"end_character":45},"in_reply_to":"1fa4df85_b996b592","updated":"2020-03-16 06:48:31.000000000","message":"Done","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d55eadfe36fd4ed816822a16bd67b435794d508f","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    .. versionadded:: 3"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. option:: --enable-lockout-failure-attempts"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    It will lock out the user after it has failed to authenticate the"},{"line_number":68,"context_line":"    maximum number of attempts, disabling the user (default)"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_64467a52","line":65,"range":{"start_line":65,"start_character":12,"end_line":65,"end_character":45},"in_reply_to":"1fa4df85_c73ad532","updated":"2020-03-02 11:17:02.000000000","message":"The intention of my original comment is \u0027\u0027-enable-ignore-lockout-failure-attempts\" looks odd when I see the option name. \"ignore\" is a verb, so I believe verb-verb style is not common. Per Colleen\u0027s comment, using \"--ignore-xxx\" (and the opposite option) sounds good.\n\nIn my original comment, I suggested various patterns for boolean options used in OSC: --enable-foo/--disable-foo, --bar/--no-bar, or more meaningless pair of names like --public/--private. You can choose appropriate pair of option names.","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"7eda933659bd666c21e3a6a098c6de1d48f87039","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    .. versionadded:: 3"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. option:: --enable-lockout-failure-attempts"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    It will lock out the user after it has failed to authenticate the"},{"line_number":68,"context_line":"    maximum number of attempts, disabling the user (default)"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_c73ad532","line":65,"range":{"start_line":65,"start_character":12,"end_line":65,"end_character":45},"in_reply_to":"1fa4df85_fe63f8da","updated":"2020-03-02 06:34:22.000000000","message":"As per amotoki\u0027s suggestion in patchset 14, I removed these \u0027ignores\u0027. If this is being passed by the user in CLI the value set  for ignore_lockout_failure_attempts in keystone False.\n\nShould I add these ignores again and update the code accordingly?","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"381b6d1915d9617ea0b9afb90e697b32be99a890","unresolved":false,"context_lines":[{"line_number":65,"context_line":".. option:: --enable-lockout-failure-attempts"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    It will lock out the user after it has failed to authenticate the"},{"line_number":68,"context_line":"    maximum number of attempts, disabling the user (default)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":".. option:: --disable-lockout-failure-attempts"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_7e22a8a6","line":68,"updated":"2020-02-27 18:53:48.000000000","message":"Maybe use the descriptions from the documentation as a starting point: https://docs.openstack.org/keystone/latest/admin/resource-options.html\n\nThe way these are  currently phrased, e.g. \"It will...\" is awkward and ambiguous. Suggest not starting with \"It\" since it is not clear what \"It\" is, but instead just describe the action: \"Opt into ignoring the number of times a user has authenticated and locking out the user as a result.\"","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"0376169ad16f7a2791fc5d0b56924e823a8a79f8","unresolved":false,"context_lines":[{"line_number":65,"context_line":".. option:: --enable-lockout-failure-attempts"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    It will lock out the user after it has failed to authenticate the"},{"line_number":68,"context_line":"    maximum number of attempts, disabling the user (default)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":".. option:: --disable-lockout-failure-attempts"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_d19ddc66","line":68,"in_reply_to":"1fa4df85_7e22a8a6","updated":"2020-03-16 06:48:31.000000000","message":"Done","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"381b6d1915d9617ea0b9afb90e697b32be99a890","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    It ignores the number of authentication requests a user tries and"},{"line_number":73,"context_line":"    does not locks out the user as a result"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":".. option:: --enable-change-password-upon-first-use"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    Request a user to change its password when the user is created or"},{"line_number":78,"context_line":"    upon administrative reset. Before accessing any services, the user"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_de9e3cb7","line":75,"range":{"start_line":75,"start_character":12,"end_line":75,"end_character":51},"updated":"2020-02-27 18:53:48.000000000","message":"Here too, the option is about ignoring the global setting.","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"0376169ad16f7a2791fc5d0b56924e823a8a79f8","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    It ignores the number of authentication requests a user tries and"},{"line_number":73,"context_line":"    does not locks out the user as a result"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":".. option:: --enable-change-password-upon-first-use"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    Request a user to change its password when the user is created or"},{"line_number":78,"context_line":"    upon administrative reset. Before accessing any services, the user"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_f1981876","line":75,"range":{"start_line":75,"start_character":12,"end_line":75,"end_character":51},"in_reply_to":"1fa4df85_de9e3cb7","updated":"2020-03-16 06:48:31.000000000","message":"Done","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"381b6d1915d9617ea0b9afb90e697b32be99a890","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":".. option:: --enable-change-password-upon-first-use"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    Request a user to change its password when the user is created or"},{"line_number":78,"context_line":"    upon administrative reset. Before accessing any services, the user"},{"line_number":79,"context_line":"    will have to change the password (default)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_9e81a44d","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":41},"updated":"2020-02-27 18:53:48.000000000","message":"Awkward wording, suggest referring to the documentation: \"Control if a user should be forced to change their password immediately after they log into keystone for the first time.\"","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"0376169ad16f7a2791fc5d0b56924e823a8a79f8","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":".. option:: --enable-change-password-upon-first-use"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    Request a user to change its password when the user is created or"},{"line_number":78,"context_line":"    upon administrative reset. Before accessing any services, the user"},{"line_number":79,"context_line":"    will have to change the password (default)"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_9189a427","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":41},"in_reply_to":"1fa4df85_9e81a44d","updated":"2020-03-16 06:48:31.000000000","message":"Done","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"381b6d1915d9617ea0b9afb90e697b32be99a890","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    or upon administrative reset. Before accessing any services, the user"},{"line_number":85,"context_line":"    will not have to change the password"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":".. option:: --enable-password-expiry"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    It will not allow user to continue using passwords that maybe expired"},{"line_number":90,"context_line":"    (default)"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_3e98b0be","line":87,"range":{"start_line":87,"start_character":12,"end_line":87,"end_character":36},"updated":"2020-02-27 18:53:48.000000000","message":"Again, missing ignore","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"0376169ad16f7a2791fc5d0b56924e823a8a79f8","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    or upon administrative reset. Before accessing any services, the user"},{"line_number":85,"context_line":"    will not have to change the password"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":".. option:: --enable-password-expiry"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    It will not allow user to continue using passwords that maybe expired"},{"line_number":90,"context_line":"    (default)"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_b18ce035","line":87,"range":{"start_line":87,"start_character":12,"end_line":87,"end_character":36},"in_reply_to":"1fa4df85_3e98b0be","updated":"2020-03-16 06:48:31.000000000","message":"Done","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"381b6d1915d9617ea0b9afb90e697b32be99a890","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    Enables the ability for a user to change its password through"},{"line_number":104,"context_line":"    self-service APIs"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":".. option:: --enable-multi-factor-auth-enabled"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Enables the MFA (Multi Factor Auth) (default)"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_5e932ca4","line":106,"range":{"start_line":106,"start_character":39,"end_line":106,"end_character":46},"updated":"2020-02-27 18:53:48.000000000","message":"Do we need the double enable?","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"0376169ad16f7a2791fc5d0b56924e823a8a79f8","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    Enables the ability for a user to change its password through"},{"line_number":104,"context_line":"    self-service APIs"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":".. option:: --enable-multi-factor-auth-enabled"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    Enables the MFA (Multi Factor Auth) (default)"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_71866816","line":106,"range":{"start_line":106,"start_character":39,"end_line":106,"end_character":46},"in_reply_to":"1fa4df85_5e932ca4","updated":"2020-03-16 06:48:31.000000000","message":"Done","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"381b6d1915d9617ea0b9afb90e697b32be99a890","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":".. option:: --multi-factor-auth-rule \u003crule\u003e"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    If user wants to define a rule set as [[\"password\", \"totp\"]],"},{"line_number":117,"context_line":"    It should be passed same as below,"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    --multi-factor-auth-rule password:totp"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    Allows user to specify MFA rules."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":".. option:: --enable"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_bed2605b","line":121,"range":{"start_line":116,"start_character":4,"end_line":121,"end_character":37},"updated":"2020-02-27 18:53:48.000000000","message":"This looks out of order. Suggest instead:\n\n Set multi-factor auth rules. For example, to set a rule requiring the \"password\" and \"totp\" auth methods to be provided, use:\n\n   --multi-factor-auth-rule password:totp\n\n May be provided multiple times to set different rule combinations.","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"0376169ad16f7a2791fc5d0b56924e823a8a79f8","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":".. option:: --multi-factor-auth-rule \u003crule\u003e"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    If user wants to define a rule set as [[\"password\", \"totp\"]],"},{"line_number":117,"context_line":"    It should be passed same as below,"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    --multi-factor-auth-rule password:totp"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    Allows user to specify MFA rules."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":".. option:: --enable"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_3178f029","line":121,"range":{"start_line":116,"start_character":4,"end_line":121,"end_character":37},"in_reply_to":"1fa4df85_bed2605b","updated":"2020-03-16 06:48:31.000000000","message":"Done","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"381b6d1915d9617ea0b9afb90e697b32be99a890","unresolved":false,"context_lines":[{"line_number":256,"context_line":"    Set user description"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    .. versionadded:: 3"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":".. option:: --enable-lockout-failure-attempts"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    It will lock out the user after it has failed to authenticate the"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_7ecce8bb","line":259,"updated":"2020-02-27 18:53:48.000000000","message":"Comments above apply here as well.","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"0376169ad16f7a2791fc5d0b56924e823a8a79f8","unresolved":false,"context_lines":[{"line_number":256,"context_line":"    Set user description"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    .. versionadded:: 3"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":".. option:: --enable-lockout-failure-attempts"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    It will lock out the user after it has failed to authenticate the"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1fa4df85_f171f845","line":259,"in_reply_to":"1fa4df85_7ecce8bb","updated":"2020-03-16 06:48:31.000000000","message":"Done","commit_id":"278d7f473b280fa09a3b8bd2dd5122d9e0013e8e"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f40a07ee9c241609382480b6093054d13f8a65e3","unresolved":false,"context_lines":[{"line_number":20,"context_line":"        [--email \u003cemail-address\u003e]"},{"line_number":21,"context_line":"        [--description \u003cdescription\u003e]"},{"line_number":22,"context_line":"        [--multi-factor-auth-rule \u003crule\u003e]"},{"line_number":23,"context_line":"        [--ignore-lockout-failure-attempts| --no-ignore-lockout-failure-attempts]"},{"line_number":24,"context_line":"        [--ignore-password-expiry| --no-ignore-password-expiry]"},{"line_number":25,"context_line":"        [--ignore-change-password-upon-first-use| --no-ignore-change-password-upon-first-use]"},{"line_number":26,"context_line":"        [--enable-lock-password| --disable-lock-password]"},{"line_number":27,"context_line":"        [--multi-factor-auth-enabled| --multi-factor-auth-disabled]"},{"line_number":28,"context_line":"        [--enable | --disable]"}],"source_content_type":"text/x-rst","patch_set":23,"id":"1fa4df85_0ca812d9","line":25,"range":{"start_line":23,"start_character":8,"end_line":25,"end_character":93},"updated":"2020-03-18 10:15:50.000000000","message":"question to both Colleen and Vishakha: Colleen suggested --no-ignore-change-password-upon-first-use. What is the difference between --no-change-change-password-upon-first-use and --change-password-upon-first-use? Generally speaking, double inverse makes it difficult to understand the meaning. From OSC user perspective, it is better to avoid using double inverse as much as possible. Vishakha replaced all \u0027enable\u0027/\u0027disable\u0027 to \u0027ignore\u0027/\u0027--no-ignore\u0027 based on Colleen\u0027s suggestion. Could you check double inverse makes sense one by one?\n\nHonestly I still cannot understand why \u0027ignore\u0027 is so important? Is it because it matches keystone implementations? \n\nFor example, --no-ignore-lock-failure-attempts means lockout_failure_attempts is applied to the user. When I see --no-ignore-lockout-failure-attempts I thought it means it enables lock-failure-attempts, but from keystone perseecitve and Colleen\u0027s suggestion, it looks more than that and perhaps I am missing something.","commit_id":"43aa9f10bd553d4e8cf6b1735f62e1a3d8bfe163"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6d9c700a4275b185f9c5c4fac71cf9c82d67477f","unresolved":false,"context_lines":[{"line_number":20,"context_line":"        [--email \u003cemail-address\u003e]"},{"line_number":21,"context_line":"        [--description \u003cdescription\u003e]"},{"line_number":22,"context_line":"        [--multi-factor-auth-rule \u003crule\u003e]"},{"line_number":23,"context_line":"        [--ignore-lockout-failure-attempts| --no-ignore-lockout-failure-attempts]"},{"line_number":24,"context_line":"        [--ignore-password-expiry| --no-ignore-password-expiry]"},{"line_number":25,"context_line":"        [--ignore-change-password-upon-first-use| --no-ignore-change-password-upon-first-use]"},{"line_number":26,"context_line":"        [--enable-lock-password| --disable-lock-password]"},{"line_number":27,"context_line":"        [--multi-factor-auth-enabled| --multi-factor-auth-disabled]"},{"line_number":28,"context_line":"        [--enable | --disable]"}],"source_content_type":"text/x-rst","patch_set":23,"id":"df33271e_7c4a7455","line":25,"range":{"start_line":23,"start_character":8,"end_line":25,"end_character":93},"in_reply_to":"1fa4df85_0a4d4d71","updated":"2020-03-24 11:57:50.000000000","message":"Colleen, thank you very much for the detail. I now understand why \"ignore\" totally makes sense. The actual behavior depends on keystone.conf and these options passed via the API just control whether the corresponding security compliance options are honored or ignored. I believe I also now understand why you commented \"(default)\" is not correct in a past patch set.","commit_id":"43aa9f10bd553d4e8cf6b1735f62e1a3d8bfe163"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"841cd55ec21f67b90993fc313f088344c7f4e5df","unresolved":false,"context_lines":[{"line_number":20,"context_line":"        [--email \u003cemail-address\u003e]"},{"line_number":21,"context_line":"        [--description \u003cdescription\u003e]"},{"line_number":22,"context_line":"        [--multi-factor-auth-rule \u003crule\u003e]"},{"line_number":23,"context_line":"        [--ignore-lockout-failure-attempts| --no-ignore-lockout-failure-attempts]"},{"line_number":24,"context_line":"        [--ignore-password-expiry| --no-ignore-password-expiry]"},{"line_number":25,"context_line":"        [--ignore-change-password-upon-first-use| --no-ignore-change-password-upon-first-use]"},{"line_number":26,"context_line":"        [--enable-lock-password| --disable-lock-password]"},{"line_number":27,"context_line":"        [--multi-factor-auth-enabled| --multi-factor-auth-disabled]"},{"line_number":28,"context_line":"        [--enable | --disable]"}],"source_content_type":"text/x-rst","patch_set":23,"id":"1fa4df85_0a4d4d71","line":25,"range":{"start_line":23,"start_character":8,"end_line":25,"end_character":93},"in_reply_to":"1fa4df85_0ca812d9","updated":"2020-03-18 16:06:52.000000000","message":"\u003e question to both Colleen and Vishakha: Colleen suggested\n \u003e --no-ignore-change-password-upon-first-use. What is the difference\n \u003e between --no-change-change-password-upon-first-use and\n \u003e --change-password-upon-first-use? Generally speaking, double\n \u003e inverse makes it difficult to understand the meaning. From OSC user\n \u003e perspective, it is better to avoid using double inverse as much as\n \u003e possible. Vishakha replaced all \u0027enable\u0027/\u0027disable\u0027 to\n \u003e \u0027ignore\u0027/\u0027--no-ignore\u0027 based on Colleen\u0027s suggestion. Could you\n \u003e check double inverse makes sense one by one?\n \u003e \n \u003e Honestly I still cannot understand why \u0027ignore\u0027 is so important? Is\n \u003e it because it matches keystone implementations?\n \u003e \n \u003e For example, --no-ignore-lock-failure-attempts means\n \u003e lockout_failure_attempts is applied to the user. When I see\n \u003e --no-ignore-lockout-failure-attempts I thought it means it enables\n \u003e lock-failure-attempts, but from keystone perseecitve and Colleen\u0027s\n \u003e suggestion, it looks more than that and perhaps I am missing\n \u003e something.\n\n\u0027ignore\u0027 is important here because these options aren\u0027t being applied to a user in a vacuum, they exist in order to opt users out of global settings that are set in keystone.conf. Consider this example:\n\n* [security_compliance]/change_password_upon_first_use\u003dtrue in keystone.conf\n\n\u003d\u003d\u003e this means that ALL users in keystone MUST change their password before they are able to get a token\n\n* set {\"options\": {\"ignore_change_password_upon_first_use\": true}} for user nova\n\n\u003d\u003d\u003e this means that the nova service user is not required to change its password on first use. This is desirable if we want to apply a global security compliance setting for human users but need to make exceptions for automated or service users\n\n* set {\"options\": {\"ignore_change_password_upon_first_use\": true}} for user bob\n\n\u003d\u003d\u003e oops! bob is a human user, this is a mistake: we actually do want bob to be forced to change his password before logging in\n\n* set {\"options\": {\"ignore_change_password_upon_first_use\": false}} for user bob\n\n\u003d\u003d\u003e this reverses the option, it is the equivalent of removing the option, but the API doesn\u0027t allow removing the option because PATCH does a merge of the JSON object\n\n\n\nHere\u0027s another example:\n\n* There are no [security_compliance] settings set in keystone.conf. All users are free not to change their password and will not be locked out if they fail to authenticate.\n\n* set {\"options\": {\"ignore_change_password_upon_first_use\": true}} for user bob\n\n\u003d\u003d\u003e this has no effect, because change_password_upon_first_use is not set in keystone.conf.\n\n* set {\"options\": {\"ignore_change_password_uopn_first_use\": false}} for user bob\n\n\u003d\u003d\u003e this has no effect, because change_password_upon_first_use is not set in keystone.conf.\n\n\n\nThis is why \u0027ignore\u0027 is important, because we are *ignoring* a setting that exists on the backend, and it has no direct effect on the user if keystone isn\u0027t configured with these options on the backend.","commit_id":"43aa9f10bd553d4e8cf6b1735f62e1a3d8bfe163"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3b4d529885e7b7d961d1779fe083faf54bd5de21","unresolved":false,"context_lines":[{"line_number":65,"context_line":".. option:: --ignore-lockout-failure-attempts"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    Opt into ignoring the number of authentication requests a user"},{"line_number":68,"context_line":"    tries and does not locks out the user as a result (default)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":".. option:: --no-ignore-lockout-failure-attempts"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"1fa4df85_6450c40b","line":68,"range":{"start_line":68,"start_character":54,"end_line":68,"end_character":63},"updated":"2020-03-17 23:32:46.000000000","message":"This isn\u0027t the default, if this option is unset AND the related security_compliance option is set in keystone.conf, then the number of auth attempts is NOT ignored. I think neither the positive or negative cases should be considered \u0027default\u0027, in either case it is setting an option when it would otherwise be empty.","commit_id":"43aa9f10bd553d4e8cf6b1735f62e1a3d8bfe163"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3b4d529885e7b7d961d1779fe083faf54bd5de21","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. option:: --ignore-lockout-failure-attempts"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    Opt into ignoring the number of authentication requests a user"},{"line_number":68,"context_line":"    tries and does not locks out the user as a result (default)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":".. option:: --no-ignore-lockout-failure-attempts"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"1fa4df85_8435c0dc","line":68,"range":{"start_line":67,"start_character":4,"end_line":68,"end_character":53},"updated":"2020-03-17 23:32:46.000000000","message":"suggest instead \"Opt into ignoring the number of times a user has authenticated and locking out the user as a result\"","commit_id":"43aa9f10bd553d4e8cf6b1735f62e1a3d8bfe163"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3b4d529885e7b7d961d1779fe083faf54bd5de21","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":".. option:: --no-ignore-lockout-failure-attempts"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    Opt into lock out the user after it has failed to authenticate"},{"line_number":73,"context_line":"    the maximum number of attempts, disabling the user"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":".. option:: --ignore-change-password-upon-first-use"}],"source_content_type":"text/x-rst","patch_set":23,"id":"1fa4df85_e43b54c5","line":72,"range":{"start_line":72,"start_character":4,"end_line":72,"end_character":30},"updated":"2020-03-17 23:32:46.000000000","message":"This is not what this does, rather it turns off the above ignoring of the security_compliance setting. Setting this on its own does not cause the user to be locked out after failed auth attempts. See https://docs.openstack.org/keystone/latest/admin/configuration.html#security-compliance for more information on what these settings are for.\n\nSuggest instead \"Opt out of ignoring the number of times a user has authenticated and locking out the user as a result.\"\n\nSame comments for other security_compliance options below.","commit_id":"43aa9f10bd553d4e8cf6b1735f62e1a3d8bfe163"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3b4d529885e7b7d961d1779fe083faf54bd5de21","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":".. option:: --enable-multi-factor-auth-enabled"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Enables the MFA (Multi Factor Auth) (default)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":".. option:: --disable-multi-factor-auth-enabled"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"1fa4df85_4476e8a6","line":109,"range":{"start_line":109,"start_character":40,"end_line":109,"end_character":49},"updated":"2020-03-17 23:32:46.000000000","message":"Again this is not the default, if unset users will not have MFA enabled. See https://docs.openstack.org/keystone/latest/admin/multi-factor-authentication.html#enabling-mfa","commit_id":"43aa9f10bd553d4e8cf6b1735f62e1a3d8bfe163"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6d9c700a4275b185f9c5c4fac71cf9c82d67477f","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    Enables the ability for a user to change its password through"},{"line_number":105,"context_line":"    self-service APIs"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":".. option:: --multi-factor-auth-enabled"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Enables the MFA (Multi Factor Auth)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"df33271e_7c91d499","line":107,"range":{"start_line":107,"start_character":12,"end_line":107,"end_character":39},"updated":"2020-03-24 11:57:50.000000000","message":"Does \"--enable-multi-factor-auth\" make  more sense?","commit_id":"ac3e89bbde5a62ce79829f838b8f2b8b091466fa"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"bc982e89046f40e3d00822e140aa10998afbdf07","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    Enables the ability for a user to change its password through"},{"line_number":105,"context_line":"    self-service APIs"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":".. option:: --multi-factor-auth-enabled"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Enables the MFA (Multi Factor Auth)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"df33271e_cdcc91be","line":107,"range":{"start_line":107,"start_character":12,"end_line":107,"end_character":39},"in_reply_to":"df33271e_60abda88","updated":"2020-03-25 14:39:31.000000000","message":"Done","commit_id":"ac3e89bbde5a62ce79829f838b8f2b8b091466fa"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"bc982e89046f40e3d00822e140aa10998afbdf07","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    Enables the ability for a user to change its password through"},{"line_number":105,"context_line":"    self-service APIs"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":".. option:: --multi-factor-auth-enabled"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Enables the MFA (Multi Factor Auth)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"df33271e_adcf8dae","line":107,"range":{"start_line":107,"start_character":12,"end_line":107,"end_character":39},"in_reply_to":"df33271e_7c91d499","updated":"2020-03-25 14:39:31.000000000","message":"Done","commit_id":"ac3e89bbde5a62ce79829f838b8f2b8b091466fa"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"98a25fc8b495bf6f6dc5383c205e3b62e4c30ffd","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    Enables the ability for a user to change its password through"},{"line_number":105,"context_line":"    self-service APIs"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":".. option:: --multi-factor-auth-enabled"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Enables the MFA (Multi Factor Auth)"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"df33271e_60abda88","line":107,"range":{"start_line":107,"start_character":12,"end_line":107,"end_character":39},"in_reply_to":"df33271e_7c91d499","updated":"2020-03-24 22:18:05.000000000","message":"I think that would be fine, it\u0027s consistent with other flags for other commands and preserves the correct meaning.","commit_id":"ac3e89bbde5a62ce79829f838b8f2b8b091466fa"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6d9c700a4275b185f9c5c4fac71cf9c82d67477f","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Enables the MFA (Multi Factor Auth)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":".. option:: --multi-factor-auth-disabled"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    Disables the MFA (Multi Factor Auth)"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"df33271e_5c8e9078","line":111,"range":{"start_line":111,"start_character":12,"end_line":111,"end_character":40},"updated":"2020-03-24 11:57:50.000000000","message":"same as above","commit_id":"ac3e89bbde5a62ce79829f838b8f2b8b091466fa"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"bc982e89046f40e3d00822e140aa10998afbdf07","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Enables the MFA (Multi Factor Auth)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":".. option:: --multi-factor-auth-disabled"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    Disables the MFA (Multi Factor Auth)"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"df33271e_2dbb7d0e","line":111,"range":{"start_line":111,"start_character":12,"end_line":111,"end_character":40},"in_reply_to":"df33271e_40b056f5","updated":"2020-03-25 14:39:31.000000000","message":"Done","commit_id":"ac3e89bbde5a62ce79829f838b8f2b8b091466fa"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"bc982e89046f40e3d00822e140aa10998afbdf07","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Enables the MFA (Multi Factor Auth)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":".. option:: --multi-factor-auth-disabled"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    Disables the MFA (Multi Factor Auth)"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"df33271e_4dc0817c","line":111,"range":{"start_line":111,"start_character":12,"end_line":111,"end_character":40},"in_reply_to":"df33271e_5c8e9078","updated":"2020-03-25 14:39:31.000000000","message":"Done","commit_id":"ac3e89bbde5a62ce79829f838b8f2b8b091466fa"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"98a25fc8b495bf6f6dc5383c205e3b62e4c30ffd","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    Enables the MFA (Multi Factor Auth)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":".. option:: --multi-factor-auth-disabled"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    Disables the MFA (Multi Factor Auth)"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"df33271e_40b056f5","line":111,"range":{"start_line":111,"start_character":12,"end_line":111,"end_character":40},"in_reply_to":"df33271e_5c8e9078","updated":"2020-03-24 22:18:05.000000000","message":"Yes --disable-multi-factor-auth is probably fine.","commit_id":"ac3e89bbde5a62ce79829f838b8f2b8b091466fa"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6d9c700a4275b185f9c5c4fac71cf9c82d67477f","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    --multi-factor-auth-rule password,totp"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    Set multi-factor auth rules (repeat option to set multiple values)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":".. option:: --enable"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"df33271e_3cdc6c73","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":31},"updated":"2020-03-24 11:57:50.000000000","message":"I think this should be first. It looks tricky to start with an example.\n\nThe description needs to match the help text of the corresponding CLI option. The help text looks complete than this.","commit_id":"ac3e89bbde5a62ce79829f838b8f2b8b091466fa"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"bc982e89046f40e3d00822e140aa10998afbdf07","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    --multi-factor-auth-rule password,totp"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    Set multi-factor auth rules (repeat option to set multiple values)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":".. option:: --enable"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":24,"id":"df33271e_8d3729b1","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":31},"in_reply_to":"df33271e_3cdc6c73","updated":"2020-03-25 14:39:31.000000000","message":"Done","commit_id":"ac3e89bbde5a62ce79829f838b8f2b8b091466fa"}],"openstackclient/identity/v3/user.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"f0250ed373ecd9bb89c6e99a0c6899762796b542","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                          \"when a user does not have a password.\"))"},{"line_number":123,"context_line":"        if parsed_args.options:"},{"line_number":124,"context_line":"            try:"},{"line_number":125,"context_line":"                options \u003d json.loads(parsed_args.options)"},{"line_number":126,"context_line":"            except ValueError:"},{"line_number":127,"context_line":"                try:"},{"line_number":128,"context_line":"                    with open(parsed_args.options) as f:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_457141df","line":125,"updated":"2019-12-17 17:49:10.000000000","message":"Unlike federated mapping rules or access rules, there probably won\u0027t be hundreds of these for one user. I think it would be more user-friendly to not require a JSON string but to allow the option to take multiple values, for example: https://opendev.org/openstack/python-openstackclient/src/commit/5b3a827a1ff80e4b51c7ede44b84bf640d5b6380/openstackclient/identity/v3/application_credential.py#L49-L56","commit_id":"5b8c6f4b00a1c9e9de449043aab3d7923e60b978"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"a17c933d6cb44df1210f6e3471a2c2ea6646c92d","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                          \"when a user does not have a password.\"))"},{"line_number":123,"context_line":"        if parsed_args.options:"},{"line_number":124,"context_line":"            try:"},{"line_number":125,"context_line":"                options \u003d json.loads(parsed_args.options)"},{"line_number":126,"context_line":"            except ValueError:"},{"line_number":127,"context_line":"                try:"},{"line_number":128,"context_line":"                    with open(parsed_args.options) as f:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_9fa656c0","line":125,"in_reply_to":"3fa7e38b_457141df","updated":"2019-12-24 10:49:08.000000000","message":"Done","commit_id":"5b8c6f4b00a1c9e9de449043aab3d7923e60b978"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"d6a061c769a24c04bfc607cd6b0bb92c493f8583","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                          \"when a user does not have a password.\"))"},{"line_number":123,"context_line":"        if parsed_args.options:"},{"line_number":124,"context_line":"            try:"},{"line_number":125,"context_line":"                options \u003d json.loads(parsed_args.options)"},{"line_number":126,"context_line":"            except ValueError:"},{"line_number":127,"context_line":"                try:"},{"line_number":128,"context_line":"                    with open(parsed_args.options) as f:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_f9b0dfff","line":125,"in_reply_to":"3fa7e38b_9fa656c0","updated":"2020-01-17 20:56:13.000000000","message":"To close the loop on this for other reviewers, we discussed this on IRC and unfortunately some of the user options (https://docs.openstack.org/keystone/latest/admin/resource-options.html#multi-factor-auth-rules) are fairly complex and there\u0027s not a great way to represent them without using JSON.","commit_id":"5b8c6f4b00a1c9e9de449043aab3d7923e60b978"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"f0250ed373ecd9bb89c6e99a0c6899762796b542","unresolved":false,"context_lines":[{"line_number":426,"context_line":"                    raise exceptions.CommandError("},{"line_number":427,"context_line":"                        _(\"options is not valid JSON string or file does\""},{"line_number":428,"context_line":"                          \" not exist.\"))"},{"line_number":429,"context_line":"        else:"},{"line_number":430,"context_line":"            options \u003d {}"},{"line_number":431,"context_line":"        kwargs[\u0027options\u0027] \u003d options"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        identity_client.users.update(user.id, **kwargs)"},{"line_number":434,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e54b8d83","line":431,"range":{"start_line":429,"start_character":8,"end_line":431,"end_character":35},"updated":"2019-12-17 17:49:10.000000000","message":"If there are no options, just leave it unset in the kwargs (same as the other arguments).","commit_id":"5b8c6f4b00a1c9e9de449043aab3d7923e60b978"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"a17c933d6cb44df1210f6e3471a2c2ea6646c92d","unresolved":false,"context_lines":[{"line_number":426,"context_line":"                    raise exceptions.CommandError("},{"line_number":427,"context_line":"                        _(\"options is not valid JSON string or file does\""},{"line_number":428,"context_line":"                          \" not exist.\"))"},{"line_number":429,"context_line":"        else:"},{"line_number":430,"context_line":"            options \u003d {}"},{"line_number":431,"context_line":"        kwargs[\u0027options\u0027] \u003d options"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        identity_client.users.update(user.id, **kwargs)"},{"line_number":434,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_bfa9d28f","line":431,"range":{"start_line":429,"start_character":8,"end_line":431,"end_character":35},"in_reply_to":"3fa7e38b_e54b8d83","updated":"2019-12-24 10:49:08.000000000","message":"Done","commit_id":"5b8c6f4b00a1c9e9de449043aab3d7923e60b978"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"9a2543f909089af61f0035cd3d4d385f15ecc760","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        if not parsed_args.password:"},{"line_number":123,"context_line":"            LOG.warning(_(\"No password was supplied, authentication will fail \""},{"line_number":124,"context_line":"                          \"when a user does not have a password.\"))"},{"line_number":125,"context_line":"        options \u003d []"},{"line_number":126,"context_line":"        if parsed_args.options:"},{"line_number":127,"context_line":"            for option in parsed_args.options:"},{"line_number":128,"context_line":"                options.append(option)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_6e582e24","line":125,"range":{"start_line":125,"start_character":18,"end_line":125,"end_character":20},"updated":"2020-01-08 21:37:57.000000000","message":"This is failing api schema validation:\n\n\"Invalid input for field \u0027options\u0027: [] is not of type \u0027object\u0027\"","commit_id":"46446f4dc528202058e4b89f5541be480369690e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"56b54159777936decfbc681cefe89f99ea28f77d","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        if not parsed_args.password:"},{"line_number":123,"context_line":"            LOG.warning(_(\"No password was supplied, authentication will fail \""},{"line_number":124,"context_line":"                          \"when a user does not have a password.\"))"},{"line_number":125,"context_line":"        options \u003d []"},{"line_number":126,"context_line":"        if parsed_args.options:"},{"line_number":127,"context_line":"            for option in parsed_args.options:"},{"line_number":128,"context_line":"                options.append(option)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_66b27c07","line":125,"range":{"start_line":125,"start_character":18,"end_line":125,"end_character":20},"in_reply_to":"3fa7e38b_0e82da52","updated":"2020-01-10 11:19:41.000000000","message":"Done for schema","commit_id":"46446f4dc528202058e4b89f5541be480369690e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"56b54159777936decfbc681cefe89f99ea28f77d","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        if not parsed_args.password:"},{"line_number":123,"context_line":"            LOG.warning(_(\"No password was supplied, authentication will fail \""},{"line_number":124,"context_line":"                          \"when a user does not have a password.\"))"},{"line_number":125,"context_line":"        options \u003d []"},{"line_number":126,"context_line":"        if parsed_args.options:"},{"line_number":127,"context_line":"            for option in parsed_args.options:"},{"line_number":128,"context_line":"                options.append(option)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_46af409c","line":125,"range":{"start_line":125,"start_character":18,"end_line":125,"end_character":20},"in_reply_to":"3fa7e38b_6e582e24","updated":"2020-01-10 11:19:41.000000000","message":"Done","commit_id":"46446f4dc528202058e4b89f5541be480369690e"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"cd1fa70d3e9a6b228f3722708f2d235f9bfdffa5","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        if not parsed_args.password:"},{"line_number":123,"context_line":"            LOG.warning(_(\"No password was supplied, authentication will fail \""},{"line_number":124,"context_line":"                          \"when a user does not have a password.\"))"},{"line_number":125,"context_line":"        options \u003d []"},{"line_number":126,"context_line":"        if parsed_args.options:"},{"line_number":127,"context_line":"            for option in parsed_args.options:"},{"line_number":128,"context_line":"                options.append(option)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_0e82da52","line":125,"range":{"start_line":125,"start_character":18,"end_line":125,"end_character":20},"in_reply_to":"3fa7e38b_6e582e24","updated":"2020-01-08 21:39:44.000000000","message":"Looks like maybe this should be:\n\noptions \u003d {}\nif parsed_args.options:\n    for option in parsed_args.options:\n        options[option] \u003d True","commit_id":"46446f4dc528202058e4b89f5541be480369690e"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b0e48ab2890eecdb08ccd8daf85d935635694fe8","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                options \u003d json.loads(parsed_args.options)"},{"line_number":126,"context_line":"            except IOError:"},{"line_number":127,"context_line":"                raise exceptions.CommandError("},{"line_number":128,"context_line":"                    _(\"options is not valid JSON string or file does\"))"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        try:"},{"line_number":131,"context_line":"            user \u003d identity_client.users.create("}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_9617389e","line":128,"range":{"start_line":128,"start_character":59,"end_line":128,"end_character":68},"updated":"2020-01-17 20:54:47.000000000","message":"incomplete thought","commit_id":"337274825e77fe53b45f6f5dbf6a2bd661320c4c"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5fb8601537e0056b59c8e8433d89958d572e21cf","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                options \u003d json.loads(parsed_args.options)"},{"line_number":126,"context_line":"            except IOError:"},{"line_number":127,"context_line":"                raise exceptions.CommandError("},{"line_number":128,"context_line":"                    _(\"options is not valid JSON string or file does\"))"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        try:"},{"line_number":131,"context_line":"            user \u003d identity_client.users.create("}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_059c626e","line":128,"range":{"start_line":128,"start_character":59,"end_line":128,"end_character":68},"in_reply_to":"3fa7e38b_9617389e","updated":"2020-01-20 10:56:00.000000000","message":"Done","commit_id":"337274825e77fe53b45f6f5dbf6a2bd661320c4c"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b0e48ab2890eecdb08ccd8daf85d935635694fe8","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        parser.add_argument("},{"line_number":351,"context_line":"            \u0027--options\u0027,"},{"line_number":352,"context_line":"            metavar\u003d\u0027\u003coptions\u003e\u0027,"},{"line_number":353,"context_line":"            help\u003d_(\u0027The resource options for the user\u0027),"},{"line_number":354,"context_line":"        )"},{"line_number":355,"context_line":"        enable_group \u003d parser.add_mutually_exclusive_group()"},{"line_number":356,"context_line":"        enable_group.add_argument("}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_59d1f32d","line":353,"updated":"2020-01-17 20:54:47.000000000","message":"It would be nice to add that the value must be a valid JSON expression, perhaps with a minimal example.","commit_id":"337274825e77fe53b45f6f5dbf6a2bd661320c4c"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"1dfe678e57216738634716fad16811a78eb71256","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        parser.add_argument("},{"line_number":351,"context_line":"            \u0027--options\u0027,"},{"line_number":352,"context_line":"            metavar\u003d\u0027\u003coptions\u003e\u0027,"},{"line_number":353,"context_line":"            help\u003d_(\u0027The resource options for the user\u0027),"},{"line_number":354,"context_line":"        )"},{"line_number":355,"context_line":"        enable_group \u003d parser.add_mutually_exclusive_group()"},{"line_number":356,"context_line":"        enable_group.add_argument("}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_4c902543","line":353,"in_reply_to":"3fa7e38b_259f1e65","updated":"2020-01-21 23:07:32.000000000","message":"would be nice if the help was here too, for example https://opendev.org/openstack/python-openstackclient/src/branch/master/openstackclient/identity/v3/application_credential.py#L86-L91","commit_id":"337274825e77fe53b45f6f5dbf6a2bd661320c4c"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"30e80f2972aeb8bf792c1ebd6fcd8ada20b0ab23","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        parser.add_argument("},{"line_number":351,"context_line":"            \u0027--options\u0027,"},{"line_number":352,"context_line":"            metavar\u003d\u0027\u003coptions\u003e\u0027,"},{"line_number":353,"context_line":"            help\u003d_(\u0027The resource options for the user\u0027),"},{"line_number":354,"context_line":"        )"},{"line_number":355,"context_line":"        enable_group \u003d parser.add_mutually_exclusive_group()"},{"line_number":356,"context_line":"        enable_group.add_argument("}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_db5125d7","line":353,"in_reply_to":"3fa7e38b_4c902543","updated":"2020-01-22 07:28:18.000000000","message":"Done. Thanks Colleen","commit_id":"337274825e77fe53b45f6f5dbf6a2bd661320c4c"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5fb8601537e0056b59c8e8433d89958d572e21cf","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        parser.add_argument("},{"line_number":351,"context_line":"            \u0027--options\u0027,"},{"line_number":352,"context_line":"            metavar\u003d\u0027\u003coptions\u003e\u0027,"},{"line_number":353,"context_line":"            help\u003d_(\u0027The resource options for the user\u0027),"},{"line_number":354,"context_line":"        )"},{"line_number":355,"context_line":"        enable_group \u003d parser.add_mutually_exclusive_group()"},{"line_number":356,"context_line":"        enable_group.add_argument("}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_259f1e65","line":353,"in_reply_to":"3fa7e38b_59d1f32d","updated":"2020-01-20 10:56:00.000000000","message":"Done. Updated in user.rst file.","commit_id":"337274825e77fe53b45f6f5dbf6a2bd661320c4c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d7de8ffb87d252f18f524fbbc0961788f4ca0383","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            metavar\u003d\u0027\u003cdescription\u003e\u0027,"},{"line_number":74,"context_line":"            help\u003d_(\u0027User description\u0027),"},{"line_number":75,"context_line":"        )"},{"line_number":76,"context_line":"        parser.add_argument("},{"line_number":77,"context_line":"            \u0027--ignore_lockout_failure_attempts\u0027,"},{"line_number":78,"context_line":"            metavar\u003d\u0027\u003cignore_lockout_failure_attempts\u003e\u0027,"},{"line_number":79,"context_line":"            default\u003dFalse,"},{"line_number":80,"context_line":"            help\u003d_(\u0027If set to True, mark a user as exempt from the PCI \u0027"},{"line_number":81,"context_line":"                   \u0027password lockout policy\u0027),"},{"line_number":82,"context_line":"        )"},{"line_number":83,"context_line":"        parser.add_argument("},{"line_number":84,"context_line":"            \u0027--ignore_password_expiry\u0027,"},{"line_number":85,"context_line":"            metavar\u003d\u0027\u003cignore_password_expiry\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_7df8424a","line":82,"range":{"start_line":76,"start_character":7,"end_line":82,"end_character":9},"updated":"2020-02-07 16:33:00.000000000","message":"In case of a boolean parameter, the OSC convention is to use two boolean option to enable and disable the option. For example, --enable/--disable, --public/--private, --foo/--no-foo.\n\nhttps://docs.openstack.org/python-openstackclient/latest/contributor/command-options.html#boolean-options","commit_id":"001fcb60c8d384feaa795be88178bd3d5437d28e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1a49518ff6516064cd620c3547c96363658def87","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            metavar\u003d\u0027\u003cdescription\u003e\u0027,"},{"line_number":74,"context_line":"            help\u003d_(\u0027User description\u0027),"},{"line_number":75,"context_line":"        )"},{"line_number":76,"context_line":"        parser.add_argument("},{"line_number":77,"context_line":"            \u0027--ignore_lockout_failure_attempts\u0027,"},{"line_number":78,"context_line":"            metavar\u003d\u0027\u003cignore_lockout_failure_attempts\u003e\u0027,"},{"line_number":79,"context_line":"            default\u003dFalse,"},{"line_number":80,"context_line":"            help\u003d_(\u0027If set to True, mark a user as exempt from the PCI \u0027"},{"line_number":81,"context_line":"                   \u0027password lockout policy\u0027),"},{"line_number":82,"context_line":"        )"},{"line_number":83,"context_line":"        parser.add_argument("},{"line_number":84,"context_line":"            \u0027--ignore_password_expiry\u0027,"},{"line_number":85,"context_line":"            metavar\u003d\u0027\u003cignore_password_expiry\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_ce2150b4","line":82,"range":{"start_line":76,"start_character":7,"end_line":82,"end_character":9},"in_reply_to":"3fa7e38b_7df8424a","updated":"2020-02-11 10:22:28.000000000","message":"Done","commit_id":"001fcb60c8d384feaa795be88178bd3d5437d28e"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d7de8ffb87d252f18f524fbbc0961788f4ca0383","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                   \u0027password lockout policy\u0027),"},{"line_number":82,"context_line":"        )"},{"line_number":83,"context_line":"        parser.add_argument("},{"line_number":84,"context_line":"            \u0027--ignore_password_expiry\u0027,"},{"line_number":85,"context_line":"            metavar\u003d\u0027\u003cignore_password_expiry\u003e\u0027,"},{"line_number":86,"context_line":"            default\u003dFalse,"},{"line_number":87,"context_line":"            help\u003d_(\u0027If set to True, mark a user whose password you do not \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_08d2275c","line":84,"updated":"2020-02-07 16:33:00.000000000","message":"We don\u0027t use underscores in command options. Use hyphens instead.","commit_id":"001fcb60c8d384feaa795be88178bd3d5437d28e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1a49518ff6516064cd620c3547c96363658def87","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                   \u0027password lockout policy\u0027),"},{"line_number":82,"context_line":"        )"},{"line_number":83,"context_line":"        parser.add_argument("},{"line_number":84,"context_line":"            \u0027--ignore_password_expiry\u0027,"},{"line_number":85,"context_line":"            metavar\u003d\u0027\u003cignore_password_expiry\u003e\u0027,"},{"line_number":86,"context_line":"            default\u003dFalse,"},{"line_number":87,"context_line":"            help\u003d_(\u0027If set to True, mark a user whose password you do not \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_6e14dc50","line":84,"in_reply_to":"3fa7e38b_08d2275c","updated":"2020-02-11 10:22:28.000000000","message":"Done","commit_id":"001fcb60c8d384feaa795be88178bd3d5437d28e"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d7de8ffb87d252f18f524fbbc0961788f4ca0383","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                   \u0027user\u0027),"},{"line_number":113,"context_line":"        )"},{"line_number":114,"context_line":"        parser.add_argument("},{"line_number":115,"context_line":"            \u0027--multi_factor_auth_rules\u0027,"},{"line_number":116,"context_line":"            metavar\u003d\u0027\u003cmulti_factor_auth_rules\u003e\u0027,"},{"line_number":117,"context_line":"            help\u003d_(\u0027Allows user to specify MFA rules, for example, \u0027"},{"line_number":118,"context_line":"                   \u0027--multi-factor-auth-rules password:totp,password:u2f\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_e870eba9","line":115,"updated":"2020-02-07 16:33:00.000000000","message":"I see two ways on this. The one in my mind is to accept a single auth rule using action\u003d\u0027append\u0027. The other is the one proposed here. It depends on how many auth rules are usually specified. I am not sure which is better. Most OSC commands follow the first one though.","commit_id":"001fcb60c8d384feaa795be88178bd3d5437d28e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1a49518ff6516064cd620c3547c96363658def87","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                   \u0027user\u0027),"},{"line_number":113,"context_line":"        )"},{"line_number":114,"context_line":"        parser.add_argument("},{"line_number":115,"context_line":"            \u0027--multi_factor_auth_rules\u0027,"},{"line_number":116,"context_line":"            metavar\u003d\u0027\u003cmulti_factor_auth_rules\u003e\u0027,"},{"line_number":117,"context_line":"            help\u003d_(\u0027Allows user to specify MFA rules, for example, \u0027"},{"line_number":118,"context_line":"                   \u0027--multi-factor-auth-rules password:totp,password:u2f\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_2e0a6428","line":115,"in_reply_to":"3fa7e38b_e870eba9","updated":"2020-02-11 10:22:28.000000000","message":"Done","commit_id":"001fcb60c8d384feaa795be88178bd3d5437d28e"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d7de8ffb87d252f18f524fbbc0961788f4ca0383","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            \u0027--multi_factor_auth_rules\u0027,"},{"line_number":116,"context_line":"            metavar\u003d\u0027\u003cmulti_factor_auth_rules\u003e\u0027,"},{"line_number":117,"context_line":"            help\u003d_(\u0027Allows user to specify MFA rules, for example, \u0027"},{"line_number":118,"context_line":"                   \u0027--multi-factor-auth-rules password:totp,password:u2f\u0027),"},{"line_number":119,"context_line":"        )"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        enable_group \u003d parser.add_mutually_exclusive_group()"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_88a6170d","line":118,"range":{"start_line":118,"start_character":46,"end_line":118,"end_character":59},"updated":"2020-02-07 16:33:00.000000000","message":"You need to explain the format in detail. If you are not familiar with what the keystone docs explains, this help is not easy to understand.","commit_id":"001fcb60c8d384feaa795be88178bd3d5437d28e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1a49518ff6516064cd620c3547c96363658def87","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            \u0027--multi_factor_auth_rules\u0027,"},{"line_number":116,"context_line":"            metavar\u003d\u0027\u003cmulti_factor_auth_rules\u003e\u0027,"},{"line_number":117,"context_line":"            help\u003d_(\u0027Allows user to specify MFA rules, for example, \u0027"},{"line_number":118,"context_line":"                   \u0027--multi-factor-auth-rules password:totp,password:u2f\u0027),"},{"line_number":119,"context_line":"        )"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        enable_group \u003d parser.add_mutually_exclusive_group()"}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_4e0fa037","line":118,"range":{"start_line":118,"start_character":46,"end_line":118,"end_character":59},"in_reply_to":"3fa7e38b_88a6170d","updated":"2020-02-11 10:22:28.000000000","message":"Done","commit_id":"001fcb60c8d384feaa795be88178bd3d5437d28e"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d7de8ffb87d252f18f524fbbc0961788f4ca0383","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                        parsed_args.multi_factor_auth_rules.split(\u0027,\u0027))"},{"line_number":196,"context_line":"                if auth_rules:"},{"line_number":197,"context_line":"                    options[\u0027multi_factor_auth_rules\u0027] \u003d auth_rules"},{"line_number":198,"context_line":"            except IOError:"},{"line_number":199,"context_line":"                raise exceptions.CommandError("},{"line_number":200,"context_line":"                    _(\"multi_factor_auth_rules is not a valid string, \""},{"line_number":201,"context_line":"                      \"for example, --multi_factor_auth_rules password:totp,\""}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_88d4d74c","line":198,"range":{"start_line":198,"start_character":19,"end_line":198,"end_character":26},"updated":"2020-02-07 16:33:00.000000000","message":"question: which line can raise IOError?","commit_id":"001fcb60c8d384feaa795be88178bd3d5437d28e"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1a49518ff6516064cd620c3547c96363658def87","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                        parsed_args.multi_factor_auth_rules.split(\u0027,\u0027))"},{"line_number":196,"context_line":"                if auth_rules:"},{"line_number":197,"context_line":"                    options[\u0027multi_factor_auth_rules\u0027] \u003d auth_rules"},{"line_number":198,"context_line":"            except IOError:"},{"line_number":199,"context_line":"                raise exceptions.CommandError("},{"line_number":200,"context_line":"                    _(\"multi_factor_auth_rules is not a valid string, \""},{"line_number":201,"context_line":"                      \"for example, --multi_factor_auth_rules password:totp,\""}],"source_content_type":"text/x-python","patch_set":13,"id":"3fa7e38b_cefab010","line":198,"range":{"start_line":198,"start_character":19,"end_line":198,"end_character":26},"in_reply_to":"3fa7e38b_88d4d74c","updated":"2020-02-11 10:22:28.000000000","message":"I removed the following part from this patch.","commit_id":"001fcb60c8d384feaa795be88178bd3d5437d28e"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fbcbbb94c5e0cb2d374ebc9303a0190b13aa4109","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            help\u003d_(\u0027User description\u0027),"},{"line_number":74,"context_line":"        )"},{"line_number":75,"context_line":"        parser.add_argument("},{"line_number":76,"context_line":"            \u0027--enable-ignore-lockout-failure-attempts\u0027,"},{"line_number":77,"context_line":"            action\u003d\"store_true\","},{"line_number":78,"context_line":"            dest\u003d\"enable_ignore_lockout_failure_attempts\","},{"line_number":79,"context_line":"            help\u003d_(\u0027Enable a user as exempt from the PCI password \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_bb78c2f6","line":76,"updated":"2020-02-12 05:37:10.000000000","message":"\"enable-ignore-....\" sounds odd a bit and it is not easy to understand. Do \"--disable-lockout-failure-attempts\" and \"--enable-lockout-failure-attempts\" work?\n\nTrue/False in OSC would be opposite from those in keystone API but I think it is more user friendly.","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"7938b975704bfa9c7a932f9731f018919f62ad79","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            help\u003d_(\u0027User description\u0027),"},{"line_number":74,"context_line":"        )"},{"line_number":75,"context_line":"        parser.add_argument("},{"line_number":76,"context_line":"            \u0027--enable-ignore-lockout-failure-attempts\u0027,"},{"line_number":77,"context_line":"            action\u003d\"store_true\","},{"line_number":78,"context_line":"            dest\u003d\"enable_ignore_lockout_failure_attempts\","},{"line_number":79,"context_line":"            help\u003d_(\u0027Enable a user as exempt from the PCI password \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_e3e43a44","line":76,"in_reply_to":"3fa7e38b_bb78c2f6","updated":"2020-02-13 10:58:56.000000000","message":"Done","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fbcbbb94c5e0cb2d374ebc9303a0190b13aa4109","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            action\u003d\"store_true\","},{"line_number":78,"context_line":"            dest\u003d\"enable_ignore_lockout_failure_attempts\","},{"line_number":79,"context_line":"            help\u003d_(\u0027Enable a user as exempt from the PCI password \u0027"},{"line_number":80,"context_line":"                   \u0027lockout policy (default)\u0027),"},{"line_number":81,"context_line":"        )"},{"line_number":82,"context_line":"        parser.add_argument("},{"line_number":83,"context_line":"            \u0027--disable-ignore-lockout-failure-attempts\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_3b4db2c4","line":80,"updated":"2020-02-12 05:37:10.000000000","message":"The description in [1] looks easier to understand as the help message.\n\n[1] https://docs.openstack.org/keystone/latest/admin/resource-options.html#ignore-lockout-failure-attempts","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"7938b975704bfa9c7a932f9731f018919f62ad79","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            action\u003d\"store_true\","},{"line_number":78,"context_line":"            dest\u003d\"enable_ignore_lockout_failure_attempts\","},{"line_number":79,"context_line":"            help\u003d_(\u0027Enable a user as exempt from the PCI password \u0027"},{"line_number":80,"context_line":"                   \u0027lockout policy (default)\u0027),"},{"line_number":81,"context_line":"        )"},{"line_number":82,"context_line":"        parser.add_argument("},{"line_number":83,"context_line":"            \u0027--disable-ignore-lockout-failure-attempts\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_c3ed7e23","line":80,"in_reply_to":"3fa7e38b_3b4db2c4","updated":"2020-02-13 10:58:56.000000000","message":"Done","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fbcbbb94c5e0cb2d374ebc9303a0190b13aa4109","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        parser.add_argument("},{"line_number":83,"context_line":"            \u0027--disable-ignore-lockout-failure-attempts\u0027,"},{"line_number":84,"context_line":"            action\u003d\"store_true\","},{"line_number":85,"context_line":"            dest\u003d\"disable_ignore_lockout_failure_attempts\","},{"line_number":86,"context_line":"            help\u003d_(\u0027Disable a user as exempt from the PCI password \u0027"},{"line_number":87,"context_line":"                   \u0027lockout policy\u0027),"},{"line_number":88,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_fbd71abc","line":85,"range":{"start_line":85,"start_character":11,"end_line":85,"end_character":59},"updated":"2020-02-12 05:37:10.000000000","message":"This is the default \"dest\" name. It looks unnecessary.","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"7938b975704bfa9c7a932f9731f018919f62ad79","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        parser.add_argument("},{"line_number":83,"context_line":"            \u0027--disable-ignore-lockout-failure-attempts\u0027,"},{"line_number":84,"context_line":"            action\u003d\"store_true\","},{"line_number":85,"context_line":"            dest\u003d\"disable_ignore_lockout_failure_attempts\","},{"line_number":86,"context_line":"            help\u003d_(\u0027Disable a user as exempt from the PCI password \u0027"},{"line_number":87,"context_line":"                   \u0027lockout policy\u0027),"},{"line_number":88,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_83d30663","line":85,"range":{"start_line":85,"start_character":11,"end_line":85,"end_character":59},"in_reply_to":"3fa7e38b_fbd71abc","updated":"2020-02-13 10:58:56.000000000","message":"Done","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fbcbbb94c5e0cb2d374ebc9303a0190b13aa4109","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                   \u0027user\u0027),"},{"line_number":150,"context_line":"        )"},{"line_number":151,"context_line":"        parser.add_argument("},{"line_number":152,"context_line":"            \u0027--multi-factor-auth-rules\u0027,"},{"line_number":153,"context_line":"            metavar\u003d\u0027\u003cmulti_factor_auth_rules\u003e\u0027,"},{"line_number":154,"context_line":"            action\u003d\"append\","},{"line_number":155,"context_line":"            default\u003d[],"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_1bd556b8","line":152,"range":{"start_line":152,"start_character":12,"end_line":152,"end_character":39},"updated":"2020-02-12 05:37:10.000000000","message":"This now specifies a single auth rule, so the option name should be \"--multi-factor-auth-rule\".","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"7938b975704bfa9c7a932f9731f018919f62ad79","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                   \u0027user\u0027),"},{"line_number":150,"context_line":"        )"},{"line_number":151,"context_line":"        parser.add_argument("},{"line_number":152,"context_line":"            \u0027--multi-factor-auth-rules\u0027,"},{"line_number":153,"context_line":"            metavar\u003d\u0027\u003cmulti_factor_auth_rules\u003e\u0027,"},{"line_number":154,"context_line":"            action\u003d\"append\","},{"line_number":155,"context_line":"            default\u003d[],"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_23ded26a","line":152,"range":{"start_line":152,"start_character":12,"end_line":152,"end_character":39},"in_reply_to":"3fa7e38b_1bd556b8","updated":"2020-02-13 10:58:56.000000000","message":"Done","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fbcbbb94c5e0cb2d374ebc9303a0190b13aa4109","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        if parsed_args.disable_multi_factor_auth_enabled:"},{"line_number":226,"context_line":"            options[\u0027multi_factor_auth_enabled\u0027] \u003d False"},{"line_number":227,"context_line":"        if parsed_args.multi_factor_auth_rules:"},{"line_number":228,"context_line":"            auth_rules \u003d [rule.split(\u0027:\u0027) if \u0027:\u0027 in rule else [rule]"},{"line_number":229,"context_line":"                          for rule in parsed_args.multi_factor_auth_rules]"},{"line_number":230,"context_line":"            if auth_rules:"},{"line_number":231,"context_line":"                options[\u0027multi_factor_auth_rules\u0027] \u003d auth_rules"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_3bfb7248","line":228,"range":{"start_line":228,"start_character":26,"end_line":228,"end_character":68},"updated":"2020-02-12 05:37:10.000000000","message":"This can be\n\n rule.split(\":\")\n\nFor example,\n\n In [1]: \"password\".split(\":\")\n Out[1]: [\u0027password\u0027]\n\n In [2]: \"password:totp\".split(\":\")\n Out[2]: [\u0027password\u0027, \u0027totp\u0027]","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"7938b975704bfa9c7a932f9731f018919f62ad79","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        if parsed_args.disable_multi_factor_auth_enabled:"},{"line_number":226,"context_line":"            options[\u0027multi_factor_auth_enabled\u0027] \u003d False"},{"line_number":227,"context_line":"        if parsed_args.multi_factor_auth_rules:"},{"line_number":228,"context_line":"            auth_rules \u003d [rule.split(\u0027:\u0027) if \u0027:\u0027 in rule else [rule]"},{"line_number":229,"context_line":"                          for rule in parsed_args.multi_factor_auth_rules]"},{"line_number":230,"context_line":"            if auth_rules:"},{"line_number":231,"context_line":"                options[\u0027multi_factor_auth_rules\u0027] \u003d auth_rules"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_43d98e7e","line":228,"range":{"start_line":228,"start_character":26,"end_line":228,"end_character":68},"in_reply_to":"3fa7e38b_3bfb7248","updated":"2020-02-13 10:58:56.000000000","message":"Done","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fbcbbb94c5e0cb2d374ebc9303a0190b13aa4109","unresolved":false,"context_lines":[{"line_number":448,"context_line":"            \u0027--description\u0027,"},{"line_number":449,"context_line":"            metavar\u003d\u0027\u003cdescription\u003e\u0027,"},{"line_number":450,"context_line":"            help\u003d_(\u0027Set user description\u0027),"},{"line_number":451,"context_line":"        )"},{"line_number":452,"context_line":"        parser.add_argument("},{"line_number":453,"context_line":"            \u0027--enable-ignore-lockout-failure-attempts\u0027,"},{"line_number":454,"context_line":"            action\u003d\"store_true\","}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_5bae6e31","line":451,"updated":"2020-02-12 05:37:10.000000000","message":"If the below is same as L.75-163 above, it is better to share the code.","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"7938b975704bfa9c7a932f9731f018919f62ad79","unresolved":false,"context_lines":[{"line_number":448,"context_line":"            \u0027--description\u0027,"},{"line_number":449,"context_line":"            metavar\u003d\u0027\u003cdescription\u003e\u0027,"},{"line_number":450,"context_line":"            help\u003d_(\u0027Set user description\u0027),"},{"line_number":451,"context_line":"        )"},{"line_number":452,"context_line":"        parser.add_argument("},{"line_number":453,"context_line":"            \u0027--enable-ignore-lockout-failure-attempts\u0027,"},{"line_number":454,"context_line":"            action\u003d\"store_true\","}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_e3cd1aba","line":451,"in_reply_to":"3fa7e38b_5bae6e31","updated":"2020-02-13 10:58:56.000000000","message":"Done","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    parser.add_argument("},{"line_number":74,"context_line":"        \u0027--disable-lockout-failure-attempts\u0027,"},{"line_number":75,"context_line":"        action\u003d\"store_true\","},{"line_number":76,"context_line":"        help\u003d_(\u0027It ignores the number of times a user has authenticated \u0027"},{"line_number":77,"context_line":"               \u0027and does not locks out the user as a result\u0027),"},{"line_number":78,"context_line":"    )"},{"line_number":79,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_9fc9ddaf","line":76,"range":{"start_line":76,"start_character":27,"end_line":76,"end_character":71},"updated":"2020-02-18 08:09:07.000000000","message":"It looks wrong. I think it is the number of authentication erquests a user tries.","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    parser.add_argument("},{"line_number":74,"context_line":"        \u0027--disable-lockout-failure-attempts\u0027,"},{"line_number":75,"context_line":"        action\u003d\"store_true\","},{"line_number":76,"context_line":"        help\u003d_(\u0027It ignores the number of times a user has authenticated \u0027"},{"line_number":77,"context_line":"               \u0027and does not locks out the user as a result\u0027),"},{"line_number":78,"context_line":"    )"},{"line_number":79,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_c550e630","line":76,"range":{"start_line":76,"start_character":27,"end_line":76,"end_character":71},"in_reply_to":"3fa7e38b_9fc9ddaf","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    parser.add_argument("},{"line_number":80,"context_line":"        \u0027--enable-password-expiry\u0027,"},{"line_number":81,"context_line":"        action\u003d\"store_true\","},{"line_number":82,"context_line":"        help\u003d_(\u0027It will not allow users to continue using passwords that may \u0027"},{"line_number":83,"context_line":"               \u0027be expired according to global configuration values (default)\u0027"},{"line_number":84,"context_line":"               ),"},{"line_number":85,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_df6435b7","line":82,"range":{"start_line":82,"start_character":34,"end_line":82,"end_character":39},"updated":"2020-02-18 08:09:07.000000000","message":"This is per-user configuration, so isn\u0027t a singular form better? This applies to other help texts.","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    parser.add_argument("},{"line_number":80,"context_line":"        \u0027--enable-password-expiry\u0027,"},{"line_number":81,"context_line":"        action\u003d\"store_true\","},{"line_number":82,"context_line":"        help\u003d_(\u0027It will not allow users to continue using passwords that may \u0027"},{"line_number":83,"context_line":"               \u0027be expired according to global configuration values (default)\u0027"},{"line_number":84,"context_line":"               ),"},{"line_number":85,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_e54de293","line":82,"range":{"start_line":82,"start_character":34,"end_line":82,"end_character":39},"in_reply_to":"3fa7e38b_df6435b7","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        \u0027--enable-password-expiry\u0027,"},{"line_number":81,"context_line":"        action\u003d\"store_true\","},{"line_number":82,"context_line":"        help\u003d_(\u0027It will not allow users to continue using passwords that may \u0027"},{"line_number":83,"context_line":"               \u0027be expired according to global configuration values (default)\u0027"},{"line_number":84,"context_line":"               ),"},{"line_number":85,"context_line":"    )"},{"line_number":86,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_7fc8a1a6","line":83,"range":{"start_line":83,"start_character":26,"end_line":83,"end_character":67},"updated":"2020-02-18 08:09:07.000000000","message":"this looks unnecessary from CLI user perspective.","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        \u0027--enable-password-expiry\u0027,"},{"line_number":81,"context_line":"        action\u003d\"store_true\","},{"line_number":82,"context_line":"        help\u003d_(\u0027It will not allow users to continue using passwords that may \u0027"},{"line_number":83,"context_line":"               \u0027be expired according to global configuration values (default)\u0027"},{"line_number":84,"context_line":"               ),"},{"line_number":85,"context_line":"    )"},{"line_number":86,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_8528ae9e","line":83,"range":{"start_line":83,"start_character":26,"end_line":83,"end_character":67},"in_reply_to":"3fa7e38b_7fc8a1a6","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \u0027--disable-password-expiry\u0027,"},{"line_number":88,"context_line":"        action\u003d\"store_true\","},{"line_number":89,"context_line":"        help\u003d_(\u0027It will allow users to continue using passwords that may be \u0027"},{"line_number":90,"context_line":"               \u0027expired according to global configuration values\u0027),"},{"line_number":91,"context_line":"    )"},{"line_number":92,"context_line":"    parser.add_argument("},{"line_number":93,"context_line":"        \u0027--enable-change-password-upon-first-use\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_1fbded03","line":90,"range":{"start_line":90,"start_character":24,"end_line":90,"end_character":64},"updated":"2020-02-18 08:09:07.000000000","message":"ditto","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \u0027--disable-password-expiry\u0027,"},{"line_number":88,"context_line":"        action\u003d\"store_true\","},{"line_number":89,"context_line":"        help\u003d_(\u0027It will allow users to continue using passwords that may be \u0027"},{"line_number":90,"context_line":"               \u0027expired according to global configuration values\u0027),"},{"line_number":91,"context_line":"    )"},{"line_number":92,"context_line":"    parser.add_argument("},{"line_number":93,"context_line":"        \u0027--enable-change-password-upon-first-use\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_a52daaae","line":90,"range":{"start_line":90,"start_character":24,"end_line":90,"end_character":64},"in_reply_to":"3fa7e38b_1fbded03","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    parser.add_argument("},{"line_number":93,"context_line":"        \u0027--enable-change-password-upon-first-use\u0027,"},{"line_number":94,"context_line":"        action\u003d\"store_true\","},{"line_number":95,"context_line":"        help\u003d_(\u0027Enable users to change their password \u0027"},{"line_number":96,"context_line":"               \u0027when the user is created, or upon administrative reset. \u0027"},{"line_number":97,"context_line":"               \u0027Before accessing any services, affected users will have \u0027"},{"line_number":98,"context_line":"               \u0027to change their password (default)\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_1ff08ddb","line":95,"range":{"start_line":95,"start_character":16,"end_line":95,"end_character":39},"updated":"2020-02-18 08:09:07.000000000","message":"How about \"Request a user to change ...\"?","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    parser.add_argument("},{"line_number":93,"context_line":"        \u0027--enable-change-password-upon-first-use\u0027,"},{"line_number":94,"context_line":"        action\u003d\"store_true\","},{"line_number":95,"context_line":"        help\u003d_(\u0027Enable users to change their password \u0027"},{"line_number":96,"context_line":"               \u0027when the user is created, or upon administrative reset. \u0027"},{"line_number":97,"context_line":"               \u0027Before accessing any services, affected users will have \u0027"},{"line_number":98,"context_line":"               \u0027to change their password (default)\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_4532b610","line":95,"range":{"start_line":95,"start_character":16,"end_line":95,"end_character":39},"in_reply_to":"3fa7e38b_1ff08ddb","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        \u0027--enable-change-password-upon-first-use\u0027,"},{"line_number":94,"context_line":"        action\u003d\"store_true\","},{"line_number":95,"context_line":"        help\u003d_(\u0027Enable users to change their password \u0027"},{"line_number":96,"context_line":"               \u0027when the user is created, or upon administrative reset. \u0027"},{"line_number":97,"context_line":"               \u0027Before accessing any services, affected users will have \u0027"},{"line_number":98,"context_line":"               \u0027to change their password (default)\u0027),"},{"line_number":99,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_bf0139b7","line":96,"range":{"start_line":96,"start_character":40,"end_line":96,"end_character":41},"updated":"2020-02-18 08:09:07.000000000","message":"A comma looks unnecessary.","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        \u0027--enable-change-password-upon-first-use\u0027,"},{"line_number":94,"context_line":"        action\u003d\"store_true\","},{"line_number":95,"context_line":"        help\u003d_(\u0027Enable users to change their password \u0027"},{"line_number":96,"context_line":"               \u0027when the user is created, or upon administrative reset. \u0027"},{"line_number":97,"context_line":"               \u0027Before accessing any services, affected users will have \u0027"},{"line_number":98,"context_line":"               \u0027to change their password (default)\u0027),"},{"line_number":99,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_6537b2ff","line":96,"range":{"start_line":96,"start_character":40,"end_line":96,"end_character":41},"in_reply_to":"3fa7e38b_bf0139b7","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        action\u003d\"store_true\","},{"line_number":95,"context_line":"        help\u003d_(\u0027Enable users to change their password \u0027"},{"line_number":96,"context_line":"               \u0027when the user is created, or upon administrative reset. \u0027"},{"line_number":97,"context_line":"               \u0027Before accessing any services, affected users will have \u0027"},{"line_number":98,"context_line":"               \u0027to change their password (default)\u0027),"},{"line_number":99,"context_line":"    )"},{"line_number":100,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_fff6d1d5","line":97,"range":{"start_line":97,"start_character":47,"end_line":97,"end_character":61},"updated":"2020-02-18 08:09:07.000000000","message":"Perhaps it can be just \"the user\".","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        action\u003d\"store_true\","},{"line_number":95,"context_line":"        help\u003d_(\u0027Enable users to change their password \u0027"},{"line_number":96,"context_line":"               \u0027when the user is created, or upon administrative reset. \u0027"},{"line_number":97,"context_line":"               \u0027Before accessing any services, affected users will have \u0027"},{"line_number":98,"context_line":"               \u0027to change their password (default)\u0027),"},{"line_number":99,"context_line":"    )"},{"line_number":100,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_051cbe7a","line":97,"range":{"start_line":97,"start_character":47,"end_line":97,"end_character":61},"in_reply_to":"3fa7e38b_fff6d1d5","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    parser.add_argument("},{"line_number":101,"context_line":"        \u0027--disable-change-password-upon-first-use\u0027,"},{"line_number":102,"context_line":"        action\u003d\"store_true\","},{"line_number":103,"context_line":"        help\u003d_(\u0027Disable users to change their password \u0027"},{"line_number":104,"context_line":"               \u0027when the user is created, or upon administrative reset. \u0027"},{"line_number":105,"context_line":"               \u0027Before accessing any services, affected users will not have \u0027"},{"line_number":106,"context_line":"               \u0027to change their password\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_dff995c6","line":103,"range":{"start_line":103,"start_character":16,"end_line":103,"end_character":39},"updated":"2020-02-18 08:09:07.000000000","message":"Similar as for L.95.\nHow about \"Do not request a user to change ...\"?","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    parser.add_argument("},{"line_number":101,"context_line":"        \u0027--disable-change-password-upon-first-use\u0027,"},{"line_number":102,"context_line":"        action\u003d\"store_true\","},{"line_number":103,"context_line":"        help\u003d_(\u0027Disable users to change their password \u0027"},{"line_number":104,"context_line":"               \u0027when the user is created, or upon administrative reset. \u0027"},{"line_number":105,"context_line":"               \u0027Before accessing any services, affected users will not have \u0027"},{"line_number":106,"context_line":"               \u0027to change their password\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_2519ba8a","line":103,"range":{"start_line":103,"start_character":16,"end_line":103,"end_character":39},"in_reply_to":"3fa7e38b_dff995c6","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    parser.add_argument("},{"line_number":109,"context_line":"        \u0027--enable-lock-password\u0027,"},{"line_number":110,"context_line":"        action\u003d\"store_true\","},{"line_number":111,"context_line":"        help\u003d_(\u0027Disables the ability for \u0027"},{"line_number":112,"context_line":"               \u0027users to change their password through self-service \u0027"},{"line_number":113,"context_line":"               \u0027APIs (default)\u0027),"},{"line_number":114,"context_line":"    )"},{"line_number":115,"context_line":"    parser.add_argument("},{"line_number":116,"context_line":"        \u0027--disable-lock-password\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_bf5cd9ef","line":113,"range":{"start_line":111,"start_character":15,"end_line":113,"end_character":31},"updated":"2020-02-18 08:09:07.000000000","message":"This can be two line text.","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    parser.add_argument("},{"line_number":109,"context_line":"        \u0027--enable-lock-password\u0027,"},{"line_number":110,"context_line":"        action\u003d\"store_true\","},{"line_number":111,"context_line":"        help\u003d_(\u0027Disables the ability for \u0027"},{"line_number":112,"context_line":"               \u0027users to change their password through self-service \u0027"},{"line_number":113,"context_line":"               \u0027APIs (default)\u0027),"},{"line_number":114,"context_line":"    )"},{"line_number":115,"context_line":"    parser.add_argument("},{"line_number":116,"context_line":"        \u0027--disable-lock-password\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_e522c2b7","line":113,"range":{"start_line":111,"start_character":15,"end_line":113,"end_character":31},"in_reply_to":"3fa7e38b_bf5cd9ef","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    parser.add_argument("},{"line_number":116,"context_line":"        \u0027--disable-lock-password\u0027,"},{"line_number":117,"context_line":"        action\u003d\"store_true\","},{"line_number":118,"context_line":"        help\u003d_(\u0027Enables the ability for \u0027"},{"line_number":119,"context_line":"               \u0027users to change their password through self-service \u0027"},{"line_number":120,"context_line":"               \u0027APIs\u0027),"},{"line_number":121,"context_line":"    )"},{"line_number":122,"context_line":"    parser.add_argument("},{"line_number":123,"context_line":"        \u0027--enable-multi-factor-auth-enabled\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_5f5125d5","line":120,"range":{"start_line":118,"start_character":15,"end_line":120,"end_character":21},"updated":"2020-02-18 08:09:07.000000000","message":"ditto","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    parser.add_argument("},{"line_number":116,"context_line":"        \u0027--disable-lock-password\u0027,"},{"line_number":117,"context_line":"        action\u003d\"store_true\","},{"line_number":118,"context_line":"        help\u003d_(\u0027Enables the ability for \u0027"},{"line_number":119,"context_line":"               \u0027users to change their password through self-service \u0027"},{"line_number":120,"context_line":"               \u0027APIs\u0027),"},{"line_number":121,"context_line":"    )"},{"line_number":122,"context_line":"    parser.add_argument("},{"line_number":123,"context_line":"        \u0027--enable-multi-factor-auth-enabled\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_85118e62","line":120,"range":{"start_line":118,"start_character":15,"end_line":120,"end_character":21},"in_reply_to":"3fa7e38b_5f5125d5","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        \u0027--enable-multi-factor-auth-enabled\u0027,"},{"line_number":124,"context_line":"        action\u003d\"store_true\","},{"line_number":125,"context_line":"        dest\u003d\"enable_multi_factor_auth_enabled\","},{"line_number":126,"context_line":"        help\u003d_(\u0027Enables the MFA rules will be followed for the \u0027"},{"line_number":127,"context_line":"               \u0027user (default)\u0027),"},{"line_number":128,"context_line":"    )"},{"line_number":129,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_5f38459d","line":126,"range":{"start_line":126,"start_character":8,"end_line":126,"end_character":64},"updated":"2020-02-18 08:09:07.000000000","message":"How about just \"Enables the MFA (multi factor auth)\"?","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        \u0027--enable-multi-factor-auth-enabled\u0027,"},{"line_number":124,"context_line":"        action\u003d\"store_true\","},{"line_number":125,"context_line":"        dest\u003d\"enable_multi_factor_auth_enabled\","},{"line_number":126,"context_line":"        help\u003d_(\u0027Enables the MFA rules will be followed for the \u0027"},{"line_number":127,"context_line":"               \u0027user (default)\u0027),"},{"line_number":128,"context_line":"    )"},{"line_number":129,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_450b962c","line":126,"range":{"start_line":126,"start_character":8,"end_line":126,"end_character":64},"in_reply_to":"3fa7e38b_5f38459d","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        action\u003d\"store_true\","},{"line_number":125,"context_line":"        dest\u003d\"enable_multi_factor_auth_enabled\","},{"line_number":126,"context_line":"        help\u003d_(\u0027Enables the MFA rules will be followed for the \u0027"},{"line_number":127,"context_line":"               \u0027user (default)\u0027),"},{"line_number":128,"context_line":"    )"},{"line_number":129,"context_line":"    parser.add_argument("},{"line_number":130,"context_line":"        \u0027--disable-multi-factor-auth-enabled\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_dfb67527","line":127,"range":{"start_line":127,"start_character":15,"end_line":127,"end_character":31},"updated":"2020-02-18 08:09:07.000000000","message":"Doesn\u0027t it fit into one line?","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        action\u003d\"store_true\","},{"line_number":125,"context_line":"        dest\u003d\"enable_multi_factor_auth_enabled\","},{"line_number":126,"context_line":"        help\u003d_(\u0027Enables the MFA rules will be followed for the \u0027"},{"line_number":127,"context_line":"               \u0027user (default)\u0027),"},{"line_number":128,"context_line":"    )"},{"line_number":129,"context_line":"    parser.add_argument("},{"line_number":130,"context_line":"        \u0027--disable-multi-factor-auth-enabled\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_6510125a","line":127,"range":{"start_line":127,"start_character":15,"end_line":127,"end_character":31},"in_reply_to":"3fa7e38b_dfb67527","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        \u0027--disable-multi-factor-auth-enabled\u0027,"},{"line_number":131,"context_line":"        action\u003d\"store_true\","},{"line_number":132,"context_line":"        dest\u003d\"disable_multi_factor_auth_enabled\","},{"line_number":133,"context_line":"        help\u003d_(\u0027Disables the MFA rules will be followed for the \u0027"},{"line_number":134,"context_line":"               \u0027user\u0027),"},{"line_number":135,"context_line":"    )"},{"line_number":136,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_1f42cd0f","line":133,"range":{"start_line":133,"start_character":15,"end_line":133,"end_character":64},"updated":"2020-02-18 08:09:07.000000000","message":"Same as for L.126.","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        \u0027--disable-multi-factor-auth-enabled\u0027,"},{"line_number":131,"context_line":"        action\u003d\"store_true\","},{"line_number":132,"context_line":"        dest\u003d\"disable_multi_factor_auth_enabled\","},{"line_number":133,"context_line":"        help\u003d_(\u0027Disables the MFA rules will be followed for the \u0027"},{"line_number":134,"context_line":"               \u0027user\u0027),"},{"line_number":135,"context_line":"    )"},{"line_number":136,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_05059e16","line":133,"range":{"start_line":133,"start_character":15,"end_line":133,"end_character":64},"in_reply_to":"3fa7e38b_1f42cd0f","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        action\u003d\"store_true\","},{"line_number":132,"context_line":"        dest\u003d\"disable_multi_factor_auth_enabled\","},{"line_number":133,"context_line":"        help\u003d_(\u0027Disables the MFA rules will be followed for the \u0027"},{"line_number":134,"context_line":"               \u0027user\u0027),"},{"line_number":135,"context_line":"    )"},{"line_number":136,"context_line":"    parser.add_argument("},{"line_number":137,"context_line":"        \u0027--multi-factor-auth-rule\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_ffb33134","line":134,"range":{"start_line":134,"start_character":14,"end_line":134,"end_character":21},"updated":"2020-02-18 08:09:07.000000000","message":"Doesn\u0027t it fit into one line?","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        action\u003d\"store_true\","},{"line_number":132,"context_line":"        dest\u003d\"disable_multi_factor_auth_enabled\","},{"line_number":133,"context_line":"        help\u003d_(\u0027Disables the MFA rules will be followed for the \u0027"},{"line_number":134,"context_line":"               \u0027user\u0027),"},{"line_number":135,"context_line":"    )"},{"line_number":136,"context_line":"    parser.add_argument("},{"line_number":137,"context_line":"        \u0027--multi-factor-auth-rule\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_25021a0f","line":134,"range":{"start_line":134,"start_character":14,"end_line":134,"end_character":21},"in_reply_to":"3fa7e38b_ffb33134","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    )"},{"line_number":136,"context_line":"    parser.add_argument("},{"line_number":137,"context_line":"        \u0027--multi-factor-auth-rule\u0027,"},{"line_number":138,"context_line":"        metavar\u003d\u0027\u003cmulti_factor_auth_rule\u003e\u0027,"},{"line_number":139,"context_line":"        action\u003d\"append\","},{"line_number":140,"context_line":"        default\u003d[],"},{"line_number":141,"context_line":"        help\u003d_(\u0027Allows user to specify MFA rules, (repeat option to set \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_5f1fe50a","line":138,"range":{"start_line":138,"start_character":17,"end_line":138,"end_character":40},"updated":"2020-02-18 08:09:07.000000000","message":"In OSC, hyphen is used consistently to concatenate words, so it needs to be \"\u003cmulti-factor-auth-rule\u003e\". Moreover, this can be simplified into \"\u003crule\u003e\" as there is no need that metavar mirrors the option name. I think \"rule\" provides its meaning sufficiently.","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    )"},{"line_number":136,"context_line":"    parser.add_argument("},{"line_number":137,"context_line":"        \u0027--multi-factor-auth-rule\u0027,"},{"line_number":138,"context_line":"        metavar\u003d\u0027\u003cmulti_factor_auth_rule\u003e\u0027,"},{"line_number":139,"context_line":"        action\u003d\"append\","},{"line_number":140,"context_line":"        default\u003d[],"},{"line_number":141,"context_line":"        help\u003d_(\u0027Allows user to specify MFA rules, (repeat option to set \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_e5fba213","line":138,"range":{"start_line":138,"start_character":17,"end_line":138,"end_character":40},"in_reply_to":"3fa7e38b_5f1fe50a","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        action\u003d\"append\","},{"line_number":140,"context_line":"        default\u003d[],"},{"line_number":141,"context_line":"        help\u003d_(\u0027Allows user to specify MFA rules, (repeat option to set \u0027"},{"line_number":142,"context_line":"               \u0027multiple values) for example, if user wants to define a \u0027"},{"line_number":143,"context_line":"               \u0027ruleset as [[\"password\"], [\"password\", \"totp\"]]  \u0027"},{"line_number":144,"context_line":"               \u0027--multi-factor-auth-rule \"password:totp\" \u0027"},{"line_number":145,"context_line":"               \u0027--multi-factor-auth-rule \"password\"\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_7f242160","line":142,"range":{"start_line":142,"start_character":33,"end_line":142,"end_character":36},"updated":"2020-02-18 08:09:07.000000000","message":"-\u003e For","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        action\u003d\"append\","},{"line_number":140,"context_line":"        default\u003d[],"},{"line_number":141,"context_line":"        help\u003d_(\u0027Allows user to specify MFA rules, (repeat option to set \u0027"},{"line_number":142,"context_line":"               \u0027multiple values) for example, if user wants to define a \u0027"},{"line_number":143,"context_line":"               \u0027ruleset as [[\"password\"], [\"password\", \"totp\"]]  \u0027"},{"line_number":144,"context_line":"               \u0027--multi-factor-auth-rule \"password:totp\" \u0027"},{"line_number":145,"context_line":"               \u0027--multi-factor-auth-rule \"password\"\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_90f6aa2c","line":142,"range":{"start_line":142,"start_character":33,"end_line":142,"end_character":36},"in_reply_to":"3fa7e38b_7f242160","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"67f98992a6d9f6fe439c5e74aee6e53a43271918","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    if parsed_args.multi_factor_auth_disabled:"},{"line_number":54,"context_line":"        options[\u0027multi_factor_auth_enabled\u0027] \u003d False"},{"line_number":55,"context_line":"    if parsed_args.multi_factor_auth_rule:"},{"line_number":56,"context_line":"        auth_rules \u003d [rule.split(\":\") for rule in"},{"line_number":57,"context_line":"                      parsed_args.multi_factor_auth_rule]"},{"line_number":58,"context_line":"        if auth_rules:"},{"line_number":59,"context_line":"            options[\u0027multi_factor_auth_rules\u0027] \u003d auth_rules"}],"source_content_type":"text/x-python","patch_set":21,"id":"1fa4df85_d1ab9c72","line":56,"range":{"start_line":56,"start_character":22,"end_line":56,"end_character":37},"updated":"2020-03-16 06:52:33.000000000","message":"A comma is a common separate when specifying multiple values in a single argument. We have an option which accepts one rule, so I don\u0027t see no reason to use a colon.","commit_id":"9ca5e2ccd30c0b18a6b923e25f19160a4627d4ed"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"8f4b966790f5eef993b7480ada85418e94ad934c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    if parsed_args.multi_factor_auth_disabled:"},{"line_number":54,"context_line":"        options[\u0027multi_factor_auth_enabled\u0027] \u003d False"},{"line_number":55,"context_line":"    if parsed_args.multi_factor_auth_rule:"},{"line_number":56,"context_line":"        auth_rules \u003d [rule.split(\":\") for rule in"},{"line_number":57,"context_line":"                      parsed_args.multi_factor_auth_rule]"},{"line_number":58,"context_line":"        if auth_rules:"},{"line_number":59,"context_line":"            options[\u0027multi_factor_auth_rules\u0027] \u003d auth_rules"}],"source_content_type":"text/x-python","patch_set":21,"id":"1fa4df85_1aae29e7","line":56,"range":{"start_line":56,"start_character":22,"end_line":56,"end_character":37},"in_reply_to":"1fa4df85_9fbbebe3","updated":"2020-03-16 10:43:59.000000000","message":"applying rule.split() isn\u0027t taking it as separate entity resulting [[\u0027password,totp\u0027]. So I have to pass \u0027,\u0027 comma as a split-er.","commit_id":"9ca5e2ccd30c0b18a6b923e25f19160a4627d4ed"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"44cbf8e744d8cd81631e3def8cfd5bbaedca0bfb","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    if parsed_args.multi_factor_auth_disabled:"},{"line_number":54,"context_line":"        options[\u0027multi_factor_auth_enabled\u0027] \u003d False"},{"line_number":55,"context_line":"    if parsed_args.multi_factor_auth_rule:"},{"line_number":56,"context_line":"        auth_rules \u003d [rule.split(\":\") for rule in"},{"line_number":57,"context_line":"                      parsed_args.multi_factor_auth_rule]"},{"line_number":58,"context_line":"        if auth_rules:"},{"line_number":59,"context_line":"            options[\u0027multi_factor_auth_rules\u0027] \u003d auth_rules"}],"source_content_type":"text/x-python","patch_set":21,"id":"1fa4df85_9fbbebe3","line":56,"range":{"start_line":56,"start_character":22,"end_line":56,"end_character":37},"in_reply_to":"1fa4df85_d1207cfa","updated":"2020-03-16 09:54:54.000000000","message":"Yes, I mean \"--multi-factor-auth-rule password,totp\". I don\u0027t see no special reason that you need a colon rather than a comma.","commit_id":"9ca5e2ccd30c0b18a6b923e25f19160a4627d4ed"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"f369a158b09c072fb9464ce30ec19b4cbaa19c4c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    if parsed_args.multi_factor_auth_disabled:"},{"line_number":54,"context_line":"        options[\u0027multi_factor_auth_enabled\u0027] \u003d False"},{"line_number":55,"context_line":"    if parsed_args.multi_factor_auth_rule:"},{"line_number":56,"context_line":"        auth_rules \u003d [rule.split(\":\") for rule in"},{"line_number":57,"context_line":"                      parsed_args.multi_factor_auth_rule]"},{"line_number":58,"context_line":"        if auth_rules:"},{"line_number":59,"context_line":"            options[\u0027multi_factor_auth_rules\u0027] \u003d auth_rules"}],"source_content_type":"text/x-python","patch_set":21,"id":"1fa4df85_d1207cfa","line":56,"range":{"start_line":56,"start_character":22,"end_line":56,"end_character":37},"in_reply_to":"1fa4df85_d1ab9c72","updated":"2020-03-16 07:20:17.000000000","message":"Do you suggest to pass multiple auth methods as\n\n--multi-factor-auth-rule password,totp instead of using [1]? \n\n[1] https://review.opendev.org/#/c/697444/21/openstackclient/tests/unit/identity/v3/fakes.py","commit_id":"9ca5e2ccd30c0b18a6b923e25f19160a4627d4ed"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"67f98992a6d9f6fe439c5e74aee6e53a43271918","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        default\u003d[],"},{"line_number":133,"context_line":"        help\u003d_(\u0027Set multi-factor auth rules. For example, to set a rule \u0027"},{"line_number":134,"context_line":"               \u0027requiring the \"password\" and \"totp\" auth methods to be \u0027"},{"line_number":135,"context_line":"               \u0027provided, use: --multi-factor-auth-rule password \u0027"},{"line_number":136,"context_line":"               \u0027May be provided multiple times to set different rule \u0027"},{"line_number":137,"context_line":"               \u0027combinations.\u0027)"},{"line_number":138,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":21,"id":"1fa4df85_91b764d9","line":135,"range":{"start_line":135,"start_character":14,"end_line":135,"end_character":66},"updated":"2020-03-16 06:52:33.000000000","message":"This looks incomplete.","commit_id":"9ca5e2ccd30c0b18a6b923e25f19160a4627d4ed"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"8f4b966790f5eef993b7480ada85418e94ad934c","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        default\u003d[],"},{"line_number":133,"context_line":"        help\u003d_(\u0027Set multi-factor auth rules. For example, to set a rule \u0027"},{"line_number":134,"context_line":"               \u0027requiring the \"password\" and \"totp\" auth methods to be \u0027"},{"line_number":135,"context_line":"               \u0027provided, use: --multi-factor-auth-rule password \u0027"},{"line_number":136,"context_line":"               \u0027May be provided multiple times to set different rule \u0027"},{"line_number":137,"context_line":"               \u0027combinations.\u0027)"},{"line_number":138,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":21,"id":"1fa4df85_3aa9a5dc","line":135,"range":{"start_line":135,"start_character":14,"end_line":135,"end_character":66},"in_reply_to":"1fa4df85_91b764d9","updated":"2020-03-16 10:43:59.000000000","message":"Done","commit_id":"9ca5e2ccd30c0b18a6b923e25f19160a4627d4ed"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"44cbf8e744d8cd81631e3def8cfd5bbaedca0bfb","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        default\u003d[],"},{"line_number":135,"context_line":"        help\u003d_(\u0027Set multi-factor auth rules. For example, to set a rule \u0027"},{"line_number":136,"context_line":"               \u0027requiring the \"password\" and \"totp\" auth methods to be \u0027"},{"line_number":137,"context_line":"               \u0027provided, use: --multi-factor-auth-rule password:totp \u0027"},{"line_number":138,"context_line":"               \u0027May be provided multiple times to set different rule \u0027"},{"line_number":139,"context_line":"               \u0027combinations.\u0027)"},{"line_number":140,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":22,"id":"1fa4df85_5f833305","line":137,"updated":"2020-03-16 09:54:54.000000000","message":"Missing a period at EOL. In addition, perhaps \u0027use \"--multi-....\"\u0027 would work.","commit_id":"1a4769213ea81a665bdd7547fbebcf98d6aeee38"}],"openstackclient/tests/unit/identity/v3/fakes.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fbcbbb94c5e0cb2d374ebc9303a0190b13aa4109","unresolved":false,"context_lines":[{"line_number":109,"context_line":"}"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"options \u003d \u0027password:totp\u0027"},{"line_number":112,"context_line":"options1 \u003d \u0027password\u0027"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"project_id \u003d \u00278-9-64\u0027"},{"line_number":115,"context_line":"project_name \u003d \u0027beatles\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_9b5dc655","line":112,"updated":"2020-02-12 05:37:10.000000000","message":"At least they need to be: option1 and option2.\nIt looks like MFA options, so mfa_opt1, mfa_opt2 looks better.","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"7938b975704bfa9c7a932f9731f018919f62ad79","unresolved":false,"context_lines":[{"line_number":109,"context_line":"}"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"options \u003d \u0027password:totp\u0027"},{"line_number":112,"context_line":"options1 \u003d \u0027password\u0027"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"project_id \u003d \u00278-9-64\u0027"},{"line_number":115,"context_line":"project_name \u003d \u0027beatles\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_a3c3a28b","line":112,"in_reply_to":"3fa7e38b_9b5dc655","updated":"2020-02-13 10:58:56.000000000","message":"Done","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"}],"openstackclient/tests/unit/identity/v3/test_user.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"024e5f215c149ae4f57b86b5bbd6767b4466c5fb","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import contextlib"},{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":"from unittest import mock"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from osc_lib import exceptions"},{"line_number":22,"context_line":"from osc_lib import utils"}],"source_content_type":"text/x-python","patch_set":11,"id":"3fa7e38b_928b3615","line":19,"updated":"2020-01-29 04:38:52.000000000","message":"This blank line is unnecessary.","commit_id":"8d2cfb0ba831e3eb66d23f01596514669dfd5533"}],"releasenotes/notes/add_options_to_user_create_and_set-302401520f36d153.yaml":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b0e48ab2890eecdb08ccd8daf85d935635694fe8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added the parameter --options to the create user and set. This will"},{"line_number":5,"context_line":"    now allow users to set user_options via CLI."},{"line_number":6,"context_line":"    \u003chttps://docs.openstack.org/keystone/latest/admin/resource-options.html#user-options\u003e"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"3fa7e38b_76715c0d","line":4,"range":{"start_line":4,"start_character":34,"end_line":4,"end_character":60},"updated":"2020-01-17 20:54:47.000000000","message":"nit: either \"to the user create and user set commands\" or \"to the user create and set commands\"","commit_id":"337274825e77fe53b45f6f5dbf6a2bd661320c4c"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5fb8601537e0056b59c8e8433d89958d572e21cf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added the parameter --options to the create user and set. This will"},{"line_number":5,"context_line":"    now allow users to set user_options via CLI."},{"line_number":6,"context_line":"    \u003chttps://docs.openstack.org/keystone/latest/admin/resource-options.html#user-options\u003e"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"3fa7e38b_858ff22d","line":4,"range":{"start_line":4,"start_character":34,"end_line":4,"end_character":60},"in_reply_to":"3fa7e38b_76715c0d","updated":"2020-01-20 10:56:00.000000000","message":"Done","commit_id":"337274825e77fe53b45f6f5dbf6a2bd661320c4c"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b0e48ab2890eecdb08ccd8daf85d935635694fe8","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added the parameter --options to the create user and set. This will"},{"line_number":5,"context_line":"    now allow users to set user_options via CLI."},{"line_number":6,"context_line":"    \u003chttps://docs.openstack.org/keystone/latest/admin/resource-options.html#user-options\u003e"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"3fa7e38b_f656ac5e","line":5,"range":{"start_line":5,"start_character":27,"end_line":5,"end_character":39},"updated":"2020-01-17 20:54:47.000000000","message":"nit: user options (no _, there\u0027s no resource in the API called user_options)","commit_id":"337274825e77fe53b45f6f5dbf6a2bd661320c4c"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5fb8601537e0056b59c8e8433d89958d572e21cf","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added the parameter --options to the create user and set. This will"},{"line_number":5,"context_line":"    now allow users to set user_options via CLI."},{"line_number":6,"context_line":"    \u003chttps://docs.openstack.org/keystone/latest/admin/resource-options.html#user-options\u003e"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"3fa7e38b_a58a2e1b","line":5,"range":{"start_line":5,"start_character":27,"end_line":5,"end_character":39},"in_reply_to":"3fa7e38b_f656ac5e","updated":"2020-01-20 10:56:00.000000000","message":"Done","commit_id":"337274825e77fe53b45f6f5dbf6a2bd661320c4c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"fbcbbb94c5e0cb2d374ebc9303a0190b13aa4109","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added the parameters --enable-ignore-lockout-failure-attempts, --disable-ignore-lockout-failure-attempts"},{"line_number":5,"context_line":"    --enable-ignore-password-expiry,--disable-ignore-password-expiry, --enable-ignore-change-password-upon-first-use,"},{"line_number":6,"context_line":"    --disable-ignore-change-password-upon-first-use, --enable-lock-password, --disable-lock-password,"},{"line_number":7,"context_line":"    --enable-multi-factor-auth-enabled,  --disable-multi-factor-auth-enabled and --multi-factor-auth-rules"},{"line_number":8,"context_line":"    to the user create and set commands. This will now allow users to set user options via CLI."},{"line_number":9,"context_line":"    \u003chttps://docs.openstack.org/keystone/latest/admin/resource-options.html#user-options\u003e"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"3fa7e38b_1b71d6df","line":7,"range":{"start_line":4,"start_character":24,"end_line":7,"end_character":106},"updated":"2020-02-12 05:37:10.000000000","message":"Could you convert this into an itemized list?","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"7938b975704bfa9c7a932f9731f018919f62ad79","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added the parameters --enable-ignore-lockout-failure-attempts, --disable-ignore-lockout-failure-attempts"},{"line_number":5,"context_line":"    --enable-ignore-password-expiry,--disable-ignore-password-expiry, --enable-ignore-change-password-upon-first-use,"},{"line_number":6,"context_line":"    --disable-ignore-change-password-upon-first-use, --enable-lock-password, --disable-lock-password,"},{"line_number":7,"context_line":"    --enable-multi-factor-auth-enabled,  --disable-multi-factor-auth-enabled and --multi-factor-auth-rules"},{"line_number":8,"context_line":"    to the user create and set commands. This will now allow users to set user options via CLI."},{"line_number":9,"context_line":"    \u003chttps://docs.openstack.org/keystone/latest/admin/resource-options.html#user-options\u003e"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"3fa7e38b_83bc6607","line":7,"range":{"start_line":4,"start_character":24,"end_line":7,"end_character":106},"in_reply_to":"3fa7e38b_1b71d6df","updated":"2020-02-13 10:58:56.000000000","message":"Done","commit_id":"ca297dcdf626777a64b3222cc096692acb38f454"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added the below mentioned parameters to the user create and set commands."},{"line_number":5,"context_line":"    --enable-lockout-failure-attempts,"},{"line_number":6,"context_line":"    --disable-lockout-failure-attempts,"},{"line_number":7,"context_line":"    --enable-password-expiry,"},{"line_number":8,"context_line":"    --disable-password-expiry,"},{"line_number":9,"context_line":"    --enable-change-password-upon-first-use,"},{"line_number":10,"context_line":"    --disable-change-password-upon-first-use,"},{"line_number":11,"context_line":"    --enable-lock-password,"},{"line_number":12,"context_line":"    --disable-lock-password,"},{"line_number":13,"context_line":"    --enable-multi-factor-auth-enabled,"},{"line_number":14,"context_line":"    --disable-multi-factor-auth-enabled and"},{"line_number":15,"context_line":"    --multi-factor-auth-rule"},{"line_number":16,"context_line":"    This will now allow users to set user options via CLI."},{"line_number":17,"context_line":"    \u003chttps://docs.openstack.org/keystone/latest/admin/resource-options.html#user-options\u003e"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3fa7e38b_1fde4d3d","line":15,"range":{"start_line":5,"start_character":4,"end_line":15,"end_character":28},"updated":"2020-02-18 08:09:07.000000000","message":"It is still not easy to read [1].\n\nWhat in my mind is:\n\n * --enable-lockout-failure-attempts\n * --disable-lockout-failure-attempts\n ...\n\n(Note that commas at EOL would be unnecessary.)\n\n[1] https://storage.bhs.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_f6b/697444/16/check/build-openstack-releasenotes/f6b90a9/docs/unreleased.html#new-features","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added the below mentioned parameters to the user create and set commands."},{"line_number":5,"context_line":"    --enable-lockout-failure-attempts,"},{"line_number":6,"context_line":"    --disable-lockout-failure-attempts,"},{"line_number":7,"context_line":"    --enable-password-expiry,"},{"line_number":8,"context_line":"    --disable-password-expiry,"},{"line_number":9,"context_line":"    --enable-change-password-upon-first-use,"},{"line_number":10,"context_line":"    --disable-change-password-upon-first-use,"},{"line_number":11,"context_line":"    --enable-lock-password,"},{"line_number":12,"context_line":"    --disable-lock-password,"},{"line_number":13,"context_line":"    --enable-multi-factor-auth-enabled,"},{"line_number":14,"context_line":"    --disable-multi-factor-auth-enabled and"},{"line_number":15,"context_line":"    --multi-factor-auth-rule"},{"line_number":16,"context_line":"    This will now allow users to set user options via CLI."},{"line_number":17,"context_line":"    \u003chttps://docs.openstack.org/keystone/latest/admin/resource-options.html#user-options\u003e"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3fa7e38b_70052e0f","line":15,"range":{"start_line":5,"start_character":4,"end_line":15,"end_character":28},"in_reply_to":"3fa7e38b_1fde4d3d","updated":"2020-02-18 10:40:05.000000000","message":"Done","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5345630c4c9be533379b447aa93e5b6fbe1c485f","unresolved":false,"context_lines":[{"line_number":14,"context_line":"    --disable-multi-factor-auth-enabled and"},{"line_number":15,"context_line":"    --multi-factor-auth-rule"},{"line_number":16,"context_line":"    This will now allow users to set user options via CLI."},{"line_number":17,"context_line":"    \u003chttps://docs.openstack.org/keystone/latest/admin/resource-options.html#user-options\u003e"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3fa7e38b_dfe75510","line":17,"range":{"start_line":17,"start_character":4,"end_line":17,"end_character":89},"updated":"2020-02-18 08:09:07.000000000","message":"I see the URL literally. Is it what you intend?","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"1c346a7013c03f12c9cfed20cace17619a657416","unresolved":false,"context_lines":[{"line_number":14,"context_line":"    --disable-multi-factor-auth-enabled and"},{"line_number":15,"context_line":"    --multi-factor-auth-rule"},{"line_number":16,"context_line":"    This will now allow users to set user options via CLI."},{"line_number":17,"context_line":"    \u003chttps://docs.openstack.org/keystone/latest/admin/resource-options.html#user-options\u003e"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"3fa7e38b_303016eb","line":17,"range":{"start_line":17,"start_character":4,"end_line":17,"end_character":89},"in_reply_to":"3fa7e38b_dfe75510","updated":"2020-02-18 10:40:05.000000000","message":"I wanted to provide more information about user-options just added. So I thought it would be better to link it here.","commit_id":"50db3033d7692cb6f2c957209c1fae3b1c242be8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8781f09e72ae080001e9582a35f9ad062c4b138a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    * --no-ignore-change-password-upon-first-use"},{"line_number":12,"context_line":"    * --enable-lock-password"},{"line_number":13,"context_line":"    * --disable-lock-password"},{"line_number":14,"context_line":"    * --multi-factor-auth-enabled"},{"line_number":15,"context_line":"    * --multi-factor-auth-disabled and"},{"line_number":16,"context_line":"    * --multi-factor-auth-rule"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    This will now allow users to set user options via CLI."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"df33271e_c22bbb2d","line":15,"range":{"start_line":14,"start_character":4,"end_line":15,"end_character":38},"updated":"2020-03-25 17:48:18.000000000","message":"This needs to be updated.\n\n\"and\" at EOL looks unnecessary.","commit_id":"7a6c45d8bac8260b5867e0ddaf66f1557f5b2224"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"25ce78d875bf92670f86e20318930827b35b3ebb","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    * --no-ignore-change-password-upon-first-use"},{"line_number":12,"context_line":"    * --enable-lock-password"},{"line_number":13,"context_line":"    * --disable-lock-password"},{"line_number":14,"context_line":"    * --multi-factor-auth-enabled"},{"line_number":15,"context_line":"    * --multi-factor-auth-disabled and"},{"line_number":16,"context_line":"    * --multi-factor-auth-rule"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    This will now allow users to set user options via CLI."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"df33271e_c2b9fbe9","line":15,"range":{"start_line":14,"start_character":4,"end_line":15,"end_character":38},"in_reply_to":"df33271e_c22bbb2d","updated":"2020-03-25 17:50:21.000000000","message":"Done","commit_id":"7a6c45d8bac8260b5867e0ddaf66f1557f5b2224"}]}
