)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"90f5ca39f1ce849c189162daf3bd55046c5b1006","unresolved":false,"context_lines":[{"line_number":7,"context_line":"JSON serialazer for Django session"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"It works with the Memcached session backend, default configuration."},{"line_number":10,"context_line":"PEP8 test failed by some strange reason, unrelated with the proposed patch."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Id7bb6562969743c9a303c20e3c43a7accb2156b3"},{"line_number":13,"context_line":"Related-bug: #1349463"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5f7c97a3_4e651cae","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":75},"updated":"2018-06-13 11:48:51.000000000","message":"It is related to your patch. You uses relative import but relative import is highly discouraged.","commit_id":"fdc86cf1b381098f86ff03bff70c4f587587a34f"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"379342996c33c3271f15b0385fecbd9af24726d2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"e3974810_2a216a7a","updated":"2025-05-21 17:50:22.000000000","message":"@jjasek@redhat.com hello, please close this MR.","commit_id":"644320c7ce48fc433966d50221fc85255767a04d"}],"doc/source/configuration/settings.rst":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"92a943b63eb0d8b51ed04db563d64e872f0a19c6","unresolved":false,"context_lines":[{"line_number":2252,"context_line":"    `Django\u0027s session documentation"},{"line_number":2253,"context_line":"    \u003chttps://docs.djangoproject.com/en/1.11/topics/http/sessions/\u003e`_"},{"line_number":2254,"context_line":""},{"line_number":2255,"context_line":"Default PickleSerializer is insecure, but alternative JSON Serializer doesn\u0027t"},{"line_number":2256,"context_line":"support additional session components, provided by Horizon, e.g. Keystone token."},{"line_number":2257,"context_line":"Proposed JSONSessionSerializer can handle them in secure way, preventing remote"},{"line_number":2258,"context_line":"code execution."}],"source_content_type":"text/x-rst","patch_set":12,"id":"5f7c97a3_9477eb08","line":2255,"range":{"start_line":2255,"start_character":0,"end_line":2255,"end_character":36},"updated":"2018-06-25 04:40:54.000000000","message":"question: You recommend to use a new session serializer JSONSessionSerializer for new deployment. What is your suggestion on the existing environments? \"insecure\" is a strong word, so we need to provide a solution for migration. What happenns if an operator a session serializer? Can it be switched safely?","commit_id":"8137a6c36141dcf212871bcd4d806feced31866a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6b60637e983123b89d1352726d70e1ec5c90dfe2","unresolved":false,"context_lines":[{"line_number":2252,"context_line":"    `Django\u0027s session documentation"},{"line_number":2253,"context_line":"    \u003chttps://docs.djangoproject.com/en/1.11/topics/http/sessions/\u003e`_"},{"line_number":2254,"context_line":""},{"line_number":2255,"context_line":"Default PickleSerializer is insecure, but alternative JSON Serializer doesn\u0027t"},{"line_number":2256,"context_line":"support additional session components, provided by Horizon, e.g. Keystone token."},{"line_number":2257,"context_line":"Proposed JSONSessionSerializer can handle them in secure way, preventing remote"},{"line_number":2258,"context_line":"code execution."}],"source_content_type":"text/x-rst","patch_set":12,"id":"5f7c97a3_8750122e","line":2255,"range":{"start_line":2255,"start_character":0,"end_line":2255,"end_character":36},"in_reply_to":"5f7c97a3_9477eb08","updated":"2018-06-25 13:58:26.000000000","message":"My question on \"migration\" strategy from \"insecure\" serializer has not been answered...","commit_id":"8137a6c36141dcf212871bcd4d806feced31866a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"92a943b63eb0d8b51ed04db563d64e872f0a19c6","unresolved":false,"context_lines":[{"line_number":2254,"context_line":""},{"line_number":2255,"context_line":"Default PickleSerializer is insecure, but alternative JSON Serializer doesn\u0027t"},{"line_number":2256,"context_line":"support additional session components, provided by Horizon, e.g. Keystone token."},{"line_number":2257,"context_line":"Proposed JSONSessionSerializer can handle them in secure way, preventing remote"},{"line_number":2258,"context_line":"code execution."},{"line_number":2259,"context_line":""},{"line_number":2260,"context_line":"It supports both Memcached and file backend and works well with the default"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5f7c97a3_74ffaf65","line":2257,"range":{"start_line":2257,"start_character":0,"end_line":2257,"end_character":30},"updated":"2018-06-25 04:40:54.000000000","message":"\"Proposed\" in the published document sounds tricky because this is not a blueprint or a spec. For description of SESSION_SERIALIZER setting option, we need to describe what options can be used.","commit_id":"8137a6c36141dcf212871bcd4d806feced31866a"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"680495ca55efbc3ef47675b4b9643cc23f53ecff","unresolved":false,"context_lines":[{"line_number":2254,"context_line":""},{"line_number":2255,"context_line":"Default PickleSerializer is insecure, but alternative JSON Serializer doesn\u0027t"},{"line_number":2256,"context_line":"support additional session components, provided by Horizon, e.g. Keystone token."},{"line_number":2257,"context_line":"Proposed JSONSessionSerializer can handle them in secure way, preventing remote"},{"line_number":2258,"context_line":"code execution."},{"line_number":2259,"context_line":""},{"line_number":2260,"context_line":"It supports both Memcached and file backend and works well with the default"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5f7c97a3_dcb34199","line":2257,"range":{"start_line":2257,"start_character":0,"end_line":2257,"end_character":30},"in_reply_to":"5f7c97a3_74ffaf65","updated":"2018-06-25 13:22:53.000000000","message":"Changed phrase","commit_id":"8137a6c36141dcf212871bcd4d806feced31866a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6b60637e983123b89d1352726d70e1ec5c90dfe2","unresolved":false,"context_lines":[{"line_number":2255,"context_line":"The PickleSerializer (default in Django) is `insecure: \u003chttps://docs.djangoproject.com/en/1.11/topics/http/sessions/#django.contrib.sessions.serializers.PickleSerializer\u003e`_,"},{"line_number":2256,"context_line":"but alternative JSON Serializer doesn\u0027t support additional session components"},{"line_number":2257,"context_line":"provided by Horizon, e.g. Keystone token."},{"line_number":2258,"context_line":"The new included JSONSessionSerializer extends the JSONSerializer provided"},{"line_number":2259,"context_line":"by Django to support Horizon-specific fields and prevents remote code execution."},{"line_number":2260,"context_line":""},{"line_number":2261,"context_line":"It supports both Memcached and file backend and works well with the default"}],"source_content_type":"text/x-rst","patch_set":13,"id":"5f7c97a3_67e05698","line":2258,"range":{"start_line":2258,"start_character":4,"end_line":2258,"end_character":16},"updated":"2018-06-25 13:58:26.000000000","message":"This is unnecessary... This document is published as \"latest\", so \"new included\" is completely unnecessary. In addition, we don\u0027t update the document in a release process, so it means \"new\" would continue to be used even if Rocky release enters so-called \"extended maintenace phase\". \"new\" would no longer \"new\" :(\n\nWe need to be careful when we use words like \"new\", \"latest\" or similar.\n\nPlease keep readers of the documents in your mind :)","commit_id":"668d12f88ee9fc99870e77b69c141b6ef5040bf5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"799c9e4e02044c040e8c255e1e757e9e12b1790e","unresolved":false,"context_lines":[{"line_number":2418,"context_line":"    `Django\u0027s session documentation"},{"line_number":2419,"context_line":"    \u003chttps://docs.djangoproject.com/en/1.11/topics/http/sessions/\u003e`_"},{"line_number":2420,"context_line":""},{"line_number":2421,"context_line":"Usage of PickleSerializer (default in Django), can lead to unauthorized remote"},{"line_number":2422,"context_line":"code execution `\u003chttps://docs.djangoproject.com/en/1.11/topics/http/sessions/#django.contrib.sessions.serializers.PickleSerializer\u003e`_,"},{"line_number":2423,"context_line":"but alternative JSON Serializer doesn\u0027t support additional session components"},{"line_number":2424,"context_line":"provided by Horizon, e.g. Keystone token."}],"source_content_type":"text/x-rst","patch_set":15,"id":"9fb8cfa7_de3733e3","line":2421,"range":{"start_line":2421,"start_character":45,"end_line":2421,"end_character":46},"updated":"2019-06-19 08:59:46.000000000","message":"A comma is unnecessary.","commit_id":"326957900224763369086a0752d3b0c35f1fe9ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"799c9e4e02044c040e8c255e1e757e9e12b1790e","unresolved":false,"context_lines":[{"line_number":2418,"context_line":"    `Django\u0027s session documentation"},{"line_number":2419,"context_line":"    \u003chttps://docs.djangoproject.com/en/1.11/topics/http/sessions/\u003e`_"},{"line_number":2420,"context_line":""},{"line_number":2421,"context_line":"Usage of PickleSerializer (default in Django), can lead to unauthorized remote"},{"line_number":2422,"context_line":"code execution `\u003chttps://docs.djangoproject.com/en/1.11/topics/http/sessions/#django.contrib.sessions.serializers.PickleSerializer\u003e`_,"},{"line_number":2423,"context_line":"but alternative JSON Serializer doesn\u0027t support additional session components"},{"line_number":2424,"context_line":"provided by Horizon, e.g. Keystone token."}],"source_content_type":"text/x-rst","patch_set":15,"id":"9fb8cfa7_fe20f79d","line":2421,"range":{"start_line":2421,"start_character":27,"end_line":2421,"end_character":44},"updated":"2019-06-19 08:59:46.000000000","message":"PickleSerializer is the default configuration in Django [1].\n\n[1] https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-SESSION_SERIALIZER","commit_id":"326957900224763369086a0752d3b0c35f1fe9ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"799c9e4e02044c040e8c255e1e757e9e12b1790e","unresolved":false,"context_lines":[{"line_number":2440,"context_line":"             }"},{"line_number":2441,"context_line":""},{"line_number":2442,"context_line":"Default value for SESSION_SERIALIZER is"},{"line_number":2443,"context_line":"\u0027django.contrib.sessions.serializers.PickleSerializer\u0027"},{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"STATIC_ROOT"},{"line_number":2446,"context_line":"-----------"}],"source_content_type":"text/x-rst","patch_set":15,"id":"9fb8cfa7_1e5b8b2e","line":2443,"updated":"2019-06-19 08:59:46.000000000","message":"Why can\u0027t we change the default value to the safer one?","commit_id":"326957900224763369086a0752d3b0c35f1fe9ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"13c799aae205a2926296ba8a0b6fbd441e7271ca","unresolved":false,"context_lines":[{"line_number":2417,"context_line":""},{"line_number":2418,"context_line":"    `Django\u0027s session documentation"},{"line_number":2419,"context_line":"    \u003chttps://docs.djangoproject.com/en/1.11/topics/http/sessions/\u003e`_"},{"line_number":2420,"context_line":""},{"line_number":2421,"context_line":"Usage of PickleSerializer can lead to unauthorized remote code execution"},{"line_number":2422,"context_line":"`\u003chttps://docs.djangoproject.com/en/1.11/topics/http/sessions/#django.contrib.sessions.serializers.PickleSerializer\u003e`_,"},{"line_number":2423,"context_line":"but alternative JSON Serializer doesn\u0027t support additional session components"}],"source_content_type":"text/x-rst","patch_set":16,"id":"9fb8cfa7_770dca3c","line":2420,"updated":"2019-06-24 07:52:43.000000000","message":"There is no information on the default value.","commit_id":"592f1b2c81c05403cdd56ea67cb93f22c129b84b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a3d4c85d8a133dc77a4f65204340942e43e6db04","unresolved":false,"context_lines":[{"line_number":2425,"context_line":"The new included JSONSessionSerializer extends the JSONSerializer provided"},{"line_number":2426,"context_line":"by Django to support Horizon-specific fields and prevents remote code execution."},{"line_number":2427,"context_line":""},{"line_number":2428,"context_line":"JSONSessionSerializer configured as default serializer. It supports both"},{"line_number":2429,"context_line":"Memcached and file backend and works well with the default configuration:"},{"line_number":2430,"context_line":""},{"line_number":2431,"context_line":".. code-block:: python"}],"source_content_type":"text/x-rst","patch_set":17,"id":"9fb8cfa7_9cff3e66","line":2428,"range":{"start_line":2428,"start_character":0,"end_line":2428,"end_character":55},"updated":"2019-06-24 11:25:32.000000000","message":"question: where is JSONSessionSerializer specified as the default serializer? I cannot find the place where it is configured.","commit_id":"644320c7ce48fc433966d50221fc85255767a04d"}],"openstack_auth/tests/unit/test_user.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"8dc413e4545faaa71d952f63b477b149fc345f03","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.assertFalse(created_token._is_pki_token(None))"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class SerializeTestCase(test.TestCase):"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def setUp(self):"},{"line_number":59,"context_line":"        super(SerializeTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_64477d4e","line":56,"updated":"2018-06-18 14:45:44.000000000","message":"nit: JSONSessionSerializerTestCase","commit_id":"7414d7c34d0ca405a879f70d1682e0e63144746b"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"8dc413e4545faaa71d952f63b477b149fc345f03","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        user_token \u003d user.Token(self.data.domain_scoped_access_info,"},{"line_number":64,"context_line":"                                unscoped_token\u003dNone)"},{"line_number":65,"context_line":"        domain_token \u003d self.data.domain_scoped_access_info"},{"line_number":66,"context_line":"        session \u003d {\u0027token\u0027: user_token, \u0027domain_token\u0027: domain_token}"},{"line_number":67,"context_line":"        serializer \u003d user.JSONSessionSerializer()"},{"line_number":68,"context_line":"        serialized_session \u003d serializer.dumps(session)"},{"line_number":69,"context_line":"        unserialized_session \u003d serializer.loads(serialized_session)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e43dcd8e","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":15},"updated":"2018-06-18 14:45:44.000000000","message":"Can we use keystoneauth1.session.Session object here? It would be better since it\u0027s more real-world use-case","commit_id":"7414d7c34d0ca405a879f70d1682e0e63144746b"}],"openstack_auth/user.py":[{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"4f42839b26760b74ce6b079aa0334b1cd22a75f0","unresolved":false,"context_lines":[{"line_number":431,"context_line":"    # allows addressing of dict elements as attributes:"},{"line_number":432,"context_line":"    # d[\u0027a\u0027] will be available as d.a"},{"line_number":433,"context_line":"    def __getattr__(self, attr):"},{"line_number":434,"context_line":"        return self[attr]"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"class JSONSessionSerializer(JSONSerializer):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_5ad635c5","line":434,"updated":"2018-06-13 14:57:34.000000000","message":"Can we just re-create the original object that was there, instead of making this?","commit_id":"c05a04c66e281402349ec45f8ff5140307b378fc"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"b5bd4557a1120f2610f9f73c0e20fdfd2c0d5a31","unresolved":false,"context_lines":[{"line_number":431,"context_line":"    # allows addressing of dict elements as attributes:"},{"line_number":432,"context_line":"    # d[\u0027a\u0027] will be available as d.a"},{"line_number":433,"context_line":"    def __getattr__(self, attr):"},{"line_number":434,"context_line":"        return self[attr]"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"class JSONSessionSerializer(JSONSerializer):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_4b95053f","line":434,"in_reply_to":"5f7c97a3_5ad635c5","updated":"2018-06-14 15:18:21.000000000","message":"Yes, it seems possible. Both objects wrapped by AttrDict bear full information for instantiating","commit_id":"c05a04c66e281402349ec45f8ff5140307b378fc"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"8dc413e4545faaa71d952f63b477b149fc345f03","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from django.conf import settings"},{"line_number":20,"context_line":"from django.contrib.auth import models"},{"line_number":21,"context_line":"from django.contrib.sessions.serializers import JSONSerializer"},{"line_number":22,"context_line":"from django.db import models as db_models"},{"line_number":23,"context_line":"from keystoneauth1 import access"},{"line_number":24,"context_line":"from keystoneauth1 import exceptions as keystone_exceptions"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_e41e2d5e","line":21,"updated":"2018-06-18 14:45:44.000000000","message":"According to OpenStack Hacking Guidelines, please import modules, not objects","commit_id":"7414d7c34d0ca405a879f70d1682e0e63144746b"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"4eea538b19725caed266480f3e8efcbebbe25e82","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from django.conf import settings"},{"line_number":20,"context_line":"from django.contrib.auth import models"},{"line_number":21,"context_line":"from django.contrib.sessions.serializers import JSONSerializer"},{"line_number":22,"context_line":"from django.db import models as db_models"},{"line_number":23,"context_line":"from keystoneauth1 import access"},{"line_number":24,"context_line":"from keystoneauth1 import exceptions as keystone_exceptions"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_b48ff0cb","line":21,"in_reply_to":"5f7c97a3_44a361b2","updated":"2018-06-19 09:40:51.000000000","message":"Akihiro, I\u0027ll address your comments in a next patch. I just missed it:(","commit_id":"7414d7c34d0ca405a879f70d1682e0e63144746b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"96d57fa38afb2a0a5eb831b60b9c72f25fe27f14","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from django.conf import settings"},{"line_number":20,"context_line":"from django.contrib.auth import models"},{"line_number":21,"context_line":"from django.contrib.sessions.serializers import JSONSerializer"},{"line_number":22,"context_line":"from django.db import models as db_models"},{"line_number":23,"context_line":"from keystoneauth1 import access"},{"line_number":24,"context_line":"from keystoneauth1 import exceptions as keystone_exceptions"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_44a361b2","line":21,"in_reply_to":"5f7c97a3_e41e2d5e","updated":"2018-06-18 14:50:59.000000000","message":"I commented this in the past commit but it seems to be ignored...\n\nhttps://review.openstack.org/#/c/574310/4/openstack_auth/utils.py@23","commit_id":"7414d7c34d0ca405a879f70d1682e0e63144746b"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"8dc413e4545faaa71d952f63b477b149fc345f03","unresolved":false,"context_lines":[{"line_number":426,"context_line":"        app_label \u003d \u0027openstack_auth\u0027"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"class JSONSessionSerializer(JSONSerializer):"},{"line_number":430,"context_line":"    def dumps(self, obj):"},{"line_number":431,"context_line":"        workaround_items \u003d [\u0027token\u0027, \u0027domain_token\u0027]"},{"line_number":432,"context_line":"        clean_obj \u003d {k: v for k, v in obj.items() if k not in workaround_items}"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_a447d51e","line":429,"range":{"start_line":429,"start_character":6,"end_line":429,"end_character":27},"updated":"2018-06-18 14:45:44.000000000","message":"Please, add some documentation how to use it with Horizon","commit_id":"7414d7c34d0ca405a879f70d1682e0e63144746b"}],"openstack_auth/utils.py":[{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"ac5ebeb8203fa42a7a3c7bedd3f3a0cc856cf2ff","unresolved":false,"context_lines":[{"line_number":537,"context_line":"class AttrDict(dict):"},{"line_number":538,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":539,"context_line":"        super(AttrDict, self).__init__(*args, **kwargs)"},{"line_number":540,"context_line":"        self.__dict__ \u003d self"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"class JSONSessionSerializer(JSONSerializer):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_f35990fc","line":540,"updated":"2018-06-12 13:19:33.000000000","message":"This is an ugly hack. Please create a dict normally instead.","commit_id":"42de8006874437ec80d640681ec651cca2b4510c"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"815a36da0de6133bc9144f031fe4fc3107a1b570","unresolved":false,"context_lines":[{"line_number":537,"context_line":"class AttrDict(dict):"},{"line_number":538,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":539,"context_line":"        super(AttrDict, self).__init__(*args, **kwargs)"},{"line_number":540,"context_line":"        self.__dict__ \u003d self"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"class JSONSessionSerializer(JSONSerializer):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_0122b2a3","line":540,"in_reply_to":"5f7c97a3_f35990fc","updated":"2018-06-12 14:21:56.000000000","message":"Surely, it is even memory leak in Py\u003c2.7.4.","commit_id":"42de8006874437ec80d640681ec651cca2b4510c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"90f5ca39f1ce849c189162daf3bd55046c5b1006","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import json"},{"line_number":16,"context_line":"import logging"},{"line_number":17,"context_line":"import re"},{"line_number":18,"context_line":"import user as auth_user  # noqa: H237"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from django.conf import settings"},{"line_number":21,"context_line":"from django.contrib import auth"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_ae24f060","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":38},"updated":"2018-06-13 11:48:51.000000000","message":"What do you want to do? If you import \u0027user\u0027 module from openstack_auth, you should use absolute import:\n\n from openstack_auth import user as auth_user\n\nNote that there is a python module named \u0027user\u0027 so your import is super confusing.\n\nIn addition, relative import is highly discouraged.","commit_id":"fdc86cf1b381098f86ff03bff70c4f587587a34f"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"5a45fdb45ad5c4a0aa81d8184709d0012e2c5c6e","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import json"},{"line_number":16,"context_line":"import logging"},{"line_number":17,"context_line":"import re"},{"line_number":18,"context_line":"import user as auth_user  # noqa: H237"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from django.conf import settings"},{"line_number":21,"context_line":"from django.contrib import auth"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_17a418a2","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":38},"in_reply_to":"5f7c97a3_ae24f060","updated":"2018-06-13 14:30:52.000000000","message":"Fixed all import issues by moving this code to user.py","commit_id":"fdc86cf1b381098f86ff03bff70c4f587587a34f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"90f5ca39f1ce849c189162daf3bd55046c5b1006","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from django.conf import settings"},{"line_number":21,"context_line":"from django.contrib import auth"},{"line_number":22,"context_line":"from django.contrib.auth import models"},{"line_number":23,"context_line":"from django.contrib.sessions.serializers import JSONSerializer"},{"line_number":24,"context_line":"from django.utils import timezone"},{"line_number":25,"context_line":"from keystoneauth1 import access"},{"line_number":26,"context_line":"from keystoneauth1.identity import v2 as v2_auth"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_eed3c836","line":23,"updated":"2018-06-13 11:48:51.000000000","message":"Use module-level import rather than attribute-level import. It is described in the OpenStack hacking guideline.","commit_id":"fdc86cf1b381098f86ff03bff70c4f587587a34f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"90f5ca39f1ce849c189162daf3bd55046c5b1006","unresolved":false,"context_lines":[{"line_number":538,"context_line":"    # allows addressing of dict elements as attributes:"},{"line_number":539,"context_line":"    # d.a returns d[\u0027a\u0027]"},{"line_number":540,"context_line":"    def __getattr__(self, attr):"},{"line_number":541,"context_line":"        return self[attr]"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"class JSONSessionSerializer(JSONSerializer):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_2e9b0073","line":541,"updated":"2018-06-13 11:48:51.000000000","message":"Can\u0027t we use classes from keystoneauth? This approach means we cannot no longer assume token object is an instance of the keystoneauth class and it sometimes makes hacking complicated.","commit_id":"fdc86cf1b381098f86ff03bff70c4f587587a34f"},{"author":{"_account_id":27838,"name":"Vadym Markov","email":"vmarkov@mirantis.com","username":"vmarkov"},"change_message_id":"5a45fdb45ad5c4a0aa81d8184709d0012e2c5c6e","unresolved":false,"context_lines":[{"line_number":538,"context_line":"    # allows addressing of dict elements as attributes:"},{"line_number":539,"context_line":"    # d.a returns d[\u0027a\u0027]"},{"line_number":540,"context_line":"    def __getattr__(self, attr):"},{"line_number":541,"context_line":"        return self[attr]"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"class JSONSessionSerializer(JSONSerializer):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_7769ccf5","line":541,"in_reply_to":"5f7c97a3_2e9b0073","updated":"2018-06-13 14:30:52.000000000","message":"AccessInfoV3 instance cant be serialized by JSON Serializer, but we can easily extract init arguments from the instance and just re-instantiate it during de-serialization. I assume, it is the shortest and clearest variant how we can implement it","commit_id":"fdc86cf1b381098f86ff03bff70c4f587587a34f"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"f075ad784875603674f90b0beb8de02bc8dd605d","unresolved":false,"context_lines":[{"line_number":538,"context_line":"    # allows addressing of dict elements as attributes:"},{"line_number":539,"context_line":"    # d.a returns d[\u0027a\u0027]"},{"line_number":540,"context_line":"    def __getattr__(self, attr):"},{"line_number":541,"context_line":"        return self[attr]"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"class JSONSessionSerializer(JSONSerializer):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_9a34cd4a","line":541,"in_reply_to":"5f7c97a3_7769ccf5","updated":"2018-06-13 14:55:52.000000000","message":"+1 to that","commit_id":"fdc86cf1b381098f86ff03bff70c4f587587a34f"}],"releasenotes/notes/session-serializer-c98d0cbb1c65c347.yaml":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"799c9e4e02044c040e8c255e1e757e9e12b1790e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: |"},{"line_number":3,"context_line":"    If you explicitly use PickleSerializer, it can lead to arbitrary remote code"},{"line_number":4,"context_line":"    execution if attacker knows SECRET_KEY."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"features:"},{"line_number":7,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":15,"id":"9fb8cfa7_fe079717","line":4,"updated":"2019-06-19 08:59:46.000000000","message":"We don\u0027t use prelude section for a specific change. Could you merge this into \u0027features\u0027 section.","commit_id":"326957900224763369086a0752d3b0c35f1fe9ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"799c9e4e02044c040e8c255e1e757e9e12b1790e","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"upgrade:"},{"line_number":14,"context_line":"  - |"},{"line_number":15,"context_line":"    After upgrade, all users will be logged out. So, user need to log in again."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"9fb8cfa7_be111f56","line":15,"updated":"2019-06-19 08:59:46.000000000","message":"This description is confusing after the release notes is rendered as HTML. See [1]. All releasenotes in Stein release will be merged into a single file. Could you rephrase it considering how it is rendered?\n\n[1] http://logs.openstack.org/10/574310/15/check/build-openstack-releasenotes/c7af2ed/html/unreleased.html","commit_id":"326957900224763369086a0752d3b0c35f1fe9ab"}]}
