diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..7e1caa13 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,224 @@ +name: Build binary + +on: + workflow_dispatch + #schedule: + # - cron: '5 5 * * *' + +permissions: + contents: write + +env: + CARGO_TERM_COLOR: always + REDLIB_ROOT_DIR: /tmp/redlib + APT: sudo apt -y -qq -o=Dpkg::Use-Pty=0 + +defaults: + run: + shell: bash + +jobs: + get_prebuilt_last_tag: + runs-on: ubuntu-latest + outputs: + REDLIB_PREBUILT_LATEST_TAG: ${{ steps.release_latest_tag.outputs.REDLIB_PREBUILT_LATEST_TAG }} + + steps: + - name: Get latest release tag of this repo + id: release_latest_tag + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + cd /tmp/ + REDLIB_PREBUILT_LATEST_TAG=$(gh release list -R mycodedoesnotcompile2/redlib_fork --json tagName -L 1 --jq '.[].tagName' --exclude-drafts --exclude-pre-releases) + echo "REDLIB_PREBUILT_LATEST_TAG=$REDLIB_PREBUILT_LATEST_TAG" >> $GITHUB_OUTPUT + + build: + needs: get_prebuilt_last_tag + strategy: + fail-fast: false + matrix: + include: + - TARGET: x86_64-unknown-linux-gnu + OS: ubuntu-latest + + - TARGET: x86_64-unknown-linux-musl + OS: ubuntu-latest + + - TARGET: aarch64-unknown-linux-gnu + OS: ubuntu-24.04-arm + + - TARGET: aarch64-unknown-linux-musl + OS: ubuntu-24.04-arm + + - TARGET: armv7-unknown-linux-gnueabihf + OS: ubuntu-latest + + # - TARGET: armv7-unknown-linux-musleabihf + # OS: ubuntu-latest + # CONTAINER: ghcr.io/rust-cross/rust-musl-cross:armv7-musleabihf + + - TARGET: arm-unknown-linux-gnueabihf + OS: ubuntu-latest + + #- TARGET: arm-unknown-linux-musleabihf + # OS: ubuntu-latest + + # - TARGET: x86_64-apple-darwin + # OS: macos-latest + + # - TARGET: x86_64-pc-windows-msvc + # OS: windows-latest + + runs-on: ${{ matrix.OS }} + container: + image: ${{ matrix.CONTAINER }} + + env: + TARGET: ${{ matrix.TARGET }} + OS: ${{ matrix.OS }} + CONTAINER: ${{ matrix.CONTAINER }} + + REDLIB_PREBUILT_LATEST_TAG: ${{ needs.get_prebuilt_last_tag.outputs.REDLIB_PREBUILT_LATEST_TAG }} + + outputs: + REDLIB_CURRENT_COMMIT_ID: ${{ steps.release_commit_id.outputs.REDLIB_CURRENT_COMMIT_ID }} + REDLIB_VERSION: ${{ steps.release_version.outputs.REDLIB_VERSION }} + + steps: + - name: Clone redlib repo and check if there is a new and uncompiled yet version + id: release_commit_id + run: | + cd /tmp/ + git clone 'https://github.com/mycodedoesnotcompile2/redlib_fork.git' redlib + ls -alh . + + cd $REDLIB_ROOT_DIR + + REDLIB_CURRENT_COMMIT_ID=$(git rev-parse --short HEAD) + echo "REDLIB_CURRENT_COMMIT_ID=$REDLIB_CURRENT_COMMIT_ID" >> $GITHUB_ENV + echo "REDLIB_CURRENT_COMMIT_ID=$REDLIB_CURRENT_COMMIT_ID" >> $GITHUB_OUTPUT + + # case: no new commit => abort the workflow + if [[ $REDLIB_PREBUILT_LATEST_TAG == $REDLIB_CURRENT_COMMIT_ID ]]; then + echo "[!] No new version to compile" + exit 100 + fi + + - name: Get redlib version + id: release_version_cargo_get + uses: nicolaiunrein/cargo-get@master + with: + subcommand: package.version + options: --entry "$REDLIB_ROOT_DIR/Cargo.toml" + + - name: Set REDLIB_VERSION env var + id: release_version + run: | + REDLIB_VERSION=${{ steps.release_version_cargo_get.outputs.metadata }} + echo "REDLIB_VERSION=$REDLIB_VERSION" >> $GITHUB_ENV + echo "REDLIB_VERSION=$REDLIB_VERSION" >> $GITHUB_OUTPUT + + - name: Install and configure dependencies + run: | + if [[ $OS =~ ^ubuntu.*$ ]]; then + $APT update + $APT install crossbuild-essential-armhf + fi + + # for musl builds + if [[ $TARGET == *"-musl"* ]]; then + $APT install musl-tools + fi + + # for arm targets + if [[ $TARGET == "arm"* ]]; then + cd "$REDLIB_ROOT_DIR" + cargo install --force --locked bindgen-cli + fi + + # some additional configuration for cross-compilation on linux + cat >>~/.cargo/config.toml <> $GITHUB_ENV + echo "REDLIB_BIN_HASH_PATH=$REDLIB_BIN_HASH_PATH" >> $GITHUB_ENV + + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: binary-${{ matrix.TARGET }} + path: | + ${{ env.REDLIB_BIN_PATH }} + ${{ env.REDLIB_BIN_HASH_PATH }} + + + deploy_release: + needs: build + runs-on: ubuntu-latest + env: + REDLIB_CURRENT_COMMIT_ID: ${{ needs.build.outputs.REDLIB_CURRENT_COMMIT_ID }} + REDLIB_VERSION: ${{ needs.build.outputs.REDLIB_VERSION }} + + steps: + - name: Download Artifact + uses: actions/download-artifact@v4 + with: + pattern: binary-* + merge-multiple: true + path: /tmp/results + + - name: List target + run: | + cd "/tmp/results" + ls -alh + + RELEASE_NOTES="/tmp/release_notes.txt" + echo "RELEASE_NOTES=$RELEASE_NOTES" >> $GITHUB_ENV + + cat *.sha256.txt > "$RELEASE_NOTES" + sha256sum -c *.sha256.txt + + mkdir -p "/tmp/hashes" + mv -f *.sha256.txt "/tmp/hashes/" + + - name: Create a new Github release + uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8 #v2.3.2 + with: + make_latest: true + body_path: ${{ env.RELEASE_NOTES }} + name: version ${{ env.REDLIB_VERSION }} - build ${{ env.REDLIB_CURRENT_COMMIT_ID }} + tag_name: ${{ env.REDLIB_CURRENT_COMMIT_ID }} + files: | + /tmp/results/redlib-* diff --git a/Cargo.lock b/Cargo.lock index 5b95595c..f8cc5782 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1417,6 +1417,7 @@ dependencies = [ "lipsum", "log", "percent-encoding", + "rustls", "pretty_env_logger", "pulldown-cmark", "regex", diff --git a/Cargo.toml b/Cargo.toml index d51e635a..d62f6e69 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,7 @@ base2048 = "2.0.2" revision = "0.10.0" tokio-socks = "0.5.2" fake_user_agent = "0.2.2" +rustls = "0.21.12" [dev-dependencies] lipsum = "0.9.0" diff --git a/src/client.rs b/src/client.rs index f858d055..284843ba 100644 --- a/src/client.rs +++ b/src/client.rs @@ -4,7 +4,7 @@ use futures_lite::future::block_on; use futures_lite::{future::Boxed, FutureExt}; use hyper::header::HeaderValue; use hyper::{body, body::Buf, header, Body, Client, Method, Request, Response, Uri}; -use hyper_rustls::HttpsConnector; +use hyper_rustls::{ConfigBuilderExt, HttpsConnector}; use libflate::gzip; use log::{error, trace, warn}; use percent_encoding::{percent_encode, CONTROLS}; @@ -33,7 +33,25 @@ const ALTERNATIVE_REDDIT_URL_BASE_HOST: &str = "www.reddit.com"; pub static HTTPS_CONNECTOR: LazyLock> = LazyLock::new(|| { let proxy_connector = ProxyConnector::new(); hyper_rustls::HttpsConnectorBuilder::new() - .with_native_roots() + .with_tls_config( + rustls::ClientConfig::builder() + .with_cipher_suites(&[ + rustls::cipher_suite::TLS13_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, + rustls::cipher_suite::TLS13_CHACHA20_POLY1305_SHA256, + rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + ]) + .with_safe_default_kx_groups() + .with_safe_default_protocol_versions() + .unwrap() + .with_native_roots() + .with_no_client_auth(), + ) .https_only() .enable_http2() .wrap_connector(proxy_connector)