<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6323929401564015442</atom:id><lastBuildDate>Sun, 01 Sep 2024 09:09:05 +0000</lastBuildDate><category>gsoc</category><title>GSoC 2022 [Matrix Cerberus]</title><description>This blog is all about my open source journey during 2022 summer</description><link>https://kuries-gsoc.blogspot.com/</link><managingEditor>noreply@blogger.com (Munukurthi Binesh)</managingEditor><generator>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-4726859351464486460</guid><pubDate>Wed, 24 Aug 2022 10:57:00 +0000</pubDate><atom:updated>2022-08-24T16:27:38.809+05:30</atom:updated><title>#10 Tenth Week [Are you my patron?]</title><description>&lt;p&gt;&amp;nbsp;This week I&#39;ve finished integrating the second third party service for the app - Patreon. Now, a &lt;b&gt;creator&lt;/b&gt; can choose which &lt;b&gt;tier members&lt;/b&gt; for their &lt;b&gt;campaign&lt;/b&gt; have access to a particular room.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;TL;DR&lt;/h2&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Design the UI for modal pop ups to save and display room conditions for patreon.&lt;/li&gt;&lt;li&gt;Connect the backend with the frontend UI&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Related PRs&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;#54 -&amp;nbsp;&lt;a href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/54&quot; target=&quot;_blank&quot;&gt;Design Patreon UI and connect with backend&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Demo Pages&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj2qkZ4_xe2NRuAB5o0kImlVzmICjFgsFUfAs3iNMgm9nzfuy04XIoxqKpohwoQfNbGAZthoUwrhrQqPjQdjUdvbxhiYydc7HYkS9yTOksDVC_acj5H_4LiyZxHTckrtYcpvecXC9UDRdsQvum2RFGh8HTOMJGZ72zP-851OdYQselp-tDecWV0cmwU&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;950&quot; data-original-width=&quot;1920&quot; height=&quot;278&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj2qkZ4_xe2NRuAB5o0kImlVzmICjFgsFUfAs3iNMgm9nzfuy04XIoxqKpohwoQfNbGAZthoUwrhrQqPjQdjUdvbxhiYydc7HYkS9yTOksDVC_acj5H_4LiyZxHTckrtYcpvecXC9UDRdsQvum2RFGh8HTOMJGZ72zP-851OdYQselp-tDecWV0cmwU=w563-h278&quot; width=&quot;563&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiGGkx2YVl2s5lEUGvjWH1dU6B_7DZAYifNU5nSlDg5A_5UOCikWu5vSmrMwcALPx3J5yZtKNdhzSWH3cWQaQhsMeKzE02gaKTH0_xafR2esyLTnBhk30KDy4wVKOLSYSVUputUo-cV06396HkyIgJVAXCOaRkgRbh5d9M_lUO1VC6LdZxGUBYZQfU1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;948&quot; data-original-width=&quot;1920&quot; height=&quot;269&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiGGkx2YVl2s5lEUGvjWH1dU6B_7DZAYifNU5nSlDg5A_5UOCikWu5vSmrMwcALPx3J5yZtKNdhzSWH3cWQaQhsMeKzE02gaKTH0_xafR2esyLTnBhk30KDy4wVKOLSYSVUputUo-cV06396HkyIgJVAXCOaRkgRbh5d9M_lUO1VC6LdZxGUBYZQfU1=w546-h269&quot; width=&quot;546&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg9IgilZ8B6QRh9qI8AiZI0l7MOcsc1bhquhP6EVLCKbDHFnMfYlNazYG3dWzbdoFP71tl62ooMrw1BGuzkHQlCDvPL3JjPQ8OeLTasVTWpmwGS0San9ejvF0nphOEsYS43LocK4yt_bg77AvhlpXxd6qaLLzDBjRj1fyFaCATGmywezqria5sY5Xy6&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;943&quot; data-original-width=&quot;1920&quot; height=&quot;271&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg9IgilZ8B6QRh9qI8AiZI0l7MOcsc1bhquhP6EVLCKbDHFnMfYlNazYG3dWzbdoFP71tl62ooMrw1BGuzkHQlCDvPL3JjPQ8OeLTasVTWpmwGS0San9ejvF0nphOEsYS43LocK4yt_bg77AvhlpXxd6qaLLzDBjRj1fyFaCATGmywezqria5sY5Xy6=w553-h271&quot; width=&quot;553&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEijkikUoYp9pKB5ovoMb5-wf_SwmYAg5dwcDJsnmiFJrf9F61qV8YL0OCV_2ZzFmCL9NvQ8Ac7cO7OXBsNx-u2Z86eDDBS-qIIsqSnOoUpGEA7VO_JDd8RxOu8AHinm4k5MmxwZkaLpIsJwrRrqL-7R-GbZhF2axHTGKrUWyC_ezTbNRGNH9yhbdu0i&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;948&quot; data-original-width=&quot;1920&quot; height=&quot;259&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEijkikUoYp9pKB5ovoMb5-wf_SwmYAg5dwcDJsnmiFJrf9F61qV8YL0OCV_2ZzFmCL9NvQ8Ac7cO7OXBsNx-u2Z86eDDBS-qIIsqSnOoUpGEA7VO_JDd8RxOu8AHinm4k5MmxwZkaLpIsJwrRrqL-7R-GbZhF2axHTGKrUWyC_ezTbNRGNH9yhbdu0i=w526-h259&quot; width=&quot;526&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/08/10-tenth-week-are-you-my-patron.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEj2qkZ4_xe2NRuAB5o0kImlVzmICjFgsFUfAs3iNMgm9nzfuy04XIoxqKpohwoQfNbGAZthoUwrhrQqPjQdjUdvbxhiYydc7HYkS9yTOksDVC_acj5H_4LiyZxHTckrtYcpvecXC9UDRdsQvum2RFGh8HTOMJGZ72zP-851OdYQselp-tDecWV0cmwU=s72-w563-h278-c" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-4710752938754791794</guid><pubDate>Tue, 23 Aug 2022 07:33:00 +0000</pubDate><atom:updated>2022-08-23T16:11:32.176+05:30</atom:updated><title>#9 Ninth Week [Bugs can be scary!]</title><description>&lt;p&gt;I&#39;ve encountered a couple of unexpected bugs this week with the GitHub API and spent majority of the time trying to fix them.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;TL;DR&lt;/h2&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Fix bugs related to insufficient permissions to fetch data from GitHub API.&lt;/li&gt;&lt;li&gt;Rewrite background validator task to run less frequently and after long intervals.&lt;/li&gt;&lt;li&gt;Support for queues to trigger a background validation check everytime a room condition is edited or a new user is added.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Related PRs&lt;/h2&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;#49 -&amp;nbsp;&lt;a href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/49&quot; target=&quot;_blank&quot;&gt;Patreon OAuth&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;#56 -&amp;nbsp;&lt;a href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/56&quot; target=&quot;_blank&quot;&gt;Trigger validation checks when a new condition is added&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Long version&lt;/h2&gt;&lt;div&gt;I had a call with my mentors this week to discuss about the project&#39;s overall progress and I got the chance to show a working example for the project.&amp;nbsp;&lt;/div&gt;&lt;div&gt;While I was presenting I noticed a couple of unexpected bugs with the &lt;b&gt;background validator.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;The &quot;Bug&quot;&lt;/h3&gt;&lt;div&gt;In my previous posts, I talked about how the &lt;b&gt;background validator&lt;/b&gt; works in general but I didn&#39;t go in detail on how the data from third party accounts is fetched and how they are compared with the conditions saved in the room account data.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Let&#39;s take an example and go over it now.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Consider that we are dealing with the &lt;b&gt;repository conditions&lt;/b&gt;&amp;nbsp;for a GitHub repository under an &lt;b&gt;owner &lt;/b&gt;(user/org) saved in the room account data and would like to validate a particular user&#39;s room membership.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We start by fetching the GitHub access token for the current user being validated and try to fetch data related to repository permissions. But the problem comes when the user doesn&#39;t have &lt;b&gt;push access &lt;/b&gt;for the repository. In that case, we end up with the error&amp;nbsp;&lt;b&gt;&quot;Must have push access to view collaborator permission.&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So, what do we do?&amp;nbsp;&lt;br /&gt;We will have to handle it differently based on the &lt;b&gt;owner&lt;/b&gt;. If the owner is a &lt;b&gt;user&lt;/b&gt;, we can just use the ir access token and get the relevant permissions.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You might be wondering &lt;b&gt;&quot;how can we say for sure that we&#39;ll have the access token of this user?&quot;&lt;/b&gt;. Well, only the owner has the ability to add repository conditions that they own for a room and if a repository condition is saved under a room then obviously the user must&#39;ve registered with our application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What if the &lt;b&gt;owner &lt;/b&gt;is an &lt;b&gt;organisation&lt;/b&gt; instead of a &lt;b&gt;user&lt;/b&gt;?&amp;nbsp;&lt;/div&gt;&lt;div&gt;This is where it gets tricky. We will have to keep track of the last user who has added/edited the room condition by saving their GitHub username along with the room conditions data.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This way we can always ensure that we never run into&amp;nbsp;&lt;b&gt;&quot;Must have push access to view collaborator permission&quot; &lt;/b&gt;problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;How do I make it less frequent?&lt;/h3&gt;&lt;div&gt;Until now, the background validator gets triggered every 10 seconds. This is too frequent, unnecessary and can be very resource consuming.&lt;/div&gt;&lt;div&gt;So, my mentor suggested to run it every 1 hour or so and make it less frequent.&amp;nbsp;&lt;/div&gt;&lt;div&gt;But a user/room admin will have to wait for an hour until the updated changes can take effect every time they edit room conditions.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To handle this problem, we made use of &lt;a href=&quot;https://docs.python.org/3/library/asyncio-queue.html&quot; target=&quot;_blank&quot;&gt;asyncio-queue&lt;/a&gt;&amp;nbsp;to process the recently edited room conditions in a FIFO manner.&lt;/div&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/08/9-ninth-week-bugs-can-be-scary.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-2102323408870069009</guid><pubDate>Sun, 14 Aug 2022 19:38:00 +0000</pubDate><atom:updated>2022-08-15T01:08:40.743+05:30</atom:updated><title>#8 Eighth Week [One down, One more to go!]</title><description>&lt;p&gt;&amp;nbsp;This week after adding some finishing touches, I&#39;ve successfully managed to add support for the GitHub! &lt;span&gt;&amp;nbsp;&lt;/span&gt;Now, it is time to implement the second third party service - &quot;Patreon&quot;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;TL;DR&lt;/h2&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Add toast notifications wherever that is necessary.&lt;/li&gt;&lt;li&gt;Patreon OAuth 2.0&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Related PRs&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;#48 -&amp;nbsp;&lt;a class=&quot;Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/MatrixDoctors/matrix-cerberus/pull/48/hovercard&quot; href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/48&quot; id=&quot;issue_48_link&quot;&gt;Connect backend and frontend for Github Conditions Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;#49 -&amp;nbsp;&lt;a class=&quot;Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/MatrixDoctors/matrix-cerberus/pull/49/hovercard&quot; href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/49&quot; id=&quot;issue_49_link&quot;&gt;Patreon OAuth&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/08/8-eighth-week-one-down-one-more-to-go.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-7181714679449736716</guid><pubDate>Sun, 14 Aug 2022 19:28:00 +0000</pubDate><atom:updated>2022-08-15T00:59:44.939+05:30</atom:updated><title>#7 Week 6-7 [Life is unpredictable]</title><description>&lt;p&gt;Due to some health related issues the progress of this project has greatly slowed down during these weeks.&lt;br /&gt;So, I&#39;ll be including both the week&#39;s progress in this blog post.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;TL;DR&lt;/h2&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Integration tests for Login page&lt;/li&gt;&lt;li&gt;UI to select options in Room and Github Conditions pages&lt;/li&gt;&lt;li&gt;Fetch and save/update data related to room conditions from the client side&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Related PRs&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;#41 -&amp;nbsp;&lt;a class=&quot;Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/MatrixDoctors/matrix-cerberus/pull/41/hovercard&quot; href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/41&quot; id=&quot;issue_41_link&quot;&gt;Integration Tests for frontend with React Testing Library and Jest&lt;/a&gt;&lt;/li&gt;&lt;li&gt;#44 -&amp;nbsp;&lt;a class=&quot;Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/MatrixDoctors/matrix-cerberus/pull/44/hovercard&quot; href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/44&quot; id=&quot;issue_44_link&quot;&gt;UI for Modals in Room Conditions and Github Conditions pages&lt;/a&gt;&lt;/li&gt;&lt;li&gt;$48 -&amp;nbsp;&lt;a class=&quot;Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/MatrixDoctors/matrix-cerberus/pull/48/hovercard&quot; href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/48&quot; id=&quot;issue_48_link&quot;&gt;Connect backend and frontend for Github Conditions Page&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/08/7-week-6-7-life-is-unpredictable.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-5482568367850992795</guid><pubDate>Sat, 23 Jul 2022 06:06:00 +0000</pubDate><atom:updated>2022-07-23T11:38:41.020+05:30</atom:updated><title>#6 Fifth Week (My Room, My Rules)</title><description>&lt;p&gt;During the first half of the week, I worked on designing the UI for the room conditions and the external url invites page. And on the latter part of the week, I focused on writing tests for the backend and the frontend.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;TL;DR&lt;/h3&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Room Conditions UI&lt;/li&gt;&lt;li&gt;External URL page&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Related PRs&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;#39 -&amp;nbsp;&lt;a href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/39&quot; target=&quot;_blank&quot;&gt;Add Room and Room External URL webpages&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Demo Pages&lt;/h3&gt;&lt;br /&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVT_me6ZktWXLJDh9kPkEAFiYCKPl15wRTZIBh3Jzb-uFrOqNNWz45UZxXUKyh759LwMFTgzicnhZhKe0XP7zSe1M3XVdJuqSoz1PZrGs20XSbRxAuCb8BVBeUwLSXorYhSfh2yhb03oEGq9t9NRi9_JuG5jJgzHJy2dtbGZ1OJivyoJl8_cdzOMc6/s1920/room-ui.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;950&quot; data-original-width=&quot;1920&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVT_me6ZktWXLJDh9kPkEAFiYCKPl15wRTZIBh3Jzb-uFrOqNNWz45UZxXUKyh759LwMFTgzicnhZhKe0XP7zSe1M3XVdJuqSoz1PZrGs20XSbRxAuCb8BVBeUwLSXorYhSfh2yhb03oEGq9t9NRi9_JuG5jJgzHJy2dtbGZ1OJivyoJl8_cdzOMc6/w561-h276/room-ui.png&quot; width=&quot;561&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;u&gt;Room Settings UI&lt;/u&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;u&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_HNjWVt6aDL9fecdtA_gKGPb5itrEajUFwJ-xtiwpO2gpyAwNZXedzD4smcsX0mWCm9OUyqLSy_pYMSGRnWjphP-Fcz4tj6HJm1x6-EiJHTuXbPwVxXlb4cX0f-6LsVtvS1z9vwe8smEKeMseLvFCaCWxzgGlfcSeodsDRnP1zTUcd8ye6DrbY0Ra/s1920/select-options-modal.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;948&quot; data-original-width=&quot;1920&quot; height=&quot;279&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_HNjWVt6aDL9fecdtA_gKGPb5itrEajUFwJ-xtiwpO2gpyAwNZXedzD4smcsX0mWCm9OUyqLSy_pYMSGRnWjphP-Fcz4tj6HJm1x6-EiJHTuXbPwVxXlb4cX0f-6LsVtvS1z9vwe8smEKeMseLvFCaCWxzgGlfcSeodsDRnP1zTUcd8ye6DrbY0Ra/w565-h279/select-options-modal.png&quot; width=&quot;565&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;Select Third Party Account&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrYciyMS1EWGFLdsRT27mvQbF931WjAtYs9Wkjq-UbRbBvF94Hb01d-1MOmF_hskcXV2wzuCfUnl3x3mL3AkSrWzBl9hqwMOH15sUGB7eAw3fmLSSFVcG8yQ0pnYVs3snH1hHkNGYBKgQJadPKON6RhVrimJvJlKDajs2DlS9dvX-Kac0_bvgMvb0u/s1920/external-url.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;948&quot; data-original-width=&quot;1920&quot; height=&quot;281&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrYciyMS1EWGFLdsRT27mvQbF931WjAtYs9Wkjq-UbRbBvF94Hb01d-1MOmF_hskcXV2wzuCfUnl3x3mL3AkSrWzBl9hqwMOH15sUGB7eAw3fmLSSFVcG8yQ0pnYVs3snH1hHkNGYBKgQJadPKON6RhVrimJvJlKDajs2DlS9dvX-Kac0_bvgMvb0u/w570-h281/external-url.png&quot; width=&quot;570&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;External URLs page&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/u&gt;&lt;/div&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/07/6-fifth-week-my-room.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVT_me6ZktWXLJDh9kPkEAFiYCKPl15wRTZIBh3Jzb-uFrOqNNWz45UZxXUKyh759LwMFTgzicnhZhKe0XP7zSe1M3XVdJuqSoz1PZrGs20XSbRxAuCb8BVBeUwLSXorYhSfh2yhb03oEGq9t9NRi9_JuG5jJgzHJy2dtbGZ1OJivyoJl8_cdzOMc6/s72-w561-h276-c/room-ui.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-710295902903650991</guid><pubDate>Mon, 11 Jul 2022 19:05:00 +0000</pubDate><atom:updated>2022-07-15T17:12:07.045+05:30</atom:updated><title>#5 Fourth Week (Show me your pass, please?)</title><description>&lt;p&gt;I&#39;ve spent most of my time implementing the background task which validates a user&#39;s room membership to a particular room.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;TL;DR&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Background validator task&lt;/li&gt;&lt;li&gt;Global app state for the backend&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Related PRs:&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;#36 -&amp;nbsp;&lt;a href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/36&quot; target=&quot;_blank&quot;&gt;Validate room membership of a user in background &lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;#37 -&amp;nbsp;&lt;a href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/37&quot; target=&quot;_blank&quot;&gt;App state for global variables.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Long Version:&amp;nbsp;&lt;/h3&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;u&gt;How does the background task validate a user&#39;s room membership&lt;/u&gt;?&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;The background task verifies all the users currently registered with the app and it runs at uniform intervals (a specific time period &lt;/li&gt;&lt;li&gt;It starts by fetching the users and rooms list from `matrix-cerberus.global_data` event type in account data.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Then the bot has two loops iterating over the users and the rooms to gets a user&#39;s membership in a particular room.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;&lt;li&gt;For &lt;b&gt;join &lt;/b&gt;and &lt;b&gt;invite&lt;/b&gt; states, I&#39;ve tried to use the data which is cached internally by matrix-nio on every successful sync with the matrix homeserver.&lt;/li&gt;&lt;li&gt;When it comes to the other states such as &lt;b&gt;ban, &lt;/b&gt;&lt;b&gt;&lt;b&gt;knock&lt;/b&gt;&amp;nbsp; &lt;/b&gt;and &lt;b&gt;leave&lt;/b&gt; the bot will try to&amp;nbsp; fetch the &lt;b&gt;m.room.member&lt;/b&gt; room state event with the &lt;b&gt;user_id&lt;/b&gt; as state_key.&lt;/li&gt;&lt;li&gt;But, it feels like there&#39;s something missing in here. Don&#39;t you think?&lt;br /&gt;Well, you are right. &lt;br /&gt;We are not keeping track of users who have either:&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Rejected an invite&lt;/li&gt;&lt;li&gt;Retracted their knock&lt;/li&gt;&lt;li&gt;User left the room &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Was kicked by a member who is not a bot. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;In all these cases, we are not supposed to send an invite to the user even if they satisfy the room conditions. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why?&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In the first two cases, we want to avoid spamming the users with invites&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Whereas, in the third and fourth case, we don&#39;t want to go against a room admin&#39;s/user&#39;s wishes and invite the user to the room. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;There is actually a simple solution which will handle all the above cases. We can just fetch the full state of the &lt;b&gt;m.room.member&lt;/b&gt; state event for all the users who have left the room via the &lt;a href=&quot;https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3roomsroomidmembers&quot; target=&quot;_blank&quot;&gt;/rooms/{roomId}/members&lt;/a&gt; endpoint.&lt;/li&gt;&lt;li&gt;With this, we get the &lt;b&gt;sender &lt;/b&gt;property. And if the &lt;b&gt;sender &lt;/b&gt;is not equal to the bot &lt;b&gt;user_id &lt;/b&gt;we can simply ignore the user.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How does this solve the problem?&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;In the first three cases, the &lt;b&gt;sender &lt;/b&gt;key is equal to the &lt;b&gt;state key &lt;/b&gt;i.e. &lt;b&gt;user_id.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;In the fourth case, the &lt;b&gt;sender &lt;/b&gt;key&lt;b&gt; &lt;/b&gt;can be anyone other than the bot.&lt;br /&gt;So, if we can ignore users whose &lt;b&gt;sender&lt;/b&gt; key in &lt;b&gt;m.room.member&lt;/b&gt; state event is not equal to the bot&#39;s &lt;b&gt;user_id &lt;/b&gt;we can avoid all those 4 scenarios.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;4. Now, that we have the user&#39;s current room membership the bot will use the &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;methods from github api class and check for the conditions set in the matrix-&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;cerberus.rooms.&amp;lt;room_id&amp;gt;.&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;5.&amp;nbsp; If any of the conditions are satisfied the bot will send corresponding invite and &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;kick event for the room.&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;6.&amp;nbsp; Steps 4 and 5 are repeated for each user_id and room_id combination.&lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;7.&amp;nbsp; After the entire loop finishes executing, the bot puts this task to sleep for a specific &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt; amount of time and then fetches the new updated rooms and users list before &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;starting the all over again from 1.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;u&gt;A global app state for backend&lt;/u&gt;?&lt;/h4&gt;&lt;p style=&quot;text-align: left;&quot;&gt;After reviewing PR &lt;a href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/32&quot; target=&quot;_blank&quot;&gt;Feat: external url invites&lt;/a&gt;,&amp;nbsp; Cadair has suggested to use a global app state variable which takes care of maintaining all the global variables like http_client, session_storage, bot_client and so on where it is necessary to maintain a single session for each Class. It is an alternative to using the global variables independently which introduces bugs and makes the code unmaintainable when the amount of code scales up.&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;So, I ended up refactoring the entire code to support the global_app_state variable such that the session is created during the app startup and stop the session on app shutdown.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;I&#39;ve tried to make sure the core modules are not dependent on other module&#39;s global variables thus making them completely independent and are at the top of the tree during imports.&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/07/fourth-week-show-me-your-pass-please.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-8709589988036990729</guid><pubDate>Mon, 04 Jul 2022 19:23:00 +0000</pubDate><atom:updated>2022-07-05T01:04:27.411+05:30</atom:updated><title>#4 Third week (GitHub, GitHub, GitHub...)</title><description>&lt;p&gt;&amp;nbsp;This week I mostly focused on how the bot will be interacting with the GitHub API from a user&#39;s POV.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;TL;DR&lt;/h3&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&amp;nbsp;Setup OAuth for GitHub&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;GitHub API class to interact with the GitHub REST and GitHub GraphQL APIs.&lt;/li&gt;&lt;li&gt;Methods to manage user and global account data events on a matrix server.&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Related PRs:&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;#29 - &lt;a class=&quot;Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/MatrixDoctors/matrix-cerberus/pull/29/hovercard&quot; href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/29&quot; id=&quot;issue_29_link&quot;&gt;User authentication for GitHub via OAuth 2.0&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;#30 - &lt;a class=&quot;Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/MatrixDoctors/matrix-cerberus/pull/30/hovercard&quot; href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/30&quot; id=&quot;issue_30_link&quot;&gt;Setup GitHub API base class to interact with the GitHub REST API.&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;#31 - &lt;a class=&quot;Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/MatrixDoctors/matrix-cerberus/pull/31/hovercard&quot; href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/31&quot; id=&quot;issue_31_link&quot;&gt;Manage user account data event in bot account&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/07/4-third-week-github-github-github.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-3619575838452355903</guid><pubDate>Sun, 26 Jun 2022 18:58:00 +0000</pubDate><atom:updated>2022-07-05T01:01:11.167+05:30</atom:updated><title>#3 Second week (External URL Invites)</title><description>&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-weight: normal;&quot;&gt;Hey there!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;This is my second week&#39;s blog post during Google Summer of Code 2022. &lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;TL;DR&lt;/h3&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Add a background task that runs the bot in parallel to the web server which handles API requests.&lt;/li&gt;&lt;li&gt;Support for Aiohttp session.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Implement External Url Invites&lt;/li&gt;&lt;li&gt;Add dependency to handle unauthorized users.&lt;/li&gt;&lt;li&gt;Create custom router and axios interceptor to parse responses and redirect users to login page on 401 unauthorized request error.&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Related PRs:&amp;nbsp;&amp;nbsp;&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;#25 - &lt;a class=&quot;Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/MatrixDoctors/matrix-cerberus/pull/25/hovercard&quot; href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/25&quot; id=&quot;issue_25_link&quot;&gt;Feat: external url invites.&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;#26 - &lt;a class=&quot;Link--primary v-align-middle no-underline h4 js-navigation-open markdown-title&quot; data-hovercard-type=&quot;pull_request&quot; data-hovercard-url=&quot;/MatrixDoctors/matrix-cerberus/pull/26/hovercard&quot; data-turbo-frame=&quot;repo-content-turbo-frame&quot; href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/pull/26&quot; id=&quot;issue_26_link&quot;&gt;Add dependency to redirect unauthenticated users to login and add webpages to display error responses&lt;/a&gt;. &amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/06/3-second-week.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-1516189693349168773</guid><pubDate>Mon, 20 Jun 2022 19:05:00 +0000</pubDate><atom:updated>2022-07-15T17:42:48.937+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">gsoc</category><title>#2 First Week (CODING PERIOD STARTS :D)</title><description>&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Hey there!&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;This is my first week&#39;s blog post during Google Summer of Code 2022. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;TL;DR&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Design UI for Login page&lt;/li&gt;&lt;li&gt;Add auto discovery of homeservers feature for users&lt;/li&gt;&lt;li&gt;Implement password and sso based login.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Authenticate with OpenID tokens. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Setup pre-commit and CI workflow for testing and linting.&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Long version&lt;/b&gt; &lt;/h3&gt;&lt;p style=&quot;text-align: left;&quot;&gt;I tried to get a head start during the community bonding period by working on the Login Page UI. And fortunately, I was able to finish it just before the first coding period started :D&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Most of my inspirations for the Login page came from the Element web Login page.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyhQDOGDllBwuI1fvhneU4pDZMbhJqGhy9GNyYWYZOaHFrgDv-izxDqk4n3bUEPvnc_NKmqROr4w_nUjMCUytS1Dz6W09mpl7F68noMTWmPoS9TbYifIm-XzDj6uJpgcvRf3QmFGZ3Lh-Kl_luW39v1avsrLNYfpNFFkGoFiiBHSexVaJdLxS_9SZf/s1920/login_page.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;909&quot; data-original-width=&quot;1920&quot; height=&quot;295&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyhQDOGDllBwuI1fvhneU4pDZMbhJqGhy9GNyYWYZOaHFrgDv-izxDqk4n3bUEPvnc_NKmqROr4w_nUjMCUytS1Dz6W09mpl7F68noMTWmPoS9TbYifIm-XzDj6uJpgcvRf3QmFGZ3Lh-Kl_luW39v1avsrLNYfpNFFkGoFiiBHSexVaJdLxS_9SZf/w622-h295/login_page.png&quot; width=&quot;622&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;u&gt;Desktop view&lt;/u&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;u&gt;&lt;img alt=&quot;&quot; height=&quot;692&quot; src=&quot;data:image/png;base64,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&quot; width=&quot;382&quot; /&gt;&amp;nbsp;&lt;/u&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;u&gt;Mobile view &lt;/u&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;u&gt;How does the login work&lt;/u&gt;?&lt;br /&gt;&lt;/h4&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Ok, now enough about the UI designs and let&#39;s look at how the login functionality works.&lt;br /&gt;&lt;br /&gt;Usually in a typical web application, a user enters a &lt;b&gt;username &lt;/b&gt;and a &lt;b&gt;password&lt;/b&gt;. These details will then be passed onto the backend server where it&#39;ll be stored in a database.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;But in our case, we are not actually registering the user or saving their credentials.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;So how are we going to authorize a user?&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;This is where the OpenID token comes in. According to the &lt;a href=&quot;https://openid.net/specs/openid-connect-core-1_0.html&quot; target=&quot;_blank&quot;&gt;OpenID Connect spec&lt;/a&gt;, it is used to verify the identity of an end-user on a server without actually giving away any sensitive information during the process.&lt;br /&gt;&lt;br /&gt;The steps listed down below give a brief overview on how a user is authenticated with the backend server:&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;A user fills the form with their username (or any other valid user field) and their password on the client-side (React)&lt;/li&gt;&lt;li&gt;React then sends a request to a matrix homeserver where the current user&#39;s account is registered to fetch the access token.&lt;/li&gt;&lt;li&gt;After the access token is received, the frontend then tried to get an OpenID token with the help of the access token.&lt;/li&gt;&lt;li&gt;Now, this OpenID token has only one purpose and that is to verify the authenticity of a user. This OpenID token is then sent to the backend via the &lt;b&gt;/api/verify-openid &lt;/b&gt;endpoint.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The backend then tries to verify if the current user has a matrix account registered in a homeserver by sending the open id token to this endpoint &lt;a href=&quot;https://spec.matrix.org/v1.2/server-server-api/#get_matrixfederationv1openiduserinfo&quot; target=&quot;_blank&quot;&gt;GET /_matrix/federation/v1/openid/userinfo &lt;/a&gt;&lt;/li&gt;&lt;li&gt;After the backend receives a success response along with the current user&#39;s matrix ID, it creates a new server session for the user and returns the session id back to the frontend which will be used to maintain connection until the session expires.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/06/2-first-week-coding-period-starts-d.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyhQDOGDllBwuI1fvhneU4pDZMbhJqGhy9GNyYWYZOaHFrgDv-izxDqk4n3bUEPvnc_NKmqROr4w_nUjMCUytS1Dz6W09mpl7F68noMTWmPoS9TbYifIm-XzDj6uJpgcvRf3QmFGZ3Lh-Kl_luW39v1avsrLNYfpNFFkGoFiiBHSexVaJdLxS_9SZf/s72-w622-h295-c/login_page.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-5056197145105139202</guid><pubDate>Fri, 03 Jun 2022 17:04:00 +0000</pubDate><atom:updated>2022-06-27T00:54:50.694+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">gsoc</category><title>#1 Communiy Bonding Period</title><description>&lt;p&gt;Hola Amigo!&lt;/p&gt;&lt;p&gt;Welcome to my first blog post during the Google Summer of Code 2022.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Summary&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;I&#39;ve managed to do a lot during the Community bonding period :). I had several discussions with my mentor on choosing the right framework and tools for the project. &lt;/p&gt;&lt;p&gt;In the end, we finalized on the following setup&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;React + Tailwind CSS for frontend&lt;/li&gt;&lt;li&gt;FastAPI for backend&lt;/li&gt;&lt;li&gt;Nginx which acts as a reverse proxy and serves frontend build.&lt;/li&gt;&lt;li&gt;Redis database to store server sessions.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The final product will be deployed with the help of docker. &lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;Why we chose FastAPI and not Django?&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Initially, I planned to use Django framework as backend as presented in my project proposal. Django is mostly known for its &quot;batteries-included&quot; nature where it takes care of most of the security features like user authentication and CSRF tokens for forms. It also has a very good ORM support and not to forget it is a battle-tested framework.&lt;br /&gt;But like every other framework it has its cons - It is very opinionated framework and dosen&#39;t have good async support.&lt;/p&gt;&lt;p&gt;And when it comes to FastAPI, it has a very good async support and is very flexible (too flexible in fact).&amp;nbsp; It has its own cons too - relatively new framework and requires the developer to configure most of the important functionalities like server-sessions and user authentication.&lt;br /&gt;&lt;br /&gt;In the end, we chose FastAPI since we wont be needing ORM and default Admin page which Django provides as most of our data will be stored in the matrix servers as account data.&lt;/p&gt;&lt;b&gt;#Week 1 of Community Bonding Period:&lt;/b&gt;&lt;br /&gt;&lt;p&gt;Since, this is a blank slate project the most important thing is to decide on the name of the project and the logo.&lt;/p&gt;&lt;p&gt;I came up with a list of names (some were crazy though XD) and me and my mentors decided to name our project &lt;b&gt;matrix-cerberus&lt;/b&gt;. (Cerberus the greek hellhound which guards the gates of HELL!)&lt;/p&gt;&lt;p&gt;After that I finished creating the boilerplate code for the project and hosted it on &lt;a href=&quot;https://cerberus.cadair.dev/&quot;&gt;https://cerberus.cadair.dev/&lt;/a&gt; (do check it out :D)&lt;/p&gt;&lt;p&gt;&lt;b&gt;#Week 2 of Community Bonding Period:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I use express-sessions a lot in my Node JS projects and I tried to find an exact implementation in FastAPI. Unfortunately,&amp;nbsp; I couldn&#39;t find a proper one. So, I decided to make one myself (inserts thanos meme).&lt;/p&gt;&lt;p&gt;I spent major portion of this week trying to configure server-sessions by saving the current user session in a redis database. You can find the implementation &lt;a href=&quot;https://github.com/MatrixDoctors/matrix-cerberus/blob/main/backend/app/core/sessions.py&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;#Week 3 of Community Bonding Period:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;During the last week, I was mostly trying to refine my project proposal and prepare a new action plan (timeline) for the upcoming Coding Period.&amp;nbsp;&lt;b&gt; &lt;/b&gt;&lt;/p&gt;&lt;p&gt;I am also pretty new to some of the tech stack (Docker, FastAPI). So, I mostly used this period to go over the Documentation and some reference implementations.&lt;/p&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/06/1-communiy-bonding-period.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6323929401564015442.post-8865414027007907232</guid><pubDate>Fri, 15 Apr 2022 11:58:00 +0000</pubDate><atom:updated>2022-06-21T12:50:41.487+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">gsoc</category><title>Introduction</title><description>&lt;p&gt;Hey there! I&#39;m Binesh and I&#39;ve been selected to work under Matrix.org as a GSoC contributor for this year&#39;s summer 2022.&lt;br /&gt;I&#39;ll be working on the project &quot;3rd party authorized room membership&quot;. &lt;strong&gt;&lt;/strong&gt; It delegates a user&#39;s
membership for a room based on their past interactions with other third 
party services.&lt;/p&gt;&lt;p&gt;I plan to add support for the following two services:&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;GitHub&lt;/li&gt;&lt;li&gt;Patreon&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;My mentors for this project are @Cadair and @Half-Shot.&lt;/p&gt;&lt;p&gt;I&#39;ll be posting about the updates and progress related to the project every week in this blog. I will try to cover the technical details, the challenges I might face 
during this period and all of my Open Source contributions to Matrix in general.&lt;/p&gt;</description><link>https://kuries-gsoc.blogspot.com/2022/04/introduction.html</link><author>noreply@blogger.com (Munukurthi Binesh)</author><thr:total>0</thr:total></item></channel></rss>