)]}'
{"keystoneauth1/identity/__init__.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b7dba83d91bce5c25a80d0927a8223cbb2d0a071","unresolved":false,"context_lines":[{"line_number":43,"context_line":"V3OidcAuthorizationCode \u003d oidc.OidcAuthorizationCode"},{"line_number":44,"context_line":"\"\"\"See :class:`keystoneauth1.identity.v3.oidc.OidcAuthorizationCode`\"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"V3TOTP \u003d v3.TOTP"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"__all__ \u003d (\u0027BaseIdentityPlugin\u0027,"},{"line_number":49,"context_line":"           \u0027Password\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_60559cf8","line":46,"updated":"2016-03-03 14:16:16.000000000","message":"(nit) to be consistent a comment should be added like the other assignments","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a74617d5e2bf501007ea0fb8a288ca1eed8d085c","unresolved":false,"context_lines":[{"line_number":43,"context_line":"V3OidcAuthorizationCode \u003d oidc.OidcAuthorizationCode"},{"line_number":44,"context_line":"\"\"\"See :class:`keystoneauth1.identity.v3.oidc.OidcAuthorizationCode`\"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"V3TOTP \u003d v3.TOTP"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"__all__ \u003d (\u0027BaseIdentityPlugin\u0027,"},{"line_number":49,"context_line":"           \u0027Password\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_afd021ca","line":46,"in_reply_to":"7af24918_60559cf8","updated":"2016-03-03 18:36:50.000000000","message":"Done","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"}],"keystoneauth1/identity/v3/__init__.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b7dba83d91bce5c25a80d0927a8223cbb2d0a071","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from keystoneauth1.identity.v3.password import *  # noqa"},{"line_number":17,"context_line":"from keystoneauth1.identity.v3.token import *  # noqa"},{"line_number":18,"context_line":"from keystoneauth1.identity.v3.oidc import *  # noqa"},{"line_number":19,"context_line":"from keystoneauth1.identity.v3.totp import *  # noqa"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"__all__ \u003d (\u0027Auth\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_00a2d8fc","line":19,"updated":"2016-03-03 14:16:16.000000000","message":"we\u0027re not good about the alphabetical rule :-( (not your fault!)","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a74617d5e2bf501007ea0fb8a288ca1eed8d085c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from keystoneauth1.identity.v3.password import *  # noqa"},{"line_number":17,"context_line":"from keystoneauth1.identity.v3.token import *  # noqa"},{"line_number":18,"context_line":"from keystoneauth1.identity.v3.oidc import *  # noqa"},{"line_number":19,"context_line":"from keystoneauth1.identity.v3.totp import *  # noqa"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"__all__ \u003d (\u0027Auth\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_cf75adcb","line":19,"in_reply_to":"7af24918_00a2d8fc","updated":"2016-03-03 18:36:50.000000000","message":"Hah, might as well fix it.","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"}],"keystoneauth1/identity/v3/totp.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"1249faa57801df906e4b61c7b8d86b11b732de68","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                    for p in self._method_parameters)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class TOTP(base.AuthConstructor):"},{"line_number":56,"context_line":"    \"\"\"A plugin for authenticating with a username and TOTP passcode."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    :param string auth_url: Identity service endpoint for authentication."}],"source_content_type":"text/x-python","patch_set":1,"id":"bae84128_49a53245","line":55,"updated":"2016-02-23 14:15:08.000000000","message":"Do we actually need this? Why not force consumers of this method to use the new API?","commit_id":"ef8c5ebf4517fe512c60c63fec7c07c3f8e2924b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"8ab9b48ed5b77961183ad578ec844e4ff36d93b2","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                    for p in self._method_parameters)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class TOTP(base.AuthConstructor):"},{"line_number":56,"context_line":"    \"\"\"A plugin for authenticating with a username and TOTP passcode."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    :param string auth_url: Identity service endpoint for authentication."}],"source_content_type":"text/x-python","patch_set":1,"id":"9aed3d3a_a901813a","line":55,"in_reply_to":"bae84128_49a53245","updated":"2016-02-29 06:09:03.000000000","message":"Can you please elaborate? I am basically duplicating code from the Password method here as they are very similar.","commit_id":"ef8c5ebf4517fe512c60c63fec7c07c3f8e2924b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b7dba83d91bce5c25a80d0927a8223cbb2d0a071","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class TOTP(base.AuthConstructor):"},{"line_number":56,"context_line":"    \"\"\"A plugin for authenticating with a username and TOTP passcode."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    :param string auth_url: Identity service endpoint for authentication."},{"line_number":59,"context_line":"    :param string passcode: TOTP passcode for authentication."},{"line_number":60,"context_line":"    :param string username: Username for authentication."}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_80f8a8c4","line":57,"updated":"2016-03-03 14:16:16.000000000","message":"It\u0027s strange to document parameters that we don\u0027t use. Is this expected?","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a74617d5e2bf501007ea0fb8a288ca1eed8d085c","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class TOTP(base.AuthConstructor):"},{"line_number":56,"context_line":"    \"\"\"A plugin for authenticating with a username and TOTP passcode."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    :param string auth_url: Identity service endpoint for authentication."},{"line_number":59,"context_line":"    :param string passcode: TOTP passcode for authentication."},{"line_number":60,"context_line":"    :param string username: Username for authentication."}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_3a1d7166","line":57,"in_reply_to":"7af24918_80f8a8c4","updated":"2016-03-03 18:36:50.000000000","message":"We do use them. The only difference between Password and TOTP is the passcode option. The rest are same.","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"9dbdb2cfb2af2e294bc5f4a80688ef36fac286a2","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def get_cache_id_elements(self):"},{"line_number":51,"context_line":"        return dict((\u0027totp_%s\u0027 % p, getattr(self, p))"},{"line_number":52,"context_line":"                    for p in self._method_parameters)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class TOTP(base.AuthConstructor):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_5c077ac9","line":52,"range":{"start_line":52,"start_character":29,"end_line":52,"end_character":33},"updated":"2016-04-28 19:15:46.000000000","message":"I\u0027ll need to check with you but i don\u0027t think this can include passcode.","commit_id":"ef1813d38c9935343d92405edf17f24a4da3572d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5068b6035ea9c9902cf6d1ac391b281acc4e8965","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def get_cache_id_elements(self):"},{"line_number":51,"context_line":"        return dict((\u0027totp_%s\u0027 % p, getattr(self, p))"},{"line_number":52,"context_line":"                    for p in self._method_parameters)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class TOTP(base.AuthConstructor):"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_719b0fca","line":52,"range":{"start_line":52,"start_character":29,"end_line":52,"end_character":33},"in_reply_to":"1a122d0e_5c077ac9","updated":"2016-05-13 22:10:28.000000000","message":"You\u0027re right. Passcode is not static. We need to exclude it.","commit_id":"ef1813d38c9935343d92405edf17f24a4da3572d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"9dbdb2cfb2af2e294bc5f4a80688ef36fac286a2","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                is going to expire. (optional) default True"},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    _auth_method_class \u003d TOTPMethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_fcfc86b6","line":75,"updated":"2016-04-28 19:15:46.000000000","message":"so this means that the \u0027v3totp\u0027 plugin will be single factor TOTP. Are you sure this is what you want? do you want to have a MFA plugin the default?","commit_id":"ef1813d38c9935343d92405edf17f24a4da3572d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5068b6035ea9c9902cf6d1ac391b281acc4e8965","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                                is going to expire. (optional) default True"},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    _auth_method_class \u003d TOTPMethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_1147234c","line":75,"in_reply_to":"1a122d0e_fcfc86b6","updated":"2016-05-13 22:10:28.000000000","message":"In this setup, TOTP is a single factor. Perhaps in the future, we\u0027ll have a single MFA plugin. For example, password \u003d \u003cpin\u003e\u003ctoken code\u003e","commit_id":"ef1813d38c9935343d92405edf17f24a4da3572d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"8e2a9972da06618e6b89bf1b6695cbcfd253ef2a","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        return \u0027totp\u0027, {\u0027user\u0027: user}"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def get_cache_id_elements(self):"},{"line_number":53,"context_line":"        # NOTE(gyee): passcode is not static so we can use it as part of the"},{"line_number":54,"context_line":"        # key in caching."},{"line_number":55,"context_line":"        params \u003d copy.copy(self._method_parameters)"},{"line_number":56,"context_line":"        params.remove(\u0027passcode\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_df45686f","line":53,"range":{"start_line":53,"start_character":51,"end_line":53,"end_character":54},"updated":"2016-06-13 18:29:32.000000000","message":"i think you men cannot, since it\u0027s removed...","commit_id":"e097b39c4060c9ca4210cd114c4125adbd9a233a"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"fe77add0adf99a9c0e27af62850b75f77247c9e6","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        return \u0027totp\u0027, {\u0027user\u0027: user}"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def get_cache_id_elements(self):"},{"line_number":53,"context_line":"        # NOTE(gyee): passcode is not static so we can use it as part of the"},{"line_number":54,"context_line":"        # key in caching."},{"line_number":55,"context_line":"        params \u003d copy.copy(self._method_parameters)"},{"line_number":56,"context_line":"        params.remove(\u0027passcode\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_82c5435d","line":53,"range":{"start_line":53,"start_character":51,"end_line":53,"end_character":54},"in_reply_to":"7aa08908_df45686f","updated":"2016-06-13 18:54:13.000000000","message":"Done","commit_id":"e097b39c4060c9ca4210cd114c4125adbd9a233a"}],"keystoneauth1/loading/_plugins/identity/v3.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b7dba83d91bce5c25a80d0927a8223cbb2d0a071","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                     kwargs.get(\u0027user_domain_id\u0027))):"},{"line_number":158,"context_line":"            m \u003d \"You have provided a username. In the V3 identity API a \" \\"},{"line_number":159,"context_line":"                \"username is only unique within a domain so you must \" \\"},{"line_number":160,"context_line":"                \"also provide either a user_domain_id or user_domain_name.\""},{"line_number":161,"context_line":"            raise exceptions.OptionError(m)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        return super(TOTP, self).load_from_options(**kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_008f782a","line":160,"updated":"2016-03-03 14:16:16.000000000","message":"Should \u0027user_domain_id\u0027 and \u0027user_domain_name\u0027 be written to match the user-facing arguments? e.g. user-domain-id","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a74617d5e2bf501007ea0fb8a288ca1eed8d085c","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                     kwargs.get(\u0027user_domain_id\u0027))):"},{"line_number":158,"context_line":"            m \u003d \"You have provided a username. In the V3 identity API a \" \\"},{"line_number":159,"context_line":"                \"username is only unique within a domain so you must \" \\"},{"line_number":160,"context_line":"                \"also provide either a user_domain_id or user_domain_name.\""},{"line_number":161,"context_line":"            raise exceptions.OptionError(m)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        return super(TOTP, self).load_from_options(**kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_1a46b54e","line":160,"in_reply_to":"7af24918_008f782a","updated":"2016-03-03 18:36:50.000000000","message":"Done","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"9dbdb2cfb2af2e294bc5f4a80688ef36fac286a2","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        # by both."},{"line_number":141,"context_line":"        options.extend(["},{"line_number":142,"context_line":"            loading.Opt(\u0027user-id\u0027, help\u003d\u0027User ID\u0027),"},{"line_number":143,"context_line":"            loading.Opt(\u0027user-name\u0027,"},{"line_number":144,"context_line":"                        dest\u003d\u0027username\u0027,"},{"line_number":145,"context_line":"                        help\u003d\u0027Username\u0027,"},{"line_number":146,"context_line":"                        deprecated\u003d[loading.Opt(\u0027username\u0027)]),"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_5c2e5a43","line":143,"range":{"start_line":143,"start_character":29,"end_line":143,"end_character":30},"updated":"2016-04-28 19:15:46.000000000","message":"this pattern got reverted. username is the standard now and user-name is deprecated.","commit_id":"ef1813d38c9935343d92405edf17f24a4da3572d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5068b6035ea9c9902cf6d1ac391b281acc4e8965","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        # by both."},{"line_number":141,"context_line":"        options.extend(["},{"line_number":142,"context_line":"            loading.Opt(\u0027user-id\u0027, help\u003d\u0027User ID\u0027),"},{"line_number":143,"context_line":"            loading.Opt(\u0027user-name\u0027,"},{"line_number":144,"context_line":"                        dest\u003d\u0027username\u0027,"},{"line_number":145,"context_line":"                        help\u003d\u0027Username\u0027,"},{"line_number":146,"context_line":"                        deprecated\u003d[loading.Opt(\u0027username\u0027)]),"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_6ed32a39","line":143,"range":{"start_line":143,"start_character":29,"end_line":143,"end_character":30},"in_reply_to":"1a122d0e_5c2e5a43","updated":"2016-05-13 22:10:28.000000000","message":"Done","commit_id":"ef1813d38c9935343d92405edf17f24a4da3572d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"9dbdb2cfb2af2e294bc5f4a80688ef36fac286a2","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                     kwargs.get(\u0027user_domain_id\u0027))):"},{"line_number":158,"context_line":"            m \u003d \"You have provided a username. In the V3 identity API a \" \\"},{"line_number":159,"context_line":"                \"username is only unique within a domain so you must \" \\"},{"line_number":160,"context_line":"                \"also provide either a user-domain-id or user-domain-name.\""},{"line_number":161,"context_line":"            raise exceptions.OptionError(m)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        return super(TOTP, self).load_from_options(**kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_fc13e6fe","line":160,"range":{"start_line":160,"start_character":30,"end_line":160,"end_character":36},"updated":"2016-04-28 19:15:46.000000000","message":"default-domain-id would also cover this. Is there a way we can push some of this stuff up to be shared with the password plugin?","commit_id":"ef1813d38c9935343d92405edf17f24a4da3572d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5068b6035ea9c9902cf6d1ac391b281acc4e8965","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                     kwargs.get(\u0027user_domain_id\u0027))):"},{"line_number":158,"context_line":"            m \u003d \"You have provided a username. In the V3 identity API a \" \\"},{"line_number":159,"context_line":"                \"username is only unique within a domain so you must \" \\"},{"line_number":160,"context_line":"                \"also provide either a user-domain-id or user-domain-name.\""},{"line_number":161,"context_line":"            raise exceptions.OptionError(m)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        return super(TOTP, self).load_from_options(**kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"dab17558_cec5f63d","line":160,"range":{"start_line":160,"start_character":30,"end_line":160,"end_character":36},"in_reply_to":"1a122d0e_fc13e6fe","updated":"2016-05-13 22:10:28.000000000","message":"I can try to add a helper which is shared by both.","commit_id":"ef1813d38c9935343d92405edf17f24a4da3572d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3c4b060a9f199c796e287ddfb3ddbac00a07b235","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        # by both."},{"line_number":156,"context_line":"        options.extend(["},{"line_number":157,"context_line":"            loading.Opt(\u0027user-id\u0027, help\u003d\u0027User ID\u0027),"},{"line_number":158,"context_line":"            loading.Opt(\u0027user-name\u0027,"},{"line_number":159,"context_line":"                        dest\u003d\u0027username\u0027,"},{"line_number":160,"context_line":"                        help\u003d\u0027Username\u0027,"},{"line_number":161,"context_line":"                        deprecated\u003d[loading.Opt(\u0027username\u0027)]),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_3b2ca098","line":158,"range":{"start_line":158,"start_character":25,"end_line":158,"end_character":34},"updated":"2016-06-13 05:11:54.000000000","message":"this should be \u0027username\u0027 look at line 29","commit_id":"53181ffb18d6845b6eeec43a4adf0057bb322264"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"6a6cb78c450f9e5cd59a3b8445584018a5c78807","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        # by both."},{"line_number":156,"context_line":"        options.extend(["},{"line_number":157,"context_line":"            loading.Opt(\u0027user-id\u0027, help\u003d\u0027User ID\u0027),"},{"line_number":158,"context_line":"            loading.Opt(\u0027user-name\u0027,"},{"line_number":159,"context_line":"                        dest\u003d\u0027username\u0027,"},{"line_number":160,"context_line":"                        help\u003d\u0027Username\u0027,"},{"line_number":161,"context_line":"                        deprecated\u003d[loading.Opt(\u0027username\u0027)]),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_b769a68e","line":158,"range":{"start_line":158,"start_character":25,"end_line":158,"end_character":34},"in_reply_to":"7aa08908_3b2ca098","updated":"2016-06-13 16:59:04.000000000","message":"Done","commit_id":"53181ffb18d6845b6eeec43a4adf0057bb322264"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3c4b060a9f199c796e287ddfb3ddbac00a07b235","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            loading.Opt(\u0027user-name\u0027,"},{"line_number":159,"context_line":"                        dest\u003d\u0027username\u0027,"},{"line_number":160,"context_line":"                        help\u003d\u0027Username\u0027,"},{"line_number":161,"context_line":"                        deprecated\u003d[loading.Opt(\u0027username\u0027)]),"},{"line_number":162,"context_line":"            loading.Opt(\u0027user-domain-id\u0027, help\u003d\"User\u0027s domain id\"),"},{"line_number":163,"context_line":"            loading.Opt(\u0027user-domain-name\u0027, help\u003d\"User\u0027s domain name\"),"},{"line_number":164,"context_line":"            loading.Opt(\u0027passcode\u0027, secret\u003dTrue, help\u003d\"User\u0027s TOTP passcode\"),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_7b22a8a4","line":161,"range":{"start_line":161,"start_character":49,"end_line":161,"end_character":57},"updated":"2016-06-13 05:11:54.000000000","message":"this should be \u0027user-name\u0027","commit_id":"53181ffb18d6845b6eeec43a4adf0057bb322264"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"6a6cb78c450f9e5cd59a3b8445584018a5c78807","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            loading.Opt(\u0027user-name\u0027,"},{"line_number":159,"context_line":"                        dest\u003d\u0027username\u0027,"},{"line_number":160,"context_line":"                        help\u003d\u0027Username\u0027,"},{"line_number":161,"context_line":"                        deprecated\u003d[loading.Opt(\u0027username\u0027)]),"},{"line_number":162,"context_line":"            loading.Opt(\u0027user-domain-id\u0027, help\u003d\"User\u0027s domain id\"),"},{"line_number":163,"context_line":"            loading.Opt(\u0027user-domain-name\u0027, help\u003d\"User\u0027s domain name\"),"},{"line_number":164,"context_line":"            loading.Opt(\u0027passcode\u0027, secret\u003dTrue, help\u003d\"User\u0027s TOTP passcode\"),"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_d70a72d1","line":161,"range":{"start_line":161,"start_character":49,"end_line":161,"end_character":57},"in_reply_to":"7aa08908_7b22a8a4","updated":"2016-06-13 16:59:04.000000000","message":"Done","commit_id":"53181ffb18d6845b6eeec43a4adf0057bb322264"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"8e2a9972da06618e6b89bf1b6695cbcfd253ef2a","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        return options"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def load_from_options(self, **kwargs):"},{"line_number":56,"context_line":"        _assertIdentityOptions(kwargs)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return super(Password, self).load_from_options(**kwargs)"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_ff3784fb","line":56,"range":{"start_line":56,"start_character":8,"end_line":56,"end_character":30},"updated":"2016-06-13 18:29:32.000000000","message":"why the switch from underscores to camel case?\n\n  _assert_user_options()","commit_id":"e097b39c4060c9ca4210cd114c4125adbd9a233a"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"fe77add0adf99a9c0e27af62850b75f77247c9e6","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        return options"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def load_from_options(self, **kwargs):"},{"line_number":56,"context_line":"        _assertIdentityOptions(kwargs)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return super(Password, self).load_from_options(**kwargs)"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_bdeea41f","line":56,"range":{"start_line":56,"start_character":8,"end_line":56,"end_character":30},"in_reply_to":"7aa08908_ff3784fb","updated":"2016-06-13 18:54:13.000000000","message":"Done","commit_id":"e097b39c4060c9ca4210cd114c4125adbd9a233a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7f7df4e4de23eab6cae3d623ca17e24554bac8a4","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    ])"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def _assert_identity_options(options):"},{"line_number":30,"context_line":"    if (options.get(\u0027username\u0027) and"},{"line_number":31,"context_line":"            not (options.get(\u0027user_domain_name\u0027) or"},{"line_number":32,"context_line":"                 options.get(\u0027user_domain_id\u0027))):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7aa08908_76f0d6fd","line":29,"updated":"2016-06-13 21:28:10.000000000","message":"nit: validate?","commit_id":"9e29e6e9c51d0458764db1689a4a7cbe34c4b907"}],"keystoneauth1/tests/unit/loading/test_v3.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b7dba83d91bce5c25a80d0927a8223cbb2d0a071","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.assertRaises(exceptions.OptionError,"},{"line_number":107,"context_line":"                          self.create,"},{"line_number":108,"context_line":"                          username\u003duuid.uuid4().hex,"},{"line_number":109,"context_line":"                          password\u003duuid.uuid4().hex)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def test_without_project_domain(self):"},{"line_number":112,"context_line":"        self.assertRaises(exceptions.OptionError,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_202d54fe","line":109,"updated":"2016-03-03 14:16:16.000000000","message":"Why does this work? Shouldn\u0027t this be passcode?","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a74617d5e2bf501007ea0fb8a288ca1eed8d085c","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        self.assertRaises(exceptions.OptionError,"},{"line_number":107,"context_line":"                          self.create,"},{"line_number":108,"context_line":"                          username\u003duuid.uuid4().hex,"},{"line_number":109,"context_line":"                          password\u003duuid.uuid4().hex)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def test_without_project_domain(self):"},{"line_number":112,"context_line":"        self.assertRaises(exceptions.OptionError,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_3abe11ff","line":109,"in_reply_to":"7af24918_202d54fe","updated":"2016-03-03 18:36:50.000000000","message":"it would\u0027ve raised OptionError on username prior to password. Let me change it to passcode to match.","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b7dba83d91bce5c25a80d0927a8223cbb2d0a071","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        self.assertRaises(exceptions.OptionError,"},{"line_number":113,"context_line":"                          self.create,"},{"line_number":114,"context_line":"                          username\u003duuid.uuid4().hex,"},{"line_number":115,"context_line":"                          password\u003duuid.uuid4().hex,"},{"line_number":116,"context_line":"                          user_domain_id\u003duuid.uuid4().hex,"},{"line_number":117,"context_line":"                          project_name\u003duuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_4038603d","line":115,"updated":"2016-03-03 14:16:16.000000000","message":"...and here too.","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a74617d5e2bf501007ea0fb8a288ca1eed8d085c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        self.assertRaises(exceptions.OptionError,"},{"line_number":113,"context_line":"                          self.create,"},{"line_number":114,"context_line":"                          username\u003duuid.uuid4().hex,"},{"line_number":115,"context_line":"                          password\u003duuid.uuid4().hex,"},{"line_number":116,"context_line":"                          user_domain_id\u003duuid.uuid4().hex,"},{"line_number":117,"context_line":"                          project_name\u003duuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7af24918_7a0899da","line":115,"in_reply_to":"7af24918_4038603d","updated":"2016-03-03 18:36:50.000000000","message":"Done","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b7dba83d91bce5c25a80d0927a8223cbb2d0a071","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7af24918_8025480a","line":118,"updated":"2016-03-03 14:16:16.000000000","message":"We need a test showing what will happen what a passcode isn\u0027t provided.","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a74617d5e2bf501007ea0fb8a288ca1eed8d085c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7af24918_9a112507","line":118,"in_reply_to":"7af24918_8025480a","updated":"2016-03-03 18:36:50.000000000","message":"Done","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"ffebb4022d903a757d0c6f118cf86257877055e5","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                        project_domain_id\u003dproject_domain_id,"},{"line_number":94,"context_line":"                        passcode\u003dpasscode)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        pw_method \u003d p.auth_methods[0]"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        self.assertEqual(username, pw_method.username)"},{"line_number":99,"context_line":"        self.assertEqual(user_domain_id, pw_method.user_domain_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5aef4532_7e030474","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":17},"updated":"2016-03-07 20:54:56.000000000","message":"nit: totp_method","commit_id":"efdf375f0dea111e9a29a640d4c13b95e5a93e8d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"7597736c43aea12518872003d925c4243972d4a3","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                        project_domain_id\u003dproject_domain_id,"},{"line_number":94,"context_line":"                        passcode\u003dpasscode)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        pw_method \u003d p.auth_methods[0]"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        self.assertEqual(username, pw_method.username)"},{"line_number":99,"context_line":"        self.assertEqual(user_domain_id, pw_method.user_domain_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5aef4532_456447e4","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":17},"in_reply_to":"5aef4532_7e030474","updated":"2016-03-08 16:45:50.000000000","message":"good catch! too much copy-n-paste :-)","commit_id":"efdf375f0dea111e9a29a640d4c13b95e5a93e8d"}],"releasenotes/notes/add-totp-auth-plugin-0650d220899c25b7.yaml":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b7dba83d91bce5c25a80d0927a8223cbb2d0a071","unresolved":false,"context_lines":[{"line_number":4,"context_line":"   [`blueprint totp-auth \u003chttps://blueprints.launchpad.net/keystone/+spec/totp-auth\u003e`_]"},{"line_number":5,"context_line":"   Add an auth plugin to handle Time-Based One-Time Password (TOTP)"},{"line_number":6,"context_line":"   authentication via the ``totp`` method. This new plugin will accept the"},{"line_number":7,"context_line":"   following identity options:"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"   - ``user-id``: user ID"},{"line_number":10,"context_line":"   - ``user-name``: username"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"7af24918_60cf5c29","line":7,"updated":"2016-03-03 14:16:16.000000000","message":"It actually accepts a bunch more (as seen in the tests). Does that matter? Should the plugin reject them?","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a74617d5e2bf501007ea0fb8a288ca1eed8d085c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"   [`blueprint totp-auth \u003chttps://blueprints.launchpad.net/keystone/+spec/totp-auth\u003e`_]"},{"line_number":5,"context_line":"   Add an auth plugin to handle Time-Based One-Time Password (TOTP)"},{"line_number":6,"context_line":"   authentication via the ``totp`` method. This new plugin will accept the"},{"line_number":7,"context_line":"   following identity options:"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"   - ``user-id``: user ID"},{"line_number":10,"context_line":"   - ``user-name``: username"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"7af24918_ba8181fd","line":7,"in_reply_to":"7af24918_60cf5c29","updated":"2016-03-03 18:36:50.000000000","message":"The TOTP method itself only cares about the identity information. The rest of the auth payload (i.e. scope) are standard. I don\u0027t think we need to document them here.","commit_id":"276ec669a8982e6194bde66c1efafd7371d97c84"},{"author":{"_account_id":11434,"name":"werner mendizabal","email":"nonameentername@gmail.com","username":"nonameentername"},"change_message_id":"a5e5308ef764dd7b24c4e5c45e27a3b23b6a3150","unresolved":false,"context_lines":[{"line_number":10,"context_line":"   - ``user-name``: username"},{"line_number":11,"context_line":"   - ``user-domain-id``: user\u0027s domain ID"},{"line_number":12,"context_line":"   - ``user-domain-name``: user\u0027s domain name"},{"line_number":13,"context_line":"   - ``passcode``: passcode generated by TOTP app or device"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"7aa08908_be0f0587","line":13,"updated":"2016-06-10 20:09:20.000000000","message":"Can you add a note on how these options can be used?\n\nWhat happens if user provides both user-id and user-name or \nuser-domain-id and user-domain-name.","commit_id":"53181ffb18d6845b6eeec43a4adf0057bb322264"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"6a6cb78c450f9e5cd59a3b8445584018a5c78807","unresolved":false,"context_lines":[{"line_number":10,"context_line":"   - ``user-name``: username"},{"line_number":11,"context_line":"   - ``user-domain-id``: user\u0027s domain ID"},{"line_number":12,"context_line":"   - ``user-domain-name``: user\u0027s domain name"},{"line_number":13,"context_line":"   - ``passcode``: passcode generated by TOTP app or device"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"7aa08908_17119a04","line":13,"in_reply_to":"7aa08908_be0f0587","updated":"2016-06-13 16:59:04.000000000","message":"Done","commit_id":"53181ffb18d6845b6eeec43a4adf0057bb322264"}]}
