{ "info": { "author": "Oprax", "author_email": "oprax@me.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "License :: OSI Approved :: MIT License", "Operating System :: POSIX", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# FreeOTP tokens extractor\n\n\n[![pipeline status](https://gitlab.com/Oprax/freeotp-extractor/badges/master/pipeline.svg)](https://gitlab.com/Oprax/freeotp-extractor/commits/master)\n[![PyPI - License](https://img.shields.io/pypi/l/freeotp-extractor.svg)](https://gitlab.com/Oprax/freeotp-extractor/blob/master/LICENSE)\n[![PyPI](https://img.shields.io/pypi/v/freeotp-extractor.svg)](https://pypi.org/project/freeotp-extractor/)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/freeotp-extractor.svg)](https://pypi.org/project/freeotp-extractor/)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)\n\n## Backing up FreeOTP\n\nUsing [adb](https://developer.android.com/studio/command-line/adb.html), [create a backup](https://androidquest.wordpress.com/2014/09/18/backup-applications-on-android-phone-with-adb/) of the app using the following command:\n\n```sh\nadb backup -f freeotp-backup.ab -apk org.fedorahosted.freeotp\n```\n\n[org.fedorahosted.freeotp](https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp) is the app ID for FreeOTP.\n\nThis will ask, on the phone, for a password to encrypt the backup. Proceed with a password.\n\n## Manually extracting the backup\n\nThe backups are some form of encrypted tar file. [Android Backup Extractor](https://github.com/nelenkov/android-backup-extractor) can decrypt them.\n\nIt's available on the AUR as [android-backup-extractor-git](https://aur.archlinux.org/packages/android-backup-extractor-git/).\n\nUse it like so (this command will ask you for the password you just set to decrypt it):\n\n```sh\nabe unpack freeotp-backup.ab freeotp-backup.tar\n```\n\nThen extract the generated tar file:\n\n```shell\n$ tar xvf freeotp-backup.tar\napps/org.fedorahosted.freeotp/_manifest\napps/org.fedorahosted.freeotp/sp/tokens.xml\n```\n\nWe don't care about the manifest file, so let's look at `apps/org.fedorahosted.freeotp/sp/tokens.xml`.\n\n## Extract tokens\n\nFirst, download [`freeotp_extractor.pyz`](https://gitlab.com/Oprax/freeotp-extractor/-/jobs/artifacts/master/raw/bin/freeotp_extractor.pyz?job=pyz) (or install it from [PyPi](https://pypi.org/project/freeotp-extractor/) with `pip`), then you can run `./freeotp_extractor.pyz -h` :\n\n```\nusage: freeotp_extractor.pyz [-h] [-v] [-o OUTPUT] [-q {term,svg,eps}] input\n\nExtract token from FreeOTP\n\npositional arguments:\n input File containing XML with tokens (usually 'tokens.xml')\n\noptional arguments:\n -h, --help show this help message and exit\n -v, --version show program's version number and exit\n -o OUTPUT, --output OUTPUT\n Give the output file for save tokens\n -q {term,svg,eps}, --qrcode {term,svg,eps}\n Use a JSON input to recreate QRcode for each issuer.\n Use 'term' to display directly to the terminal, 'svg'\n and 'eps' output the qrcode into a file\n```\n\nTo just output tokens in the termnal :\n```sh\n./freeotp_extractor.pyz apps/org.fedorahosted.freeotp/sp/tokens.xml\n```\n\nIt will output something like :\n```\nDropbox:example@gmail.com: BQ4F6XX3QOFEXQY5SNFPJZW3\ngitlab.com:example@gmail.com: 4FBTY2GE3VK7BMFBFOE3X7CR\nGoogle:example@gmail.com: RK6MVRZCQXFBUMGBKZBF5CAA\n```\n\nOr you can pass a `output` parameter to save it into a file :\n```sh\n./freeotp_extractor.pyz --output tokens.json apps/org.fedorahosted.freeotp/sp/tokens.xml\n```\n\n`tokens.json`:\n```json\n{\n \"Dropbox:example@gmail.com\":{\n \"secret\":\"BQ4F6XX3QOFEXQY5SNFPJZW3\",\n \"issuer\":\"Dropbox\"\n },\n \"gitlab.com:example@gmail.com\":{\n \"secret\":\"4FBTY2GE3VK7BMFBFOE3X7CR\",\n \"issuer\":\"Gitlab\"\n },\n \"Google:example@gmail.com\":{\n \"secret\":\"RK6MVRZCQXFBUMGBKZBF5CAA\",\n \"issuer\":\"Google\"\n }\n}\n```\n\n## Recreate QRcode\n\nWith the JSON file (i.e.: `tokens.json`) you can recreate QRcode to scan from an application.\nTo output it directly to the terminal :\n```sh\n./freeotp_extractor.pyz tokens.json -q term\n```\n\nOr if you wan to save it into files :\n```sh\nmkdir -p ./qrcode\n./freeotp_extractor.pyz tokens.json -q svg -o ./qrcode\n```\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://gitlab.com/Oprax/freeotp-extractor", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "freeotp-extractor", "package_url": "https://pypi.org/project/freeotp-extractor/", "platform": "", "project_url": "https://pypi.org/project/freeotp-extractor/", "project_urls": { "Homepage": "https://gitlab.com/Oprax/freeotp-extractor" }, "release_url": "https://pypi.org/project/freeotp-extractor/0.3.1/", "requires_dist": [ "pyqrcode", "awesome-slugify" ], "requires_python": "", "summary": "Extract tokens from FreeOTP backup", "version": "0.3.1" }, "last_serial": 5834587, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "4d161ee0e6b928ee2f1c33da8d6f09b0", "sha256": "784fb98334d0319f91d7fdacc162b8c3be56de7e9f9bbdd29364f1ec51307617" }, "downloads": -1, "filename": "freeotp_extractor-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4d161ee0e6b928ee2f1c33da8d6f09b0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5181, "upload_time": "2019-09-15T10:09:13", "url": "https://files.pythonhosted.org/packages/e4/e8/8f25bab3e18a46b7c29883eed46099bc3e3797df160dec63f55f0b419355/freeotp_extractor-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1de7af0bab78581d8ef63dc1f99850b9", "sha256": "28da6caa8d116e36048c707018c5daef116b5c7819579bc8661d58ffa64cc650" }, "downloads": -1, "filename": "freeotp-extractor-0.2.0.tar.gz", "has_sig": false, "md5_digest": "1de7af0bab78581d8ef63dc1f99850b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3711, "upload_time": "2019-09-15T10:09:16", "url": "https://files.pythonhosted.org/packages/c5/bd/f0ab23534fd072a6c9a32e3b4631384bb16f429cbc124d514fe31a9a051d/freeotp-extractor-0.2.0.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "baeb6ec364e0437b672681a328dc8ddf", "sha256": "7db133045f057468d58367151037e6263776b6e4b275e8bfdaf1387437031ef6" }, "downloads": -1, "filename": "freeotp_extractor-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "baeb6ec364e0437b672681a328dc8ddf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5702, "upload_time": "2019-09-15T11:33:36", "url": "https://files.pythonhosted.org/packages/d8/1a/3d82a719af4af237bc95825c59216b84d608ebdd126a4f84894289e9df43/freeotp_extractor-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ec90a4a2c5eabb9abae33045f033214c", "sha256": "cfba8874539d35b88b39b3f219758e7be5f7a72b00485041a5c270b836a4d13c" }, "downloads": -1, "filename": "freeotp-extractor-0.2.2.tar.gz", "has_sig": false, "md5_digest": "ec90a4a2c5eabb9abae33045f033214c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4353, "upload_time": "2019-09-15T11:33:37", "url": "https://files.pythonhosted.org/packages/96/3b/5206b21b46b0e49d8554fbadf178f21ad0242a302414a6efebf91e304191/freeotp-extractor-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "4f975df65b8d5fcbd2e7e83b30643573", "sha256": "c543e460118bcb84dcd8e337f811f1fb7a478e215fa850932809d2e87e014e3a" }, "downloads": -1, "filename": "freeotp_extractor-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4f975df65b8d5fcbd2e7e83b30643573", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5697, "upload_time": "2019-09-15T13:50:06", "url": "https://files.pythonhosted.org/packages/98/0f/0b8eea8b1a346b06288fe97f91beee1dcfa04fe2dce7442a8d8608f75395/freeotp_extractor-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "696b953995875899886a695d4524ec98", "sha256": "1c3d21b650cc764fc1a270682dd49f33db5329c40d3fb93c16a5650f9c854188" }, "downloads": -1, "filename": "freeotp-extractor-0.3.0.tar.gz", "has_sig": false, "md5_digest": "696b953995875899886a695d4524ec98", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4352, "upload_time": "2019-09-15T13:50:08", "url": "https://files.pythonhosted.org/packages/7b/9a/5dbebfa2afde00563efce5622e966efdd8447230f5a4bd979a19872beaea/freeotp-extractor-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "751a3df0290c9a8d74429f941b7ba508", "sha256": "4f43409055e270cda1e75890012fb8b6bbad7235f53b68ef06c3b5ee5bcb5ecb" }, "downloads": -1, "filename": "freeotp_extractor-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "751a3df0290c9a8d74429f941b7ba508", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5697, "upload_time": "2019-09-16T07:39:22", "url": "https://files.pythonhosted.org/packages/c5/b7/fe9e0a853097d40096daa4412ec79f3471a918bb2eefbe0350ed5dde346a/freeotp_extractor-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0659830842d9cbf8e903ea7b59b1d713", "sha256": "63618dac5ea17753e8bd4f93a80bd265e9c2e44f01284dcc66f165916e90ba2e" }, "downloads": -1, "filename": "freeotp-extractor-0.3.1.tar.gz", "has_sig": false, "md5_digest": "0659830842d9cbf8e903ea7b59b1d713", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4354, "upload_time": "2019-09-16T07:39:24", "url": "https://files.pythonhosted.org/packages/52/51/d3e746ad995314341747cbd19e9d6d8e1969684a07024ca04c7605c69118/freeotp-extractor-0.3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "751a3df0290c9a8d74429f941b7ba508", "sha256": "4f43409055e270cda1e75890012fb8b6bbad7235f53b68ef06c3b5ee5bcb5ecb" }, "downloads": -1, "filename": "freeotp_extractor-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "751a3df0290c9a8d74429f941b7ba508", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5697, "upload_time": "2019-09-16T07:39:22", "url": "https://files.pythonhosted.org/packages/c5/b7/fe9e0a853097d40096daa4412ec79f3471a918bb2eefbe0350ed5dde346a/freeotp_extractor-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0659830842d9cbf8e903ea7b59b1d713", "sha256": "63618dac5ea17753e8bd4f93a80bd265e9c2e44f01284dcc66f165916e90ba2e" }, "downloads": -1, "filename": "freeotp-extractor-0.3.1.tar.gz", "has_sig": false, "md5_digest": "0659830842d9cbf8e903ea7b59b1d713", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4354, "upload_time": "2019-09-16T07:39:24", "url": "https://files.pythonhosted.org/packages/52/51/d3e746ad995314341747cbd19e9d6d8e1969684a07024ca04c7605c69118/freeotp-extractor-0.3.1.tar.gz" } ] }