)]}'
{"id":"openstack%2Fpython-swiftclient~194884","triplet_id":"openstack%2Fpython-swiftclient~master~I81b99d859e3f3a8e92971955c74b01917f53ec9a","project":"openstack/python-swiftclient","branch":"master","topic":"sensitive_log_values","hashtags":[],"change_id":"I81b99d859e3f3a8e92971955c74b01917f53ec9a","subject":"don\u0027t log sensitive request and response header values","status":"ABANDONED","created":"2015-06-24 00:08:28.000000000","updated":"2016-03-07 17:19:28.000000000","total_comment_count":1,"unresolved_comment_count":0,"has_review_started":true,"meta_rev_id":"e3b2d94327154b84b88bad7397713c61f16096cc","_number":194884,"virtual_id_number":194884,"owner":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"actions":{},"labels":{"Verified":{"disliked":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"all":[{"date":"2016-02-19 15:02:19.000000000","_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},{"value":-1,"date":"2015-06-24 02:24:54.000000000","_account_id":3,"name":"Jenkins","username":"jenkins"},{"date":"2016-03-01 14:30:51.000000000","_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},{"date":"2016-02-18 18:04:25.000000000","_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"}],"values":{"-2":"Fails","-1":"Doesn\u0027t seem to work"," 0":"No score","+1":"Works for me","+2":"Verified"},"description":"","value":-1,"default_value":0,"optional":true},"Code-Review":{"recommended":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"all":[{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":3,"name":"Jenkins","username":"jenkins"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},{"value":0,"permitted_voting_range":{"min":-2,"max":2},"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},{"value":0,"permitted_voting_range":{"min":-2,"max":2},"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},{"value":1,"date":"2015-06-24 02:02:30.000000000","permitted_voting_range":{"min":-2,"max":2},"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"}],"values":{"-2":"Do not merge","-1":"This patch needs further work before it can be merged"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me (core reviewer)"},"description":"","value":1,"default_value":0,"optional":true},"Workflow":{"rejected":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"all":[{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},{"_account_id":3,"name":"Jenkins","username":"jenkins"},{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},{"value":-1,"date":"2015-06-24 17:08:42.000000000","permitted_voting_range":{"min":-1,"max":0},"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},{"value":0,"date":"2016-02-17 21:14:42.000000000","permitted_voting_range":{"min":-1,"max":1},"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"}],"values":{"-1":"Work in progress"," 0":"Ready for reviews","+1":"Approved"},"description":"","default_value":0,"optional":true}},"removable_reviewers":[],"reviewers":{"REVIEWER":[{"_account_id":3,"name":"Jenkins","username":"jenkins"},{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2015-06-24 02:02:30.000000000","updated_by":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"reviewer":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"state":"REVIEWER"},{"updated":"2015-06-24 02:24:54.000000000","updated_by":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"reviewer":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"state":"REVIEWER"},{"updated":"2016-02-17 21:14:42.000000000","updated_by":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"reviewer":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"state":"REVIEWER"},{"updated":"2016-02-18 18:04:25.000000000","updated_by":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"reviewer":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"state":"REVIEWER"},{"updated":"2016-02-19 15:02:19.000000000","updated_by":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"reviewer":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"state":"REVIEWER"},{"updated":"2016-03-01 14:30:51.000000000","updated_by":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"reviewer":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"state":"REVIEWER"}],"messages":[{"id":"40ee72a4c1c5d2cd35ab0fe146e9fab28fcbd71b","author":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"date":"2015-06-24 00:08:28.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"b6d1618cc154069535397496c9f09cc5df1f9f39","author":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"date":"2015-06-24 00:17:24.000000000","message":"Patch Set 1:\n\nTwo things to consider:\n\n* What other headers should be redacted, if any?\n\n* John Dickinson suggested using the same configuration convention as Swift itself does, in which there\u0027s a \"reveal_sensitive_prefix\" setting to show some configurable number of characters of sensitive values, to facilitate debugging. I didn\u0027t implement that this this first patchset, mostly because I couldn\u0027t think of where the configuration should live (an environment variable didn\u0027t seem attractive, but I\u0027m not aware of any .swiftclientrc or similar configuration file). Should we do this, and if so, how?","accounts_in_message":[],"_revision_number":1},{"id":"f9af0c22f80af770aa22a03ffe815041c61eea64","author":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"date":"2015-06-24 00:58:12.000000000","message":"Patch Set 1: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see http://docs.openstack.org/infra/manual/developers.html#automated-testing\n\n- gate-python-swiftclient-python26 http://logs.openstack.org/84/194884/1/check/gate-python-swiftclient-python26/713d57e/ : FAILURE in 47s\n- gate-python-swiftclient-pep8 http://logs.openstack.org/84/194884/1/check/gate-python-swiftclient-pep8/fb1bd7b/ : FAILURE in 1m 22s\n- gate-python-swiftclient-docs http://docs-draft.openstack.org/84/194884/1/check/gate-python-swiftclient-docs/4805e8e//doc/build/html/ : SUCCESS in 49s\n- gate-python-swiftclient-python27 http://logs.openstack.org/84/194884/1/check/gate-python-swiftclient-python27/b6b88a0/ : SUCCESS in 1m 00s\n- gate-python-swiftclient-python34 http://logs.openstack.org/84/194884/1/check/gate-python-swiftclient-python34/645b776/ : SUCCESS in 2m 10s\n- gate-python-swiftclient-pypy http://logs.openstack.org/84/194884/1/check/gate-python-swiftclient-pypy/b8611a0/ : SUCCESS in 1m 35s (non-voting)\n- gate-tempest-dsvm-neutron-src-python-swiftclient http://logs.openstack.org/84/194884/1/check/gate-tempest-dsvm-neutron-src-python-swiftclient/f0a5097/ : SUCCESS in 49m 37s\n- check-swift-dsvm-functional http://logs.openstack.org/84/194884/1/check/check-swift-dsvm-functional/76b2cdf/ : SUCCESS in 26m 01s\n- check-swiftclient-dsvm-functional http://logs.openstack.org/84/194884/1/check/check-swiftclient-dsvm-functional/6b9b928/ : FAILURE in 18m 37s","accounts_in_message":[],"_revision_number":1},{"id":"cfbe7de46f0dd28e1410b91b19865c97e84ae3a1","author":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"date":"2015-06-24 01:34:34.000000000","message":"Uploaded patch set 2.","accounts_in_message":[],"_revision_number":2},{"id":"7dfa76a8b7c3dc7ded3df9d2ad83e7105e7e7648","author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"date":"2015-06-24 02:02:30.000000000","message":"Patch Set 2: Code-Review+1\n\n(1 comment)\n\nI\u0027m guessing this is more of an issue for programatic access to swiftclient than on the command line?\n\nWhen I\u0027m trouble shooting on the command line it\u0027s sorta nice to be able get real live working curl requests that I can cut and paste into the terminal and figure out what\u0027s going on.\n\nI mean, stat -v will output the auth_token to the console - why can\u0027t --debug?\n\nIf the issue is just programatic use of the client anytime you have a root logger configured at the debug log level putting auth token in the logs which you\u0027ve probably configured to go to a file on disk - well that\u0027s a different ball of wax - but it\u0027s easier to define configuration by exposing or documenting the interface.\n\nNot a deal breaker, I could be convinced I don\u0027t want `swift --debug ...` to output things that are useful because security - but we should probably recognize that programatic access may have different requirements than our command line tool.  Could also be a follow up patch.\n\nFWIW as a workaround programatic usage could (should?)\n\n    logging.getLogger(\"swiftclient\").setLevel(logging.WARNING)\n\n... not that that\u0027s *documented* anywhere, and it\u0027d be nice if the defaults were sane for programatic access.  Maybe the command line tool could:\n\n    logging.getLogger(\"swiftclient\").swiftclient_logger_blacklist_headers \u003d []\n\nand the default could be setup in the module to exclude stuff you\u0027d probably not want logged.","accounts_in_message":[],"_revision_number":2},{"id":"a747add2165dc6d9d874019c96f9af5767f06154","author":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"date":"2015-06-24 02:24:54.000000000","message":"Patch Set 2: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see http://docs.openstack.org/infra/manual/developers.html#automated-testing\n\n- gate-python-swiftclient-python26 http://logs.openstack.org/84/194884/2/check/gate-python-swiftclient-python26/730b8d7/ : SUCCESS in 1m 12s\n- gate-python-swiftclient-pep8 http://logs.openstack.org/84/194884/2/check/gate-python-swiftclient-pep8/5a3fd37/ : SUCCESS in 51s\n- gate-python-swiftclient-docs http://docs-draft.openstack.org/84/194884/2/check/gate-python-swiftclient-docs/1fd3061//doc/build/html/ : SUCCESS in 41s\n- gate-python-swiftclient-python27 http://logs.openstack.org/84/194884/2/check/gate-python-swiftclient-python27/db9290f/ : SUCCESS in 58s\n- gate-python-swiftclient-python34 http://logs.openstack.org/84/194884/2/check/gate-python-swiftclient-python34/f81b7e2/ : SUCCESS in 2m 24s\n- gate-python-swiftclient-pypy http://logs.openstack.org/84/194884/2/check/gate-python-swiftclient-pypy/f2e5e6b/ : SUCCESS in 2m 11s (non-voting)\n- gate-tempest-dsvm-neutron-src-python-swiftclient http://logs.openstack.org/84/194884/2/check/gate-tempest-dsvm-neutron-src-python-swiftclient/4be1ab3/ : SUCCESS in 50m 14s\n- check-swift-dsvm-functional http://logs.openstack.org/84/194884/2/check/check-swift-dsvm-functional/a93b331/ : SUCCESS in 27m 13s\n- check-swiftclient-dsvm-functional http://logs.openstack.org/84/194884/2/check/check-swiftclient-dsvm-functional/33ee2f9/ : FAILURE in 14m 54s","accounts_in_message":[],"_revision_number":2},{"id":"e86190f51c93e1b5318c7959458d667d8f355ac9","author":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"date":"2015-06-24 17:08:42.000000000","message":"Patch Set 2: Workflow-1\n\nYes, I was thinking in terms of programmatic access with the root logger set to DEBUG, but now that you mention it, I agree that --debug should output real curl commands. I\u0027ll set this proposal to \"-1 work in progress\" for now and look into differentiating programmatic and CLI defaults.","accounts_in_message":[],"_revision_number":2},{"id":"60e41b6170dc29f222ba9cc66d77af555a2042e1","author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"date":"2016-02-18 18:04:25.000000000","message":"Patch Set 2:\n\nwe need to resolve this approach vs https://review.openstack.org/#/c/259273","accounts_in_message":[],"_revision_number":2},{"id":"e093c3dbff80bd8e309014ab415850ea960b5a06","author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"date":"2016-02-19 15:02:19.000000000","message":"Patch Set 2:\n\nI have attempted to combine both approaches to bug #1516692 in a new patch here: https://review.openstack.org/#/c/282363","accounts_in_message":[],"_revision_number":2},{"id":"17176e58f75c865cd966ef030d683ff220e08cb4","author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"date":"2016-03-01 14:30:51.000000000","message":"Patch Set 2:\n\nShouldn\u0027t this be abandoned? The I43dd7254f7281d4db59b286aa2145643c64e1705 is merged with Zack as co-author.","accounts_in_message":[],"_revision_number":2},{"id":"5bdce7213edda2d8868e41e2514f98d2142c4f92","author":{"_account_id":9216,"name":"Joel Wright","email":"joel.wright@gmail.com","username":"jjw-sohonet"},"date":"2016-03-05 21:09:54.000000000","message":"Abandoned\n\nThis has been superseded by patch 282363.","accounts_in_message":[],"_revision_number":2},{"id":"6d1dea94bd5cb9205aa9eb6877b889f3afa7528e","author":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"date":"2016-03-07 17:19:28.000000000","message":"Patch Set 2:\n\nThanks, Joel et al.! Sorry I\u0027ve been out of touch; I likely should have marked this as abandoned myself long ago.","accounts_in_message":[],"_revision_number":2}],"current_revision_number":2,"current_revision":"453606062350d35f4b159c2aca57a373eb93ef16","revisions":{"f029d91f646a9c59e1aa9e6bc1ecdb47e7fee408":{"kind":"REWORK","_number":1,"created":"2015-06-24 00:08:28.000000000","uploader":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"ref":"refs/changes/84/194884/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/python-swiftclient","ref":"refs/changes/84/194884/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/84/194884/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/84/194884/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/84/194884/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/python-swiftclient refs/changes/84/194884/1"}}},"commit":{"parents":[{"commit":"7c716997a8ede3f98741709b0594340df9849a76","subject":"Fix docstring typo for SwiftService.upload","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/7c716997a8ede3f98741709b0594340df9849a76"}]}],"author":{"name":"Zack M. Davis","email":"zdavis@swiftstack.com","date":"2015-06-23 20:31:33.000000000","tz":-420},"committer":{"name":"Zack M. Davis","email":"zdavis@swiftstack.com","date":"2015-06-24 00:05:04.000000000","tz":-420},"subject":"don\u0027t log sensitive request and response header values","message":"don\u0027t log sensitive request and response header values\n\nPreviously, the `http_log` function (called many places in client.py to\nlog information about HTTP requests and responses) would log any headers\ngiven to it (as a dictionary under a \u0027headers\u0027 key in its `kwargs`\nargument). This is not necessarily desirable behavior, because some\nheaders contain cryptosecrets which should be treated with more care\nthan this in the vast majority of use-cases (it should be possible for\nan untrusted party to view debugging logs without compromising the\nsystem itself). Thus, this commit modifies `http_log` to run headers\nthrough a new `scrub` function, which redacts the values of any\n\u0027X-Auth-Token\u0027, \u0027X-Auth-Key\u0027, and \u0027Set-Cookie\u0027 headers (replacing them\nwith the string \"[redacted]\"), prior to actual logging.\n\nAlso, the MockHttpResponse classes is changed to use a\nrequests.structures.CaseInsensitiveDict for its headers, and for\nconsistency with other functions in the client module, `the\nget_auth_1_0` function is changed to pass its headers, rather than an\nempty dictionary, to `http_log` (the actual values won\u0027t be logged, of\ncourse, due to the new `scrub` functionality).\n\nChange-Id: I81b99d859e3f3a8e92971955c74b01917f53ec9a\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/f029d91f646a9c59e1aa9e6bc1ecdb47e7fee408"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/f029d91f646a9c59e1aa9e6bc1ecdb47e7fee408"}]},"branch":"refs/heads/master"},"453606062350d35f4b159c2aca57a373eb93ef16":{"kind":"REWORK","_number":2,"created":"2015-06-24 01:34:34.000000000","uploader":{"_account_id":9878,"name":"Zack M. Davis","email":"zdavis@swiftstack.com","username":"zackmdavis"},"ref":"refs/changes/84/194884/2","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/python-swiftclient","ref":"refs/changes/84/194884/2","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/84/194884/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/84/194884/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/84/194884/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/python-swiftclient refs/changes/84/194884/2"}}},"commit":{"parents":[{"commit":"7c716997a8ede3f98741709b0594340df9849a76","subject":"Fix docstring typo for SwiftService.upload","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/7c716997a8ede3f98741709b0594340df9849a76"}]}],"author":{"name":"Zack M. Davis","email":"zdavis@swiftstack.com","date":"2015-06-23 20:31:33.000000000","tz":-420},"committer":{"name":"Zack M. Davis","email":"zdavis@swiftstack.com","date":"2015-06-24 01:34:08.000000000","tz":-420},"subject":"don\u0027t log sensitive request and response header values","message":"don\u0027t log sensitive request and response header values\n\nPreviously, the `http_log` function (called many places in client.py to\nlog information about HTTP requests and responses) would log any headers\ngiven to it (as a dictionary under a \u0027headers\u0027 key in its `kwargs`\nargument). This is not necessarily desirable behavior, because some\nheaders contain cryptosecrets which should be treated with more care\nthan this in the vast majority of use-cases (it should be possible for\nan untrusted party to view debugging logs without compromising the\nsystem itself). Thus, this commit modifies `http_log` to run headers\nthrough a new `scrub` function, which redacts the values of any\n\u0027X-Auth-Token\u0027, \u0027X-Auth-Key\u0027, and \u0027Set-Cookie\u0027 headers (replacing them\nwith the string \"[redacted]\"), prior to actual logging.\n\nAlso, the MockHttpResponse classes is changed to use a\nrequests.structures.CaseInsensitiveDict for its headers, and for\nconsistency with other functions in the client module, `the\nget_auth_1_0` function is changed to pass its headers, rather than an\nempty dictionary, to `http_log` (the actual values won\u0027t be logged, of\ncourse, due to the new `scrub` functionality).\n\nChange-Id: I81b99d859e3f3a8e92971955c74b01917f53ec9a\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/453606062350d35f4b159c2aca57a373eb93ef16"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/453606062350d35f4b159c2aca57a373eb93ef16"}]},"branch":"refs/heads/master"}},"requirements":[],"submit_records":[],"submit_requirements":[]}
