@@ -34,6 +34,7 @@ make_mock_interfold() {
3434 ' case "${1:-} ${2:-} ${3:-}" in' \
3535 ' "password set --password-stdin"*) operation=password ;;' \
3636 ' "wallet set --private-key-stdin"*) operation=wallet ;;' \
37+ ' "wallet get --config"*) operation=wallet-get ;;' \
3738 ' "start "*) operation=start ;;' \
3839 ' *) operation=unexpected ;;' \
3940 ' esac' \
@@ -51,6 +52,13 @@ make_mock_interfold() {
5152 ' ;;' \
5253 ' wallet)' \
5354 ' IFS= read -r secret' \
55+ ' printf "%s" "$secret" > "$WALLET_FILE"' \
56+ ' chmod 400 "$WALLET_FILE"' \
57+ ' ;;' \
58+ ' wallet-get)' \
59+ ' [ "${WALLET_GET_FAIL:-}" != "1" ] || exit 43' \
60+ ' [ -s "$WALLET_FILE" ] || exit 44' \
61+ ' printf "0x3333333333333333333333333333333333333333\n"' \
5462 ' ;;' \
5563 ' start)' \
5664 ' : ;;' \
@@ -93,6 +101,8 @@ run_entrypoint() {
93101 TEMPLATE_FILE=" $ROOT_DIR /config.template.yaml" \
94102 SECRETS_FILE=" $case_dir /secrets/secrets.json" \
95103 PASSWORD_FILE=" $case_dir /data/password" \
104+ CREDENTIALS_READY_FILE=" $case_dir /data/credentials.provisioned" \
105+ WALLET_FILE=" $case_dir /data/wallet" \
96106 CALL_LOG=" $case_dir /calls" \
97107 ARGV_LOG=" $case_dir /argv" \
98108 RPC_URL=" ws://127.0.0.1:8545" \
141151assert_contains " $failure_dir /calls" ' wallet'
142152assert_not_contains " $failure_dir /calls" ' start'
143153[ -e " $failure_dir /secrets/secrets.json" ] || fail " failed setup removed recovery input"
154+ [ ! -e " $failure_dir /data/credentials.provisioned" ] || fail " failed setup created readiness marker"
155+ run_entrypoint " $failure_dir "
156+ [ " $( tr ' \n' ' ' < " $failure_dir /calls" ) " = " wallet-get wallet start " ] \
157+ || fail " wallet retry did not resume incomplete provisioning"
158+ [ ! -e " $failure_dir /secrets/secrets.json" ] || fail " retried setup did not remove plaintext credentials"
159+ [ -e " $failure_dir /data/credentials.provisioned" ] || fail " retried setup did not create readiness marker"
144160
145161# Existing state may only be reused with the password that encrypted it.
146162mismatch_dir=" $TEST_ROOT /password-mismatch"
156172matching_dir=" $TEST_ROOT /password-match"
157173mkdir -p " $matching_dir /data" " $matching_dir /secrets"
158174printf ' %s' ' correct horse battery staple' > " $matching_dir /data/password"
175+ printf ' %s' ' ready' > " $matching_dir /data/credentials.provisioned"
159176write_secrets " $matching_dir /secrets/secrets.json"
160177run_entrypoint " $matching_dir "
161178[ " $( tr ' \n' ' ' < " $matching_dir /calls" ) " = " start " ] || fail " matching persisted state was re-provisioned"
@@ -191,21 +208,41 @@ restart_dir="$TEST_ROOT/restart"
191208mkdir -p " $restart_dir /data"
192209printf ' %s' ' persisted-password' > " $restart_dir /data/password"
193210chmod 400 " $restart_dir /data/password"
211+ printf ' %s' ' ready' > " $restart_dir /data/credentials.provisioned"
194212run_entrypoint " $restart_dir "
195213[ " $( tr ' \n' ' ' < " $restart_dir /calls" ) " = " start " ] || fail " persisted restart unexpectedly re-provisioned credentials"
196214
215+ old_restart_dir=" $TEST_ROOT /old-restart"
216+ mkdir -p " $old_restart_dir /data"
217+ printf ' %s' ' persisted-password' > " $old_restart_dir /data/password"
218+ printf ' %s' ' wallet' > " $old_restart_dir /data/wallet"
219+ run_entrypoint " $old_restart_dir "
220+ [ " $( tr ' \n' ' ' < " $old_restart_dir /calls" ) " = " wallet-get start " ] \
221+ || fail " old complete state was not marked and started"
222+ [ -e " $old_restart_dir /data/credentials.provisioned" ] || fail " old complete state was not marked ready"
223+
224+ incomplete_restart_dir=" $TEST_ROOT /incomplete-restart"
225+ mkdir -p " $incomplete_restart_dir /data"
226+ printf ' %s' ' persisted-password' > " $incomplete_restart_dir /data/password"
227+ if run_entrypoint " $incomplete_restart_dir " ; then
228+ fail " password-only state without upload was accepted"
229+ fi
230+ assert_contains " $incomplete_restart_dir /calls" ' wallet-get'
231+ assert_not_contains " $incomplete_restart_dir /calls" ' start'
232+
197233# The 0.1.8 state bridge moves the complete custom-config namespace in one
198234# rename, preserving the unversioned DB/event log for current releases.
199235upgrade_dir=" $TEST_ROOT /legacy-upgrade"
200236mkdir -p " $upgrade_dir /data/.enclave/config/_default" " $upgrade_dir /data/.enclave/data/_default/db" \
201237 " $upgrade_dir /data/.enclave/data/_default/log.0"
202238printf ' %s' ' persisted-password' > " $upgrade_dir /data/.enclave/config/_default/key"
203239printf ' %s' ' legacy-state' > " $upgrade_dir /data/.enclave/data/_default/db/sentinel"
240+ printf ' %s' ' wallet' > " $upgrade_dir /data/wallet"
204241run_entrypoint " $upgrade_dir " \
205242 PASSWORD_FILE=" $upgrade_dir /data/.interfold/config/_default/key"
206243[ ! -e " $upgrade_dir /data/.enclave" ] || fail " legacy state namespace remained after upgrade"
207244assert_contains " $upgrade_dir /data/.interfold/data/_default/db/sentinel" ' legacy-state'
208- [ " $( tr ' \n' ' ' < " $upgrade_dir /calls" ) " = " start " ] || fail " legacy state upgrade did not start"
245+ [ " $( tr ' \n' ' ' < " $upgrade_dir /calls" ) " = " wallet-get start " ] || fail " legacy state upgrade did not start"
209246
210247ambiguous_dir=" $TEST_ROOT /ambiguous-upgrade"
211248mkdir -p " $ambiguous_dir /data/.enclave" " $ambiguous_dir /data/.interfold"
0 commit comments