diff --git a/README.md b/README.md index 389e6b7..ea13d9f 100644 --- a/README.md +++ b/README.md @@ -26,28 +26,39 @@ There are two types of images. - `deb`: Images based on the official [.deb release](https://protonmail.com/bridge/install). It only supports the `amd64` architecture. - `build`: Images based on the [source code](https://github.com/ProtonMail/proton-bridge). It supports `amd64`, `arm64`, and `arm/v7`. Supporting to more architectures is possible. PRs are welcome. -tag | description - -- | -- -`latest` | latest `deb` image -`[version]` | `deb` images -`build` | latest `build` image -`[version]-build` | `build` images +| tag | description | +| ----------------- | -------------------- | +| `latest` | latest `deb` image | +| `[version]` | `deb` images | +| `build` | latest `build` image | +| `[version]-build` | `build` images | + +## Environment Variables for images with `build` in tag + +| Name | Description | Default Value | +| --------------------- | --------------------------------------------------------------------------------- | ------------- | +| `PROTONMAIL_USERNAME` | your protonmail account username | (not set) | +| `PROTONMAIL_PASSWORD` | the password for your protonmail account | (not set) | +| `KEY_ID` | the pgp-id for the internal password manager required by protonmail-bridge | `pass-key` | +| `GNUPGHOME` | change the defulat `/root/.gnupg` to this directory as a workaround for gpg error | `/tmp/gnupg` | ## Initialization To initialize and add account to the bridge, run the following command. -``` +```bash docker run --rm -it -v protonmail:/home/protonmail shenxn/protonmail-bridge init ``` Wait for the bridge to startup, use `login` command and follow the instructions to add your account into the bridge. Then use `info` to see the configuration information (username and password). After that, use `exit` to exit the bridge. You may need `CTRL+C` to exit the docker entirely. +__NOTE:__ If you have `PROTONMAIL_USERNAME` and `PROTONMAIL_PASSWORD` set for `docker run` with `-e`, the login process will finish automatically. + ## Run To run the container, use the following command. -``` +```bash docker run -d --name=protonmail-bridge -v protonmail:/home/protonmail -p 1025:25/tcp -p 1143:143/tcp --restart=unless-stopped shenxn/protonmail-bridge ``` @@ -61,7 +72,7 @@ If you don't want to use Helm, you can also reference to the guide ([#6](https:/ Please be aware that running the command above will expose your bridge to the network. Remember to use firewall if you are going to run this in an untrusted network or on a machine that has public IP address. You can also use the following command to publish the port to only localhost, which is the same behavior as the official bridge package. -``` +```bash docker run -d --name=protonmail-bridge -v protonmail:/home/protonmail -p 127.0.0.1:1025:25/tcp -p 127.0.0.1:1143:143/tcp --restart=unless-stopped shenxn/protonmail-bridge ``` diff --git a/build/.dockerignore b/build/.dockerignore index cdbb9e6..a9d46dd 100644 --- a/build/.dockerignore +++ b/build/.dockerignore @@ -6,3 +6,4 @@ !gpgparams !Dockerfile !build.sh +!login.exp diff --git a/build/Dockerfile b/build/Dockerfile index 439e831..77926fb 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.15 AS build +FROM golang:1.16 AS build # Install dependencies RUN apt-get update && apt-get install -y libsecret-1-dev @@ -16,15 +16,18 @@ EXPOSE 143/tcp # Install dependencies and protonmail bridge RUN apt-get update \ - && apt-get install -y --no-install-recommends socat pass libsecret-1-0 ca-certificates \ + && apt-get install -y --no-install-recommends \ + expect socat pass libsecret-1-0 ca-certificates \ && rm -rf /var/lib/apt/lists/* -# Copy bash scripts -COPY gpgparams entrypoint.sh /protonmail/ - # Copy protonmail COPY --from=build /build/proton-bridge/proton-bridge /protonmail/ +# Copy bash scripts +COPY gpgparams entrypoint.sh login.exp /protonmail/ + +RUN chmod +x /protonmail/login.exp + # Add a user 'protonmail' with UID 8535 RUN useradd -u 8535 -d /home/protonmail protonmail \ && mkdir -p /home/protonmail \ diff --git a/build/build.sh b/build/build.sh index 05903bf..b12e21b 100644 --- a/build/build.sh +++ b/build/build.sh @@ -2,12 +2,12 @@ set -ex -VERSION=`cat VERSION` +VERSION="$(cat VERSION)" # Clone new code git clone https://github.com/ProtonMail/proton-bridge.git cd proton-bridge -git checkout v$VERSION +git checkout "v${VERSION}" # Build make build-nogui diff --git a/build/entrypoint.sh b/build/entrypoint.sh index c04cb4a..3f4f653 100644 --- a/build/entrypoint.sh +++ b/build/entrypoint.sh @@ -9,13 +9,37 @@ echo $PWD # Initialize if [[ $1 == init ]]; then + # set GNUPGHOME as a workaround for + # + # gpg-agent[106]: error binding socket to '/root/.gnupg/S.gpg-agent': File name too long + # + # when using docker volume mount + # + # ref: https://dev.gnupg.org/T2964 + # + + export GNUPGHOME="${GNUPGHOME:-"/tmp/gnupg"}" + rm -rf "${GNUPGHOME}" || true + mkdir -p "${GNUPGHOME}" + chmod 0700 "${GNUPGHOME}" # Initialize pass gpg --generate-key --batch /protonmail/gpgparams - pass init pass-key + pass init "${KEY_ID:-"pass-key"}" # Login - /protonmail/proton-bridge --cli $@ + do_login="/protonmail/proton-bridge --cli $*" + if [[ "x${PROTONMAIL_USERNAME}" != "x" && "x${PROTONMAIL_PASSWORD}" != "x" ]]; then + # automated login if both username and password are set + do_login="/protonmail/login.exp ${do_login}" + fi + + $do_login + + # copy gnupg files to default path + mkdir -p /root/.gnupg + kill "$(pidof gpg-agent)" + cp -a "${GNUPGHOME}/" /root/.gnupg/ else diff --git a/build/login.exp b/build/login.exp new file mode 100644 index 0000000..0fbb553 --- /dev/null +++ b/build/login.exp @@ -0,0 +1,58 @@ +#!/usr/bin/expect -f + +set timeout 15; + +spawn {*}$argv ; + +# wait for inital prompt +expect { + ">>> " { + # protonmail-bridge started without error, do nothing + } + + timeout { + exit 2 + } +} + +send "login\r" +expect { + "Username: " { + # login start, enter username + } + + timeout { + exit 2 + } +} + +send "$env(PROTONMAIL_USERNAME)\r" +expect { + "Password: " { + # username entered, enter password + } + + timeout { + exit 2 + } +} + +stty -echo +sleep 1 +send "$env(PROTONMAIL_PASSWORD)\r" +stty echo +expect { + "was added successfully." { + # login ok + exit 0 + } + + "Server error" { + # login failed + exit 1 + } + + timeout { + exit 2 + } +}