{"id":18037760,"url":"https://github.com/moki/thegreatsuspender-recovery","last_synced_at":"2025-04-05T00:23:34.621Z","repository":{"id":92872402,"uuid":"336154295","full_name":"moki/thegreatsuspender-recovery","owner":"moki","description":"The Great Suspender session recovery","archived":false,"fork":false,"pushed_at":"2021-02-05T07:14:06.000Z","size":5,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-02-10T08:46:38.119Z","etag":null,"topics":["cli","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/moki.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-05T03:35:33.000Z","updated_at":"2021-02-05T15:04:29.000Z","dependencies_parsed_at":null,"dependency_job_id":"f70c0848-77c9-4811-bdf4-e7a0135e24e0","html_url":"https://github.com/moki/thegreatsuspender-recovery","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moki%2Fthegreatsuspender-recovery","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moki%2Fthegreatsuspender-recovery/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moki%2Fthegreatsuspender-recovery/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moki%2Fthegreatsuspender-recovery/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moki","download_url":"https://codeload.github.com/moki/thegreatsuspender-recovery/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247267766,"owners_count":20911023,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","rust"],"created_at":"2024-10-30T13:13:36.234Z","updated_at":"2025-04-05T00:23:34.596Z","avatar_url":"https://github.com/moki.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# The Great Suspender Recovery\n\nIronically enough The Great suspender ended up not being so great,\n\nand got suspended from google extensions store.\n\nFor having malicious intent code inside of it after ownership transfer.\n\nFollowing is the quick, dirty and lazy way to recover your tabs.\n\n## What do\n\n* Acquire safe version\n\n* Build it\n\n* Install it\n\n* Extract session\n\n* Parse URLs\n\n### Acquire safe version\n\nthat being the last version uploaded to the github by the original developer\n\n```\ngit clone --depth 1 --branch v7.1.6 git@github.com:greatsuspender/thegreatsuspender.git\n```\n\n### Build it\n\n```\ncd thegreatsuspender/\n\nnpm install\nnpm run generate-key\nnpm run build\n```\n\n### Install it\n\nunzip extension bundle\n\n```\ncd build/zip\nunzip tgs-7.1.6.zip tgs-7.1.6\n```\n\n*note: if you don't have developer mode enabled, you are going to have to enable it now*\n\nInside chrom[e/ium] navigate to the: `chrome://extensions/` and enable `Developer mode`\n\nClick on the `[Load unpacked]` button.\n\nopen previously unzipped folder located at `thegreatsuspender/build/zip/tgs-7.1.6` if you folowed everything to the t.\n\n### Extract session\n\nNow you should have working extesion running, so let's actually recover your tab session.\n\nClick on the The Great Suspender logo(or open it up from the `settings-\u003emore tools-\u003eextensions`)\n\nClick `Settings`, and navigate to the `Session management` tab.\n\nUnder `Current session:` you should have expandable session dialog,\n\nyou should be able to preview your saved tab session and export it.\n\nexample: `5 Feb 2021 7:14am (12 windows, 287 tabs) [export] [save]`\n\nClick `[export]`, that will save session.txt file of the form:\n```\n...\nchrome-extension://\u003cEXTENSION_ID?\u003e#ttl=\u003cTAB_TITLE?\u003e\u0026pos=0\u0026uri=\u003cTAB_URL\u003e\nchrome-extension://\u003cEXTENSION_ID?\u003e#ttl=\u003cTAB_TITLE\u003e\u003e\u0026pos=0\u0026uri=\u003cTAB_URL\u003e\n...\n```\n\nHaving tabs with what i assume are `Extension id`, `Tab title`,\nand what i am certain of `Tab URI`, separated with new lines.\n\n*note: if you enjoy manual labor or just comfortable enough with your text editor —*\n\n*we are done here, thanks for reading!*\n\n### Parse\n\nWe are interested in the latter, that is `tab URI`,\n\neverything that goes after `\u0026pos\u0026uri=` token, up until the end of the line.\n\nPseudocode:\n\n* Read session.txt file\n* Split on the new lines token `'\\n'`\n* For each element in the collection\n  * Find index of the `\u0026pos\u0026uri=` token, by walking.\n  * Return new substring `[\u0026pos\u0026uri=.length(), string.length()]`\n* Persist new collection of the urls to the fs.\n\n### Implementation\n\nThe source code for the script[s], located at the `script/\u003cplatform\u003e`\n\n`\u003cplatform\u003e` being implementation language\n\nI am providing rust script i've cooked up in a hurry [here](script/rust)\n\nIf you feel charitable — contribute to the repository with the recovery script\n\nimplementation in programming language of your choice, for others to use.\n\n## Thanks\n\nThanks for reading!\n\nI am glad that you have your tabs back, cya!\n\n## license\n\nBSD 3-Clause License\n\nCopyright (c) 2021, Kirill Morozov (moki) \u003cmorozov.kirill.moki@gmail.com\u003e\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n   contributors may be used to endorse or promote products derived from\n   this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoki%2Fthegreatsuspender-recovery","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoki%2Fthegreatsuspender-recovery","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoki%2Fthegreatsuspender-recovery/lists"}