diff --git a/.carnet/cookies.d/1db590b59b0f72a48d4f.cookie b/.carnet/cookies.d/1db590b59b0f72a48d4f.cookie new file mode 100644 index 0000000..7b44761 --- /dev/null +++ b/.carnet/cookies.d/1db590b59b0f72a48d4f.cookie @@ -0,0 +1 @@ +8ede68df4e3dd1681c59802c diff --git a/.carnet/initialized b/.carnet/initialized new file mode 100644 index 0000000..461f711 --- /dev/null +++ b/.carnet/initialized @@ -0,0 +1 @@ +initialized diff --git a/.carnet/owners/1db590b59b0f72a48d4f.cert b/.carnet/owners/1db590b59b0f72a48d4f.cert new file mode 100644 index 0000000..bf16a1f --- /dev/null +++ b/.carnet/owners/1db590b59b0f72a48d4f.cert @@ -0,0 +1,56 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- diff --git a/.carnet/seal-ignore.list b/.carnet/seal-ignore.list new file mode 100644 index 0000000..7ff8bf7 --- /dev/null +++ b/.carnet/seal-ignore.list @@ -0,0 +1,8 @@ +/\.git/ +/\.git$ +^\./target/ +^\./\.carnet/seal/ +/\.private-staging-mountpoint/ +/target/ +/Cargo.lock + diff --git a/.carnet/seal/sealed b/.carnet/seal/sealed new file mode 100644 index 0000000..cca29a5 --- /dev/null +++ b/.carnet/seal/sealed @@ -0,0 +1 @@ +sealed diff --git a/.carnet/seal/signatures.sha256 b/.carnet/seal/signatures.sha256 new file mode 100644 index 0000000..fb2837a Binary files /dev/null and b/.carnet/seal/signatures.sha256 differ diff --git a/.carnet/seal/signatures.sha256.1db590b59b0f72a48d4f.sig b/.carnet/seal/signatures.sha256.1db590b59b0f72a48d4f.sig new file mode 100644 index 0000000..cffa621 Binary files /dev/null and b/.carnet/seal/signatures.sha256.1db590b59b0f72a48d4f.sig differ diff --git a/.carnet/seal/signatures.sha384 b/.carnet/seal/signatures.sha384 new file mode 100644 index 0000000..497f906 Binary files /dev/null and b/.carnet/seal/signatures.sha384 differ diff --git a/.carnet/seal/signatures.sha384.1db590b59b0f72a48d4f.sig b/.carnet/seal/signatures.sha384.1db590b59b0f72a48d4f.sig new file mode 100644 index 0000000..c4dcd49 Binary files /dev/null and b/.carnet/seal/signatures.sha384.1db590b59b0f72a48d4f.sig differ diff --git a/.private-staging/EuhXwWP3KHituntu6prfcumglts1vivVI9bAfw42R3I b/.private-staging/EuhXwWP3KHituntu6prfcumglts1vivVI9bAfw42R3I index 65a2393..46f95ac 100644 Binary files a/.private-staging/EuhXwWP3KHituntu6prfcumglts1vivVI9bAfw42R3I and b/.private-staging/EuhXwWP3KHituntu6prfcumglts1vivVI9bAfw42R3I differ diff --git a/NEWS.en.md b/NEWS.en.md index 53b0f1a..f0b4957 100644 --- a/NEWS.en.md +++ b/NEWS.en.md @@ -4,6 +4,33 @@ This file documents noteworthy changes between each version of Carnet. +### Noteworthy changes in v0.3.4 (2021-05-23) + +This release contains last minute changes prior to project +announcement. + +##### Breaking Changes + +* None that we're aware of. + +##### New Features + +* Improved CLI ergonomics by showing expected help message when no + arguments are given +* Initializing, sealing, and verifying non-crate directories is now + permitted +* Improved documentation: The carnet:files command is now mentioned + in --carnet:help +* Improved Error messages +* Dogfooding from now on: The Carnet repository is now being signed + using Carnet. + +##### Bug Fixes + +* Fixed argument parsing bugs + + + ### Noteworthy changes in v0.3.3 (2021-05-21) This is the first publicly-released version of Carnet. diff --git a/README.en.md b/README.en.md index 5391f94..e2c3542 100644 --- a/README.en.md +++ b/README.en.md @@ -1,2 +1,2 @@ The English version of the README file is currently located in -[README.md](README.md). It will be moved here later. +[README.md](README.md). It will be moved back here later. diff --git a/README.md b/README.md index 2adb906..1da98f3 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ > life-cycle management are WIH. Carnet is a small tool that imposes additional security constraints -on Rust's official package manager, Cargo. This tool aims to prevent -or otherwise limit the damage malicious crates can cause. +on Rust's official package manager, Cargo. It aims to prevent or +otherwise limit the damage malicious crates can cause. Carnet imposes two types of security constraints on Cargo: diff --git a/carnet b/carnet index abd6848..38600a8 100755 --- a/carnet +++ b/carnet @@ -3,14 +3,13 @@ PROJECT_NAME="carnet" PROJECT_TITLE="Carnet: Bureaucracy for Cargo" - PROJECT_VERSION="0.3.3" + PROJECT_VERSION="0.3.4" PROJECT_DATE="2021-05-21" COPYRIGHT="Copyright © 2021 Kutometa SPC, Kuwait" DESCRIPTION="Carnet is a small tool that imposes additional security constraints on Rust's official package - manager, Cargo. This tool aims to prevent or - otherwise limit the damage malicious crates can - cause." + manager, Cargo. It aims to prevent or otherwise + limit the damage malicious crates can cause." COPYRIGHT_BLURB=" $PROJECT_NAME $PROJECT_VERSION $COPYRIGHT @@ -177,7 +176,7 @@ ${BOLD-}USAGE${RESET-} carnet [OPTIONS] [CARGO COMMANDS & OPTIONS] carnet [OPTIONS] [CARNET COMMAND] - + ${BOLD-}GENERAL OPTIONS${RESET-} --carnet:config-dir=... Override default configuration @@ -207,8 +206,7 @@ ${BOLD-}SANDBOX OPTIONS${RESET-} ${BOLD-}AUTHENTICATION OPTIONS${RESET-} --carnet:disable-verification Disable automatic verification. - See carnet:edit and carnet:done. - + See carnet:edit and carnet:done. ${BOLD-}COMMANDS${RESET-} @@ -216,6 +214,7 @@ ${BOLD-}COMMANDS${RESET-} carnet:sandbox-run Run arbitrary commands in sandbox. carnet:seal Seal current crate. carnet:verify Verify current crate. + carnet:files View all files that get sealed. carnet:own Set origin of current as local. carnet:disown Set origin of current crate as foreign. carnet:distrust Unregister the current crate from cache. @@ -1203,7 +1202,7 @@ locate_known_crate_from_the_inside_and_set_up_global_variables() { break fi if [[ "$( realpath -- "$KNOWN_CRATE_PATH" )" == "/" ]]; then - debug "Could not find Cargo.toml in this directory or any of its parents.\n" + debug "Could not find a crate in this directory or any of its parents.\n" unset KNOWN_CRATE_PATH unset KNOWN_CRATE_PATH_HASH unset KNOWN_CRATE_ORIGIN @@ -1430,65 +1429,62 @@ for arg in "$@"; do elif [[ "$END_OF_OPTIONS" == "no" ]] && [[ "$arg" =~ ^--rw-paths= ]]; then SANDBOX_RW_PATHS="${arg:11}" - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "--$PROJECT_NAME:help" ]] || [[ "$arg" == "$PROJECT_NAME:help" ]] ) ; then - COMMAND="help" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "--$PROJECT_NAME:help" ]] || [[ "$arg" == "$PROJECT_NAME:help" ]] ) ; then + if ! [[ "${COMMAND}" ]]; then COMMAND="help"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "--help" ]] || [[ "$arg" == "help" ]] || [[ "$arg" == "-h" ]]) ; then - COMMAND="cargo-help" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "--help" ]] || [[ "$arg" == "help" ]] || [[ "$arg" == "-h" ]]) ; then + if ! [[ "${COMMAND}" ]]; then COMMAND="cargo-help"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:sandbox-run" ]] || [[ "$arg" == "sandbox-run" ]] ); then - COMMAND="sandbox-run" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:sandbox-run" ]] || [[ "$arg" == "sandbox-run" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="sandbox-run"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:seal" ]] || [[ "$arg" == "seal" ]] ); then - COMMAND="seal" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:seal" ]] || [[ "$arg" == "seal" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="seal"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:disable" ]] || [[ "$arg" == "disable" ]] ); then - COMMAND="disable" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:disable" ]] || [[ "$arg" == "disable" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="disable"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:enable" ]] || [[ "$arg" == "enable" ]] ); then - COMMAND="enable" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:enable" ]] || [[ "$arg" == "enable" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="enable"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:verify" ]] || [[ "$arg" == "verify" ]] ); then - COMMAND="verify" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:verify" ]] || [[ "$arg" == "verify" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="verify"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:owners" ]] || [[ "$arg" == "owners" ]] ); then - COMMAND="list-owners" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:owners" ]] || [[ "$arg" == "owners" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="list-owners"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:files" ]] || [[ "$arg" == "files" ]] ); then - COMMAND="list-seal-files" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:files" ]] || [[ "$arg" == "files" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="list-seal-files"; fi - #elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:bash-embedable" ]] || [[ "$arg" == "bash-embedable" ]] ); then - # COMMAND="generate-bash-embedable" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:own" ]] || [[ "$arg" == "own" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="own"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:own" ]] || [[ "$arg" == "own" ]] ); then - COMMAND="own" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:disown" ]] || [[ "$arg" == "disown" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="disown"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:disown" ]] || [[ "$arg" == "disown" ]] ); then - COMMAND="disown" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:distrust" ]] || [[ "$arg" == "distrust" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="distrust"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:distrust" ]] || [[ "$arg" == "distrust" ]] ); then - COMMAND="distrust" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:init" ]] || [[ "$arg" == "init" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="init"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:init" ]] || [[ "$arg" == "init" ]] ); then - COMMAND="init" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:uninit" ]] || [[ "$arg" == "uninit" ]] ) ; then + if ! [[ "${COMMAND}" ]]; then COMMAND="uninit"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:uninit" ]] || [[ "$arg" == "uninit" ]] ) ; then - COMMAND="uninit" - - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:identity" ]] || [[ "$arg" == "identity" ]] ); then - COMMAND="identity" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:identity" ]] || [[ "$arg" == "identity" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="identity"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "--$PROJECT_NAME:version" ]] || [[ "$arg" == "--version" ]] ); then - COMMAND="version" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "--$PROJECT_NAME:version" ]] || [[ "$arg" == "--version" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="version"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "--$PROJECT_NAME:legal" ]] || [[ "$arg" == "--legal" ]] ); then - COMMAND="legal" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "--$PROJECT_NAME:legal" ]] || [[ "$arg" == "--legal" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="legal"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:edit" ]] || [[ "$arg" == "edit" ]] ); then - COMMAND="edit" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:edit" ]] || [[ "$arg" == "edit" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="edit"; fi - elif [[ "$END_OF_OPTIONS" == "no" ]] && ( [[ "$arg" == "$PROJECT_NAME:done" ]] || [[ "$arg" == "done" ]] ); then - COMMAND="done" + elif [[ "$END_OF_OPTIONS" == "no" ]] && ! [[ "${COMMAND}" ]] && ( [[ "$arg" == "$PROJECT_NAME:done" ]] || [[ "$arg" == "done" ]] ); then + if ! [[ "${COMMAND}" ]]; then COMMAND="done"; fi elif [[ "$END_OF_OPTIONS" == "no" ]] && [[ "$arg" == "--$PROJECT_NAME:end" ]]; then END_OF_OPTIONS="yes" @@ -1515,7 +1511,9 @@ if ! [[ "${CARGO_PATH-}" ]]; then } fi -if [[ "$COMMAND" == "cargo-help" ]]; then +debug "Carnet command selected was '$COMMAND'. If empty, this means that this is a direct cargo pass though."; + +if [[ "$COMMAND" == "cargo-help" ]] || [[ "$#" -eq 0 ]]; then # TODO sandbox "$CARGO_PATH" "help" printf "%s\n\n" "See '$PROJECT_NAME $PROJECT_NAME:help' or '$PROJECT_NAME --$PROJECT_NAME:help' for more information about options and commands that are specific to carnet." @@ -1738,12 +1736,15 @@ if [[ "$COMMAND" ]]; then KNOWN_CRATE_PATH="." locate_known_crate_from_the_inside_and_set_up_global_variables crate_root="${UNHANDLED_NON_OPTIONS[0]:-.}" + if ! [[ -d "$crate_root" ]]; then + fatal "'$crate_root' is not a directory" + fi if ! [[ -f "$crate_root/Cargo.toml" ]]; then - fatal "'$crate_root' doesn't seem to be a rust crate (no Cargo.toml)" + warn "'$crate_root' doesn't seem to be a rust crate (no Cargo.toml). Proceeding anyway." fi - initialize_crate "${UNHANDLED_NON_OPTIONS[0]:-.}" - trust_crate "${UNHANDLED_NON_OPTIONS[0]:-.}" - own_crate "${UNHANDLED_NON_OPTIONS[0]:-.}" + initialize_crate "$crate_root" + trust_crate "$crate_root" + own_crate "$crate_root" elif [[ "$COMMAND" == "uninit" ]]; then KNOWN_CRATE_PATH="." locate_known_crate_from_the_inside_and_set_up_global_variables @@ -1821,15 +1822,16 @@ else sandbox "$CARGO_PATH" "${FILTERED_ARGS[@]}" || exit "$?" if ! [[ "${UNHANDLED_NON_OPTIONS[1]-}" ]] || ! [[ -f "${UNHANDLED_NON_OPTIONS[1]}/Cargo.toml" ]]; then - fatal "Your new crate has been successfully setup by cargo, \ - but carnet could not initialize it automatically because \ - it couldn't find the new directory \ - '${UNHANDLED_NON_OPTIONS[1]-}'. You can initialize your \ - crate manually by running $PROJECT_NAME carnet:init inside your crate." + fatal "Carnet has failed to setup your new crate properly. You can try to use cargo directly and then run $PROJECT_NAME carnet:init manually inside your new crate. Please consider reporting this issue if you can reproduce it." + Please consider reporting this issue. fi initialize_crate "${UNHANDLED_NON_OPTIONS[1]}" trust_crate "${UNHANDLED_NON_OPTIONS[1]}" own_crate "${UNHANDLED_NON_OPTIONS[1]}" + + if ! [[ "${UNHANDLED_NON_OPTIONS[1]-}" ]] || ! [[ -d "${UNHANDLED_NON_OPTIONS[1]}/.carnet" ]]; then + fatal "Carnet has failed to setup your new crate properly. Try to run $PROJECT_NAME carnet:init manually inside your new crate. Please consider reporting this issue if you can reproduce it." + fi elif [[ "${UNHANDLED_NON_OPTIONS[0]-}" == "version" ]]; then echo "$PROJECT_NAME $PROJECT_VERSION ($PROJECT_DATE NCA)" sandbox "$CARGO_PATH" version @@ -1838,7 +1840,7 @@ else printf "%s\n\n" "See '$PROJECT_NAME $PROJECT_NAME:help' or '$PROJECT_NAME --$PROJECT_NAME:help' for more information about the options and commands that are specific to Carnet." else if ! [[ "${KNOWN_CRATE_STATE-}" ]] || [[ "$KNOWN_CRATE_STATE" != "found" ]]; then - fatal "Could not find a registered crate in '$PWD' or any parent directory" + fatal "Could not find a registered crate in current directory or any parent directory.\n See 'carnet new' and 'carnet init' commands." fi if [[ "$DISABLE_AUTOVERIFICATION" != "yes" ]]; then verify diff --git a/tests/carnet-test.sh b/tests/carnet-test.sh index cc8f6cc..7df63f0 100644 --- a/tests/carnet-test.sh +++ b/tests/carnet-test.sh @@ -103,7 +103,7 @@ else for case in "cases/"*; do case_name="$(basename "$case")" if [[ "${case_name::12}" == "0000-ignored" ]] && [[ "${TEST_IGNORED-}" == "" ]]; then - step "ignored" "$case_name" + step "ignored" "$case_name (Set env TEST_IGNORED to 'yes' to test)" else run_case "$case" fi