beignet 0.23.1 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -7
- package/dist/cli/backup-destination.js +89 -0
- package/dist/cli/backup-destination.js.map +1 -0
- package/dist/cli/backup-mac.js +74 -0
- package/dist/cli/backup-mac.js.map +1 -0
- package/dist/cli/beignet-node.js +455 -213
- package/dist/cli/beignet-node.js.map +1 -1
- package/dist/cli/cli.js +53 -28
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/config.js +1 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/daemon-options.js +1 -0
- package/dist/cli/daemon-options.js.map +1 -1
- package/dist/cli/daemon.js +219 -28
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/errors.js +2 -0
- package/dist/cli/errors.js.map +1 -1
- package/dist/cli/http-rate-limiter.js +13 -5
- package/dist/cli/http-rate-limiter.js.map +1 -1
- package/dist/cli/openapi.js +61 -23
- package/dist/cli/openapi.js.map +1 -1
- package/dist/cli/restore.js +44 -22
- package/dist/cli/restore.js.map +1 -1
- package/dist/cli/webhooks.js +71 -5
- package/dist/cli/webhooks.js.map +1 -1
- package/dist/electrum/index.js +5 -1
- package/dist/electrum/index.js.map +1 -1
- package/dist/lightning/chain/chain-monitor.js +37 -0
- package/dist/lightning/chain/chain-monitor.js.map +1 -1
- package/dist/lightning/chain/chain-watcher.js +49 -4
- package/dist/lightning/chain/chain-watcher.js.map +1 -1
- package/dist/lightning/chain/closing.js +28 -20
- package/dist/lightning/chain/closing.js.map +1 -1
- package/dist/lightning/chain/electrum-backend.js +2 -1
- package/dist/lightning/chain/electrum-backend.js.map +1 -1
- package/dist/lightning/chain/output-resolver.js +33 -23
- package/dist/lightning/chain/output-resolver.js.map +1 -1
- package/dist/lightning/channel/channel-actions.js.map +1 -1
- package/dist/lightning/channel/channel-manager.js +41 -16
- package/dist/lightning/channel/channel-manager.js.map +1 -1
- package/dist/lightning/channel/channel-state.js +1 -1
- package/dist/lightning/channel/channel-state.js.map +1 -1
- package/dist/lightning/channel/channel.js +193 -35
- package/dist/lightning/channel/channel.js.map +1 -1
- package/dist/lightning/channel/dual-funding.js +10 -1
- package/dist/lightning/channel/dual-funding.js.map +1 -1
- package/dist/lightning/channel/splice-weight.js +2 -1
- package/dist/lightning/channel/splice-weight.js.map +1 -1
- package/dist/lightning/channel/types.js +9 -1
- package/dist/lightning/channel/types.js.map +1 -1
- package/dist/lightning/channel/validation.js +3 -0
- package/dist/lightning/channel/validation.js.map +1 -1
- package/dist/lightning/direct-funding/messages.js +19 -6
- package/dist/lightning/direct-funding/messages.js.map +1 -1
- package/dist/lightning/direct-funding/receiver/engine.js +1 -1
- package/dist/lightning/direct-funding/receiver/engine.js.map +1 -1
- package/dist/lightning/direct-funding/receiver/types.js.map +1 -1
- package/dist/lightning/direct-funding/receiver/verify.js +8 -8
- package/dist/lightning/direct-funding/receiver/verify.js.map +1 -1
- package/dist/lightning/direct-funding/sender/engine.js +5 -5
- package/dist/lightning/direct-funding/sender/engine.js.map +1 -1
- package/dist/lightning/features/flags.js +0 -1
- package/dist/lightning/features/flags.js.map +1 -1
- package/dist/lightning/ffor/witness-service.js +25 -1
- package/dist/lightning/ffor/witness-service.js.map +1 -1
- package/dist/lightning/gossip/gossip-sync.js +43 -15
- package/dist/lightning/gossip/gossip-sync.js.map +1 -1
- package/dist/lightning/gossip/messages.js +8 -1
- package/dist/lightning/gossip/messages.js.map +1 -1
- package/dist/lightning/gossip/network-graph.js +65 -16
- package/dist/lightning/gossip/network-graph.js.map +1 -1
- package/dist/lightning/gossip/types.js.map +1 -1
- package/dist/lightning/invoice/amount.js +8 -1
- package/dist/lightning/invoice/amount.js.map +1 -1
- package/dist/lightning/invoice/decode.js +1 -2
- package/dist/lightning/invoice/decode.js.map +1 -1
- package/dist/lightning/l402/client.js +120 -11
- package/dist/lightning/l402/client.js.map +1 -1
- package/dist/lightning/message/channel-commitment.js +7 -2
- package/dist/lightning/message/channel-commitment.js.map +1 -1
- package/dist/lightning/message/channel-funding.js +8 -3
- package/dist/lightning/message/channel-funding.js.map +1 -1
- package/dist/lightning/message/channel-open.js +7 -2
- package/dist/lightning/message/channel-open.js.map +1 -1
- package/dist/lightning/message/channel-reestablish.js +7 -1
- package/dist/lightning/message/channel-reestablish.js.map +1 -1
- package/dist/lightning/message/channel-update.js +12 -4
- package/dist/lightning/message/channel-update.js.map +1 -1
- package/dist/lightning/message/dual-funding.js +13 -2
- package/dist/lightning/message/dual-funding.js.map +1 -1
- package/dist/lightning/message/error.js +7 -1
- package/dist/lightning/message/error.js.map +1 -1
- package/dist/lightning/message/init.js +2 -1
- package/dist/lightning/message/init.js.map +1 -1
- package/dist/lightning/message/interactive-tx.js +12 -11
- package/dist/lightning/message/interactive-tx.js.map +1 -1
- package/dist/lightning/message/splice.js +8 -14
- package/dist/lightning/message/splice.js.map +1 -1
- package/dist/lightning/node/lightning-node.js +745 -165
- package/dist/lightning/node/lightning-node.js.map +1 -1
- package/dist/lightning/node/types.js +4 -1
- package/dist/lightning/node/types.js.map +1 -1
- package/dist/lightning/offer/offer-manager.js +91 -27
- package/dist/lightning/offer/offer-manager.js.map +1 -1
- package/dist/lightning/offer/tlv.js +50 -9
- package/dist/lightning/offer/tlv.js.map +1 -1
- package/dist/lightning/onion/failures.js +11 -1
- package/dist/lightning/onion/failures.js.map +1 -1
- package/dist/lightning/onion/hop-payload.js +43 -9
- package/dist/lightning/onion/hop-payload.js.map +1 -1
- package/dist/lightning/onion/process.js +31 -5
- package/dist/lightning/onion/process.js.map +1 -1
- package/dist/lightning/onion/types.js +5 -4
- package/dist/lightning/onion/types.js.map +1 -1
- package/dist/lightning/recovery/assembly.js +6 -1
- package/dist/lightning/recovery/assembly.js.map +1 -1
- package/dist/lightning/recovery/durability-barrier.js +3 -0
- package/dist/lightning/recovery/durability-barrier.js.map +1 -1
- package/dist/lightning/recovery/frame-codec.js +19 -1
- package/dist/lightning/recovery/frame-codec.js.map +1 -1
- package/dist/lightning/recovery/guardian-client.js +15 -6
- package/dist/lightning/recovery/guardian-client.js.map +1 -1
- package/dist/lightning/recovery/guardian-host.js +18 -3
- package/dist/lightning/recovery/guardian-host.js.map +1 -1
- package/dist/lightning/recovery/guardian-proto.js +37 -1
- package/dist/lightning/recovery/guardian-proto.js.map +1 -1
- package/dist/lightning/recovery/guardian-replication.js +406 -9
- package/dist/lightning/recovery/guardian-replication.js.map +1 -1
- package/dist/lightning/recovery/guardian-rotation.js +10 -2
- package/dist/lightning/recovery/guardian-rotation.js.map +1 -1
- package/dist/lightning/recovery/guardian-store.js +104 -7
- package/dist/lightning/recovery/guardian-store.js.map +1 -1
- package/dist/lightning/recovery/guardian-wire.js +11 -1
- package/dist/lightning/recovery/guardian-wire.js.map +1 -1
- package/dist/lightning/recovery/guardian.js +225 -44
- package/dist/lightning/recovery/guardian.js.map +1 -1
- package/dist/lightning/recovery/journal.js +278 -40
- package/dist/lightning/recovery/journal.js.map +1 -1
- package/dist/lightning/recovery/recovery-manager.js.map +1 -1
- package/dist/lightning/recovery/restore-driver.js +28 -5
- package/dist/lightning/recovery/restore-driver.js.map +1 -1
- package/dist/lightning/recovery/wire-safety.js +14 -0
- package/dist/lightning/recovery/wire-safety.js.map +1 -1
- package/dist/lightning/storage/serialization.js +33 -0
- package/dist/lightning/storage/serialization.js.map +1 -1
- package/dist/lightning/swaps/chain-resolver.js +23 -0
- package/dist/lightning/swaps/chain-resolver.js.map +1 -1
- package/dist/lightning/swaps/client.js +9 -0
- package/dist/lightning/swaps/client.js.map +1 -1
- package/dist/lightning/swaps/exposure.js +10 -7
- package/dist/lightning/swaps/exposure.js.map +1 -1
- package/dist/lightning/swaps/ledger.js +2 -1
- package/dist/lightning/swaps/ledger.js.map +1 -1
- package/dist/lightning/swaps/messages.js.map +1 -1
- package/dist/lightning/swaps/reverse-engine.js +130 -16
- package/dist/lightning/swaps/reverse-engine.js.map +1 -1
- package/dist/lightning/transport/peer-manager.js +73 -8
- package/dist/lightning/transport/peer-manager.js.map +1 -1
- package/dist/lightning/transport/peer.js +11 -5
- package/dist/lightning/transport/peer.js.map +1 -1
- package/dist/lightning/transport/websocket-frame.js +3 -0
- package/dist/lightning/transport/websocket-frame.js.map +1 -1
- package/dist/lightning/transport/websocket-server.js +55 -5
- package/dist/lightning/transport/websocket-server.js.map +1 -1
- package/dist/lightning/transport/websocket.js +2 -1
- package/dist/lightning/transport/websocket.js.map +1 -1
- package/dist/lightning/validation/index.js +8 -4
- package/dist/lightning/validation/index.js.map +1 -1
- package/dist/lightning/wallet/wallet-funding-provider.js +42 -8
- package/dist/lightning/wallet/wallet-funding-provider.js.map +1 -1
- package/dist/lightning/watchtower/watchtower-client.js +20 -2
- package/dist/lightning/watchtower/watchtower-client.js.map +1 -1
- package/dist/transaction/index.js +169 -15
- package/dist/transaction/index.js.map +1 -1
- package/dist/types/cli/backup-destination.d.ts +6 -0
- package/dist/types/cli/backup-mac.d.ts +6 -0
- package/dist/types/cli/beignet-node.d.ts +12 -3
- package/dist/types/cli/errors.d.ts +2 -0
- package/dist/types/cli/http-rate-limiter.d.ts +2 -0
- package/dist/types/cli/restore.d.ts +8 -2
- package/dist/types/cli/types.d.ts +2 -0
- package/dist/types/cli/webhooks.d.ts +7 -0
- package/dist/types/electrum/index.d.ts +2 -1
- package/dist/types/lightning/chain/chain-monitor.d.ts +1 -0
- package/dist/types/lightning/chain/chain-watcher.d.ts +6 -0
- package/dist/types/lightning/chain/closing.d.ts +5 -0
- package/dist/types/lightning/channel/channel-actions.d.ts +1 -0
- package/dist/types/lightning/channel/channel-manager.d.ts +1 -0
- package/dist/types/lightning/channel/channel-state.d.ts +5 -0
- package/dist/types/lightning/channel/channel.d.ts +11 -2
- package/dist/types/lightning/channel/splice-weight.d.ts +1 -0
- package/dist/types/lightning/channel/types.d.ts +5 -0
- package/dist/types/lightning/direct-funding/messages.d.ts +3 -3
- package/dist/types/lightning/direct-funding/receiver/types.d.ts +1 -0
- package/dist/types/lightning/direct-funding/receiver/verify.d.ts +1 -1
- package/dist/types/lightning/gossip/gossip-sync.d.ts +4 -2
- package/dist/types/lightning/gossip/network-graph.d.ts +8 -1
- package/dist/types/lightning/gossip/types.d.ts +1 -0
- package/dist/types/lightning/l402/client.d.ts +2 -0
- package/dist/types/lightning/node/lightning-node.d.ts +23 -2
- package/dist/types/lightning/node/types.d.ts +6 -0
- package/dist/types/lightning/offer/offer-manager.d.ts +1 -0
- package/dist/types/lightning/onion/hop-payload.d.ts +5 -0
- package/dist/types/lightning/onion/process.d.ts +6 -0
- package/dist/types/lightning/onion/types.d.ts +1 -0
- package/dist/types/lightning/recovery/capsule.d.ts +1 -1
- package/dist/types/lightning/recovery/durability-barrier.d.ts +1 -0
- package/dist/types/lightning/recovery/frame-codec.d.ts +3 -1
- package/dist/types/lightning/recovery/guardian-client.d.ts +7 -3
- package/dist/types/lightning/recovery/guardian-host.d.ts +7 -0
- package/dist/types/lightning/recovery/guardian-replication.d.ts +20 -2
- package/dist/types/lightning/recovery/guardian-rotation.d.ts +4 -0
- package/dist/types/lightning/recovery/guardian-store.d.ts +17 -3
- package/dist/types/lightning/recovery/guardian-wire.d.ts +7 -0
- package/dist/types/lightning/recovery/guardian.d.ts +17 -2
- package/dist/types/lightning/recovery/journal.d.ts +16 -0
- package/dist/types/lightning/recovery/restore-driver.d.ts +3 -0
- package/dist/types/lightning/recovery/types.d.ts +1 -0
- package/dist/types/lightning/storage/serialization.d.ts +10 -0
- package/dist/types/lightning/swaps/chain-resolver.d.ts +1 -0
- package/dist/types/lightning/swaps/client.d.ts +1 -0
- package/dist/types/lightning/swaps/ledger.d.ts +1 -0
- package/dist/types/lightning/swaps/reverse-engine.d.ts +6 -0
- package/dist/types/lightning/transport/duplex-transport.d.ts +1 -0
- package/dist/types/lightning/transport/peer-manager.d.ts +11 -0
- package/dist/types/lightning/transport/websocket-frame.d.ts +2 -1
- package/dist/types/lightning/transport/websocket-server.d.ts +13 -0
- package/dist/types/lightning/transport/websocket.d.ts +1 -0
- package/dist/types/lightning/validation/index.d.ts +3 -1
- package/dist/types/lightning/wallet/wallet-funding-provider.d.ts +11 -0
- package/dist/types/lightning/watchtower/watchtower-client.d.ts +1 -1
- package/dist/types/transaction/index.d.ts +2 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/tls-verification.d.ts +4 -0
- package/dist/types/wallet/constants.d.ts +1 -0
- package/dist/types/wallet/index.d.ts +21 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/tls-verification.js +30 -0
- package/dist/utils/tls-verification.js.map +1 -0
- package/dist/wallet/constants.js +2 -1
- package/dist/wallet/constants.js.map +1 -1
- package/dist/wallet/index.js +168 -10
- package/dist/wallet/index.js.map +1 -1
- package/docs/AI_AGENT_GUIDE.md +25 -4
- package/docs/DIRECT-FUNDING-OWNERSHIP-PROOFS.md +12 -10
- package/docs/RECOVERY-GUARDIAN-WIRE.md +76 -15
- package/docs/RECOVERY-PROTOCOL.md +8 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -160,6 +160,7 @@ const res = await Wallet.create({
|
|
|
160
160
|
```
|
|
161
161
|
|
|
162
162
|
- **Failover:** with multiple servers the wallet rotates through them in order on connect/reconnect failure, then through hardcoded fallback peers for the network, with a per-server cooldown so dead servers are not hammered. Inspect `wallet.electrum.currentServer` and `wallet.electrum.rotationCount`.
|
|
163
|
+
- **Certificate verification:** by default a TLS Electrum connection is encrypted but the server certificate is not checked, because the client library dials with `rejectUnauthorized: false`. An on-path attacker can therefore stand in for the server. On Node, pass `tls: withTlsVerification(tls)` to accept only certificates that chain to a trusted CA and match the host, and add `{ fingerprints: ['AB:CD:…'] }` to also accept self-signed servers by SHA-256 fingerprint (`openssl x509 -noout -fingerprint -sha256`). The CLI/daemon and React Native do not verify yet.
|
|
163
164
|
- **Fee source:** `'electrum'` queries only the connected server via `blockchain.estimatefee`, so fee lookups never leak to mempool.space/blocktank over clearnet. `'auto'` prefers Electrum and falls back to HTTP. All remote rates are clamped to 5000 sat/vB.
|
|
164
165
|
- **Networks:** mainnet, testnet, regtest and signet work end to end (wallet, Electrum, CLI/daemon `--network signet`, Lightning chain hash and `tbs` invoice prefix). Signet shares testnet address formats and coin type 1.
|
|
165
166
|
- **BIP21:** `encodeBip21({ address, amountSats?, label?, message? })` builds a `bitcoin:` URI.
|
|
@@ -194,7 +195,7 @@ The full read-only surface works: address generation, gap-limit scanning, Electr
|
|
|
194
195
|
<details>
|
|
195
196
|
<summary><b>Hardware wallets and external signers (PSBT)</b></summary>
|
|
196
197
|
|
|
197
|
-
`buildPsbt` runs the normal setup (coin selection, change, fee) but stops before signing, returning a base64 PSBT populated with what a hardware signer needs: `witnessUtxo` (or `nonWitnessUtxo` for legacy p2pkh), `redeemScript` for p2sh-p2wpkh, `tapInternalKey` plus `tapBip32Derivation` for p2tr, and `bip32Derivation` on every wallet input. Works on full and watch-only wallets.
|
|
198
|
+
`buildPsbt` runs the normal setup (coin selection, change, fee) but stops before signing, returning a base64 PSBT populated with what a hardware signer needs: `witnessUtxo` (or `nonWitnessUtxo` for legacy p2pkh), `redeemScript` for p2sh-p2wpkh, `tapInternalKey` plus `tapBip32Derivation` for p2tr, and `bip32Derivation` on every wallet input. The change output carries the same derivation fields, so the signer shows it as change rather than as a second recipient. Works on full and watch-only wallets.
|
|
198
199
|
|
|
199
200
|
```typescript
|
|
200
201
|
// 1. Build (never touches private keys)
|
|
@@ -205,9 +206,10 @@ const { psbtBase64, fee, vsizeEstimate } = build.value;
|
|
|
205
206
|
// 2. Sign externally (hardware wallet, HWI, another machine)
|
|
206
207
|
const signedBase64 = await myHardwareWallet.signPsbt(psbtBase64);
|
|
207
208
|
|
|
208
|
-
// 3. Import:
|
|
209
|
+
// 3. Import: checks the inputs and outputs are the ones built, validates a
|
|
210
|
+
// signature on EVERY input, finalizes, does NOT broadcast
|
|
209
211
|
const imported = wallet.importSignedPsbt(signedBase64);
|
|
210
|
-
if (imported.isErr()) return; // missing/invalid signatures are rejected loudly
|
|
212
|
+
if (imported.isErr()) return; // changed outputs, missing/invalid signatures are rejected loudly
|
|
211
213
|
const { txHex, txid } = imported.value;
|
|
212
214
|
|
|
213
215
|
// 4. Broadcast when ready
|
|
@@ -217,9 +219,11 @@ await wallet.broadcastTransaction(txHex);
|
|
|
217
219
|
const combined = wallet.combinePsbts([copyA, copyB]);
|
|
218
220
|
```
|
|
219
221
|
|
|
222
|
+
`importSignedPsbt` finalizes only a PSBT that spends the same inputs to the same outputs as one this wallet instance built (it remembers its 50 most recent builds, in memory). To import a PSBT built elsewhere, or after a restart, pass the unsigned PSBT as the second argument: `wallet.importSignedPsbt(signedBase64, psbtBase64)`. Inputs the signer already finalized are refused, since their signatures cannot be checked.
|
|
223
|
+
|
|
220
224
|
For watch-only wallets the true master fingerprint is unknowable from an account xpub, so the xpub's parent fingerprint is used: signers should locate keys by derivation path.
|
|
221
225
|
|
|
222
|
-
Also on the daemon (`POST /psbt/build`, `/psbt/import-signed`, `/psbt/combine`) and the CLI (`beignet psbt build|import-signed|combine`).
|
|
226
|
+
Also on the daemon (`POST /psbt/build`, `/psbt/import-signed`, `/psbt/combine`) and the CLI (`beignet psbt build|import-signed|combine`). A restart forgets the daemon's builds, so the import there takes the unsigned PSBT too: `unsignedPsbtBase64` on the route, a second argument to `beignet psbt import-signed`.
|
|
223
227
|
|
|
224
228
|
</details>
|
|
225
229
|
|
|
@@ -262,10 +266,11 @@ const signedA = walletA.signPsbtWithOurKey(unsigned);
|
|
|
262
266
|
const signedB = walletB.signPsbtWithOurKey(unsigned);
|
|
263
267
|
if (signedA.isErr() || signedB.isErr()) return;
|
|
264
268
|
|
|
265
|
-
// 5. Combine, finalize at threshold, broadcast.
|
|
269
|
+
// 5. Combine, finalize at threshold, broadcast. The coordinator did not build
|
|
270
|
+
// the PSBT, so it checks the combined one against the unsigned original.
|
|
266
271
|
const combined = coordinator.combinePsbts([signedA.value, signedB.value]);
|
|
267
272
|
if (combined.isErr()) return;
|
|
268
|
-
const finalized = coordinator.importSignedPsbt(combined.value); // 2-of-3 met
|
|
273
|
+
const finalized = coordinator.importSignedPsbt(combined.value, unsigned); // 2-of-3 met
|
|
269
274
|
if (finalized.isErr()) return;
|
|
270
275
|
await coordinator.broadcastTransaction(finalized.value.txHex);
|
|
271
276
|
|
|
@@ -750,7 +755,9 @@ Recommended safeguards in production:
|
|
|
750
755
|
- Cap exposure with `maxPaymentSats` and `dailySpendLimitSats`. Both count a
|
|
751
756
|
payment's amount plus its routing-fee cap, so the fee cannot slip past them:
|
|
752
757
|
the cap is `maxFeeSats`/`maxFeeMsat` when you pass one, and 1% of the
|
|
753
|
-
amount (never below 50 sats) when you do not.
|
|
758
|
+
amount (never below 50 sats) when you do not. Both also cover external
|
|
759
|
+
on-chain sends (amount plus fee); see the Spending Limits section of
|
|
760
|
+
`src/cli/README.md`.
|
|
754
761
|
- Call `validatePayment()` before every send.
|
|
755
762
|
- Set `backupPath` for automated database backups, and keep an SCB (`beignet backup scb`).
|
|
756
763
|
- Keep `~/.beignet` and the data directory owner-only. The CLI creates them `0700`/`0600` and tightens an older config on load; check them again after copying files between hosts.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.resolveBackupDestination = void 0;
|
|
27
|
+
const fs = __importStar(require("fs"));
|
|
28
|
+
const path = __importStar(require("path"));
|
|
29
|
+
const backup_mac_1 = require("./backup-mac");
|
|
30
|
+
function canonicalPath(p) {
|
|
31
|
+
const resolved = path.resolve(p);
|
|
32
|
+
try {
|
|
33
|
+
return fs.realpathSync.native(resolved);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return path.join(fs.realpathSync.native(path.dirname(resolved)), path.basename(resolved));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function resolveBackupDestination(destPath, protectedPaths, overwrite) {
|
|
40
|
+
let target;
|
|
41
|
+
try {
|
|
42
|
+
target = canonicalPath(destPath);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return {
|
|
46
|
+
refusal: `Backup directory does not exist: ${path.dirname(path.resolve(destPath))}`
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (target !== target.trim()) {
|
|
50
|
+
return { refusal: 'Backup filename must not start or end with whitespace' };
|
|
51
|
+
}
|
|
52
|
+
const stat = fs.statSync(target, { throwIfNoEntry: false });
|
|
53
|
+
if (!stat && fs.lstatSync(target, { throwIfNoEntry: false })) {
|
|
54
|
+
return { refusal: `destPath is a broken symlink: ${target}` };
|
|
55
|
+
}
|
|
56
|
+
for (const p of protectedPaths) {
|
|
57
|
+
let own;
|
|
58
|
+
try {
|
|
59
|
+
own = canonicalPath(p);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
own = path.resolve(p);
|
|
63
|
+
}
|
|
64
|
+
if (own === target) {
|
|
65
|
+
return { refusal: `Refusing to overwrite a daemon file: ${target}` };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (stat && !stat.isFile()) {
|
|
69
|
+
return { refusal: `destPath is not a regular file: ${target}` };
|
|
70
|
+
}
|
|
71
|
+
if (stat && !overwrite) {
|
|
72
|
+
return {
|
|
73
|
+
refusal: `destPath already exists: ${target}. Pass overwrite: true to replace it`
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const macPath = (0, backup_mac_1.backupMacPath)(target);
|
|
77
|
+
const macStat = fs.lstatSync(macPath, { throwIfNoEntry: false });
|
|
78
|
+
if (macStat && !macStat.isFile()) {
|
|
79
|
+
return { refusal: `MAC path is not a regular file: ${macPath}` };
|
|
80
|
+
}
|
|
81
|
+
if (macStat && !overwrite) {
|
|
82
|
+
return {
|
|
83
|
+
refusal: `MAC path already exists: ${macPath}. Pass overwrite: true to replace it`
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return { path: target };
|
|
87
|
+
}
|
|
88
|
+
exports.resolveBackupDestination = resolveBackupDestination;
|
|
89
|
+
//# sourceMappingURL=backup-destination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-destination.js","sourceRoot":"","sources":["../../src/cli/backup-destination.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,uCAAyB;AACzB,2CAA6B;AAC7B,6CAA6C;AAS7C,SAAS,aAAa,CAAC,CAAS;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;KACxC;IAAC,MAAM;QACP,OAAO,IAAI,CAAC,IAAI,CACf,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAC9C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACvB,CAAC;KACF;AACF,CAAC;AAMD,SAAgB,wBAAwB,CACvC,QAAgB,EAChB,cAAwB,EACxB,SAAkB;IAElB,IAAI,MAAc,CAAC;IACnB,IAAI;QACH,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;KACjC;IAAC,MAAM;QACP,OAAO;YACN,OAAO,EAAE,oCAAoC,IAAI,CAAC,OAAO,CACxD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CACtB,EAAE;SACH,CAAC;KACF;IAED,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE;QAC7B,OAAO,EAAE,OAAO,EAAE,uDAAuD,EAAE,CAAC;KAC5E;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE;QAC7D,OAAO,EAAE,OAAO,EAAE,iCAAiC,MAAM,EAAE,EAAE,CAAC;KAC9D;IACD,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE;QAC/B,IAAI,GAAW,CAAC;QAChB,IAAI;YACH,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;SACvB;QAAC,MAAM;YACP,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SACtB;QACD,IAAI,GAAG,KAAK,MAAM,EAAE;YACnB,OAAO,EAAE,OAAO,EAAE,wCAAwC,MAAM,EAAE,EAAE,CAAC;SACrE;KACD;IACD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;QAC3B,OAAO,EAAE,OAAO,EAAE,mCAAmC,MAAM,EAAE,EAAE,CAAC;KAChE;IACD,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;QACvB,OAAO;YACN,OAAO,EAAE,4BAA4B,MAAM,sCAAsC;SACjF,CAAC;KACF;IAED,MAAM,OAAO,GAAG,IAAA,0BAAa,EAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IACjE,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE;QACjC,OAAO,EAAE,OAAO,EAAE,mCAAmC,OAAO,EAAE,EAAE,CAAC;KACjE;IACD,IAAI,OAAO,IAAI,CAAC,SAAS,EAAE;QAC1B,OAAO;YACN,OAAO,EAAE,4BAA4B,OAAO,sCAAsC;SAClF,CAAC;KACF;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC;AAvDD,4DAuDC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.readBackupMac = exports.writeBackupMac = exports.fileMac = exports.deriveBackupMacKey = exports.backupMacPath = void 0;
|
|
27
|
+
const crypto_1 = require("crypto");
|
|
28
|
+
const fs = __importStar(require("fs"));
|
|
29
|
+
const encryption_1 = require("../lightning/storage/encryption");
|
|
30
|
+
const fs_utils_1 = require("./fs-utils");
|
|
31
|
+
const BACKUP_MAC_INFO = 'beignet-db-backup-mac-v1';
|
|
32
|
+
const BACKUP_MAC_PREFIX = 'beignet-db-mac-v1:';
|
|
33
|
+
function backupMacPath(backupPath) {
|
|
34
|
+
return `${backupPath}.hmac`;
|
|
35
|
+
}
|
|
36
|
+
exports.backupMacPath = backupMacPath;
|
|
37
|
+
function deriveBackupMacKey(seed) {
|
|
38
|
+
return (0, encryption_1.hkdfKey)(seed, BACKUP_MAC_INFO);
|
|
39
|
+
}
|
|
40
|
+
exports.deriveBackupMacKey = deriveBackupMacKey;
|
|
41
|
+
async function fileMac(key, filePath) {
|
|
42
|
+
const hmac = (0, crypto_1.createHmac)('sha256', key);
|
|
43
|
+
for await (const chunk of fs.createReadStream(filePath)) {
|
|
44
|
+
hmac.update(chunk);
|
|
45
|
+
}
|
|
46
|
+
return hmac.digest();
|
|
47
|
+
}
|
|
48
|
+
exports.fileMac = fileMac;
|
|
49
|
+
async function writeBackupMac(key, backupPath) {
|
|
50
|
+
const mac = await fileMac(key, backupPath);
|
|
51
|
+
(0, fs_utils_1.writeFileAtomic)(backupMacPath(backupPath), `${BACKUP_MAC_PREFIX}${mac.toString('hex')}\n`);
|
|
52
|
+
}
|
|
53
|
+
exports.writeBackupMac = writeBackupMac;
|
|
54
|
+
function readBackupMac(backupPath) {
|
|
55
|
+
const macPath = backupMacPath(backupPath);
|
|
56
|
+
let text;
|
|
57
|
+
try {
|
|
58
|
+
text = fs.readFileSync(macPath, 'utf8').trim();
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if (err.code === 'ENOENT')
|
|
62
|
+
return null;
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
const hex = text.startsWith(BACKUP_MAC_PREFIX)
|
|
66
|
+
? text.slice(BACKUP_MAC_PREFIX.length)
|
|
67
|
+
: '';
|
|
68
|
+
if (!/^[0-9a-f]{64}$/.test(hex)) {
|
|
69
|
+
throw new Error(`Malformed backup MAC file: ${macPath}`);
|
|
70
|
+
}
|
|
71
|
+
return Buffer.from(hex, 'hex');
|
|
72
|
+
}
|
|
73
|
+
exports.readBackupMac = readBackupMac;
|
|
74
|
+
//# sourceMappingURL=backup-mac.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-mac.js","sourceRoot":"","sources":["../../src/cli/backup-mac.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,mCAAoC;AACpC,uCAAyB;AACzB,gEAA0D;AAC1D,yCAA6C;AAE7C,MAAM,eAAe,GAAG,0BAA0B,CAAC;AACnD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAG/C,SAAgB,aAAa,CAAC,UAAkB;IAC/C,OAAO,GAAG,UAAU,OAAO,CAAC;AAC7B,CAAC;AAFD,sCAEC;AAGD,SAAgB,kBAAkB,CAAC,IAAY;IAC9C,OAAO,IAAA,oBAAO,EAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AACvC,CAAC;AAFD,gDAEC;AAGM,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,QAAgB;IAC1D,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACvC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE;QACxD,IAAI,CAAC,MAAM,CAAC,KAAe,CAAC,CAAC;KAC7B;IACD,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;AACtB,CAAC;AAND,0BAMC;AAGM,KAAK,UAAU,cAAc,CACnC,GAAW,EACX,UAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC3C,IAAA,0BAAe,EACd,aAAa,CAAC,UAAU,CAAC,EACzB,GAAG,iBAAiB,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAC9C,CAAC;AACH,CAAC;AATD,wCASC;AAMD,SAAgB,aAAa,CAAC,UAAkB;IAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,IAAY,CAAC;IACjB,IAAI;QACH,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KAC/C;IAAC,OAAO,GAAG,EAAE;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;KACV;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAC7C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC;QACtC,CAAC,CAAC,EAAE,CAAC;IACN,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAChC,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;KACzD;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAhBD,sCAgBC"}
|