)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"5725dac9cc7bdf3a2b954f13887caeff77c3e279","unresolved":true,"context_lines":[{"line_number":18,"context_line":"the valid one and the previous session will be invalidated."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The following manual tests encompass both simulteaneous session control"},{"line_number":21,"context_line":"configuration: \u0027allow\u0027 and \u0027disconnect\u0027 and were verified whit this code"},{"line_number":22,"context_line":"change before submitting it:"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Test Plan:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"12dab4c6_84ff6bf2","line":21,"range":{"start_line":21,"start_character":58,"end_line":21,"end_character":62},"updated":"2021-11-15 13:44:33.000000000","message":"with","commit_id":"69fc617c86d5a2e985146e955b0fb84f206b5cc7"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"339a8b28304f20d83a8c528b074ab04da4f2ef49","unresolved":false,"context_lines":[{"line_number":18,"context_line":"the valid one and the previous session will be invalidated."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The following manual tests encompass both simulteaneous session control"},{"line_number":21,"context_line":"configuration: \u0027allow\u0027 and \u0027disconnect\u0027 and were verified whit this code"},{"line_number":22,"context_line":"change before submitting it:"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Test Plan:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"a25054d4_7a094614","line":21,"range":{"start_line":21,"start_character":58,"end_line":21,"end_character":62},"in_reply_to":"12dab4c6_84ff6bf2","updated":"2021-11-16 17:08:10.000000000","message":"Done","commit_id":"69fc617c86d5a2e985146e955b0fb84f206b5cc7"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"b7c10ee1e380395843b8ec1d1e41e0ce0c5a6dc8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ffd41733_b8227d05","updated":"2021-11-12 11:57:04.000000000","message":"recheck, trigger CI.","commit_id":"f667c491eb2d939bdc975c5cc0df0c712d652d9a"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"c7aa8bb4fcea90fbcb1e442a032b0aab33d5366b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"bc172609_961f8934","updated":"2021-11-15 16:47:40.000000000","message":"I was also thinking what if we add a new field for \u0027simultaneous_sessions\u0027 in user setting form [3]\nand the end-user can select the option whether to enable/disable this field from there.\nthoughts?\n\n[3] https://github.com/openstack/horizon/blob/master/openstack_dashboard/dashboards/settings/user/forms.py","commit_id":"69fc617c86d5a2e985146e955b0fb84f206b5cc7"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"5725dac9cc7bdf3a2b954f13887caeff77c3e279","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8d6d01c5_ab28479a","updated":"2021-11-15 13:44:33.000000000","message":"Thanks for the patch, please find below some feedback:\n\n • Could you add documentation for this configiration in ``configuration/settings.rst`` [1]\n • I was thinking if we can use simultaneous_sessions\u003d True/False rather than allow/disconnect.\n • Add default value of \"simultaneous_sessions\" in ``horizon/defaults.py`` [2].\n • Could you add a release notes for this change.\n\n[1] https://github.com/openstack/horizon/blob/master/doc/source/configuration/settings.rst\n[2] https://github.com/openstack/horizon/blob/master/horizon/defaults.py","commit_id":"69fc617c86d5a2e985146e955b0fb84f206b5cc7"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"0ecddbb56e35806cae45677b631168b836203c8e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ade716a1_5f087bbd","in_reply_to":"077c7c93_ec9b4865","updated":"2021-11-16 17:56:20.000000000","message":"The simultaneous_sessions\u003d True/False rather than allow/disconnect was the original idea too, but it was thought that using meaningful strings for those values would give us the option to expand this configuration int the future. For example, in the future we could implement: simultaneous_logins\u003d\u0027block\u0027 to disallow simultaneous sessions and keep the first, blocking future new sessions for a given user or simultaneous_logins\u003d\u0027permissive\u0027 to allow up to N simultaneous sessions, reading N value from other config. Any thoughts?\n\n\u003e\u003e ok, I am fine with allow/disconnect, let\u0027s see what other the reviewers think!","commit_id":"69fc617c86d5a2e985146e955b0fb84f206b5cc7"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"c5f8482b68aa7093716be4880473b209a01eb3c6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"cdc191e0_7eabd2d6","in_reply_to":"16309f56_536f167e","updated":"2022-02-23 16:06:50.000000000","message":"Done","commit_id":"69fc617c86d5a2e985146e955b0fb84f206b5cc7"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"339a8b28304f20d83a8c528b074ab04da4f2ef49","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"077c7c93_ec9b4865","in_reply_to":"8d6d01c5_ab28479a","updated":"2021-11-16 17:08:10.000000000","message":"Thanks for your feedback. Started working on patch sets to cover all the raised points but before submitting the final version I need to clarify few points:\n\n • Updated the documentation in ``configuration/settings.rst`` wit the new config key. Was just unsure about which ``versionadded::`` value should be there.\n\n • The simultaneous_sessions\u003d True/False rather than allow/disconnect was the original idea too, but it was thought that using meaningful strings for those values would give us the option to expand this configuration int the future. For example, in the future we could implement: simultaneous_logins\u003d\u0027block\u0027 to disallow simultaneous sessions and keep the first, blocking future new sessions for a given user or simultaneous_logins\u003d\u0027permissive\u0027 to allow up to N simultaneous sessions, reading N value from other config. Any thoughts?\n\n • About adding the default value of \"simultaneous_sessions\" in ``horizon/defaults.py`` I could not find any other HORIZON_CONFIG key on that file. Isn\u0027t the default value in ``openstack_dashboard/settings.py`` enough? If not, could you please point em to an example of a HORIZON_CONFIG key default value there? Thanks.\n\n • Added a release note file but was unsure about the file naming convention, would you mind to review it?\n\nThanks again for your feedback, it is my first patch to this repo so I really appreciate it.","commit_id":"69fc617c86d5a2e985146e955b0fb84f206b5cc7"},{"author":{"_account_id":32349,"name":"Thiago Paiva Brito","email":"thiago.brito@windriver.com","username":"outbrito"},"change_message_id":"da16d96fa2d0e65b8226773d5166aded2c0c9075","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"27b59f73_f09c4a00","in_reply_to":"ade716a1_5f087bbd","updated":"2021-11-16 19:54:09.000000000","message":"I like to have the option to extend this later.","commit_id":"69fc617c86d5a2e985146e955b0fb84f206b5cc7"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"21dc44a01c3f496fe8e22c4dbf07b338ba35b2b5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"16309f56_536f167e","in_reply_to":"bc172609_961f8934","updated":"2021-11-17 13:53:49.000000000","message":"Not sure if the end-user should be able to enable/disable the simultaneous sessions control. Thinking from a security need perspective, only an advanced user (e.g. a system admin) should be able to enable/disable this access control and the control must apply to all other users. But am open to hear other thoughts on this suggestion.","commit_id":"69fc617c86d5a2e985146e955b0fb84f206b5cc7"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"0ecddbb56e35806cae45677b631168b836203c8e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"25c3d4aa_d828e96a","updated":"2021-11-16 17:56:20.000000000","message":"About adding default horizon configuration, please refer to [1]\n\n[1] https://github.com/openstack/horizon/blob/master/horizon/conf/default.py","commit_id":"2f3d918ac5453a3abfea7c4761f048ab774e12f3"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"83a1dd5c3ced72acd0ea1fa3ea44bd22a5f7a145","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"37365e42_c1943793","in_reply_to":"25c3d4aa_d828e96a","updated":"2021-11-16 19:37:46.000000000","message":"Thanks, it is updated now.","commit_id":"2f3d918ac5453a3abfea7c4761f048ab774e12f3"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"2fc91f380ef70c420012cda329374c3f622f7e0a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"b26375fd_475cc0bb","updated":"2022-02-23 13:50:36.000000000","message":"@Thales Elero Cervi, Hi could you fix review comments on your patch, as we have feature freeze today.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"781770e0ccbd7d2f46336e14ab9980c1d8df3a6d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"89d2a161_ef3f8a27","updated":"2022-02-16 13:50:57.000000000","message":"Adding review priority for this patch to get more attention.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"c163a8a230b0c10c3beceaf22360c849b6f2aa56","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"5ae18fcb_d4f93c6b","updated":"2022-02-23 13:52:36.000000000","message":"Note: this features looks minor to me So I am also fine to merge it by end of this week once review comments fixed. If it works for other Core reviewers.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"42034a7ec83ff73faecd797b7feb2f352d663322","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"560d0b64_fb010161","updated":"2022-02-21 05:29:16.000000000","message":"few comments inline, otherwise looks good to me.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"584f6e860cd5ac72e49ff10ad70d68cd9a85aa42","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"3e98c8da_f2758815","updated":"2021-11-16 21:16:10.000000000","message":"recheck","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"5a137661c790dc7289956195ca6882b84d07e041","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"e155195b_48d67adb","updated":"2022-02-23 16:19:20.000000000","message":"@Thales Cervi, Hi you forgot to fix amotoki comments","commit_id":"80f170df87f60813163bf95d2ce024f43bbec841"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"896c62820fb1a1f3bf9f13a22b5bb4abe2521313","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"c49fc22b_028ce0e3","in_reply_to":"e155195b_48d67adb","updated":"2022-02-23 17:14:54.000000000","message":"Yeap, will be checking his comments now. Thanks Vishal!","commit_id":"80f170df87f60813163bf95d2ce024f43bbec841"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"f5ec067da3db3e1dc484662f81dbb7159c831e3c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"348a5e36_4fb6353d","updated":"2022-02-25 16:48:37.000000000","message":"Any updates on remaining comments from amotoki?","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"719eb4446c403164be24380d79ad2aecee9e40c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"bbf69453_1fa4b6bd","updated":"2022-02-28 09:16:42.000000000","message":"I am checking the patch in detail. I noticed that several things similar to my past comments have not addressed. There are also small nits.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a48fc84a290a71a0c97c742eb5dd29e109ce0dde","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"02455f00_aeac6d87","updated":"2022-02-28 08:14:32.000000000","message":"The author did not update the patch due to the time limitations to the feature freeze.\nI am not sure who will follow-up my comment on the relationship between the session expiry and the cache expiry introduced in the patch. I cannot give my +2 without the commitment.\n\nAnother way is to improve the patch in this review and consider it as the feature freeze exception.\nGenerally speaking, it looks like a good shape, so it is \n\nRegarding the setting, I don\u0027t want to add the falling back logic on the setting as I commented in the inline comment. It is a super simple change. If the author is okay I can take care of it quickly in this review.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"4390ff3d4ebf19ac9922773dc5c399c968a13871","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"ef9b6295_e5d2db41","in_reply_to":"348a5e36_4fb6353d","updated":"2022-02-25 20:21:01.000000000","message":"Not from my side Vishal. Won\u0027t be able to change to code with his suggestions and test it for today. \nIf you don\u0027t think the code can go in on this state, we will need more time later to update and test. If you do think the code can go in like this, we can create new changes with the refactoring suggestions later.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"9a93e448e6381435ae497e74e395ad51646f63eb","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"da0b5c44_4d2eccf7","in_reply_to":"ef9b6295_e5d2db41","updated":"2022-02-25 20:21:34.000000000","message":"Marked as resolved by accident. I\u0027m sorry","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"a7fb7d21_3e66eae3","updated":"2022-02-28 10:21:25.000000000","message":"I moved the setting to the top level of horizon settings.\n\nThe race condition on the session expiry still needs to be followed up. I am okay once someone commits to investigate whether the race condition I pointed out is an issue or not. A follow-up work works for me I just wonders who will take care of it to avoid the situation that no follow-up happens and it leads to extra work in the horizon team.","commit_id":"c6a828b75bc97d426093c84ad2ad745cb4a1d42a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"70420fb315d13b5aafc1c83904f621c9ba8dc493","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"6eb8476e_f68f2c58","updated":"2022-03-03 02:40:45.000000000","message":"As discussed in the horizon meeting, we are okay to merge this.\nThe issue I commented can be fixed as follow-up.\n","commit_id":"5d6eefa498cf532bde6e9aed4ed278597a8289bc"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f013f819e7b1acdb80ab09cf6daa13dbfd77c8b8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"5a201c9f_ccb58a04","updated":"2022-02-28 16:53:03.000000000","message":"recheck","commit_id":"5d6eefa498cf532bde6e9aed4ed278597a8289bc"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"0573bc9d0edad2dae392234383930b647ce7951c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"6edbc857_a629d81c","updated":"2022-03-03 10:08:42.000000000","message":"recheck","commit_id":"5d6eefa498cf532bde6e9aed4ed278597a8289bc"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"b9e1db177dded40b514a7df811a8776278389004","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"eacc3f1b_b3c37bb1","updated":"2022-03-03 15:13:33.000000000","message":"recheck","commit_id":"5d6eefa498cf532bde6e9aed4ed278597a8289bc"}],"doc/source/configuration/settings.rst":[{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"0ecddbb56e35806cae45677b631168b836203c8e","unresolved":true,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"simultaneous_sessions"},{"line_number":460,"context_line":"~~~~~~~~~"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":".. versionadded:: 2022.x"},{"line_number":463,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7ad77674_5d25dc6d","line":460,"range":{"start_line":460,"start_character":0,"end_line":460,"end_character":9},"updated":"2021-11-16 17:56:20.000000000","message":"Could you underline the complete text.","commit_id":"2f3d918ac5453a3abfea7c4761f048ab774e12f3"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"00656baf854f5a39dda2bb03df553c8c61e99d2f","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"simultaneous_sessions"},{"line_number":460,"context_line":"~~~~~~~~~"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":".. versionadded:: 2022.x"},{"line_number":463,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1c28ac29_522a41ff","line":460,"range":{"start_line":460,"start_character":0,"end_line":460,"end_character":9},"in_reply_to":"7ad77674_5d25dc6d","updated":"2021-11-16 19:33:14.000000000","message":"Done","commit_id":"2f3d918ac5453a3abfea7c4761f048ab774e12f3"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"0ecddbb56e35806cae45677b631168b836203c8e","unresolved":true,"context_lines":[{"line_number":459,"context_line":"simultaneous_sessions"},{"line_number":460,"context_line":"~~~~~~~~~"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":".. versionadded:: 2022.x"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"Default: ``allow``"},{"line_number":465,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"f7d3382f_70691ab4","line":462,"range":{"start_line":462,"start_character":18,"end_line":462,"end_character":24},"updated":"2021-11-16 17:56:20.000000000","message":"Please use \u002721.0.0(Yoga)\u0027 as this is going to be next horizon release version.","commit_id":"2f3d918ac5453a3abfea7c4761f048ab774e12f3"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"00656baf854f5a39dda2bb03df553c8c61e99d2f","unresolved":false,"context_lines":[{"line_number":459,"context_line":"simultaneous_sessions"},{"line_number":460,"context_line":"~~~~~~~~~"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":".. versionadded:: 2022.x"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"Default: ``allow``"},{"line_number":465,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"c78d669f_3a13c445","line":462,"range":{"start_line":462,"start_character":18,"end_line":462,"end_character":24},"in_reply_to":"f7d3382f_70691ab4","updated":"2021-11-16 19:33:14.000000000","message":"Done","commit_id":"2f3d918ac5453a3abfea7c4761f048ab774e12f3"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"42034a7ec83ff73faecd797b7feb2f352d663322","unresolved":true,"context_lines":[{"line_number":459,"context_line":"simultaneous_sessions"},{"line_number":460,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":".. versionadded:: 21.0.0(Yoga)"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"Default: ``allow``"},{"line_number":465,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"eff55ac7_da44c88a","line":462,"range":{"start_line":462,"start_character":18,"end_line":462,"end_character":24},"updated":"2022-02-21 05:29:16.000000000","message":"Now it needs to update to \u002721.1.0\u0027","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"205c97a7ef7af7e3227b80c14d38fbf47fb09670","unresolved":false,"context_lines":[{"line_number":459,"context_line":"simultaneous_sessions"},{"line_number":460,"context_line":"~~~~~~~~~~~~~~~~~~~~~"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":".. versionadded:: 21.0.0(Yoga)"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"Default: ``allow``"},{"line_number":465,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"dceb94d8_cc24775b","line":462,"range":{"start_line":462,"start_character":18,"end_line":462,"end_character":24},"in_reply_to":"eff55ac7_da44c88a","updated":"2022-02-23 16:06:16.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"379cef79b348c623c8d6fb6473bbf2bf2d88783f","unresolved":true,"context_lines":[{"line_number":463,"context_line":""},{"line_number":464,"context_line":"Default: ``allow``"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"Controls whether a user can have more than one simultaneous dashboard valid"},{"line_number":467,"context_line":"session. Valid values are ``allow`` and ``disconnect``."},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"Value ``allow`` enables more than one simultaneous Horizon dashboard valid"},{"line_number":470,"context_line":"sessions for a user."}],"source_content_type":"text/x-rst","patch_set":6,"id":"e1f67576_cb5f4f6f","line":467,"range":{"start_line":466,"start_character":33,"end_line":467,"end_character":7},"updated":"2022-02-21 07:04:19.000000000","message":"nit: I think it can be rephrased to \"multiple sessions\". If it works, it would be much simpler.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"fb5debab7d695cf0a85f200c54755d80a7a18bf1","unresolved":false,"context_lines":[{"line_number":463,"context_line":""},{"line_number":464,"context_line":"Default: ``allow``"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"Controls whether a user can have more than one simultaneous dashboard valid"},{"line_number":467,"context_line":"session. Valid values are ``allow`` and ``disconnect``."},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"Value ``allow`` enables more than one simultaneous Horizon dashboard valid"},{"line_number":470,"context_line":"sessions for a user."}],"source_content_type":"text/x-rst","patch_set":6,"id":"97c0a0a5_970df774","line":467,"range":{"start_line":466,"start_character":33,"end_line":467,"end_character":7},"in_reply_to":"e1f67576_cb5f4f6f","updated":"2022-02-23 17:19:03.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    HORIZON_CONFIG \u003d {"},{"line_number":263,"context_line":"        \u0027user_home\u0027: \u0027openstack_dashboard.views.get_user_home\u0027,"},{"line_number":264,"context_line":"        \u0027simultaneous_sessions\u0027: \u0027allow\u0027,"},{"line_number":265,"context_line":"        \u0027ajax_queue_limit\u0027: 10,"},{"line_number":266,"context_line":"        \u0027auto_fade_alerts\u0027: {"},{"line_number":267,"context_line":"            \u0027delay\u0027: 3000,"}],"source_content_type":"text/x-rst","patch_set":9,"id":"bf865150_a6f71aee","line":264,"updated":"2022-02-28 10:21:25.000000000","message":"Dropped in the latest patch set.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"}],"horizon/conf/default.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"baafdf6189a0a55f26e46b7bad0750b17c84cf6d","unresolved":true,"context_lines":[{"line_number":25,"context_line":"    \u0027user_home\u0027: settings.LOGIN_REDIRECT_URL,"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # The same user simultaneous dashboard sessions protection logic"},{"line_number":28,"context_line":"    \u0027simultaneous_sessions\u0027: \u0027allow\u0027,"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    # AJAX settings for JavaScript"},{"line_number":31,"context_line":"    \u0027ajax_queue_limit\u0027: 10,"}],"source_content_type":"text/x-python","patch_set":6,"id":"98da1b9b_e0cdfb09","line":28,"updated":"2022-02-21 07:02:01.000000000","message":"- question: This looks like a boolean setting. Why does not a boolean value like \"allow_simultaneous_sessions\" work?\n\n- HORIZON_CONFIG is currently used only for horizon/middleware/base.py and the long-existing settings from the beginning. There is no need to place it inside HORIZON_CONFIG. For simplicity, I would suggest to place the new setting at the top level.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"73e0526759223ca93cb8160c69aa6930dfc885bd","unresolved":true,"context_lines":[{"line_number":25,"context_line":"    \u0027user_home\u0027: settings.LOGIN_REDIRECT_URL,"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # The same user simultaneous dashboard sessions protection logic"},{"line_number":28,"context_line":"    \u0027simultaneous_sessions\u0027: \u0027allow\u0027,"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    # AJAX settings for JavaScript"},{"line_number":31,"context_line":"    \u0027ajax_queue_limit\u0027: 10,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5d068b0a_af7c1ffe","line":28,"in_reply_to":"2499aff7_77c310bd","updated":"2022-02-23 19:42:32.000000000","message":"Ok, I understand now. It was probably our lack of knowledge on Horizon settings best practices. I understand that this should be moved to the top level (e.g. SIMULTANEOUS_SESSIONS\u003d\u0027allow\u0027) and the new SimultaneousSessionsMiddleware should access it with  settings.SIMULTANEOUS_SESSIONS\n\nI\u0027m just afraid I won\u0027t have time to test this code change before the end of the week :(","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"722977f49d67b4482b6f3300fc9144f1b3163ef0","unresolved":true,"context_lines":[{"line_number":25,"context_line":"    \u0027user_home\u0027: settings.LOGIN_REDIRECT_URL,"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # The same user simultaneous dashboard sessions protection logic"},{"line_number":28,"context_line":"    \u0027simultaneous_sessions\u0027: \u0027allow\u0027,"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    # AJAX settings for JavaScript"},{"line_number":31,"context_line":"    \u0027ajax_queue_limit\u0027: 10,"}],"source_content_type":"text/x-python","patch_set":6,"id":"2499aff7_77c310bd","line":28,"in_reply_to":"323b54ab_41891701","updated":"2022-02-23 16:49:47.000000000","message":"Why don\u0027t you put it directly in horizon/defaults.py?\nFrom my experience on working on refactoring on default settings in horizon, almost all keys in HORIZON_CONFIG dict can be moved to the top level in horizon/defaults.py. As a long term plan, the existing keys in HORIZON_CONFIG will be broken down into the top-level config in horizon/defaults.py. Thus, I am suggesting to move it to the top level.\nWhat is the exact reason you prefer to a new key in HORIZON_CONFIG rather than putting it directly to horizon/defaults.py?","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a48fc84a290a71a0c97c742eb5dd29e109ce0dde","unresolved":true,"context_lines":[{"line_number":25,"context_line":"    \u0027user_home\u0027: settings.LOGIN_REDIRECT_URL,"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # The same user simultaneous dashboard sessions protection logic"},{"line_number":28,"context_line":"    \u0027simultaneous_sessions\u0027: \u0027allow\u0027,"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    # AJAX settings for JavaScript"},{"line_number":31,"context_line":"    \u0027ajax_queue_limit\u0027: 10,"}],"source_content_type":"text/x-python","patch_set":6,"id":"72543418_27a2560e","line":28,"in_reply_to":"5d068b0a_af7c1ffe","updated":"2022-02-28 08:14:32.000000000","message":"It is a simple change. If you are not willing to do it, I can do the setting change quickly.\n\nAt least, it is not a good idea to cut a release without changing the setting. Otherwise, we need a deprecation plan including the logic to look up for the previous and new settings. This is too much burden.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \u0027user_home\u0027: settings.LOGIN_REDIRECT_URL,"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # The same user simultaneous dashboard sessions protection logic"},{"line_number":28,"context_line":"    \u0027simultaneous_sessions\u0027: \u0027allow\u0027,"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    # AJAX settings for JavaScript"},{"line_number":31,"context_line":"    \u0027ajax_queue_limit\u0027: 10,"}],"source_content_type":"text/x-python","patch_set":6,"id":"78e7cfd3_feef048b","line":28,"in_reply_to":"72543418_27a2560e","updated":"2022-02-28 10:21:25.000000000","message":"Done\nI moved the setting to settings.SIMULTANEOUS_SESSIONS instead of using HORIZON_CONFIG.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"014c31b07cb4e11aabd1557133d96f19bf13aff3","unresolved":true,"context_lines":[{"line_number":25,"context_line":"    \u0027user_home\u0027: settings.LOGIN_REDIRECT_URL,"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # The same user simultaneous dashboard sessions protection logic"},{"line_number":28,"context_line":"    \u0027simultaneous_sessions\u0027: \u0027allow\u0027,"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    # AJAX settings for JavaScript"},{"line_number":31,"context_line":"    \u0027ajax_queue_limit\u0027: 10,"}],"source_content_type":"text/x-python","patch_set":6,"id":"323b54ab_41891701","line":28,"in_reply_to":"98da1b9b_e0cdfb09","updated":"2022-02-23 16:14:34.000000000","message":"* For the current status of this feature a boolean value would work fine as well. But it was designed with a string value to let the door open for future extensions of this feature that control the simultaneous sessions in new ways (different from both options currently available).\n\n* Since Horizon need to have one control option for \u0027simultaneous_sessions\u0027 when a login occurs, it sounded that this would be the best place to put the config. Do you still disagree?","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"}],"horizon/middleware/simultaneous_sessions.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"baafdf6189a0a55f26e46b7bad0750b17c84cf6d","unresolved":true,"context_lines":[{"line_number":36,"context_line":"        cache \u003d caches[\u0027default\u0027]"},{"line_number":37,"context_line":"        cache_key \u003d (\u0027user_pk_{}_restrict\u0027).format(request.user.pk)"},{"line_number":38,"context_line":"        cache_value \u003d cache.get(cache_key)"},{"line_number":39,"context_line":"        if cache_value is not None and ("},{"line_number":40,"context_line":"                self.simultaneous_sessions \u003d\u003d \u0027disconnect\u0027):"},{"line_number":41,"context_line":"            if request.session.session_key !\u003d cache_value:"},{"line_number":42,"context_line":"                LOG.info(\u0027The user %(user_id)s is already logged in, \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"efb831fb_e99292d8","line":39,"range":{"start_line":39,"start_character":11,"end_line":39,"end_character":34},"updated":"2022-02-21 07:02:01.000000000","message":"This can be just:\n\n  if cache_value and\n\nas a cached value is always a session key so it is never empty.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"b404942bcfeb08dfe4564488da056e12c4638d82","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        cache \u003d caches[\u0027default\u0027]"},{"line_number":37,"context_line":"        cache_key \u003d (\u0027user_pk_{}_restrict\u0027).format(request.user.pk)"},{"line_number":38,"context_line":"        cache_value \u003d cache.get(cache_key)"},{"line_number":39,"context_line":"        if cache_value is not None and ("},{"line_number":40,"context_line":"                self.simultaneous_sessions \u003d\u003d \u0027disconnect\u0027):"},{"line_number":41,"context_line":"            if request.session.session_key !\u003d cache_value:"},{"line_number":42,"context_line":"                LOG.info(\u0027The user %(user_id)s is already logged in, \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"958229a7_8286291e","line":39,"range":{"start_line":39,"start_character":11,"end_line":39,"end_character":34},"in_reply_to":"efb831fb_e99292d8","updated":"2022-02-23 17:15:32.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"baafdf6189a0a55f26e46b7bad0750b17c84cf6d","unresolved":true,"context_lines":[{"line_number":41,"context_line":"            if request.session.session_key !\u003d cache_value:"},{"line_number":42,"context_line":"                LOG.info(\u0027The user %(user_id)s is already logged in, \u0027"},{"line_number":43,"context_line":"                         \u0027the last session will be disconnected.\u0027, {"},{"line_number":44,"context_line":"                             \u0027user_id\u0027: request.user"},{"line_number":45,"context_line":"                         })"},{"line_number":46,"context_line":"                engine \u003d importlib.import_module(settings.SESSION_ENGINE)"},{"line_number":47,"context_line":"                session \u003d engine.SessionStore(session_key\u003dcache_value)"}],"source_content_type":"text/x-python","patch_set":6,"id":"27d1f744_a76c8d25","line":44,"range":{"start_line":44,"start_character":40,"end_line":44,"end_character":52},"updated":"2022-02-21 07:02:01.000000000","message":"I prefer to use request.user.id explicitly as the log message says \"user_id\".","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"b404942bcfeb08dfe4564488da056e12c4638d82","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            if request.session.session_key !\u003d cache_value:"},{"line_number":42,"context_line":"                LOG.info(\u0027The user %(user_id)s is already logged in, \u0027"},{"line_number":43,"context_line":"                         \u0027the last session will be disconnected.\u0027, {"},{"line_number":44,"context_line":"                             \u0027user_id\u0027: request.user"},{"line_number":45,"context_line":"                         })"},{"line_number":46,"context_line":"                engine \u003d importlib.import_module(settings.SESSION_ENGINE)"},{"line_number":47,"context_line":"                session \u003d engine.SessionStore(session_key\u003dcache_value)"}],"source_content_type":"text/x-python","patch_set":6,"id":"60c50520_35a20da6","line":44,"range":{"start_line":44,"start_character":40,"end_line":44,"end_character":52},"in_reply_to":"27d1f744_a76c8d25","updated":"2022-02-23 17:15:32.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"baafdf6189a0a55f26e46b7bad0750b17c84cf6d","unresolved":true,"context_lines":[{"line_number":45,"context_line":"                         })"},{"line_number":46,"context_line":"                engine \u003d importlib.import_module(settings.SESSION_ENGINE)"},{"line_number":47,"context_line":"                session \u003d engine.SessionStore(session_key\u003dcache_value)"},{"line_number":48,"context_line":"                LOG.debug(\u0027Deleting session %(session)s\u0027, {"},{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"4cc09d71_0e2a510f","line":49,"range":{"start_line":48,"start_character":26,"end_line":49,"end_character":66},"updated":"2022-02-21 07:02:01.000000000","message":"Is this message correct? %(session)s will be replaced with the current session as you use request.session. Deleting the current session is not the thing you do here.\n\nIn addition, I am not sure this logging message is needed. Doesn\u0027t L.42 already cover required information? (cache_key is generated based on request.user.id.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"b404942bcfeb08dfe4564488da056e12c4638d82","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                         })"},{"line_number":46,"context_line":"                engine \u003d importlib.import_module(settings.SESSION_ENGINE)"},{"line_number":47,"context_line":"                session \u003d engine.SessionStore(session_key\u003dcache_value)"},{"line_number":48,"context_line":"                LOG.debug(\u0027Deleting session %(session)s\u0027, {"},{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"18d401db_091c0828","line":49,"range":{"start_line":48,"start_character":26,"end_line":49,"end_character":66},"in_reply_to":"4cc09d71_0e2a510f","updated":"2022-02-23 17:15:32.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"baafdf6189a0a55f26e46b7bad0750b17c84cf6d","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            cache.set(cache_key, request.session.session_key,"},{"line_number":55,"context_line":"                      settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"87264c31_a7c8a5df","line":52,"updated":"2022-02-21 07:02:01.000000000","message":"question: why is the cache not updated when a cache is found and the session key matches the cache value? The session expiry can be refreshed (See horizon/middleware/base.py for details). If so, I think the cache of user_pk here will be expired first. I might be wrong.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"03d4b689de51bbf1f1baddf31e38d25a11ed6da6","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            cache.set(cache_key, request.session.session_key,"},{"line_number":55,"context_line":"                      settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"36824736_f95072ab","line":52,"in_reply_to":"24c3520f_1f70573f","updated":"2022-03-02 16:41:17.000000000","message":"I am not sticking to a specific solution here.\n\nLet me explain what is the problem.\n\nMy points are that if SESSION_REFRESH is True a session timeout will be extended in every access but the user cache introduced here is not refreshed.\n\nLet\u0027s assume that SESSION_TIMEOUT is 1000s. User-A logs into horizon at time 0 and accesss again with a same session at time 500. The session expiration time will be extended to time 1500 (500+1000) [1]. The user cache timeout is still time 1000.\nThus, after time 1000, the session continues but the user cache will no longer exist.\n\nIf user-a logs in a new session at time 1300 (and the first session is not access after time 500), the user cache for user-a no longer exists, so the first session will not be deleted. Both of the first and second sessions will be active. I believe this is not what you want.\n\nHope the above explanation helps you find a solution.\n\n[1] https://opendev.org/openstack/horizon/src/branch/master/horizon/middleware/base.py#L73-L78","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"ab0b8af16a7cf42733a93fde8f37ab8ab1f67ff3","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            cache.set(cache_key, request.session.session_key,"},{"line_number":55,"context_line":"                      settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"68eb583a_bd67c9b7","line":52,"in_reply_to":"36824736_f95072ab","updated":"2022-03-02 18:08:31.000000000","message":"I understand your point and it makes sense. \n\nJust to clarify: the commitment to follow up should be of doing it ASAP for this coming release or would it be done after the release?\n\nThis was originally Hugo\u0027s code but I also gave some maintenance to it. I could definitely follow up on this topic when I find some time to bring up my environment and check it again. Was just afraid of those hard deadlines from previous week.\n\nSo I\u0027m confused if this feature is going on like it is for this release and the follow up should be done before the next one, or if all the work should be done ASAP for this release.\n\nAnyways, thanks a lot for reviewing it thoroughly!","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"b7c9bfb70f89436d22f162ca59d8fe35e0457ad8","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            cache.set(cache_key, request.session.session_key,"},{"line_number":55,"context_line":"                      settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"c49d9002_a3e4c21c","line":52,"in_reply_to":"409510a9_a255120a","updated":"2022-03-02 08:50:02.000000000","message":"@Thales Elero Cervi: ping, waiting for your response on this comment.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a48fc84a290a71a0c97c742eb5dd29e109ce0dde","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            cache.set(cache_key, request.session.session_key,"},{"line_number":55,"context_line":"                      settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"409510a9_a255120a","line":52,"in_reply_to":"5706e700_7b9d1cd0","updated":"2022-02-28 08:14:32.000000000","message":"If so, can you promise to follow up this?\n\nI cannot give +2 only due to the time constraint and without the commitment of the follow-up. In such case, I will defer the decision to other reviewers. I saw many cases where no follow-up happened and they turns out debts in the code base.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"70420fb315d13b5aafc1c83904f621c9ba8dc493","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            cache.set(cache_key, request.session.session_key,"},{"line_number":55,"context_line":"                      settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"94746d65_451369fc","line":52,"in_reply_to":"68eb583a_bd67c9b7","updated":"2022-03-03 02:40:45.000000000","message":"Ideally it is better to follow it up soon before Yoga release, but it is not mandatory. This is a new feature. People should consider it as experimental to some extent and it is not surprising if there is a bug.\n\nI proposed https://review.opendev.org/c/openstack/horizon/+/831626 as draft. You can take it over. I can take care of UT though. More manual testing would be appreciated.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"73e0526759223ca93cb8160c69aa6930dfc885bd","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            cache.set(cache_key, request.session.session_key,"},{"line_number":55,"context_line":"                      settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5706e700_7b9d1cd0","line":52,"in_reply_to":"87264c31_a7c8a5df","updated":"2022-02-23 19:42:32.000000000","message":"You might also be right on this one. We thought that the session expiry was already being handled by the HorizonMiddleware and therefore we only had to care about the new session handling.\n\n\nI\u0027m just afraid I won\u0027t have time to test this code change before the end of the week :(","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"40a13de372e8f8e5d7ff131ff6bf31723694ad28","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            cache.set(cache_key, request.session.session_key,"},{"line_number":55,"context_line":"                      settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"b9434a0b_c3c794c2","line":52,"in_reply_to":"94746d65_451369fc","updated":"2022-03-03 06:42:53.000000000","message":"Thanks for helping here.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"68204fcb84787de5bb7d93f6af1f7bb3292d8577","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                          \u0027session\u0027: request.session.session_key})"},{"line_number":50,"context_line":"                session.delete()"},{"line_number":51,"context_line":"                cache.set(cache_key, request.session.session_key,"},{"line_number":52,"context_line":"                          settings.SESSION_TIMEOUT)"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            cache.set(cache_key, request.session.session_key,"},{"line_number":55,"context_line":"                      settings.SESSION_TIMEOUT)"}],"source_content_type":"text/x-python","patch_set":6,"id":"24c3520f_1f70573f","line":52,"in_reply_to":"c49d9002_a3e4c21c","updated":"2022-03-02 11:21:00.000000000","message":"Sure, we can definitely follow up on this.\nJust to clarify: your point here is that the session timeout renew should be done outside the if conditional here, correct?\nWas really under the impression that the HorizonMiddleware would handle the renew when sessions is supposed to be renewed on that case.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"719eb4446c403164be24380d79ad2aecee9e40c1","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        cache_value \u003d cache.get(cache_key)"},{"line_number":39,"context_line":"        if cache_value and (self.simultaneous_sessions \u003d\u003d \u0027disconnect\u0027):"},{"line_number":40,"context_line":"            if request.session.session_key !\u003d cache_value:"},{"line_number":41,"context_line":"                LOG.info(\u0027The user %(user_id)s is already logged in, \u0027"},{"line_number":42,"context_line":"                         \u0027the last session will be disconnected.\u0027, {"},{"line_number":43,"context_line":"                             \u0027user_id\u0027: request.user.id"},{"line_number":44,"context_line":"                         })"}],"source_content_type":"text/x-python","patch_set":9,"id":"96487b82_018eaa13","line":41,"range":{"start_line":41,"start_character":34,"end_line":41,"end_character":46},"updated":"2022-02-28 09:16:42.000000000","message":"nit: There is only one substitution. The logging guideline recommends to use %s in this case.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        cache_value \u003d cache.get(cache_key)"},{"line_number":39,"context_line":"        if cache_value and (self.simultaneous_sessions \u003d\u003d \u0027disconnect\u0027):"},{"line_number":40,"context_line":"            if request.session.session_key !\u003d cache_value:"},{"line_number":41,"context_line":"                LOG.info(\u0027The user %(user_id)s is already logged in, \u0027"},{"line_number":42,"context_line":"                         \u0027the last session will be disconnected.\u0027, {"},{"line_number":43,"context_line":"                             \u0027user_id\u0027: request.user.id"},{"line_number":44,"context_line":"                         })"}],"source_content_type":"text/x-python","patch_set":9,"id":"b5f97597_aa275a6d","line":41,"range":{"start_line":41,"start_character":34,"end_line":41,"end_character":46},"in_reply_to":"96487b82_018eaa13","updated":"2022-02-28 10:21:25.000000000","message":"Fixed in patch set 10.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"}],"horizon/test/settings.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    \u0027user_home\u0027: None,"},{"line_number":121,"context_line":"    \u0027bug_url\u0027: None,"},{"line_number":122,"context_line":"    \u0027help_url\u0027: \"http://example.com\","},{"line_number":123,"context_line":"    \u0027simultaneous_sessions\u0027: \u0027allow\u0027,"},{"line_number":124,"context_line":"}"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"STATICFILES_DIRS \u003d settings_utils.get_xstatic_dirs("}],"source_content_type":"text/x-python","patch_set":9,"id":"652b13b0_26d61744","line":123,"updated":"2022-02-28 10:21:25.000000000","message":"Dropped in the latest patch set. There is no need to specify it in HORIZON_CONFIG explicitly as we can use the default value from defaults.py.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"}],"horizon/test/unit/middleware/test_simultaneous_sessions.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"baafdf6189a0a55f26e46b7bad0750b17c84cf6d","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        mw \u003d middleware.SimultaneousSessionsMiddleware("},{"line_number":46,"context_line":"            self.get_response)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self.assertEqual(settings.HORIZON_CONFIG["},{"line_number":49,"context_line":"            \u0027simultaneous_sessions\u0027], ALLOW_SESSIONS)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self.request.session._set_session_key(\"123456789\")"},{"line_number":52,"context_line":"        mw._process_request(self.request)"}],"source_content_type":"text/x-python","patch_set":6,"id":"e7abf338_51803565","line":49,"range":{"start_line":48,"start_character":7,"end_line":49,"end_character":53},"updated":"2022-02-21 07:02:01.000000000","message":"This just checks if the test config is configured correctly. I think it is unnecesary.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"69fcdd8d500c6931d6454c085ce8a4f32998dade","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        mw \u003d middleware.SimultaneousSessionsMiddleware("},{"line_number":46,"context_line":"            self.get_response)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self.assertEqual(settings.HORIZON_CONFIG["},{"line_number":49,"context_line":"            \u0027simultaneous_sessions\u0027], ALLOW_SESSIONS)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self.request.session._set_session_key(\"123456789\")"},{"line_number":52,"context_line":"        mw._process_request(self.request)"}],"source_content_type":"text/x-python","patch_set":6,"id":"449eee41_2c530764","line":49,"range":{"start_line":48,"start_character":7,"end_line":49,"end_character":53},"in_reply_to":"e7abf338_51803565","updated":"2022-02-23 17:23:36.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"baafdf6189a0a55f26e46b7bad0750b17c84cf6d","unresolved":true,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self.request.session._set_session_key(\"123456789\")"},{"line_number":52,"context_line":"        mw._process_request(self.request)"},{"line_number":53,"context_line":"        self.assertFalse(delete.called)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        self.request.session._set_session_key(\"987654321\")"},{"line_number":56,"context_line":"        mw._process_request(self.request)"}],"source_content_type":"text/x-python","patch_set":6,"id":"c5b7f9b1_f0ce452e","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":39},"updated":"2022-02-21 07:02:01.000000000","message":"Consider delete.assert_not_called()","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"73e0526759223ca93cb8160c69aa6930dfc885bd","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self.request.session._set_session_key(\"123456789\")"},{"line_number":52,"context_line":"        mw._process_request(self.request)"},{"line_number":53,"context_line":"        self.assertFalse(delete.called)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        self.request.session._set_session_key(\"987654321\")"},{"line_number":56,"context_line":"        mw._process_request(self.request)"}],"source_content_type":"text/x-python","patch_set":6,"id":"710deb22_f5606e3d","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":39},"in_reply_to":"c5b7f9b1_f0ce452e","updated":"2022-02-23 19:42:32.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"719eb4446c403164be24380d79ad2aecee9e40c1","unresolved":true,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"HORIZON_CONFIG \u003d copy.deepcopy(settings.HORIZON_CONFIG)"},{"line_number":27,"context_line":"DISCONNECT_SESSION \u003d \u0027disconnect\u0027"},{"line_number":28,"context_line":"ALLOW_SESSIONS \u003d \u0027allow\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"HORIZON_CONFIG[\u0027simultaneous_sessions\u0027] \u003d DISCONNECT_SESSION"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"a6db561c_66c7184b","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":24},"updated":"2022-02-28 09:16:42.000000000","message":"nit: This is unnecessary. This is the test code, so there is no need to define unncessary values.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"HORIZON_CONFIG \u003d copy.deepcopy(settings.HORIZON_CONFIG)"},{"line_number":27,"context_line":"DISCONNECT_SESSION \u003d \u0027disconnect\u0027"},{"line_number":28,"context_line":"ALLOW_SESSIONS \u003d \u0027allow\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"HORIZON_CONFIG[\u0027simultaneous_sessions\u0027] \u003d DISCONNECT_SESSION"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"971f6e57_095f35df","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":24},"in_reply_to":"a6db561c_66c7184b","updated":"2022-02-28 10:21:25.000000000","message":"After moving the setting to the top level, there is no need to change HORIZON_CONFIG and the test code is now simpler.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"719eb4446c403164be24380d79ad2aecee9e40c1","unresolved":true,"context_lines":[{"line_number":27,"context_line":"DISCONNECT_SESSION \u003d \u0027disconnect\u0027"},{"line_number":28,"context_line":"ALLOW_SESSIONS \u003d \u0027allow\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"HORIZON_CONFIG[\u0027simultaneous_sessions\u0027] \u003d DISCONNECT_SESSION"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class SimultaneousSessionsMiddlewareTest(django_test.TestCase):"}],"source_content_type":"text/x-python","patch_set":9,"id":"fc50cce6_34d0627d","line":30,"updated":"2022-02-28 09:16:42.000000000","message":"This changes the default settings globally. This should be droppped.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[{"line_number":27,"context_line":"DISCONNECT_SESSION \u003d \u0027disconnect\u0027"},{"line_number":28,"context_line":"ALLOW_SESSIONS \u003d \u0027allow\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"HORIZON_CONFIG[\u0027simultaneous_sessions\u0027] \u003d DISCONNECT_SESSION"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class SimultaneousSessionsMiddlewareTest(django_test.TestCase):"}],"source_content_type":"text/x-python","patch_set":9,"id":"c31cc080_b7b507bb","line":30,"in_reply_to":"fc50cce6_34d0627d","updated":"2022-02-28 10:21:25.000000000","message":"Done","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"719eb4446c403164be24380d79ad2aecee9e40c1","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        mw \u003d middleware.SimultaneousSessionsMiddleware("},{"line_number":60,"context_line":"            self.get_response)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        self.assertEqual(settings.HORIZON_CONFIG["},{"line_number":63,"context_line":"            \u0027simultaneous_sessions\u0027], DISCONNECT_SESSION)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.request.session._set_session_key(\"123456789\")"},{"line_number":66,"context_line":"        mw._process_request(self.request)"}],"source_content_type":"text/x-python","patch_set":9,"id":"41702bc4_3227bebf","line":63,"range":{"start_line":62,"start_character":8,"end_line":63,"end_character":57},"updated":"2022-02-28 09:16:42.000000000","message":"Hmm.. only the same pattern in test_simultaneous_sessions was dropped.\nIt seems I should comment one by one...","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        mw \u003d middleware.SimultaneousSessionsMiddleware("},{"line_number":60,"context_line":"            self.get_response)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        self.assertEqual(settings.HORIZON_CONFIG["},{"line_number":63,"context_line":"            \u0027simultaneous_sessions\u0027], DISCONNECT_SESSION)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.request.session._set_session_key(\"123456789\")"},{"line_number":66,"context_line":"        mw._process_request(self.request)"}],"source_content_type":"text/x-python","patch_set":9,"id":"a031b30d_c7ef4ef9","line":63,"range":{"start_line":62,"start_character":8,"end_line":63,"end_character":57},"in_reply_to":"41702bc4_3227bebf","updated":"2022-02-28 10:21:25.000000000","message":"Done","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"719eb4446c403164be24380d79ad2aecee9e40c1","unresolved":true,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.request.session._set_session_key(\"123456789\")"},{"line_number":66,"context_line":"        mw._process_request(self.request)"},{"line_number":67,"context_line":"        self.assertFalse(delete.called)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.request.session._set_session_key(\"987654321\")"},{"line_number":70,"context_line":"        mw._process_request(self.request)"}],"source_content_type":"text/x-python","patch_set":9,"id":"df6a20d1_ede09c75","line":67,"range":{"start_line":67,"start_character":8,"end_line":67,"end_character":39},"updated":"2022-02-28 09:16:42.000000000","message":"My comment on L.53 in patch set 6 is applied to here.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        self.request.session._set_session_key(\"123456789\")"},{"line_number":66,"context_line":"        mw._process_request(self.request)"},{"line_number":67,"context_line":"        self.assertFalse(delete.called)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.request.session._set_session_key(\"987654321\")"},{"line_number":70,"context_line":"        mw._process_request(self.request)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5967e5ac_370bb3cb","line":67,"range":{"start_line":67,"start_character":8,"end_line":67,"end_character":39},"in_reply_to":"df6a20d1_ede09c75","updated":"2022-02-28 10:21:25.000000000","message":"Done","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"719eb4446c403164be24380d79ad2aecee9e40c1","unresolved":true,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.request.session._set_session_key(\"987654321\")"},{"line_number":70,"context_line":"        mw._process_request(self.request)"},{"line_number":71,"context_line":"        self.assertTrue(delete.called)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fb13e03_ec96280c","line":71,"range":{"start_line":71,"start_character":7,"end_line":71,"end_character":38},"updated":"2022-02-28 09:16:42.000000000","message":"Called arguments should be asserted.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        self.request.session._set_session_key(\"987654321\")"},{"line_number":70,"context_line":"        mw._process_request(self.request)"},{"line_number":71,"context_line":"        self.assertTrue(delete.called)"}],"source_content_type":"text/x-python","patch_set":9,"id":"6667b810_9534c3d6","line":71,"range":{"start_line":71,"start_character":7,"end_line":71,"end_character":38},"in_reply_to":"5fb13e03_ec96280c","updated":"2022-02-28 10:21:25.000000000","message":"Done","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"8218ffad133ebfad4decec618afdbe2780fe601c","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self.request.session._set_session_key(\u0027987654321\u0027)"},{"line_number":60,"context_line":"        mw._process_request(self.request)"},{"line_number":61,"context_line":"        delete.assert_called_once_with(\u0027foo\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"950c69c1_c3a1da79","line":61,"range":{"start_line":61,"start_character":39,"end_line":61,"end_character":44},"updated":"2022-02-28 16:52:47.000000000","message":"woops.... sorry. I forgot to delete this by mistake. It was just added to force to fail the test during my debug.","commit_id":"c6a828b75bc97d426093c84ad2ad745cb4a1d42a"}],"openstack_dashboard/settings.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"baafdf6189a0a55f26e46b7bad0750b17c84cf6d","unresolved":true,"context_lines":[{"line_number":92,"context_line":"    \u0027ProfilerClientMiddleware\u0027,"},{"line_number":93,"context_line":"    \u0027openstack_dashboard.contrib.developer.profiler.middleware.\u0027"},{"line_number":94,"context_line":"    \u0027ProfilerMiddleware\u0027,"},{"line_number":95,"context_line":"    \u0027horizon.middleware.SimultaneousSessionsMiddleware\u0027,"},{"line_number":96,"context_line":")"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"CACHED_TEMPLATE_LOADERS \u003d ["}],"source_content_type":"text/x-python","patch_set":6,"id":"fe6c47cb_b05ce4a5","line":95,"updated":"2022-02-21 07:02:01.000000000","message":"Django middlewares are processed in the order in this list. Is this the right place you want? As far as I capture, this middleware needs to be placed after authenticated and perhaps there is no need to be placed after HorizonMiddleware.\nI am not sure which is better that it should be before or after OperationLogMiddleware.","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"b404942bcfeb08dfe4564488da056e12c4638d82","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    \u0027ProfilerClientMiddleware\u0027,"},{"line_number":93,"context_line":"    \u0027openstack_dashboard.contrib.developer.profiler.middleware.\u0027"},{"line_number":94,"context_line":"    \u0027ProfilerMiddleware\u0027,"},{"line_number":95,"context_line":"    \u0027horizon.middleware.SimultaneousSessionsMiddleware\u0027,"},{"line_number":96,"context_line":")"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"CACHED_TEMPLATE_LOADERS \u003d ["}],"source_content_type":"text/x-python","patch_set":6,"id":"d1c8fbba_673b984f","line":95,"in_reply_to":"fe6c47cb_b05ce4a5","updated":"2022-02-23 17:15:32.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"HORIZON_CONFIG \u003d {"},{"line_number":56,"context_line":"    \u0027user_home\u0027: \u0027openstack_dashboard.views.get_user_home\u0027,"},{"line_number":57,"context_line":"    \u0027simultaneous_sessions\u0027: \u0027allow\u0027,"},{"line_number":58,"context_line":"    \u0027ajax_queue_limit\u0027: 10,"},{"line_number":59,"context_line":"    \u0027auto_fade_alerts\u0027: {"},{"line_number":60,"context_line":"        \u0027delay\u0027: 3000,"}],"source_content_type":"text/x-python","patch_set":9,"id":"170252bc_38168ec7","line":57,"updated":"2022-02-28 10:21:25.000000000","message":"Dropped in the latest patch set. There is no need to specify it in HORIZON_CONFIG explicitly as we can use the default value from defaults.py.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"}],"releasenotes/notes/bp-handle-multiple-login-sessions-from-same-user-in-horizon-448baa6534a8a451.yaml":[{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"42034a7ec83ff73faecd797b7feb2f352d663322","unresolved":true,"context_lines":[{"line_number":1,"context_line":"features:"},{"line_number":2,"context_line":"  - |"},{"line_number":3,"context_line":"    [`handle-multiple-login-sessions-from-same-user-in-horizon \u003chttps://blueprints.launchpad.net/horizon/+spec/handle-multiple-login-sessions-from-same-user-in-horizon\u003e`_]"},{"line_number":4,"context_line":"    This bp add a new HORIZON_CONFIG key on the dashboard settings that controls if multiple simultaneous dashboard sessions are allowed or not for a user."},{"line_number":5,"context_line":"    When there is the need to control the active sessions that one user can have simultaneously, it will be possible to configure the Horizon dashboard to disallow more than one active session per user."},{"line_number":6,"context_line":"    When multiple simultaneously sessions are disabled, the most recent authenticated session will be considered the valid one and the previous session will be invalidated."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"b23f6061_48719a46","line":4,"range":{"start_line":4,"start_character":12,"end_line":4,"end_character":15},"updated":"2022-02-21 05:29:16.000000000","message":"adds","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"42034a7ec83ff73faecd797b7feb2f352d663322","unresolved":true,"context_lines":[{"line_number":1,"context_line":"features:"},{"line_number":2,"context_line":"  - |"},{"line_number":3,"context_line":"    [`handle-multiple-login-sessions-from-same-user-in-horizon \u003chttps://blueprints.launchpad.net/horizon/+spec/handle-multiple-login-sessions-from-same-user-in-horizon\u003e`_]"},{"line_number":4,"context_line":"    This bp add a new HORIZON_CONFIG key on the dashboard settings that controls if multiple simultaneous dashboard sessions are allowed or not for a user."},{"line_number":5,"context_line":"    When there is the need to control the active sessions that one user can have simultaneously, it will be possible to configure the Horizon dashboard to disallow more than one active session per user."},{"line_number":6,"context_line":"    When multiple simultaneously sessions are disabled, the most recent authenticated session will be considered the valid one and the previous session will be invalidated."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"c83a0423_cd23c827","line":4,"range":{"start_line":4,"start_character":72,"end_line":4,"end_character":80},"updated":"2022-02-21 05:29:16.000000000","message":"control","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"205c97a7ef7af7e3227b80c14d38fbf47fb09670","unresolved":false,"context_lines":[{"line_number":1,"context_line":"features:"},{"line_number":2,"context_line":"  - |"},{"line_number":3,"context_line":"    [`handle-multiple-login-sessions-from-same-user-in-horizon \u003chttps://blueprints.launchpad.net/horizon/+spec/handle-multiple-login-sessions-from-same-user-in-horizon\u003e`_]"},{"line_number":4,"context_line":"    This bp add a new HORIZON_CONFIG key on the dashboard settings that controls if multiple simultaneous dashboard sessions are allowed or not for a user."},{"line_number":5,"context_line":"    When there is the need to control the active sessions that one user can have simultaneously, it will be possible to configure the Horizon dashboard to disallow more than one active session per user."},{"line_number":6,"context_line":"    When multiple simultaneously sessions are disabled, the most recent authenticated session will be considered the valid one and the previous session will be invalidated."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"da88ad31_83ead015","line":4,"range":{"start_line":4,"start_character":12,"end_line":4,"end_character":15},"in_reply_to":"b23f6061_48719a46","updated":"2022-02-23 16:06:16.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"205c97a7ef7af7e3227b80c14d38fbf47fb09670","unresolved":false,"context_lines":[{"line_number":1,"context_line":"features:"},{"line_number":2,"context_line":"  - |"},{"line_number":3,"context_line":"    [`handle-multiple-login-sessions-from-same-user-in-horizon \u003chttps://blueprints.launchpad.net/horizon/+spec/handle-multiple-login-sessions-from-same-user-in-horizon\u003e`_]"},{"line_number":4,"context_line":"    This bp add a new HORIZON_CONFIG key on the dashboard settings that controls if multiple simultaneous dashboard sessions are allowed or not for a user."},{"line_number":5,"context_line":"    When there is the need to control the active sessions that one user can have simultaneously, it will be possible to configure the Horizon dashboard to disallow more than one active session per user."},{"line_number":6,"context_line":"    When multiple simultaneously sessions are disabled, the most recent authenticated session will be considered the valid one and the previous session will be invalidated."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"db33e0a3_ea80fee8","line":4,"range":{"start_line":4,"start_character":72,"end_line":4,"end_character":80},"in_reply_to":"c83a0423_cd23c827","updated":"2022-02-23 16:06:16.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"42034a7ec83ff73faecd797b7feb2f352d663322","unresolved":true,"context_lines":[{"line_number":3,"context_line":"    [`handle-multiple-login-sessions-from-same-user-in-horizon \u003chttps://blueprints.launchpad.net/horizon/+spec/handle-multiple-login-sessions-from-same-user-in-horizon\u003e`_]"},{"line_number":4,"context_line":"    This bp add a new HORIZON_CONFIG key on the dashboard settings that controls if multiple simultaneous dashboard sessions are allowed or not for a user."},{"line_number":5,"context_line":"    When there is the need to control the active sessions that one user can have simultaneously, it will be possible to configure the Horizon dashboard to disallow more than one active session per user."},{"line_number":6,"context_line":"    When multiple simultaneously sessions are disabled, the most recent authenticated session will be considered the valid one and the previous session will be invalidated."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"1945e40b_fea311e5","line":6,"range":{"start_line":6,"start_character":18,"end_line":6,"end_character":32},"updated":"2022-02-21 05:29:16.000000000","message":"simultaneous","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"205c97a7ef7af7e3227b80c14d38fbf47fb09670","unresolved":false,"context_lines":[{"line_number":3,"context_line":"    [`handle-multiple-login-sessions-from-same-user-in-horizon \u003chttps://blueprints.launchpad.net/horizon/+spec/handle-multiple-login-sessions-from-same-user-in-horizon\u003e`_]"},{"line_number":4,"context_line":"    This bp add a new HORIZON_CONFIG key on the dashboard settings that controls if multiple simultaneous dashboard sessions are allowed or not for a user."},{"line_number":5,"context_line":"    When there is the need to control the active sessions that one user can have simultaneously, it will be possible to configure the Horizon dashboard to disallow more than one active session per user."},{"line_number":6,"context_line":"    When multiple simultaneously sessions are disabled, the most recent authenticated session will be considered the valid one and the previous session will be invalidated."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"1cacb4f1_3975eda2","line":6,"range":{"start_line":6,"start_character":18,"end_line":6,"end_character":32},"in_reply_to":"1945e40b_fea311e5","updated":"2022-02-23 16:06:16.000000000","message":"Done","commit_id":"b63c779e4d5cdcd780701d8ead91ea13065592a9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"719eb4446c403164be24380d79ad2aecee9e40c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b0770106_e87f79cb","updated":"2022-02-28 09:16:42.000000000","message":"The length of lines was too long.\nI wrapped the lines properly.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40d2b4289fd01ba57ebd993e885e4139a8f5b125","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b506d873_28786717","in_reply_to":"b0770106_e87f79cb","updated":"2022-02-28 10:21:25.000000000","message":"Also update it to refer to the new setting settings.SIMULTANEOUS_SESSIONS.","commit_id":"3499322e23a31de77afb006c29babf9d11d3f6cb"}],"releasenotes/notes/bp-handle-multiple-login-sessions-from-same-user-in-horizon.yaml":[{"author":{"_account_id":29313,"name":"Vishal Manchanda","email":"manchandavishal143@gmail.com","username":"vishalmanchanda"},"change_message_id":"0ecddbb56e35806cae45677b631168b836203c8e","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [`handle-multiple-login-sessions-from-same-user-in-horizon \u003chttps://blueprints.launchpad.net/horizon/+spec/handle-multiple-login-sessions-from-same-user-in-horizon\u003e`_]"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"cd971b27_3d461c22","line":1,"updated":"2021-11-16 17:56:20.000000000","message":"For generating a release not please use the reno command\nhttps://docs.openstack.org/reno/latest/user/usage.html#creating-new-release-notes","commit_id":"2f3d918ac5453a3abfea7c4761f048ab774e12f3"},{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"00656baf854f5a39dda2bb03df553c8c61e99d2f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [`handle-multiple-login-sessions-from-same-user-in-horizon \u003chttps://blueprints.launchpad.net/horizon/+spec/handle-multiple-login-sessions-from-same-user-in-horizon\u003e`_]"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"f73d2ab1_fe00b92a","line":1,"in_reply_to":"cd971b27_3d461c22","updated":"2021-11-16 19:33:14.000000000","message":"Done","commit_id":"2f3d918ac5453a3abfea7c4761f048ab774e12f3"}]}
