diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5f56cd3..a6c3ca1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,8 @@ name: tests +# https://docs.github.com/de/actions/using-workflows/workflow-syntax-for-github-actions +# https://docs.github.com/en/actions/using-workflows + on: push: pull_request: diff --git a/.github/workflows/ci_docker.yml b/.github/workflows/ci_docker.yml index d601bb0..c57e494 100644 --- a/.github/workflows/ci_docker.yml +++ b/.github/workflows/ci_docker.yml @@ -1,5 +1,8 @@ name: docker +# https://docs.github.com/de/actions/using-workflows/workflow-syntax-for-github-actions +# https://docs.github.com/en/actions/using-workflows + # How to setup: https://event-driven.io/en/how_to_buid_and_push_docker_image_with_github_actions/ # How to run: https://aschmelyun.com/blog/using-docker-run-inside-of-github-actions/ @@ -8,7 +11,10 @@ on: push: # branches: [master] # run it during pull request - # pull_request: + pull_request: + schedule: + # Run weekly + - cron: '47 3 * * 6' jobs: # define job to build and publish docker image diff --git a/Dockerfile b/Dockerfile index 2a5344c..0577d82 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,7 @@ FROM python:3.11-slim-bullseye +# https://docs.docker.com/engine/reference/builder/ + # For debugging # docker build . -t extract_otp_secrets --pull --build-arg RUN_TESTS=false # docker run --rm -v "$(pwd)":/files:ro extract_otp_secrets @@ -12,7 +14,11 @@ COPY . . ARG RUN_TESTS=true -RUN apt-get update && apt-get install -y libzbar0 libsm6 python3-opencv nano \ +RUN apt-get update && apt-get install -y \ + libzbar0 \ + libsm6 \ + python3-opencv \ + && rm -rf /var/lib/apt/lists/* \ && pip install --no-cache-dir -r requirements.txt \ && if [ "$RUN_TESTS" = "true" ]; then /extract/run_pytest.sh; else echo "Not running tests..."; fi diff --git a/Dockerfile_only_txt b/Dockerfile_only_txt index f830c18..ea103e7 100644 --- a/Dockerfile_only_txt +++ b/Dockerfile_only_txt @@ -1,5 +1,7 @@ FROM python:3.11-alpine +# https://docs.docker.com/engine/reference/builder/ + # For debugging # docker run --rm -v "$(pwd)":/files:ro extract_otp_secrets_only_txt # docker build . -t extract_otp_secrets_only_txt -f Dockerfile_only_txt --pull --build-arg RUN_TESTS=false @@ -12,10 +14,23 @@ COPY . . ARG RUN_TESTS=true -RUN apk add --no-cache zlib jpeg \ +RUN apk add --no-cache \ + zlib \ + jpeg \ && echo "Arch: $(apk --print-arch)" \ - && if [[ "$(apk --print-arch)" == "aarch64" ]]; then apk add --no-cache --virtual .build-deps gcc libc-dev python3-dev py3-setuptools zlib-dev jpeg-dev; fi \ - && pip install --no-cache-dir protobuf qrcode Pillow colorama \ + && if [[ "$(apk --print-arch)" == "aarch64" ]]; then apk add --no-cache --virtual .build-deps \ + gcc \ + libc-dev \ + python3-dev \ + py3-setuptools \ + zlib-dev \ + jpeg-dev \ + ; fi \ + && pip install --no-cache-dir \ + protobuf \ + qrcode \ + Pillow \ + colorama \ && if [[ "$(apk --print-arch)" == "aarch64" ]]; then apk del .build-deps; fi \ && if [[ "$RUN_TESTS" == "true" ]]; then /extract/run_pytest.sh tests/extract_otp_secrets_test.py -k "not qreader" --relaxed; else echo "Not running tests..."; fi diff --git a/README.md b/README.md index 6b8d591..27b09a9 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,8 @@ For a detailed installation documentation of [pyzbar](https://github.com/Natural The zbar DLLs are included with the Windows Python wheels. On other operating systems, you will need to install the zbar shared library. +TODO Write installation, not error message + ##### Windows error message If you see an ugly ImportError when importing [pyzbar](https://pypi.org/project/pyzbar/) on Windows you will most likely need the [Visual C++ Redistributable Packages for Visual Studio 2013](https://www.microsoft.com/en-US/download/details.aspx?id=40784). Install vcredist_x64.exe if using 64-bit Python, vcredist_x86.exe if using 32-bit Python. @@ -196,8 +198,8 @@ FileNotFoundError: Could not find module 'libiconv.dll' (or one of its dependenc * JSON * Dedicated CSV for KeePass * QR code images -* Supports reading from stdin and writing to stdout -* Reads QR codes images: (See [OpenCV docu](https://docs.opencv.org/3.4/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56)) +* Supports reading from stdin and writing to stdout, thus pipes can be used +* Reads QR codes images: (See [OpenCV docu](https://docs.opencv.org/4.x/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56)) * Portable Network Graphics - *.png * WebP - *.webp * JPEG files - *.jpeg, *.jpg, *.jpe @@ -205,11 +207,7 @@ FileNotFoundError: Could not find module 'libiconv.dll' (or one of its dependenc * Windows bitmaps - *.bmp, *.dib * JPEG 2000 files - *.jp2 * Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm - * Sun rasters - *.sr, *.ras - * OpenEXR Image files - *.exr - * Radiance HDR - *.hdr, *.pic - * Raster and Vector geospatial data supported by GDAL -* Errors and warnings are written to stderr +* Errors and warnings are written to stderr and these are printed in red color on all platforms * Many ways to run the script: * Native Python * pipenv @@ -224,6 +222,7 @@ FileNotFoundError: Could not find module 'libiconv.dll' (or one of its dependenc * Windows * Uses UTF-8 on all platforms * Supports Python >= 3.7 +* Written in modern Python using type hints and following best practices * All these features are backed by tests ran nightly * All functionality in one Python script: extract_otp_secrets.py (except protobuf generated code in protobuf_generated_python) @@ -297,14 +296,14 @@ https://github.com/nipunn1313/mypy-protobuf ### pip ``` -pip install git+https://github.com/scito/extract_otp_secret_keys +pip install -U git+https://github.com/scito/extract_otp_secret_keys python -m extract_otp_secrets ``` #### For development ``` -pip install git+https://github.com/scito/extract_otp_secret_keys@support_img_read +pip install -U git+https://github.com/scito/extract_otp_secret_keys.git@support_img_read python -m extract_otp_secrets ``` @@ -312,9 +311,9 @@ python -m extract_otp_secrets https://stackoverflow.com/questions/13685920/install-specific-git-commit-with-pip -e for egg -pip install -e git+ +pip install -U -e git+ -# pip install -e git+https://github.com/scito/extract_otp_secret_keys@$(git ls-remote git@github.com:scito/extract_otp_secret_keys@support_img_read.git | head -1 | awk '{print $1;}')#egg=extract_otp_secrets +# pip install -U -e git+https://github.com/scito/extract_otp_secret_keys@$(git ls-remote git@github.com:scito/extract_otp_secret_keys@support_img_read.git | head -1 | awk '{print $1;}')#egg=extract_otp_secrets pip3.11 install -e git+https://github.com/scito/extract_otp_secret_keys.git@$(git ls-remote git@github.com:scito/extract_otp_secret_keys.git | grep support_img_read | head -1 | awk '{print $1;}')#egg=extract_otp_secrets python -m extract_otp_secrets ``` @@ -329,7 +328,7 @@ python -m extract_otp_secrets example_export.txt ### local pip ``` -pip install -e . +pip install -U -e . ``` ### pipenv @@ -362,8 +361,8 @@ Alternatively, you can use a python virtual env for the dependencies: python -m venv venv . venv/bin/activate - pip install -r requirements-dev.txt - pip install -r requirements.txt + pip install -U -r requirements-dev.txt + pip install -U -r requirements.txt The requirements\*.txt files contain all the dependencies (also the optional ones). To leave the python virtual env just call `deactivate`. @@ -444,6 +443,8 @@ Run tests: python -m unittest ``` +Note the `pytest`s are preferred and more complete. For each unittest there is also a test in `pytest`. + ### VSCode Setup Setup for running the tests in VSCode. @@ -458,7 +459,7 @@ Setup for running the tests in VSCode. ### Build ``` -pip install -e . +pip install -U -e . python src/extract_otp_secrets.py pip wheel . @@ -483,6 +484,7 @@ pip install -U -r requirements.txt * [Android OTP Extractor](https://github.com/puddly/android-otp-extractor) can extract your tokens from popular Android OTP apps and export them in a standard format or just display them as QR codes for easy importing. [Requires a _rooted_ Android phone.] * [Python QReader](https://github.com/Eric-Canas/QReader) * [pyzbar](https://github.com/NaturalHistoryMuseum/pyzbar) +* [OpenCV](https://docs.opencv.org/4.x/) (CV2) Open Source Computer Vision library with [opencv-python](https://github.com/opencv/opencv-python) ***