)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9a06d27faff61e31bba368a6467b7fd66b410925","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"tempurls with a prefix-based scope"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The middleware does now allow the usage of signatures with a prefix-based"},{"line_number":10,"context_line":"scope. A prefix-based signature grants access to all objects which share"},{"line_number":11,"context_line":"the same prefix. This avoids the creation of a large amount of signatures,"},{"line_number":12,"context_line":"when a whole container or pseudofolder is shared."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9aed3d3a_5f7e8719","line":9,"range":{"start_line":9,"start_character":15,"end_line":9,"end_character":29},"updated":"2016-02-29 16:05:03.000000000","message":"nit: s/does now allow/now allows/","commit_id":"11fe42efc25445468680ddd24b0e6452e5712cbe"}],"doc/source/api/temporary_url_middleware.rst":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"7f76c77a4a1a15a358421a3c744ac6ee9677a5df","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"A prefix-based temporary URL is similar but requires the parameter"},{"line_number":68,"context_line":"``temp_url_prefix``, which must be equal to the common prefix shared"},{"line_number":69,"context_line":"by all objectnames for which the URL is valid."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":".. code::"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3a71b18c_42aa9cd3","line":69,"range":{"start_line":69,"start_character":7,"end_line":69,"end_character":18},"updated":"2016-12-09 16:45:23.000000000","message":"object names","commit_id":"835dcbdbfe314e6095257cde76c4b70bc709577a"}],"swift/common/middleware/tempurl.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9a06d27faff61e31bba368a6467b7fd66b410925","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        else:"},{"line_number":358,"context_line":"            if not obj.startswith(temp_url_prefix):"},{"line_number":359,"context_line":"                return self._invalid(env, start_response)"},{"line_number":360,"context_line":"            path \u003d \u0027/v1/%s/%s/%s\u0027 % (account, container, temp_url_prefix)"},{"line_number":361,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] \u003d\u003d \u0027HEAD\u0027:"},{"line_number":362,"context_line":"            hmac_vals \u003d ("},{"line_number":363,"context_line":"                self._get_hmacs(env, temp_url_expires, path, keys) +"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aed3d3a_da38e5a2","line":360,"updated":"2016-02-29 16:05:03.000000000","message":"The only difference to the _get_hmacs arguments between a prefix-scoped tempurl and an object-specific tempurl is the path? So given a valid object-specific tempurl (say, to PUT to /v1/a/c/o), I actually have access to everything *under* that object (like /v1/a/c/o1, /v1/a/c/o2, or  /v1/a/c/o/some/other/rather/deep/path) provided I include \u0026temp_url_perfix\u003do in my query string.\n\nMaybe we could avoid this by scoping the prefix-based path? Leave object-specific tempurls with a path like \"/v1/a/c/o\" but have prefix-scoped ones use \"prefix:/v1/a/c/o\"?","commit_id":"11fe42efc25445468680ddd24b0e6452e5712cbe"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"960e2d9b237306696b60f7b7274aee6b1e8d4fab","unresolved":false,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    def _get_path_parts(self, env):"},{"line_number":443,"context_line":"        \"\"\""},{"line_number":444,"context_line":"        Return the account, container and objectname for the request,"},{"line_number":445,"context_line":"        if it\u0027s an object request and one of the configured methods;"},{"line_number":446,"context_line":"        otherwise, None is returned."},{"line_number":447,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_81779d01","line":444,"range":{"start_line":444,"start_character":42,"end_line":444,"end_character":52},"updated":"2016-11-23 06:18:47.000000000","message":"missing space","commit_id":"972578a38f19df00a4f204791e572c6f8cc6f733"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"69dab0222ffe7b70b7ed1beccf226d2d90c7895a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"limited to the expiration time set when the website created the link."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"------------"},{"line_number":48,"context_line":"Client Usage"},{"line_number":49,"context_line":"------------"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"To create such temporary URLs, first an ``X-Account-Meta-Temp-URL-Key``"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a71b18c_94cc0b37","line":48,"range":{"start_line":48,"start_character":1,"end_line":48,"end_character":12},"updated":"2016-12-02 04:00:15.000000000","message":"these docs should be updated","commit_id":"1b8d68e374cdb46a3b29b54f00d5472641481374"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"7f76c77a4a1a15a358421a3c744ac6ee9677a5df","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    path \u003d \u0027prefix:/v1/AUTH_account/container/pre\u0027"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"The so generated signature would be valid for all objects starting"},{"line_number":90,"context_line":"with ``pre``. The middleware detects a prefix-based temporary URL by"},{"line_number":91,"context_line":"a query parameter called ``temp_url_prefix``. So, if ``sig`` and ``expires``"},{"line_number":92,"context_line":"would end up like above, following URL would be valid::"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_22dda070","line":89,"range":{"start_line":89,"start_character":0,"end_line":89,"end_character":16},"updated":"2016-12-09 16:45:23.000000000","message":"The generated","commit_id":"835dcbdbfe314e6095257cde76c4b70bc709577a"}],"test/functional/test_tempurl.py":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"7f76c77a4a1a15a358421a3c744ac6ee9677a5df","unresolved":false,"context_lines":[{"line_number":313,"context_line":"            \u0027GET\u0027, expires, self.env.conn.make_path(self.env.obj.path),"},{"line_number":314,"context_line":"            self.env.tempurl_key)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def tempurl_sig(self, method, expires, path, key):"},{"line_number":317,"context_line":"        path_parts \u003d urllib.parse.unquote(path).split(\u0027/\u0027)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        prefix \u003d path_parts[4][0:4]"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_d93cbec1","line":316,"range":{"start_line":316,"start_character":8,"end_line":316,"end_character":19},"updated":"2016-12-09 16:45:23.000000000","message":"tempurl_parms","commit_id":"835dcbdbfe314e6095257cde76c4b70bc709577a"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"7cf5bb54410911419cee9b80bdaa0850678a81a3","unresolved":false,"context_lines":[{"line_number":330,"context_line":"            \u0027temp_url_sig\u0027: sig, \u0027temp_url_expires\u0027: str(expires),"},{"line_number":331,"context_line":"            \u0027temp_url_prefix\u0027: prefix}"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"    def test_empty_prefix(self):"},{"line_number":334,"context_line":"        parms \u003d self.tempurl_parms("},{"line_number":335,"context_line":"            \u0027GET\u0027, self.expires,"},{"line_number":336,"context_line":"            self.env.conn.make_path(self.env.obj.path),"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_8b3ed3b6","line":333,"range":{"start_line":333,"start_character":8,"end_line":333,"end_character":26},"updated":"2016-12-12 22:01:42.000000000","message":"nice! users can give access to a whole container with an empty prefix, wondering if this should be called out in the docs?","commit_id":"8333c4b36aee2102a6f2721e96994b5b9e67d8ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c8f52779865cf4044b514cd802d2136ccec9792f","unresolved":false,"context_lines":[{"line_number":354,"context_line":"                          parms\u003dparms)"},{"line_number":355,"context_line":"        self.assert_status([401])"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    def test_object_url_with_prefix(self):"},{"line_number":358,"context_line":"        parms \u003d super(TestTempURLPrefix, self).tempurl_parms("},{"line_number":359,"context_line":"            \u0027GET\u0027, self.expires,"},{"line_number":360,"context_line":"            self.env.conn.make_path(self.env.obj.path),"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_945510c8","line":357,"updated":"2016-12-12 23:31:30.000000000","message":"Nice.","commit_id":"8333c4b36aee2102a6f2721e96994b5b9e67d8ee"}]}
