From 11ca693efe79942bc3b2ffd721a7610c8209fc16 Mon Sep 17 00:00:00 2001 From: Geoffrey Huntley Date: Mon, 14 Nov 2022 05:29:45 +0000 Subject: [PATCH] feat(windows): add product information to coder.exe --- .github/workflows/release.yaml | 3 +++ .gitignore | 2 ++ cmd/coder/coder.exe.ico | Bin 0 -> 192254 bytes cmd/coder/coder.exe.manifest | 17 +++++++++++++ cmd/coder/versioninfo.json | 44 +++++++++++++++++++++++++++++++++ docs/CONTRIBUTING.md | 3 ++- dogfood/Dockerfile | 1 + flake.nix | 1 + go.mod | 5 ++++ go.sum | 4 +++ scripts/build_go.sh | 25 ++++++++++++++++++- scripts/sign_windows.sh | 38 ++++++++++++++++++++++++++++ 12 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 cmd/coder/coder.exe.ico create mode 100644 cmd/coder/coder.exe.manifest create mode 100644 cmd/coder/versioninfo.json create mode 100755 scripts/sign_windows.sh diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 8444e30baa030..da114ac091eda 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -119,6 +119,9 @@ jobs: AC_APIKEY_ISSUER_ID: ${{ secrets.AC_APIKEY_ISSUER_ID }} AC_APIKEY_ID: ${{ secrets.AC_APIKEY_ID }} AC_APIKEY_FILE: /tmp/apple_apikey.p8 + CODER_SIGN_WINDOWS: "0" + AUTHENTICODE_CERTIFICATE_FILE: /tmp/windows_cert.pkcs12 + AUTHENTICODE_CERTIFICATE_PASSWORD_FILE: /tmp/windows_cert_password.txt - name: Delete Apple Developer certificate and API key run: rm -f /tmp/{apple_cert.p12,apple_cert_password.txt,apple_apikey.p8} diff --git a/.gitignore b/.gitignore index 25c5e1c798913..9bb066d5f53a6 100644 --- a/.gitignore +++ b/.gitignore @@ -44,6 +44,8 @@ site/out/ *.lock.hcl .terraform/ +**/*.syso + .vscode/*.log .vscode/launch.json **/*.swp diff --git a/cmd/coder/coder.exe.ico b/cmd/coder/coder.exe.ico new file mode 100644 index 0000000000000000000000000000000000000000..37cbd495d195f7d3a972644362a61ad29334011a GIT binary patch literal 192254 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 h=$i1}+Wh5uHR1h + + + + + + + + + + diff --git a/cmd/coder/versioninfo.json b/cmd/coder/versioninfo.json new file mode 100644 index 0000000000000..3da420c00dfb9 --- /dev/null +++ b/cmd/coder/versioninfo.json @@ -0,0 +1,44 @@ +{ + "FixedFileInfo": + { + "FileVersion": { + "Major": 0, + "Minor": 0, + "Patch": 0, + "Build": 0 + }, + "ProductVersion": { + "Major": 0, + "Minor": 0, + "Patch": 0, + "Build": 0 + }, + "FileFlagsMask": "3f", + "FileFlags ": "00", + "FileOS": "040004", + "FileType": "01", + "FileSubType": "00" + }, + "StringFileInfo": + { + "Comments": "https://coder.com", + "CompanyName": "Coder Technologies, Inc", + "FileDescription": "Coder", + "FileVersion": "", + "InternalName": "coder", + "LegalCopyright": "© Coder Technologies, Inc. All rights reserved.", + "LegalTrademarks": "", + "OriginalFilename": "coder.exe", + "PrivateBuild": "", + "ProductName": "Coder®", + "ProductVersion": "", + "SpecialBuild": "" + }, + "VarFileInfo": + { + "Translation": { + "LangID": "0409", + "CharsetID": "04B0" + } + } +} diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 6a1543597d4a2..82fc30fb3c27e 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -62,7 +62,8 @@ Alternatively if you do not want to use nix then you'll need to install the need - on macOS, run `brew install pango` - [`pandoc`]() - on macOS, run `brew install pandocomatic` - +- [`osslsigncode`]() + - on macOS, run `brew install osslsigncode` ### Development workflow diff --git a/dogfood/Dockerfile b/dogfood/Dockerfile index a05a1266ad286..d2318f819ed8a 100644 --- a/dogfood/Dockerfile +++ b/dogfood/Dockerfile @@ -124,6 +124,7 @@ RUN apt-get update --quiet && apt-get install --yes \ openjdk-11-jdk-headless \ openssh-server \ openssl \ + osslsigncode \ pkg-config \ python3 \ python3-pip \ diff --git a/flake.nix b/flake.nix index dfc44b91df36f..d5ab4f1682049 100644 --- a/flake.nix +++ b/flake.nix @@ -32,6 +32,7 @@ nodePackages.typescript nodePackages.typescript-language-server nodejs + osslsigncode openssh openssl postgresql diff --git a/go.mod b/go.mod index f38504b38d9dc..6573a2bbf8adb 100644 --- a/go.mod +++ b/go.mod @@ -302,3 +302,8 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect howett.net/plist v1.0.0 // indirect ) + +require ( + github.com/akavel/rsrc v0.10.2 // indirect + github.com/josephspurrier/goversioninfo v1.4.0 // indirect +) diff --git a/go.sum b/go.sum index 29b60a8021290..43751420da431 100644 --- a/go.sum +++ b/go.sum @@ -170,6 +170,8 @@ github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= +github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/akutz/memconn v0.1.0 h1:NawI0TORU4hcOMsMr11g7vwlCdkYeLKXBcxWu2W/P8A= github.com/akutz/memconn v0.1.0/go.mod h1:Jo8rI7m0NieZyLI5e2CDlRdRqRRB4S7Xp77ukDjH+Fw= github.com/alecthomas/chroma v0.9.4/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= @@ -1118,6 +1120,8 @@ github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqx github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josephspurrier/goversioninfo v1.4.0 h1:Puhl12NSHUSALHSuzYwPYQkqa2E1+7SrtAPJorKK0C8= +github.com/josephspurrier/goversioninfo v1.4.0/go.mod h1:JWzv5rKQr+MmW+LvM412ToT/IkYDZjaclF2pKDss8IY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/josharian/native v1.0.0 h1:Ts/E8zCSEsG17dUqv7joXJFybuMLjQfWE04tsBODTxk= github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= diff --git a/scripts/build_go.sh b/scripts/build_go.sh index 3a8649890174f..2d10e8233f2cf 100755 --- a/scripts/build_go.sh +++ b/scripts/build_go.sh @@ -32,10 +32,11 @@ os="${GOOS:-linux}" arch="${GOARCH:-amd64}" slim="${CODER_SLIM_BUILD:-0}" sign_darwin="${CODER_SIGN_DARWIN:-0}" +sign_windows="${CODER_SIGN_WINDOWS:-0}" output_path="" agpl="${CODER_BUILD_AGPL:-0}" -args="$(getopt -o "" -l version:,os:,arch:,output:,slim,agpl,sign-darwin -- "$@")" +args="$(getopt -o "" -l version:,os:,arch:,output:,slim,agpl,sign-darwin,sign-windows -- "$@")" eval set -- "$args" while true; do case "$1" in @@ -68,6 +69,10 @@ while true; do sign_darwin=1 shift ;; + --sign-windows) + sign_windows=1 + shift + ;; --) shift break @@ -93,6 +98,20 @@ if [[ "$sign_darwin" == 1 ]]; then requiredenvs AC_CERTIFICATE_FILE AC_CERTIFICATE_PASSWORD_FILE fi +if [[ "$sign_windows" == 1 ]]; then + dependencies osslsigncode + requiredenvs AUTHENTICODE_CERTIFICATE_FILE AUTHENTICODE_CERTIFICATE_PASSWORD_FILE +fi + +if [[ "$os" == "windows" ]]; then + goversioninfo -platform-specific=true \ + -product-version=${version} \ + -icon=cmd/coder/coder.exe.ico \ + -manifest=cmd/coder/coder.exe.manifest \ + cmd/coder/versioninfo.json +fi + + build_args=( -ldflags "-s -w -X 'github.com/coder/coder/buildinfo.tag=$version'" ) @@ -134,4 +153,8 @@ if [[ "$sign_darwin" == 1 ]] && [[ "$os" == "darwin" ]]; then execrelative ./sign_darwin.sh "$output_path" 1>&2 fi +if [[ "$sign_windows" == 1 ]] && [[ "$os" == "windows" ]]; then + execrelative ./sign_windows.sh "$output_path" 1>&2 +fi + echo "$output_path" diff --git a/scripts/sign_windows.sh b/scripts/sign_windows.sh new file mode 100755 index 0000000000000..7d83ab009df72 --- /dev/null +++ b/scripts/sign_windows.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +set -x +# This script signs the provided windows binary with a X.509 certificate and +# it's associated private key. +# +# Usage: ./sign_windows.sh path/to/binary +# +# On success, the input file will be signed using the X.509 certificate. +# +# You can check if a binary is signed by running the following command: +# osslsigncode verify path/to/binary +# +# Depends on the osslsigncode utility. Requires the following environment variables +# to be set: +# - $AUTHENTICODE_CERTIFICATE_FILE: The path to the X5.09 certificate file. +# - $AUTHENTICODE_CERTIFICATE_PASSWORD_FILE: The path to the file containing the password +# for the X5.09 certificate. + +set -euo pipefail +# shellcheck source=scripts/lib.sh +source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" + +# Check dependencies +dependencies osslsigncode +requiredenvs AUTHENTICODE_CERTIFICATE_FILE AUTHENTICODE_CERTIFICATE_PASSWORD_FILE + +osslsigncode sign \ + -pkcs12 "$AUTHENTICODE_CERTIFICATE_FILE" \ + -readpass "$AUTHENTICODE_CERTIFICATE_PASSWORD_FILE" \ + -n "Coder" \ + -i "https://coder.com" \ + -t "http://timestamp.sectigo.com" + -in "$@" \ + -out "$@" \ + 1>&2 + +osslsigncodeosslsigncode verify "$@" 1>&2