)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f2e0e232c708c7ab6594475848ad5c8d0dc30efc","unresolved":true,"context_lines":[{"line_number":17,"context_line":"  sha512:\u003csig\u003e"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Give the formpost signiture an argparse overhaul so we can optionally"},{"line_number":20,"context_line":"pass in a digest to use."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"[1] https://www.schneier.com/blog/archives/2012/10/when_will_we_se.html"},{"line_number":23,"context_line":"[2] https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"4eb3a157_685aa1b4","line":20,"updated":"2022-04-14 15:19:59.000000000","message":"Seems like this might be better as separate patches, particularly since there seems to be interest in backporting parts of it. My thinking is three changes:\n\n- add support for sha256/512 (which can be backported as a \"security hardening opportunity\" if not exactly a \"security fix\")\n- deprecate sha1 (which is basically literally just adding the log message)\n- the swift-form-signature overhaul\n\nWDYT?","commit_id":"46a465c54232259b01ec156610fddd4e6938960d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6f43c221ff1ddeed530a0406513e394013c52356","unresolved":false,"context_lines":[{"line_number":17,"context_line":"  sha512:\u003csig\u003e"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Give the formpost signiture an argparse overhaul so we can optionally"},{"line_number":20,"context_line":"pass in a digest to use."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"[1] https://www.schneier.com/blog/archives/2012/10/when_will_we_se.html"},{"line_number":23,"context_line":"[2] https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"a4008a79_6da12fe7","line":20,"in_reply_to":"1cc527ef_30aa1535","updated":"2022-05-05 05:51:33.000000000","message":"Ack","commit_id":"46a465c54232259b01ec156610fddd4e6938960d"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"5e4cd53c1c8a15dfdc1c8a9aee51aca1ca3782c1","unresolved":true,"context_lines":[{"line_number":17,"context_line":"  sha512:\u003csig\u003e"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Give the formpost signiture an argparse overhaul so we can optionally"},{"line_number":20,"context_line":"pass in a digest to use."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"[1] https://www.schneier.com/blog/archives/2012/10/when_will_we_se.html"},{"line_number":23,"context_line":"[2] https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1cc527ef_30aa1535","line":20,"in_reply_to":"4eb3a157_685aa1b4","updated":"2022-04-19 02:39:44.000000000","message":"Yeah, a spit makes sense esp if we want a backport. The swift-form-signature overhaul would allow poople to use a different scheme esp if they rely on that tool to generate the signature. So maybe it should be included into the first (or is it too out of scope for security hardening)?\n\nI do have a swiftclient patch to move the generation over in the client (https://review.opendev.org/c/openstack/python-swiftclient/+/833954).. so maybe it\u0027s a moot point adding it at all (depending on when the swift client patch lands and released)","commit_id":"46a465c54232259b01ec156610fddd4e6938960d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a7532750acb90a93723a3c6daf78512e8c1501e","unresolved":true,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch follows the approach of soft deprecation of SHA1 in tempurl."},{"line_number":13,"context_line":"It\u0027s still a default digest, but we\u0027ll start with warning as the"},{"line_number":14,"context_line":"middleware is loaded."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Further, because there is much shared code between formpost and tempurl, this"},{"line_number":17,"context_line":"patch also goes and refactors shared code out into swift.common.digest."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9ec43794_b9cf65a0","line":14,"updated":"2022-07-23 04:57:58.000000000","message":"... and exposing any deprecated digests (if they\u0027re still allowed) in /info.","commit_id":"2c8fe050b5b17ed57b46e578d2989db0429e9980"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9e01da18352a0a7d656225016107eea1e7830f23","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch follows the approach of soft deprecation of SHA1 in tempurl."},{"line_number":13,"context_line":"It\u0027s still a default digest, but we\u0027ll start with warning as the"},{"line_number":14,"context_line":"middleware is loaded."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Further, because there is much shared code between formpost and tempurl, this"},{"line_number":17,"context_line":"patch also goes and refactors shared code out into swift.common.digest."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"3c43ab0a_3ee2404a","line":14,"in_reply_to":"9ec43794_b9cf65a0","updated":"2022-07-26 00:42:37.000000000","message":"Done","commit_id":"2c8fe050b5b17ed57b46e578d2989db0429e9980"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c8befe068fe5905af3facb0167fd846ed537bd15","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4af823d8_918082b6","updated":"2022-03-15 06:27:48.000000000","message":"Have a 1/2 written formport patch for swiftclient. will continue in the morning.","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55b347fd75865617e1cbc25e42504401a0acb6d4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d1be4913_18faab41","updated":"2022-03-15 05:42:37.000000000","message":"Thanks for already having a quick look Tim!","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"5e4cd53c1c8a15dfdc1c8a9aee51aca1ca3782c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"cb2a2d84_4abe30eb","updated":"2022-04-19 02:39:44.000000000","message":"Sorry for the late response, was off over easter.","commit_id":"46a465c54232259b01ec156610fddd4e6938960d"},{"author":{"_account_id":9914,"name":"Ade Lee","email":"alee@redhat.com","username":"alee"},"change_message_id":"64603548703dd3715286b8537dd9ab035c3226c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"76db2418_efd2ce71","updated":"2022-04-14 15:28:49.000000000","message":"sounds reasonable to me.  we\u0027re gong to want to backport this so that we can make things work as far back as wallaby.","commit_id":"46a465c54232259b01ec156610fddd4e6938960d"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"d80993257357885af39219f0c83612d7c9d1126b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"a5b3e44e_50915c9b","updated":"2022-04-20 12:28:07.000000000","message":"Matt, I think the last patchset is missing the former changes - can you please have a look?","commit_id":"4e97a8b8fc965fc8a0f88e53d9d5b472ea40ad4a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6f43c221ff1ddeed530a0406513e394013c52356","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"be6d55c8_e8e8442e","in_reply_to":"a5b3e44e_50915c9b","updated":"2022-05-05 05:51:33.000000000","message":"I broke up the old patchset into a few. Thought having support for more digests should come first before we remove the only supported digest. Also means more digest support could be backported for people wanted to comply to FIPs or whatever.\n\nKept this with old change-id so is a little confusing.","commit_id":"4e97a8b8fc965fc8a0f88e53d9d5b472ea40ad4a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0c89b9041e4527ce3eed0793a2f5f41a0510feec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"bedb5ebb_f9d6b2fc","updated":"2022-05-27 05:52:38.000000000","message":"IDK -- I don\u0027t really like having our default config triggering warnings.","commit_id":"ff1b1a21e916908989b540fb52773e440a5a73ef"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"dcd70178578924ffc63f189ee7b001291422fff9","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"7712eb01_3a671390","updated":"2022-05-24 09:56:42.000000000","message":"LGTM, wfm, just one minor question inside.","commit_id":"ff1b1a21e916908989b540fb52773e440a5a73ef"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ff02a09737c0432319d029a6a8f4df8fffc1beae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"ab4c76a8_52ac7300","updated":"2022-06-30 22:56:31.000000000","message":"I like the new module! I think I prefer it as swift/common/digest_utils.py, though, given how we\u0027ll surely want to use it for admin /info calls.","commit_id":"095be0a99b586322a638c993a28ffe021be02197"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"ec8cc489795c54a99acb860c30de2176f5feb15d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"834e8236_9d5eb63f","updated":"2022-06-30 06:49:13.000000000","message":"Thanks Christian for the review. In the meeting this morning we discussed how we\u0027re deprecating sha1 in tempurl and thought we might like a more soft approach. So reased this off that softer follow up for tempurl. And as we\u0027re following it. Could do some refactoring to make it less cludgy.\n","commit_id":"095be0a99b586322a638c993a28ffe021be02197"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9e01da18352a0a7d656225016107eea1e7830f23","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"a03a3fc2_66369e27","updated":"2022-07-26 00:42:37.000000000","message":"Thanks Tim, squashing in the follow up!","commit_id":"2c8fe050b5b17ed57b46e578d2989db0429e9980"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a7532750acb90a93723a3c6daf78512e8c1501e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"1f3b2e0c_052ee4af","updated":"2022-07-23 04:57:58.000000000","message":"Yeah, this all looks pretty straightforward. I whipped up https://review.opendev.org/c/openstack/swift/+/850787 to do something similar for /info requests, and the new module really helped out. There\u0027s also https://review.opendev.org/c/openstack/python-swiftclient/+/850786 to make it easier to sign /info requests.\n\nHad a couple thoughts on the signature for get_allowed_digests(), but otherwise I think I\u0027m happy to merge this next week.","commit_id":"2c8fe050b5b17ed57b46e578d2989db0429e9980"}],"swift/cli/form_signature.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b4ab128536489d01c4f204178b45971da948a347","unresolved":true,"context_lines":[{"line_number":19,"context_line":"import hmac"},{"line_number":20,"context_line":"import six"},{"line_number":21,"context_line":"from time import time"},{"line_number":22,"context_line":"import argparse"},{"line_number":23,"context_line":"from swift.common.middleware.tempurl import SUPPORTED_DIGESTS"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"45d5151b_ea9239f7","line":22,"updated":"2022-03-15 05:12:53.000000000","message":"Whoo! Go argparse!\n\nLong term, we probably ought to pull this out to swiftclient, like we did with swift-temp-url in\n\n- https://github.com/openstack/python-swiftclient/commit/def0e0a6\n- https://github.com/openstack/swift/commit/350f10bf\n- https://github.com/openstack/swift/commit/250da37a","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55b347fd75865617e1cbc25e42504401a0acb6d4","unresolved":true,"context_lines":[{"line_number":19,"context_line":"import hmac"},{"line_number":20,"context_line":"import six"},{"line_number":21,"context_line":"from time import time"},{"line_number":22,"context_line":"import argparse"},{"line_number":23,"context_line":"from swift.common.middleware.tempurl import SUPPORTED_DIGESTS"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9bff4960_e5f43dcd","line":22,"in_reply_to":"45d5151b_ea9239f7","updated":"2022-03-15 05:42:37.000000000","message":"Yeah, I thuoght that too. but figured we probably shouldn\u0027t do it all at once.. though as you mention later, we are doing a bunch at once already.\n\nJust started poking and it started to snowball :P","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a7532750acb90a93723a3c6daf78512e8c1501e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import hmac"},{"line_number":20,"context_line":"import six"},{"line_number":21,"context_line":"from time import time"},{"line_number":22,"context_line":"import argparse"},{"line_number":23,"context_line":"from swift.common.middleware.tempurl import SUPPORTED_DIGESTS"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7991ed47_ba4bb95e","line":22,"in_reply_to":"9bff4960_e5f43dcd","updated":"2022-07-23 04:57:58.000000000","message":"Ack","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b4ab128536489d01c4f204178b45971da948a347","unresolved":true,"context_lines":[{"line_number":42,"context_line":"                        help\u003d\u0027The number of seconds from now to allow the \u0027"},{"line_number":43,"context_line":"                             \u0027form post to begin.\u0027)"},{"line_number":44,"context_line":"    parser.add_argument(\u0027key\u0027,"},{"line_number":45,"context_line":"                        help\u003d\u0027The X-Account-Meta-Temp-URL-Key for the \u0027"},{"line_number":46,"context_line":"                             \u0027account/container.\u0027)"},{"line_number":47,"context_line":"    parser.add_argument(\u0027--algorithm\u0027, \u0027-a\u0027, default\u003d\u0027sha512\u0027,"},{"line_number":48,"context_line":"                        choices\u003dSUPPORTED_DIGESTS,"}],"source_content_type":"text/x-python","patch_set":1,"id":"57934cb4_c229ac3b","line":45,"updated":"2022-03-15 05:12:53.000000000","message":"Off-topic: Users can also use container tempurl keys, right?","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55b347fd75865617e1cbc25e42504401a0acb6d4","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                        help\u003d\u0027The number of seconds from now to allow the \u0027"},{"line_number":43,"context_line":"                             \u0027form post to begin.\u0027)"},{"line_number":44,"context_line":"    parser.add_argument(\u0027key\u0027,"},{"line_number":45,"context_line":"                        help\u003d\u0027The X-Account-Meta-Temp-URL-Key for the \u0027"},{"line_number":46,"context_line":"                             \u0027account/container.\u0027)"},{"line_number":47,"context_line":"    parser.add_argument(\u0027--algorithm\u0027, \u0027-a\u0027, default\u003d\u0027sha512\u0027,"},{"line_number":48,"context_line":"                        choices\u003dSUPPORTED_DIGESTS,"}],"source_content_type":"text/x-python","patch_set":1,"id":"a6f798a5_683b65f7","line":45,"in_reply_to":"57934cb4_c229ac3b","updated":"2022-03-15 05:42:37.000000000","message":"Yeah, they can. Formpost hasn\u0027t had much love. Just copied and pasted, will fix it. Thanks","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b4ab128536489d01c4f204178b45971da948a347","unresolved":true,"context_lines":[{"line_number":45,"context_line":"                        help\u003d\u0027The X-Account-Meta-Temp-URL-Key for the \u0027"},{"line_number":46,"context_line":"                             \u0027account/container.\u0027)"},{"line_number":47,"context_line":"    parser.add_argument(\u0027--algorithm\u0027, \u0027-a\u0027, default\u003d\u0027sha512\u0027,"},{"line_number":48,"context_line":"                        choices\u003dSUPPORTED_DIGESTS,"},{"line_number":49,"context_line":"                        help\u003d\u0027Select the hash algorithm to use.\u0027)"},{"line_number":50,"context_line":"    return parser"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3c284dee_45d347d4","line":48,"range":{"start_line":48,"start_character":32,"end_line":48,"end_character":49},"updated":"2022-03-15 05:12:53.000000000","message":"Right; the maximally-inclusive set. Even once we actually *drop* support server-side, though, users may still want to use SHA-1 when talking to some old clusters or something... all the more reason we want to move this to the client.","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55b347fd75865617e1cbc25e42504401a0acb6d4","unresolved":true,"context_lines":[{"line_number":45,"context_line":"                        help\u003d\u0027The X-Account-Meta-Temp-URL-Key for the \u0027"},{"line_number":46,"context_line":"                             \u0027account/container.\u0027)"},{"line_number":47,"context_line":"    parser.add_argument(\u0027--algorithm\u0027, \u0027-a\u0027, default\u003d\u0027sha512\u0027,"},{"line_number":48,"context_line":"                        choices\u003dSUPPORTED_DIGESTS,"},{"line_number":49,"context_line":"                        help\u003d\u0027Select the hash algorithm to use.\u0027)"},{"line_number":50,"context_line":"    return parser"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"c730e748_df2ef1ca","line":48,"range":{"start_line":48,"start_character":32,"end_line":48,"end_character":49},"in_reply_to":"3c284dee_45d347d4","updated":"2022-03-15 05:42:37.000000000","message":"hmm, yeah, that\u0027s not great is it.\n\nMaybe we leave it as SUPPORTED_DISGESTS here, and I\u0027ll get a patch together to add it to the client. When we drop the sha1 fully we can also plan to drop this cli tool completely too?","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b4ab128536489d01c4f204178b45971da948a347","unresolved":true,"context_lines":[{"line_number":86,"context_line":"            key.encode(\u0027utf8\u0027)"},{"line_number":87,"context_line":"    sig \u003d hmac.new(key, data, args.algorithm).hexdigest()"},{"line_number":88,"context_line":"    print(\u0027  Expires:\u0027, expires)"},{"line_number":89,"context_line":"    print(\u0027Signature: %s:%s\u0027 % (args.algorithm, sig))"},{"line_number":90,"context_line":"    print(\u0027\u0027)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    print(\u0027Sample form:\\n\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"6d7cbec0_e1068d18","line":89,"range":{"start_line":89,"start_character":32,"end_line":89,"end_character":46},"updated":"2022-03-15 05:12:53.000000000","message":"We should probably only prepend this if it\u0027s not sha1. Otherwise this won\u0027t work for old clusters.","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55b347fd75865617e1cbc25e42504401a0acb6d4","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            key.encode(\u0027utf8\u0027)"},{"line_number":87,"context_line":"    sig \u003d hmac.new(key, data, args.algorithm).hexdigest()"},{"line_number":88,"context_line":"    print(\u0027  Expires:\u0027, expires)"},{"line_number":89,"context_line":"    print(\u0027Signature: %s:%s\u0027 % (args.algorithm, sig))"},{"line_number":90,"context_line":"    print(\u0027\u0027)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    print(\u0027Sample form:\\n\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"65cb288a_0759884d","line":89,"range":{"start_line":89,"start_character":32,"end_line":89,"end_character":46},"in_reply_to":"6d7cbec0_e1068d18","updated":"2022-03-15 05:42:37.000000000","message":"Ack","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b4ab128536489d01c4f204178b45971da948a347","unresolved":true,"context_lines":[{"line_number":106,"context_line":"          % args.max_file_count)"},{"line_number":107,"context_line":"    print(\u0027  \u003cinput type\u003d\"hidden\" name\u003d\"expires\" value\u003d\"%d\" /\u003e\u0027 % expires)"},{"line_number":108,"context_line":"    print(\u0027  \u003cinput type\u003d\"hidden\" name\u003d\"signature\" value\u003d\"%s:%s\" /\u003e\u0027 %"},{"line_number":109,"context_line":"          (args.algorithm, sig))"},{"line_number":110,"context_line":"    print(\u0027  \u003c!-- This signature allows for at most %d files, --\u003e\u0027"},{"line_number":111,"context_line":"          % args.max_file_count)"},{"line_number":112,"context_line":"    print(\u0027  \u003c!-- but it may also have any smaller number. --\u003e\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"2b0cd3f0_dd9fcfaa","line":109,"range":{"start_line":109,"start_character":11,"end_line":109,"end_character":25},"updated":"2022-03-15 05:12:53.000000000","message":"ditto","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55b347fd75865617e1cbc25e42504401a0acb6d4","unresolved":false,"context_lines":[{"line_number":106,"context_line":"          % args.max_file_count)"},{"line_number":107,"context_line":"    print(\u0027  \u003cinput type\u003d\"hidden\" name\u003d\"expires\" value\u003d\"%d\" /\u003e\u0027 % expires)"},{"line_number":108,"context_line":"    print(\u0027  \u003cinput type\u003d\"hidden\" name\u003d\"signature\" value\u003d\"%s:%s\" /\u003e\u0027 %"},{"line_number":109,"context_line":"          (args.algorithm, sig))"},{"line_number":110,"context_line":"    print(\u0027  \u003c!-- This signature allows for at most %d files, --\u003e\u0027"},{"line_number":111,"context_line":"          % args.max_file_count)"},{"line_number":112,"context_line":"    print(\u0027  \u003c!-- but it may also have any smaller number. --\u003e\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"6589a7e9_570c2d6c","line":109,"range":{"start_line":109,"start_character":11,"end_line":109,"end_character":25},"in_reply_to":"2b0cd3f0_dd9fcfaa","updated":"2022-03-15 05:42:37.000000000","message":"Ack","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"}],"swift/common/digest.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a7532750acb90a93723a3c6daf78512e8c1501e","unresolved":true,"context_lines":[{"line_number":69,"context_line":"    return hmac.new(key, message, digest).hexdigest()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"def get_allowed_digests(conf, logger):"},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    Pulls out \u0027allowed_digests\u0027 from the supplied conf. Then compares them with"},{"line_number":75,"context_line":"    the list of supported and deprecated digests and returns whatever remain."}],"source_content_type":"text/x-python","patch_set":14,"id":"00402829_d6355213","line":72,"range":{"start_line":72,"start_character":24,"end_line":72,"end_character":28},"updated":"2022-07-23 04:57:58.000000000","message":"I might prefer having callers pass allowed_digests (i.e. conf.get(\u0027allowed_digests\u0027) ) instead of the whole conf dict, since we only care about the one option. Then it also gives them more flexibility on option name -- https://review.opendev.org/c/openstack/swift/+/850787 might be better using info_allowed_digests or something. *shrug*","commit_id":"2c8fe050b5b17ed57b46e578d2989db0429e9980"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9e01da18352a0a7d656225016107eea1e7830f23","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    return hmac.new(key, message, digest).hexdigest()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"def get_allowed_digests(conf, logger):"},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    Pulls out \u0027allowed_digests\u0027 from the supplied conf. Then compares them with"},{"line_number":75,"context_line":"    the list of supported and deprecated digests and returns whatever remain."}],"source_content_type":"text/x-python","patch_set":14,"id":"8114b745_e20856e4","line":72,"range":{"start_line":72,"start_character":24,"end_line":72,"end_character":28},"in_reply_to":"00402829_d6355213","updated":"2022-07-26 00:42:37.000000000","message":"Done","commit_id":"2c8fe050b5b17ed57b46e578d2989db0429e9980"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a7532750acb90a93723a3c6daf78512e8c1501e","unresolved":true,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    :param conf: conf or dict object that holds the allowed_digests setting."},{"line_number":80,"context_line":"        Defaults to DEFAULT_ALLOWED_DIGESTS."},{"line_number":81,"context_line":"    :param logger: Logger object to use it issue any warnings to."},{"line_number":82,"context_line":"    :returns: A set of allowed digests that are supported and a set of"},{"line_number":83,"context_line":"        deprecated digests."},{"line_number":84,"context_line":"    :raises: ValueError, if there are no digests left to return."}],"source_content_type":"text/x-python","patch_set":14,"id":"e52238ab_7b184534","line":81,"updated":"2022-07-23 04:57:58.000000000","message":"I\u0027m not *sure* it\u0027s a good idea, but we could make this optional and only do the warnings if provided.","commit_id":"2c8fe050b5b17ed57b46e578d2989db0429e9980"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9e01da18352a0a7d656225016107eea1e7830f23","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    :param conf: conf or dict object that holds the allowed_digests setting."},{"line_number":80,"context_line":"        Defaults to DEFAULT_ALLOWED_DIGESTS."},{"line_number":81,"context_line":"    :param logger: Logger object to use it issue any warnings to."},{"line_number":82,"context_line":"    :returns: A set of allowed digests that are supported and a set of"},{"line_number":83,"context_line":"        deprecated digests."},{"line_number":84,"context_line":"    :raises: ValueError, if there are no digests left to return."}],"source_content_type":"text/x-python","patch_set":14,"id":"5c6d88a5_93cd190b","line":81,"in_reply_to":"e52238ab_7b184534","updated":"2022-07-26 00:42:37.000000000","message":"Done","commit_id":"2c8fe050b5b17ed57b46e578d2989db0429e9980"}],"swift/common/middleware/digest_utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ff02a09737c0432319d029a6a8f4df8fffc1beae","unresolved":true,"context_lines":[{"line_number":23,"context_line":"SUPPORTED_DIGESTS \u003d set(DEFAULT_ALLOWED_DIGESTS.split()) | DEPRECATED_DIGESTS"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def get_allowed_digests(conf, logger):"},{"line_number":27,"context_line":"    allowed_digests \u003d set("},{"line_number":28,"context_line":"        digest.lower() for digest in conf.get(\u0027allowed_digests\u0027, \u0027\u0027).split())"},{"line_number":29,"context_line":"    if not allowed_digests:"}],"source_content_type":"text/x-python","patch_set":10,"id":"487689b2_dd7bdce9","line":26,"updated":"2022-06-30 22:56:31.000000000","message":"Could use a docstring.","commit_id":"095be0a99b586322a638c993a28ffe021be02197"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7b07e23efe58a6f86351ac78496dc77cbb7a3c21","unresolved":true,"context_lines":[{"line_number":23,"context_line":"SUPPORTED_DIGESTS \u003d set(DEFAULT_ALLOWED_DIGESTS.split()) | DEPRECATED_DIGESTS"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def get_allowed_digests(conf, logger):"},{"line_number":27,"context_line":"    allowed_digests \u003d set("},{"line_number":28,"context_line":"        digest.lower() for digest in conf.get(\u0027allowed_digests\u0027, \u0027\u0027).split())"},{"line_number":29,"context_line":"    if not allowed_digests:"}],"source_content_type":"text/x-python","patch_set":10,"id":"10265c52_5aa88487","line":26,"in_reply_to":"487689b2_dd7bdce9","updated":"2022-07-01 02:06:42.000000000","message":"oh yeah, I\u0027ll add one.","commit_id":"095be0a99b586322a638c993a28ffe021be02197"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ff02a09737c0432319d029a6a8f4df8fffc1beae","unresolved":true,"context_lines":[{"line_number":51,"context_line":"    return allowed_digests"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def extract_digest_and_algorithm(value):"},{"line_number":55,"context_line":"    \"\"\""},{"line_number":56,"context_line":"    Returns a tuple of (digest_algorithm, hex_encoded_digest)"},{"line_number":57,"context_line":"    from a client-provided string of the form::"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f66b5fb_206f2597","line":54,"updated":"2022-06-30 22:56:31.000000000","message":"We oughta update our docs ToC; I think we\u0027ve lost https://docs.openstack.org/swift/latest/misc.html#swift.common.utils.extract_digest_and_algorithm","commit_id":"095be0a99b586322a638c993a28ffe021be02197"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7b07e23efe58a6f86351ac78496dc77cbb7a3c21","unresolved":true,"context_lines":[{"line_number":51,"context_line":"    return allowed_digests"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def extract_digest_and_algorithm(value):"},{"line_number":55,"context_line":"    \"\"\""},{"line_number":56,"context_line":"    Returns a tuple of (digest_algorithm, hex_encoded_digest)"},{"line_number":57,"context_line":"    from a client-provided string of the form::"}],"source_content_type":"text/x-python","patch_set":10,"id":"603736e8_8bd1923e","line":54,"in_reply_to":"3f66b5fb_206f2597","updated":"2022-07-01 02:06:42.000000000","message":"oh right.. yeah, didn\u0027t think of that. I\u0027ll push up a new patchset","commit_id":"095be0a99b586322a638c993a28ffe021be02197"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a7532750acb90a93723a3c6daf78512e8c1501e","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return allowed_digests"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def extract_digest_and_algorithm(value):"},{"line_number":55,"context_line":"    \"\"\""},{"line_number":56,"context_line":"    Returns a tuple of (digest_algorithm, hex_encoded_digest)"},{"line_number":57,"context_line":"    from a client-provided string of the form::"}],"source_content_type":"text/x-python","patch_set":10,"id":"d9f1a3dc_b0b244a4","line":54,"in_reply_to":"603736e8_8bd1923e","updated":"2022-07-23 04:57:58.000000000","message":"Done","commit_id":"095be0a99b586322a638c993a28ffe021be02197"}],"swift/common/middleware/formpost.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b4ab128536489d01c4f204178b45971da948a347","unresolved":true,"context_lines":[{"line_number":211,"context_line":"        #: The filter configuration dict."},{"line_number":212,"context_line":"        self.conf \u003d conf"},{"line_number":213,"context_line":"        self.allowed_digests \u003d conf.get("},{"line_number":214,"context_line":"            \u0027allowed_digests\u0027, DEFAULT_ALLOWED_DIGESTS.split())"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def __call__(self, env, start_response):"},{"line_number":217,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"5fa4a591_39ef3670","line":214,"updated":"2022-03-15 05:12:53.000000000","message":"IDK -- I get nervous about deprecating SHA-1 in the same commit where we\u0027re finally adding non-SHA-1 support. Operators *can* work around it, but I feel worse about this than I do the tempurl situation...\n\nOTOH, it seems likely that the tempurl change is going to catch someone out, too -- the extra time having the old way default-supported doesn\u0027t matter much unless clients are actually transitioning... I\u0027m torn.","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55b347fd75865617e1cbc25e42504401a0acb6d4","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        #: The filter configuration dict."},{"line_number":212,"context_line":"        self.conf \u003d conf"},{"line_number":213,"context_line":"        self.allowed_digests \u003d conf.get("},{"line_number":214,"context_line":"            \u0027allowed_digests\u0027, DEFAULT_ALLOWED_DIGESTS.split())"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def __call__(self, env, start_response):"},{"line_number":217,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"1580ad35_8633248e","line":214,"in_reply_to":"5fa4a591_39ef3670","updated":"2022-03-15 05:42:37.000000000","message":"Maybe I\u0027ll add deprecated (or rather make SUPPORTED_DIGESTS) for the time being but will add a commant that we\u0027ll want to change it later.","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b4ab128536489d01c4f204178b45971da948a347","unresolved":true,"context_lines":[{"line_number":493,"context_line":"                       \u0027release.\u0027, \u0027, \u0027.join(deprecated))"},{"line_number":494,"context_line":"    if not allowed_digests:"},{"line_number":495,"context_line":"        raise ValueError(\u0027No valid digest algorithms are configured \u0027"},{"line_number":496,"context_line":"                         \u0027for tempurls\u0027)"},{"line_number":497,"context_line":"    info \u003d {\u0027allowed_digests\u0027: sorted(allowed_digests)}"},{"line_number":498,"context_line":"    register_swift_info(\u0027formpost\u0027, **info)"},{"line_number":499,"context_line":"    conf.update(info)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fb89ea55_b0e3933b","line":496,"range":{"start_line":496,"start_character":30,"end_line":496,"end_character":38},"updated":"2022-03-15 05:12:53.000000000","message":"A little too much copy/paste ;-)","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"55b347fd75865617e1cbc25e42504401a0acb6d4","unresolved":false,"context_lines":[{"line_number":493,"context_line":"                       \u0027release.\u0027, \u0027, \u0027.join(deprecated))"},{"line_number":494,"context_line":"    if not allowed_digests:"},{"line_number":495,"context_line":"        raise ValueError(\u0027No valid digest algorithms are configured \u0027"},{"line_number":496,"context_line":"                         \u0027for tempurls\u0027)"},{"line_number":497,"context_line":"    info \u003d {\u0027allowed_digests\u0027: sorted(allowed_digests)}"},{"line_number":498,"context_line":"    register_swift_info(\u0027formpost\u0027, **info)"},{"line_number":499,"context_line":"    conf.update(info)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ec3e107b_f5872cee","line":496,"range":{"start_line":496,"start_character":30,"end_line":496,"end_character":38},"in_reply_to":"fb89ea55_b0e3933b","updated":"2022-03-15 05:42:37.000000000","message":"I don\u0027t know what you mean :P","commit_id":"3e5f1453bfa864b520c5ea56f43712f396512c65"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0c89b9041e4527ce3eed0793a2f5f41a0510feec","unresolved":true,"context_lines":[{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    logger \u003d get_logger(conf, log_route\u003d\u0027formpost\u0027)"},{"line_number":490,"context_line":"    allowed_digests \u003d set(conf.get(\u0027allowed_digests\u0027, \u0027\u0027).split()) or \\"},{"line_number":491,"context_line":"        SUPPORTED_DIGESTS"},{"line_number":492,"context_line":"    not_supported \u003d allowed_digests - SUPPORTED_DIGESTS"},{"line_number":493,"context_line":"    if not_supported:"},{"line_number":494,"context_line":"        logger.warning(\u0027The following digest algorithms are configured but \u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"68fe748a_58288132","line":491,"updated":"2022-05-27 05:52:38.000000000","message":"So we still default to SUPPORTED_DIGESTS...","commit_id":"ff1b1a21e916908989b540fb52773e440a5a73ef"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a7532750acb90a93723a3c6daf78512e8c1501e","unresolved":false,"context_lines":[{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    logger \u003d get_logger(conf, log_route\u003d\u0027formpost\u0027)"},{"line_number":490,"context_line":"    allowed_digests \u003d set(conf.get(\u0027allowed_digests\u0027, \u0027\u0027).split()) or \\"},{"line_number":491,"context_line":"        SUPPORTED_DIGESTS"},{"line_number":492,"context_line":"    not_supported \u003d allowed_digests - SUPPORTED_DIGESTS"},{"line_number":493,"context_line":"    if not_supported:"},{"line_number":494,"context_line":"        logger.warning(\u0027The following digest algorithms are configured but \u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"987c4563_b8a18350","line":491,"in_reply_to":"68fe748a_58288132","updated":"2022-07-23 04:57:58.000000000","message":"Ack","commit_id":"ff1b1a21e916908989b540fb52773e440a5a73ef"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0c89b9041e4527ce3eed0793a2f5f41a0510feec","unresolved":true,"context_lines":[{"line_number":498,"context_line":"    if deprecated:"},{"line_number":499,"context_line":"        logger.warning(\u0027The following digest algorithms are configured but \u0027"},{"line_number":500,"context_line":"                       \u0027deprecated: %s. Support will be removed in a future \u0027"},{"line_number":501,"context_line":"                       \u0027release.\u0027, \u0027, \u0027.join(deprecated))"},{"line_number":502,"context_line":"    if not allowed_digests:"},{"line_number":503,"context_line":"        raise ValueError(\u0027No valid digest algorithms are configured \u0027"},{"line_number":504,"context_line":"                         \u0027for formpost\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"40c93221_ba785b61","line":501,"updated":"2022-05-27 05:52:38.000000000","message":"...which means we\u0027ll be tripping this warning even if the operator hasn\u0027t explicitly configured allowed_digests at all. :-/\n\n*That*, in turn, is going to nudge operators toward explicitly configuring it, which may make future default changes less useful. Maybe we could do something like\n\n if deprecated and conf.get(\u0027allowed_digests\u0027):\n     logger.warning(...)\n\n?","commit_id":"ff1b1a21e916908989b540fb52773e440a5a73ef"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a7532750acb90a93723a3c6daf78512e8c1501e","unresolved":false,"context_lines":[{"line_number":498,"context_line":"    if deprecated:"},{"line_number":499,"context_line":"        logger.warning(\u0027The following digest algorithms are configured but \u0027"},{"line_number":500,"context_line":"                       \u0027deprecated: %s. Support will be removed in a future \u0027"},{"line_number":501,"context_line":"                       \u0027release.\u0027, \u0027, \u0027.join(deprecated))"},{"line_number":502,"context_line":"    if not allowed_digests:"},{"line_number":503,"context_line":"        raise ValueError(\u0027No valid digest algorithms are configured \u0027"},{"line_number":504,"context_line":"                         \u0027for formpost\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"67dffc7f_aa91c140","line":501,"in_reply_to":"40c93221_ba785b61","updated":"2022-07-23 04:57:58.000000000","message":"Ack","commit_id":"ff1b1a21e916908989b540fb52773e440a5a73ef"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"dcd70178578924ffc63f189ee7b001291422fff9","unresolved":true,"context_lines":[{"line_number":502,"context_line":"    if not allowed_digests:"},{"line_number":503,"context_line":"        raise ValueError(\u0027No valid digest algorithms are configured \u0027"},{"line_number":504,"context_line":"                         \u0027for formpost\u0027)"},{"line_number":505,"context_line":"    info \u003d {\u0027allowed_digests\u0027: sorted(allowed_digests)}"},{"line_number":506,"context_line":"    register_swift_info(\u0027formpost\u0027, **info)"},{"line_number":507,"context_line":"    conf.update(info)"},{"line_number":508,"context_line":"    return lambda app: FormPost(app, conf)"}],"source_content_type":"text/x-python","patch_set":9,"id":"2edd733c_d6f5e69b","line":505,"updated":"2022-05-24 09:56:42.000000000","message":"There is a warning about the deprecated algo in the logs, but that\u0027s only seen by an operator. I\u0027m wondering if an end-user should be informed as well that sha1 is allowed, but deprecated? Maybe the /info response should list the deprecated digests as well if these are still enabled? Sth like this maybe?\n\n$ curl -s http://127.0.0.1:8080/info | jq \".formpost\"\n{\n  \"allowed_digests\": [\n    \"sha1\",\n    \"sha256\",\n    \"sha512\"\n  ],\n  \"deprecated_digests\": [\n    \"sha1\"\n  ]\n}","commit_id":"ff1b1a21e916908989b540fb52773e440a5a73ef"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a2aa7d210e2e321c5fa98b7bd46c4e097602b47e","unresolved":true,"context_lines":[{"line_number":502,"context_line":"    if not allowed_digests:"},{"line_number":503,"context_line":"        raise ValueError(\u0027No valid digest algorithms are configured \u0027"},{"line_number":504,"context_line":"                         \u0027for formpost\u0027)"},{"line_number":505,"context_line":"    info \u003d {\u0027allowed_digests\u0027: sorted(allowed_digests)}"},{"line_number":506,"context_line":"    register_swift_info(\u0027formpost\u0027, **info)"},{"line_number":507,"context_line":"    conf.update(info)"},{"line_number":508,"context_line":"    return lambda app: FormPost(app, conf)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9147c1c1_4f1b15f0","line":505,"in_reply_to":"2edd733c_d6f5e69b","updated":"2022-07-20 04:46:42.000000000","message":"Yeah, I like this idea. I\u0027ll give it a whirl :)","commit_id":"ff1b1a21e916908989b540fb52773e440a5a73ef"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"314b052a0ac455a3cc854cd6f4793055d59c4a7f","unresolved":false,"context_lines":[{"line_number":502,"context_line":"    if not allowed_digests:"},{"line_number":503,"context_line":"        raise ValueError(\u0027No valid digest algorithms are configured \u0027"},{"line_number":504,"context_line":"                         \u0027for formpost\u0027)"},{"line_number":505,"context_line":"    info \u003d {\u0027allowed_digests\u0027: sorted(allowed_digests)}"},{"line_number":506,"context_line":"    register_swift_info(\u0027formpost\u0027, **info)"},{"line_number":507,"context_line":"    conf.update(info)"},{"line_number":508,"context_line":"    return lambda app: FormPost(app, conf)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7c3b29f4_15060b03","line":505,"in_reply_to":"9147c1c1_4f1b15f0","updated":"2022-07-20 05:31:23.000000000","message":"Done","commit_id":"ff1b1a21e916908989b540fb52773e440a5a73ef"}]}
