)]}'
{"oslo_messaging/_drivers/amqpdriver.py":[{"author":{"_account_id":11069,"name":"Corey Wright","email":"undefined+launchpad@pobox.com","username":"coreywright"},"change_message_id":"61274047a9f572a7c793bb881d478174c76bbba7","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    def __call__(self, message):"},{"line_number":105,"context_line":"        ctxt \u003d rpc_amqp.unpack_context(self.conf, message)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"},{"line_number":108,"context_line":"            # Sanitizing the message can be expensive, so only do it"},{"line_number":109,"context_line":"            # if debug logging is enabled."},{"line_number":110,"context_line":"            rpc_common._safe_log(LOG.debug, \u0027received %s\u0027, dict(message))"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_88acdbee","line":107,"updated":"2015-06-13 00:05:50.000000000","message":"We can remove this check if we remove the _safe_log() indirection and call LOG.debug and _fix_passwords() directly.  (See comments on common.py.)","commit_id":"d68da19386fd85f91c43a3e5e0b66fe0c5b63d5c"},{"author":{"_account_id":16366,"name":"Randall Nortman","email":"openstack@nortman.net","username":"rnortman"},"change_message_id":"5270bb4684889d6299dd24e53c4c67cfd421d1a5","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    def __call__(self, message):"},{"line_number":105,"context_line":"        ctxt \u003d rpc_amqp.unpack_context(self.conf, message)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"},{"line_number":108,"context_line":"            # Sanitizing the message can be expensive, so only do it"},{"line_number":109,"context_line":"            # if debug logging is enabled."},{"line_number":110,"context_line":"            rpc_common._safe_log(LOG.debug, \u0027received %s\u0027, dict(message))"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_8ba05592","line":107,"in_reply_to":"fa32b979_88acdbee","updated":"2015-06-13 00:50:34.000000000","message":"Without the LOG.isEnabledFor check, the arguments to LOG.debug will be evaluated even if the message is later discarded, and so _fix_passwords will still run and chew up some CPU.","commit_id":"d68da19386fd85f91c43a3e5e0b66fe0c5b63d5c"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1459f76f34427f9226d1c5dd3628fca2ecb90ea3","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"},{"line_number":108,"context_line":"            # Sanitizing the message can be expensive, so only do it"},{"line_number":109,"context_line":"            # if debug logging is enabled."},{"line_number":110,"context_line":"            rpc_common._safe_log(LOG.debug, \u0027received %s\u0027, dict(message))"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        unique_id \u003d self.msg_id_cache.check_duplicate_message(message)"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_136acc1a","line":110,"updated":"2015-06-16 17:05:46.000000000","message":"Why do you not use strutils.mask_password ?","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":16366,"name":"Randall Nortman","email":"openstack@nortman.net","username":"rnortman"},"change_message_id":"843e65fa73c21a7cdd2b792c76521af24558b957","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"},{"line_number":108,"context_line":"            # Sanitizing the message can be expensive, so only do it"},{"line_number":109,"context_line":"            # if debug logging is enabled."},{"line_number":110,"context_line":"            rpc_common._safe_log(LOG.debug, \u0027received %s\u0027, dict(message))"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        unique_id \u003d self.msg_id_cache.check_duplicate_message(message)"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_ceffd6a8","line":110,"in_reply_to":"fa32b979_136acc1a","updated":"2015-06-16 18:36:41.000000000","message":"There was code here that used strutils.mask_password but it was commented out because mask_password is too slow to use here.  This code executes once on each message received, and the performance was an issue.  (See the patch commit msg for more on the history and bug links.)  This patch introduces a higher-performance version.  You could argue that mask_password should be replaced with this version so that we don\u0027t have two separate implementations, but I wasn\u0027t going to be bold enough to do that myself.","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":11069,"name":"Corey Wright","email":"undefined+launchpad@pobox.com","username":"coreywright"},"change_message_id":"0151bc19583f8b4c56f4581c1d0b4d73d8b74ee8","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from oslo_messaging._i18n import _LI"},{"line_number":32,"context_line":"from oslo_messaging._i18n import _LW"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"from oslo_utils import strutils"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_990f4b2e","line":34,"updated":"2015-07-16 15:25:52.000000000","message":"why is this here instead of with the above non-python-standard-library-but-external-to-this-project imports?\n\ni tested it and flake8 seems to be happy either location (here or above), but maybe there\u0027s an oslo-specific policy that\u0027s not enforced using flake8.","commit_id":"3c1404cdaf1cbd196b8b5777cd91150bc6615303"},{"author":{"_account_id":16366,"name":"Randall Nortman","email":"openstack@nortman.net","username":"rnortman"},"change_message_id":"950e0daee3431c353bd68f9258b241867bb81c2f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from oslo_messaging._i18n import _LI"},{"line_number":32,"context_line":"from oslo_messaging._i18n import _LW"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"from oslo_utils import strutils"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_f9ce97b6","line":34,"in_reply_to":"9a41bdd9_990f4b2e","updated":"2015-07-16 15:30:00.000000000","message":"Because I wasn\u0027t paying attention.\n\nDone","commit_id":"3c1404cdaf1cbd196b8b5777cd91150bc6615303"},{"author":{"_account_id":14358,"name":"Marian Horban","email":"m.horban@gmail.com","username":"mhorban"},"change_message_id":"42d9f5c8ac6f4a9a1f2c2ee0f63889e10eb145bd","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        ctxt \u003d rpc_amqp.unpack_context(self.conf, message)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"},{"line_number":179,"context_line":"            # Sanitizing the message can be expensive, so only do it"},{"line_number":180,"context_line":"            # if debug logging is enabled."},{"line_number":181,"context_line":"            LOG.debug(u\u0027received: %s\u0027,"},{"line_number":182,"context_line":"                      strutils.mask_password(six.text_type(message)))"}],"source_content_type":"text/x-python","patch_set":6,"id":"da20952f_4e66012b","line":179,"updated":"2015-08-31 19:12:06.000000000","message":"Why don\u0027t you evaluate \n\n   is_enabled_debug \u003d LOG.isEnabledFor(logging.DEBUG)\n\nin  __init__ ?","commit_id":"da357e8b68fb8662e46c97008f2958bd2566ded8"}],"oslo_messaging/_drivers/common.py":[{"author":{"_account_id":11069,"name":"Corey Wright","email":"undefined+launchpad@pobox.com","username":"coreywright"},"change_message_id":"61274047a9f572a7c793bb881d478174c76bbba7","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                  or isinstance(d[k], list)"},{"line_number":176,"context_line":"                  or isinstance(d[k], tuple)):"},{"line_number":177,"context_line":"                _fix_passwords(d[k])"},{"line_number":178,"context_line":"    elif isinstance(d[k], list) or isinstance(d[k], tuple):"},{"line_number":179,"context_line":"        for elem in d:"},{"line_number":180,"context_line":"            _fix_passwords(elem)"},{"line_number":181,"context_line":"    return d"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_c5108cab","line":178,"updated":"2015-06-13 00:05:50.000000000","message":"UnboundLocalError: local variable \u0027k\u0027 referenced before assignment\n\nI recommend adding unit tests as I believe that would have caught that error.","commit_id":"d68da19386fd85f91c43a3e5e0b66fe0c5b63d5c"},{"author":{"_account_id":16366,"name":"Randall Nortman","email":"openstack@nortman.net","username":"rnortman"},"change_message_id":"5270bb4684889d6299dd24e53c4c67cfd421d1a5","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                  or isinstance(d[k], list)"},{"line_number":176,"context_line":"                  or isinstance(d[k], tuple)):"},{"line_number":177,"context_line":"                _fix_passwords(d[k])"},{"line_number":178,"context_line":"    elif isinstance(d[k], list) or isinstance(d[k], tuple):"},{"line_number":179,"context_line":"        for elem in d:"},{"line_number":180,"context_line":"            _fix_passwords(elem)"},{"line_number":181,"context_line":"    return d"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_abaf597c","line":178,"in_reply_to":"fa32b979_c5108cab","updated":"2015-06-13 00:50:34.000000000","message":"Done","commit_id":"d68da19386fd85f91c43a3e5e0b66fe0c5b63d5c"},{"author":{"_account_id":11069,"name":"Corey Wright","email":"undefined+launchpad@pobox.com","username":"coreywright"},"change_message_id":"61274047a9f572a7c793bb881d478174c76bbba7","unresolved":false,"context_lines":[{"line_number":181,"context_line":"    return d"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"def _safe_log(log_func, msg, msg_data):"},{"line_number":185,"context_line":"    \"\"\"Sanitizes the msg_data field before logging.\"\"\""},{"line_number":186,"context_line":"    return log_func(msg, _fix_passwords(copy.deepcopy(msg_data)))"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_08520b14","line":184,"updated":"2015-06-13 00:05:50.000000000","message":"Can we reduce the indirection and remove this function and push the functionality into the calling function as:\n\n1. It\u0027s only called by a single function.\n\n2. This commit is hopefully temporary until strutils.mask_password becomes performant.\n\nI realize this function was used previously and we are reintroducing it as this commit is a revert of sorts, but I\u0027m thinking this commit should be minimal because the indirection/infrastructure is unwarranted long-term.\n\nI\u0027ll defer to regular oslo.messaging reviewers.","commit_id":"d68da19386fd85f91c43a3e5e0b66fe0c5b63d5c"},{"author":{"_account_id":16366,"name":"Randall Nortman","email":"openstack@nortman.net","username":"rnortman"},"change_message_id":"5270bb4684889d6299dd24e53c4c67cfd421d1a5","unresolved":false,"context_lines":[{"line_number":181,"context_line":"    return d"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"def _safe_log(log_func, msg, msg_data):"},{"line_number":185,"context_line":"    \"\"\"Sanitizes the msg_data field before logging.\"\"\""},{"line_number":186,"context_line":"    return log_func(msg, _fix_passwords(copy.deepcopy(msg_data)))"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa32b979_4befadb0","line":184,"in_reply_to":"fa32b979_08520b14","updated":"2015-06-13 00:50:34.000000000","message":"I could go either way on this.  I like the safety of having the deepcopy done in _safe_log.  In case this ends up living longer than we expect and maybe getting used in other places in the code, failing to remember the deepcopy when calling _fix_passwords could result in disaster.","commit_id":"d68da19386fd85f91c43a3e5e0b66fe0c5b63d5c"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"73ee27bc7ee3c8ed37879b93f42c4e643da59981","unresolved":false,"context_lines":[{"line_number":166,"context_line":"def _fix_passwords(d):"},{"line_number":167,"context_line":"    \"\"\"Sanitizes the password fields in the dictionary.\"\"\""},{"line_number":168,"context_line":"    if isinstance(d, dict):"},{"line_number":169,"context_line":"        for k in six.iterkeys(d):"},{"line_number":170,"context_line":"            if (k.lower() in _SANITIZE"},{"line_number":171,"context_line":"                    or k.lower().find(\u0027password\u0027) !\u003d -1"},{"line_number":172,"context_line":"                    or k.lower().find(\u0027auth_token\u0027) !\u003d -1):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_333cb0e1","line":169,"updated":"2015-06-16 17:12:23.000000000","message":"since we know we need both the key and value, can we do a six.iteritems?\n\n    for k, v in six.iteritems(d):","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":16366,"name":"Randall Nortman","email":"openstack@nortman.net","username":"rnortman"},"change_message_id":"843e65fa73c21a7cdd2b792c76521af24558b957","unresolved":false,"context_lines":[{"line_number":166,"context_line":"def _fix_passwords(d):"},{"line_number":167,"context_line":"    \"\"\"Sanitizes the password fields in the dictionary.\"\"\""},{"line_number":168,"context_line":"    if isinstance(d, dict):"},{"line_number":169,"context_line":"        for k in six.iterkeys(d):"},{"line_number":170,"context_line":"            if (k.lower() in _SANITIZE"},{"line_number":171,"context_line":"                    or k.lower().find(\u0027password\u0027) !\u003d -1"},{"line_number":172,"context_line":"                    or k.lower().find(\u0027auth_token\u0027) !\u003d -1):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_c168078a","line":169,"in_reply_to":"fa32b979_333cb0e1","updated":"2015-06-16 18:36:41.000000000","message":"Done","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"73ee27bc7ee3c8ed37879b93f42c4e643da59981","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                    or k.lower().find(\u0027password\u0027) !\u003d -1"},{"line_number":172,"context_line":"                    or k.lower().find(\u0027auth_token\u0027) !\u003d -1):"},{"line_number":173,"context_line":"                d[k] \u003d \u0027\u003cSANITIZED\u003e\u0027"},{"line_number":174,"context_line":"            elif (isinstance(d[k], dict)"},{"line_number":175,"context_line":"                  or isinstance(d[k], list)"},{"line_number":176,"context_line":"                  or isinstance(d[k], tuple)):"},{"line_number":177,"context_line":"                _fix_passwords(d[k])"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_d3f8e44b","line":174,"updated":"2015-06-16 17:12:23.000000000","message":"this should work right?\n    \n    isinstance(d[k], (dict, list, tuple))","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":16366,"name":"Randall Nortman","email":"openstack@nortman.net","username":"rnortman"},"change_message_id":"843e65fa73c21a7cdd2b792c76521af24558b957","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                    or k.lower().find(\u0027password\u0027) !\u003d -1"},{"line_number":172,"context_line":"                    or k.lower().find(\u0027auth_token\u0027) !\u003d -1):"},{"line_number":173,"context_line":"                d[k] \u003d \u0027\u003cSANITIZED\u003e\u0027"},{"line_number":174,"context_line":"            elif (isinstance(d[k], dict)"},{"line_number":175,"context_line":"                  or isinstance(d[k], list)"},{"line_number":176,"context_line":"                  or isinstance(d[k], tuple)):"},{"line_number":177,"context_line":"                _fix_passwords(d[k])"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_6106dbcf","line":174,"in_reply_to":"fa32b979_d3f8e44b","updated":"2015-06-16 18:36:41.000000000","message":"Done","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"53da26a46a804e5ab130c7f0da893da86c96e67a","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                  or isinstance(d[k], list)"},{"line_number":176,"context_line":"                  or isinstance(d[k], tuple)):"},{"line_number":177,"context_line":"                _fix_passwords(d[k])"},{"line_number":178,"context_line":"    elif isinstance(d, list) or isinstance(d, tuple):"},{"line_number":179,"context_line":"        for elem in d:"},{"line_number":180,"context_line":"            _fix_passwords(elem)"},{"line_number":181,"context_line":"    return d"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_8fb6f388","line":178,"updated":"2015-06-15 13:39:05.000000000","message":"Can we add a test for this case as well?","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":16366,"name":"Randall Nortman","email":"openstack@nortman.net","username":"rnortman"},"change_message_id":"843e65fa73c21a7cdd2b792c76521af24558b957","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                  or isinstance(d[k], list)"},{"line_number":176,"context_line":"                  or isinstance(d[k], tuple)):"},{"line_number":177,"context_line":"                _fix_passwords(d[k])"},{"line_number":178,"context_line":"    elif isinstance(d, list) or isinstance(d, tuple):"},{"line_number":179,"context_line":"        for elem in d:"},{"line_number":180,"context_line":"            _fix_passwords(elem)"},{"line_number":181,"context_line":"    return d"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_2110d300","line":178,"in_reply_to":"fa32b979_3e21d79f","updated":"2015-06-16 18:36:41.000000000","message":"Done","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":16366,"name":"Randall Nortman","email":"openstack@nortman.net","username":"rnortman"},"change_message_id":"2233fdbc16fdb478f61b4336b54b936dddbbba9f","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                  or isinstance(d[k], list)"},{"line_number":176,"context_line":"                  or isinstance(d[k], tuple)):"},{"line_number":177,"context_line":"                _fix_passwords(d[k])"},{"line_number":178,"context_line":"    elif isinstance(d, list) or isinstance(d, tuple):"},{"line_number":179,"context_line":"        for elem in d:"},{"line_number":180,"context_line":"            _fix_passwords(elem)"},{"line_number":181,"context_line":"    return d"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_92fe1a6a","line":178,"in_reply_to":"fa32b979_8fb6f388","updated":"2015-06-15 13:52:31.000000000","message":"If I\u0027m not mistaken the existing test already covers this branch, because the above check (to see if d[k] is a dict, list, or tuple) will recursively call _fix_passwords, and then if it\u0027s a list or tuple, this branch will be followed.  The test case includes both lists and tuples.","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"bd80dff7bb55b7b29d0f80cd8471bee15a2c61f4","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                  or isinstance(d[k], list)"},{"line_number":176,"context_line":"                  or isinstance(d[k], tuple)):"},{"line_number":177,"context_line":"                _fix_passwords(d[k])"},{"line_number":178,"context_line":"    elif isinstance(d, list) or isinstance(d, tuple):"},{"line_number":179,"context_line":"        for elem in d:"},{"line_number":180,"context_line":"            _fix_passwords(elem)"},{"line_number":181,"context_line":"    return d"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_f0c0a57e","line":178,"in_reply_to":"fa32b979_92fe1a6a","updated":"2015-06-15 23:57:57.000000000","message":"Aha! I wasn\u0027t thinking clearly. Thanks!","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":5638,"name":"Davanum Srinivas","email":"davanum@gmail.com","username":"dims-v"},"change_message_id":"73ee27bc7ee3c8ed37879b93f42c4e643da59981","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                  or isinstance(d[k], list)"},{"line_number":176,"context_line":"                  or isinstance(d[k], tuple)):"},{"line_number":177,"context_line":"                _fix_passwords(d[k])"},{"line_number":178,"context_line":"    elif isinstance(d, list) or isinstance(d, tuple):"},{"line_number":179,"context_line":"        for elem in d:"},{"line_number":180,"context_line":"            _fix_passwords(elem)"},{"line_number":181,"context_line":"    return d"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa32b979_3e21d79f","line":178,"in_reply_to":"fa32b979_f0c0a57e","updated":"2015-06-16 17:12:23.000000000","message":"This should work right?\n\n    isinstance(d, (list, tuple))","commit_id":"78b5cc430bad7d477780238d7394eaa62ca3c602"},{"author":{"_account_id":11069,"name":"Corey Wright","email":"undefined+launchpad@pobox.com","username":"coreywright"},"change_message_id":"9f4ab30eab0685d749a2b1fc66bd1952cf649151","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            if (k.lower() in _SANITIZE"},{"line_number":171,"context_line":"                    or k.lower().find(\u0027password\u0027) !\u003d -1"},{"line_number":172,"context_line":"                    or k.lower().find(\u0027auth_token\u0027) !\u003d -1):"},{"line_number":173,"context_line":"                d[k] \u003d \u0027\u003cSANITIZED\u003e\u0027"},{"line_number":174,"context_line":"            elif isinstance(v, (dict, list, tuple)):"},{"line_number":175,"context_line":"                _fix_passwords(v)"},{"line_number":176,"context_line":"    elif isinstance(d, (list, tuple)):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_2fa98e90","line":173,"updated":"2015-06-17 02:41:14.000000000","message":"ignore me if by this point (ie we\u0027ve identified the key by keyword) the value will only ever be a string...\n\nthe only corner-case i can think of is if the value is not a string and we just replaced it with one, but i\u0027ll admit i\u0027m ignorant about message formats and maybe this will never happen for values associated with the identified keys (eg \"password\", \"auth_token\").","commit_id":"55cb1828a238bb65bea89c6bd8ba2e0b01800d35"},{"author":{"_account_id":16366,"name":"Randall Nortman","email":"openstack@nortman.net","username":"rnortman"},"change_message_id":"ec0a382369b1f998ff4ad0df9028260a7fa01504","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            if (k.lower() in _SANITIZE"},{"line_number":171,"context_line":"                    or k.lower().find(\u0027password\u0027) !\u003d -1"},{"line_number":172,"context_line":"                    or k.lower().find(\u0027auth_token\u0027) !\u003d -1):"},{"line_number":173,"context_line":"                d[k] \u003d \u0027\u003cSANITIZED\u003e\u0027"},{"line_number":174,"context_line":"            elif isinstance(v, (dict, list, tuple)):"},{"line_number":175,"context_line":"                _fix_passwords(v)"},{"line_number":176,"context_line":"    elif isinstance(d, (list, tuple)):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa32b979_31e00129","line":173,"in_reply_to":"fa32b979_2fa98e90","updated":"2015-06-17 12:50:01.000000000","message":"You\u0027re right that if any matching key maps to a non-string value, it will be replaced with a string.  But if the key matches, then it must be something like \"password\", so whatever it is, string or other, we want to sanitize it.  And remember this is only for debug logging purposes; the message continues on unmodified for actual processing.","commit_id":"55cb1828a238bb65bea89c6bd8ba2e0b01800d35"}]}
