squidcloudctl 1.3.0 → 3.0.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 +72 -0
- package/dist/auth-revoke-LTTGYMMO.js +2 -0
- package/dist/auth-revoke-LTTGYMMO.js.map +1 -0
- package/dist/auth-sessions-ZVZIABS6.js +2 -0
- package/dist/auth-sessions-ZVZIABS6.js.map +1 -0
- package/dist/auth-status-X4HCOXHF.js +2 -0
- package/dist/auth-status-X4HCOXHF.js.map +1 -0
- package/dist/bin/squidcloud.js +189 -3
- package/dist/bin/squidcloud.js.map +1 -1
- package/dist/chunk-2RAH2YAY.js +6 -0
- package/dist/chunk-2RAH2YAY.js.map +1 -0
- package/dist/chunk-3E23ZFCV.js +2 -0
- package/dist/chunk-3E23ZFCV.js.map +1 -0
- package/dist/chunk-3JD6INFN.js +2 -0
- package/dist/chunk-3JD6INFN.js.map +1 -0
- package/dist/chunk-3XXAN3BP.js +2 -0
- package/dist/chunk-3XXAN3BP.js.map +1 -0
- package/dist/chunk-43FK57CR.js +2 -0
- package/dist/chunk-43FK57CR.js.map +1 -0
- package/dist/chunk-4625KLCT.js +2 -0
- package/dist/chunk-4625KLCT.js.map +1 -0
- package/dist/chunk-4EBJSKII.js +2 -0
- package/dist/chunk-4EBJSKII.js.map +1 -0
- package/dist/chunk-4FZZ3I76.js +3 -0
- package/dist/chunk-4FZZ3I76.js.map +1 -0
- package/dist/chunk-4GV6L47P.js +2 -0
- package/dist/chunk-4GV6L47P.js.map +1 -0
- package/dist/chunk-4VH6P4GC.js +2 -0
- package/dist/chunk-4VH6P4GC.js.map +1 -0
- package/dist/chunk-4VMT6FXR.js +2 -0
- package/dist/chunk-4VMT6FXR.js.map +1 -0
- package/dist/chunk-5JWZKMAI.js +2 -0
- package/dist/chunk-5JWZKMAI.js.map +1 -0
- package/dist/chunk-5TYVWTHC.js +2 -0
- package/dist/chunk-5TYVWTHC.js.map +1 -0
- package/dist/chunk-5XSOEZ7F.js +2 -0
- package/dist/chunk-5XSOEZ7F.js.map +1 -0
- package/dist/chunk-632C2FZM.js +2 -0
- package/dist/chunk-632C2FZM.js.map +1 -0
- package/dist/chunk-6IXURJIU.js +2 -0
- package/dist/chunk-6IXURJIU.js.map +1 -0
- package/dist/chunk-6LLJ6P3U.js +2 -0
- package/dist/chunk-6LLJ6P3U.js.map +1 -0
- package/dist/chunk-7JVXW7C4.js +2 -0
- package/dist/chunk-7JVXW7C4.js.map +1 -0
- package/dist/chunk-7TMB3QXF.js +2 -0
- package/dist/chunk-7TMB3QXF.js.map +1 -0
- package/dist/chunk-ADVALEDT.js +2 -0
- package/dist/chunk-ADVALEDT.js.map +1 -0
- package/dist/chunk-AN6SA3TI.js +2 -0
- package/dist/chunk-AN6SA3TI.js.map +1 -0
- package/dist/chunk-AZ4774YQ.js +2 -0
- package/dist/chunk-AZ4774YQ.js.map +1 -0
- package/dist/chunk-BDRSOUY3.js +2 -0
- package/dist/chunk-BDRSOUY3.js.map +1 -0
- package/dist/chunk-BDUD2TSS.js +2 -0
- package/dist/chunk-BDUD2TSS.js.map +1 -0
- package/dist/chunk-BGOM6C6D.js +2 -0
- package/dist/chunk-BGOM6C6D.js.map +1 -0
- package/dist/chunk-BUG4O26P.js +2 -0
- package/dist/chunk-BUG4O26P.js.map +1 -0
- package/dist/chunk-BUKRJMQ5.js +2 -0
- package/dist/chunk-BUKRJMQ5.js.map +1 -0
- package/dist/chunk-C7M6KZGB.js +2 -0
- package/dist/chunk-C7M6KZGB.js.map +1 -0
- package/dist/chunk-CRT5ANG2.js +2 -0
- package/dist/chunk-CRT5ANG2.js.map +1 -0
- package/dist/chunk-E26CRSCS.js +2 -0
- package/dist/chunk-E26CRSCS.js.map +1 -0
- package/dist/chunk-E5PJTTE5.js +2 -0
- package/dist/chunk-E5PJTTE5.js.map +1 -0
- package/dist/chunk-E6UJ45WU.js +2 -0
- package/dist/chunk-E6UJ45WU.js.map +1 -0
- package/dist/chunk-EDD2NCQT.js +2 -0
- package/dist/chunk-EDD2NCQT.js.map +1 -0
- package/dist/chunk-FJ5D3ELC.js +2 -0
- package/dist/chunk-FJ5D3ELC.js.map +1 -0
- package/dist/chunk-GFTSNOCG.js +5 -0
- package/dist/chunk-GFTSNOCG.js.map +1 -0
- package/dist/chunk-GMKCZ2PB.js +2 -0
- package/dist/chunk-GMKCZ2PB.js.map +1 -0
- package/dist/chunk-GRZ7FAK4.js +2 -0
- package/dist/chunk-GRZ7FAK4.js.map +1 -0
- package/dist/chunk-GVYPGCEO.js +2 -0
- package/dist/chunk-GVYPGCEO.js.map +1 -0
- package/dist/chunk-H3FD4YYC.js +2 -0
- package/dist/chunk-H3FD4YYC.js.map +1 -0
- package/dist/chunk-I3DVKNFK.js +2 -0
- package/dist/chunk-I3DVKNFK.js.map +1 -0
- package/dist/chunk-IER3WJEG.js +2 -0
- package/dist/chunk-IER3WJEG.js.map +1 -0
- package/dist/chunk-J5MM66CO.js +2 -0
- package/dist/chunk-J5MM66CO.js.map +1 -0
- package/dist/chunk-K4UZNQFC.js +2 -0
- package/dist/chunk-K4UZNQFC.js.map +1 -0
- package/dist/chunk-KJIMUYAU.js +2 -0
- package/dist/chunk-KJIMUYAU.js.map +1 -0
- package/dist/chunk-KLPKNHXU.js +2 -0
- package/dist/chunk-KLPKNHXU.js.map +1 -0
- package/dist/chunk-KQE3YLI3.js +2 -0
- package/dist/chunk-KQE3YLI3.js.map +1 -0
- package/dist/chunk-KZ7RBLQY.js +2 -0
- package/dist/chunk-KZ7RBLQY.js.map +1 -0
- package/dist/chunk-LDYPQMLZ.js +2 -0
- package/dist/chunk-LDYPQMLZ.js.map +1 -0
- package/dist/chunk-LFPHETWG.js +2 -0
- package/dist/chunk-LFPHETWG.js.map +1 -0
- package/dist/chunk-M6RN7Y3S.js +2 -0
- package/dist/chunk-M6RN7Y3S.js.map +1 -0
- package/dist/chunk-N6QOCJDY.js +2 -0
- package/dist/chunk-N6QOCJDY.js.map +1 -0
- package/dist/chunk-NB4OO3VK.js +2 -0
- package/dist/chunk-NB4OO3VK.js.map +1 -0
- package/dist/chunk-NJC4W2S6.js +2 -0
- package/dist/chunk-NJC4W2S6.js.map +1 -0
- package/dist/chunk-NJCALUUB.js +2 -0
- package/dist/chunk-NJCALUUB.js.map +1 -0
- package/dist/chunk-NS5IBNC2.js +2 -0
- package/dist/chunk-NS5IBNC2.js.map +1 -0
- package/dist/chunk-OCDE2G25.js +2 -0
- package/dist/chunk-OCDE2G25.js.map +1 -0
- package/dist/chunk-OEURGJIH.js +2 -0
- package/dist/chunk-OEURGJIH.js.map +1 -0
- package/dist/chunk-OPZJKTOV.js +2 -0
- package/dist/chunk-OPZJKTOV.js.map +1 -0
- package/dist/chunk-OXJ6DOWC.js +2 -0
- package/dist/chunk-OXJ6DOWC.js.map +1 -0
- package/dist/chunk-P42LDK4T.js +2 -0
- package/dist/chunk-P42LDK4T.js.map +1 -0
- package/dist/chunk-PGDN5F2F.js +2 -0
- package/dist/chunk-PGDN5F2F.js.map +1 -0
- package/dist/chunk-PVZ4PRGM.js +2 -0
- package/dist/chunk-PVZ4PRGM.js.map +1 -0
- package/dist/chunk-QCDCTQU5.js +2 -0
- package/dist/chunk-QCDCTQU5.js.map +1 -0
- package/dist/chunk-QEG6LP5X.js +2 -0
- package/dist/chunk-QEG6LP5X.js.map +1 -0
- package/dist/chunk-QF3NWEHO.js +2 -0
- package/dist/chunk-QF3NWEHO.js.map +1 -0
- package/dist/chunk-QLLHU2RS.js +2 -0
- package/dist/chunk-QLLHU2RS.js.map +1 -0
- package/dist/chunk-R2PV6TY4.js +2 -0
- package/dist/chunk-R2PV6TY4.js.map +1 -0
- package/dist/chunk-RREABTVT.js +2 -0
- package/dist/chunk-RREABTVT.js.map +1 -0
- package/dist/chunk-RRGGKRRS.js +2 -0
- package/dist/chunk-RRGGKRRS.js.map +1 -0
- package/dist/chunk-RYEKRFP5.js +2 -0
- package/dist/chunk-RYEKRFP5.js.map +1 -0
- package/dist/chunk-SBNM6EQO.js +2 -0
- package/dist/chunk-SBNM6EQO.js.map +1 -0
- package/dist/chunk-T6VFW2SW.js +2 -0
- package/dist/chunk-T6VFW2SW.js.map +1 -0
- package/dist/chunk-TAS2JGNI.js +2 -0
- package/dist/chunk-TAS2JGNI.js.map +1 -0
- package/dist/chunk-UO2SSIIZ.js +3 -0
- package/dist/chunk-UO2SSIIZ.js.map +1 -0
- package/dist/chunk-UYERZEPM.js +2 -0
- package/dist/chunk-UYERZEPM.js.map +1 -0
- package/dist/chunk-V3UZYH25.js +2 -0
- package/dist/chunk-V3UZYH25.js.map +1 -0
- package/dist/chunk-VBOLWWMB.js +2 -0
- package/dist/chunk-VBOLWWMB.js.map +1 -0
- package/dist/chunk-VDWSP3BD.js +3 -0
- package/dist/chunk-VDWSP3BD.js.map +1 -0
- package/dist/chunk-VPEATOB2.js +2 -0
- package/dist/chunk-VPEATOB2.js.map +1 -0
- package/dist/chunk-VXPI52BF.js +2 -0
- package/dist/chunk-VXPI52BF.js.map +1 -0
- package/dist/chunk-WOMYFCVM.js +2 -0
- package/dist/chunk-WOMYFCVM.js.map +1 -0
- package/dist/chunk-WVCLY4PF.js +2 -0
- package/dist/chunk-WVCLY4PF.js.map +1 -0
- package/dist/chunk-WVS5JOCE.js +2 -0
- package/dist/chunk-WVS5JOCE.js.map +1 -0
- package/dist/chunk-X33BC54Z.js +2 -0
- package/dist/chunk-X33BC54Z.js.map +1 -0
- package/dist/chunk-XHGWAAJS.js +2 -0
- package/dist/chunk-XHGWAAJS.js.map +1 -0
- package/dist/chunk-XJTNICPE.js +2 -0
- package/dist/chunk-XJTNICPE.js.map +1 -0
- package/dist/chunk-YBKX6Q3Q.js +2 -0
- package/dist/chunk-YBKX6Q3Q.js.map +1 -0
- package/dist/chunk-YE2FF227.js +2 -0
- package/dist/chunk-YE2FF227.js.map +1 -0
- package/dist/chunk-YMTB3NHI.js +2 -0
- package/dist/chunk-YMTB3NHI.js.map +1 -0
- package/dist/chunk-YQQMT67S.js +2 -0
- package/dist/chunk-YQQMT67S.js.map +1 -0
- package/dist/chunk-YRSMMECJ.js +2 -0
- package/dist/chunk-YRSMMECJ.js.map +1 -0
- package/dist/chunk-Z4BTW3UI.js +2 -0
- package/dist/chunk-Z4BTW3UI.js.map +1 -0
- package/dist/chunk-ZGBTOZ7M.js +2 -0
- package/dist/chunk-ZGBTOZ7M.js.map +1 -0
- package/dist/chunk-ZQ2OIVG3.js +2 -0
- package/dist/chunk-ZQ2OIVG3.js.map +1 -0
- package/dist/chunk-ZXNTK3KX.js +2 -0
- package/dist/chunk-ZXNTK3KX.js.map +1 -0
- package/dist/chunk-ZY4RVPTF.js +2 -0
- package/dist/chunk-ZY4RVPTF.js.map +1 -0
- package/dist/chunk-ZZSRCXWK.js +2 -0
- package/dist/chunk-ZZSRCXWK.js.map +1 -0
- package/dist/collab-activity-R6AYISVI.js +2 -0
- package/dist/collab-activity-R6AYISVI.js.map +1 -0
- package/dist/collab-invite-TUWJGMNS.js +2 -0
- package/dist/collab-invite-TUWJGMNS.js.map +1 -0
- package/dist/collab-leave-GRSWXTOP.js +2 -0
- package/dist/collab-leave-GRSWXTOP.js.map +1 -0
- package/dist/collab-list-ZKZTNIGX.js +2 -0
- package/dist/collab-list-ZKZTNIGX.js.map +1 -0
- package/dist/collab-remove-2HYNLLLX.js +2 -0
- package/dist/collab-remove-2HYNLLLX.js.map +1 -0
- package/dist/collab-transfer-HC5KHBV5.js +2 -0
- package/dist/collab-transfer-HC5KHBV5.js.map +1 -0
- package/dist/commands/auth/auth-status.js +29 -0
- package/dist/commands/auth/index.js +1 -1
- package/dist/commands/auth/login-device.js +70 -0
- package/dist/commands/auth/login-oauth.js +81 -0
- package/dist/commands/auth/logout.js +23 -0
- package/dist/commands/auth/whoami.js +21 -0
- package/dist/commands/collab/index.js +1 -1
- package/dist/commands/deploy/index.js +1 -2
- package/dist/commands/deploy/index.js.map +1 -1
- package/dist/commands/filereq/client.js +37 -0
- package/dist/commands/filereq/create.js +36 -0
- package/dist/commands/filereq/delete.js +18 -0
- package/dist/commands/filereq/list.js +17 -0
- package/dist/commands/filereq/submissions.js +29 -0
- package/dist/commands/files/download.js +23 -0
- package/dist/commands/files/list.js +33 -0
- package/dist/commands/files/upload.js +57 -0
- package/dist/commands/forms/index.js +1 -1
- package/dist/commands/fs/binary.js +110 -0
- package/dist/commands/fs/mount.js +46 -0
- package/dist/commands/fs/status.js +18 -0
- package/dist/commands/fs/stop.js +19 -0
- package/dist/commands/fs/webdav.js +1 -0
- package/dist/commands/health.js +20 -0
- package/dist/commands/host/api.js +186 -0
- package/dist/commands/host/keys.js +63 -0
- package/dist/commands/host/status.js +15 -0
- package/dist/commands/host/stop.js +19 -0
- package/dist/commands/logs/index.js +1 -1
- package/dist/commands/monitor/index.js +1 -1
- package/dist/commands/scripts/index.js +1 -1
- package/dist/commands/secrets/list.js +14 -0
- package/dist/commands/secrets/secrets-create.js +28 -0
- package/dist/commands/secrets/secrets-delete.js +9 -0
- package/dist/commands/secrets/secrets-list.js +1 -0
- package/dist/commands/secrets/secrets-rename.js +9 -0
- package/dist/commands/secrets/secrets-verify.js +16 -0
- package/dist/commands/share/create.js +34 -0
- package/dist/commands/sign/index.js +1 -1
- package/dist/commands/sites/client.js +20 -0
- package/dist/commands/sites/index.js +1 -1
- package/dist/commands/sites/list.js +18 -0
- package/dist/commands/sites/open.js +12 -0
- package/dist/commands/sites/unpublish.js +32 -0
- package/dist/commands/sites/visibility.js +16 -0
- package/dist/commands/storage/commands.js +114 -0
- package/dist/commands/storage/folders-create.js +15 -0
- package/dist/commands/storage/folders-helpers.js +8 -0
- package/dist/commands/storage/folders-list.js +14 -0
- package/dist/commands/storage/index.js +1 -1
- package/dist/commands/storage/storage-cp.js +1 -0
- package/dist/commands/storage/storage-download.js +1 -0
- package/dist/commands/storage/storage-info.js +1 -0
- package/dist/commands/storage/storage-ls.js +1 -0
- package/dist/commands/storage/storage-mkdir.js +15 -0
- package/dist/commands/storage/storage-mv.js +1 -0
- package/dist/commands/storage/storage-rm.js +1 -0
- package/dist/commands/storage/storage-search.js +1 -0
- package/dist/commands/storage/storage-upload.js +1 -0
- package/dist/commands/time/index.js +1 -1
- package/dist/commands/util/index.js +1 -1
- package/dist/commands/util/version.js +16 -0
- package/dist/completion-DY4JRFCG.js +2 -0
- package/dist/completion-DY4JRFCG.js.map +1 -0
- package/dist/config-GGD4POJI.js +2 -0
- package/dist/config-GGD4POJI.js.map +1 -0
- package/dist/config-delete-K42TE5KR.js +2 -0
- package/dist/config-delete-K42TE5KR.js.map +1 -0
- package/dist/config-get-7BFP6F4Q.js +2 -0
- package/dist/config-get-7BFP6F4Q.js.map +1 -0
- package/dist/config-reset-BIGP2K2H.js +2 -0
- package/dist/config-reset-BIGP2K2H.js.map +1 -0
- package/dist/config-set-C6PZ3J6Q.js +2 -0
- package/dist/config-set-C6PZ3J6Q.js.map +1 -0
- package/dist/create-G6YH4DLB.js +2 -0
- package/dist/create-G6YH4DLB.js.map +1 -0
- package/dist/create-GMSJQNJC.js +2 -0
- package/dist/create-GMSJQNJC.js.map +1 -0
- package/dist/credits-6PQPN6AJ.js +2 -0
- package/dist/credits-6PQPN6AJ.js.map +1 -0
- package/dist/doctor-WVBOVEGI.js +2 -0
- package/dist/doctor-WVBOVEGI.js.map +1 -0
- package/dist/download-C3JFSCQ4.js +2 -0
- package/dist/download-C3JFSCQ4.js.map +1 -0
- package/dist/feedback-A522XU46.js +2 -0
- package/dist/feedback-A522XU46.js.map +1 -0
- package/dist/forms-clear-OVSVO22O.js +2 -0
- package/dist/forms-clear-OVSVO22O.js.map +1 -0
- package/dist/forms-create-BLNCFEXX.js +2 -0
- package/dist/forms-create-BLNCFEXX.js.map +1 -0
- package/dist/forms-delete-DS2YSDUQ.js +2 -0
- package/dist/forms-delete-DS2YSDUQ.js.map +1 -0
- package/dist/forms-embed-WIFFAJZZ.js +2 -0
- package/dist/forms-embed-WIFFAJZZ.js.map +1 -0
- package/dist/forms-export-FQQI7SV2.js +2 -0
- package/dist/forms-export-FQQI7SV2.js.map +1 -0
- package/dist/forms-info-QXGLAQBN.js +2 -0
- package/dist/forms-info-QXGLAQBN.js.map +1 -0
- package/dist/forms-list-2CNVSPKA.js +2 -0
- package/dist/forms-list-2CNVSPKA.js.map +1 -0
- package/dist/forms-submissions-Q3FV3AC3.js +2 -0
- package/dist/forms-submissions-Q3FV3AC3.js.map +1 -0
- package/dist/health-Q5OYY2QY.js +2 -0
- package/dist/health-Q5OYY2QY.js.map +1 -0
- package/dist/lib/api/cert-pin.js +28 -0
- package/dist/lib/api/client.js +132 -0
- package/dist/lib/api/index.js +1 -2
- package/dist/lib/api/upload-res54.js +104 -0
- package/dist/lib/auth/constants.js +6 -0
- package/dist/lib/auth/fingerprint.js +39 -0
- package/dist/lib/auth/index.js +5 -2
- package/dist/lib/auth/index.js.map +1 -1
- package/dist/lib/auth/keychain.js +56 -0
- package/dist/lib/auth/oauth-session.js +89 -0
- package/dist/lib/auth/refresh.js +93 -0
- package/dist/lib/auth/session.js +34 -0
- package/dist/lib/auth/ssp-handshake.js +72 -0
- package/dist/lib/crypto/encrypt-file.js +64 -0
- package/dist/lib/crypto/index.js +2 -2
- package/dist/lib/crypto/sanitize.js +19 -0
- package/dist/lib/crypto/ssp.js +80 -0
- package/dist/lib/deploy/allowlist.js +16 -0
- package/dist/lib/deploy/detector.js +53 -0
- package/dist/lib/deploy/index.js +2 -2
- package/dist/lib/deploy/index.js.map +1 -1
- package/dist/lib/forms/index.js +1 -0
- package/dist/lib/host/microredis.js +191 -0
- package/dist/lib/host/security.js +142 -0
- package/dist/lib/host/server.js +240 -0
- package/dist/lib/output/banner.js +58 -0
- package/dist/lib/output/brand.js +37 -0
- package/dist/lib/output/index.js +11 -2
- package/dist/lib/output/logger.js +114 -0
- package/dist/lib/output/mascot.js +31 -0
- package/dist/lib/output/spinner.js +44 -0
- package/dist/lib/output/table.js +81 -0
- package/dist/lib/picker.js +71 -0
- package/dist/lib/refs-types.js +1 -0
- package/dist/lib/refs.js +81 -0
- package/dist/lib/transfer.js +168 -0
- package/dist/lib/upload/index.js +1 -2
- package/dist/lib/utils/ci-detect.js +28 -0
- package/dist/lib/utils/format.js +70 -0
- package/dist/lib/utils/index.js +2 -2
- package/dist/lib/utils/open.js +16 -0
- package/dist/list-3P3SIMDW.js +2 -0
- package/dist/list-3P3SIMDW.js.map +1 -0
- package/dist/list-BK2B4CQI.js +4 -0
- package/dist/list-BK2B4CQI.js.map +1 -0
- package/dist/list-PVSQ7A54.js +4 -0
- package/dist/list-PVSQ7A54.js.map +1 -0
- package/dist/login-device-ATMWTABG.js +2 -0
- package/dist/login-device-ATMWTABG.js.map +1 -0
- package/dist/login-oauth-CDU3A5QB.js +2 -0
- package/dist/login-oauth-CDU3A5QB.js.map +1 -0
- package/dist/logout-AV7RCXWJ.js +2 -0
- package/dist/logout-AV7RCXWJ.js.map +1 -0
- package/dist/logs-export-M2FQFCNI.js +2 -0
- package/dist/logs-export-M2FQFCNI.js.map +1 -0
- package/dist/logs-search-JSCT3K5O.js +2 -0
- package/dist/logs-search-JSCT3K5O.js.map +1 -0
- package/dist/logs-tail-W5YO2QRG.js +2 -0
- package/dist/logs-tail-W5YO2QRG.js.map +1 -0
- package/dist/monitor-5AKUYIKP.js +2 -0
- package/dist/monitor-5AKUYIKP.js.map +1 -0
- package/dist/monitor-automations-YAAS7N6L.js +2 -0
- package/dist/monitor-automations-YAAS7N6L.js.map +1 -0
- package/dist/monitor-pipelines-JO4DQ6T4.js +2 -0
- package/dist/monitor-pipelines-JO4DQ6T4.js.map +1 -0
- package/dist/monitor-sites-5IEY3Y2F.js +2 -0
- package/dist/monitor-sites-5IEY3Y2F.js.map +1 -0
- package/dist/monitor-storage-6HG6URCV.js +2 -0
- package/dist/monitor-storage-6HG6URCV.js.map +1 -0
- package/dist/oauth-session-KBMWAOVL.js +2 -0
- package/dist/oauth-session-KBMWAOVL.js.map +1 -0
- package/dist/registry/index.js +61 -2
- package/dist/scripts-cancel-2XO47DN7.js +2 -0
- package/dist/scripts-cancel-2XO47DN7.js.map +1 -0
- package/dist/scripts-delete-A6TXCHNO.js +2 -0
- package/dist/scripts-delete-A6TXCHNO.js.map +1 -0
- package/dist/scripts-disable-7GIY3YOK.js +2 -0
- package/dist/scripts-disable-7GIY3YOK.js.map +1 -0
- package/dist/scripts-enable-NGIS5VDP.js +2 -0
- package/dist/scripts-enable-NGIS5VDP.js.map +1 -0
- package/dist/scripts-init-J37ZGUDW.js +2 -0
- package/dist/scripts-init-J37ZGUDW.js.map +1 -0
- package/dist/scripts-list-ECFFKNOI.js +2 -0
- package/dist/scripts-list-ECFFKNOI.js.map +1 -0
- package/dist/scripts-logs-4DMITGNX.js +2 -0
- package/dist/scripts-logs-4DMITGNX.js.map +1 -0
- package/dist/scripts-run-CHHP53KW.js +2 -0
- package/dist/scripts-run-CHHP53KW.js.map +1 -0
- package/dist/scripts-status-YZTKCLMU.js +2 -0
- package/dist/scripts-status-YZTKCLMU.js.map +1 -0
- package/dist/scripts-validate-LGMQVRTC.js +2 -0
- package/dist/scripts-validate-LGMQVRTC.js.map +1 -0
- package/dist/scripts-watch-W2C4CBZZ.js +2 -0
- package/dist/scripts-watch-W2C4CBZZ.js.map +1 -0
- package/dist/secrets-audit-SZZ2RG77.js +2 -0
- package/dist/secrets-audit-SZZ2RG77.js.map +1 -0
- package/dist/secrets-create-QLUNM3JL.js +3 -0
- package/dist/secrets-create-QLUNM3JL.js.map +1 -0
- package/dist/secrets-delete-ISNVSZVL.js +2 -0
- package/dist/secrets-delete-ISNVSZVL.js.map +1 -0
- package/dist/secrets-export-R7VPKQCW.js +3 -0
- package/dist/secrets-export-R7VPKQCW.js.map +1 -0
- package/dist/secrets-init-TKIIJKCB.js +13 -0
- package/dist/secrets-init-TKIIJKCB.js.map +1 -0
- package/dist/secrets-list-YPMO7PWR.js +2 -0
- package/dist/secrets-list-YPMO7PWR.js.map +1 -0
- package/dist/secrets-rename-X7Q6PLPI.js +2 -0
- package/dist/secrets-rename-X7Q6PLPI.js.map +1 -0
- package/dist/secrets-verify-GZCFB6RI.js +2 -0
- package/dist/secrets-verify-GZCFB6RI.js.map +1 -0
- package/dist/sign-cancel-H34SAG56.js +2 -0
- package/dist/sign-cancel-H34SAG56.js.map +1 -0
- package/dist/sign-download-3MAWJ2XB.js +2 -0
- package/dist/sign-download-3MAWJ2XB.js.map +1 -0
- package/dist/sign-list-NW5WYD4V.js +2 -0
- package/dist/sign-list-NW5WYD4V.js.map +1 -0
- package/dist/sign-request-HFI3KJ2L.js +2 -0
- package/dist/sign-request-HFI3KJ2L.js.map +1 -0
- package/dist/sign-status-BD7S2FEA.js +2 -0
- package/dist/sign-status-BD7S2FEA.js.map +1 -0
- package/dist/sign-verify-OCYA4RI3.js +2 -0
- package/dist/sign-verify-OCYA4RI3.js.map +1 -0
- package/dist/sites-analytics-AJIFXZEM.js +2 -0
- package/dist/sites-analytics-AJIFXZEM.js.map +1 -0
- package/dist/sites-delete-SDBENOY6.js +2 -0
- package/dist/sites-delete-SDBENOY6.js.map +1 -0
- package/dist/sites-deploys-WHLZTAYW.js +2 -0
- package/dist/sites-deploys-WHLZTAYW.js.map +1 -0
- package/dist/sites-info-RZJNVFFP.js +2 -0
- package/dist/sites-info-RZJNVFFP.js.map +1 -0
- package/dist/sites-list-DKZWNHLM.js +2 -0
- package/dist/sites-list-DKZWNHLM.js.map +1 -0
- package/dist/sites-logs-O35RH2CT.js +2 -0
- package/dist/sites-logs-O35RH2CT.js.map +1 -0
- package/dist/sites-open-QE6RD5JB.js +2 -0
- package/dist/sites-open-QE6RD5JB.js.map +1 -0
- package/dist/sites-purge-KROBLAUK.js +2 -0
- package/dist/sites-purge-KROBLAUK.js.map +1 -0
- package/dist/sites-rename-YMZQ5C37.js +2 -0
- package/dist/sites-rename-YMZQ5C37.js.map +1 -0
- package/dist/sites-rollback-OQXR2V5A.js +2 -0
- package/dist/sites-rollback-OQXR2V5A.js.map +1 -0
- package/dist/sites-unpublish-VKEPVVOB.js +2 -0
- package/dist/sites-unpublish-VKEPVVOB.js.map +1 -0
- package/dist/sites-visibility-Q2WXPRFB.js +2 -0
- package/dist/sites-visibility-Q2WXPRFB.js.map +1 -0
- package/dist/storage-cat-Z42FIYKB.js +2 -0
- package/dist/storage-cat-Z42FIYKB.js.map +1 -0
- package/dist/storage-clean-E3ZU5JVL.js +2 -0
- package/dist/storage-clean-E3ZU5JVL.js.map +1 -0
- package/dist/storage-cp-IBCATT2F.js +2 -0
- package/dist/storage-cp-IBCATT2F.js.map +1 -0
- package/dist/storage-diff-FX4QVDH7.js +2 -0
- package/dist/storage-diff-FX4QVDH7.js.map +1 -0
- package/dist/storage-download-ULJS52LJ.js +2 -0
- package/dist/storage-download-ULJS52LJ.js.map +1 -0
- package/dist/storage-info-HRE7ORAJ.js +2 -0
- package/dist/storage-info-HRE7ORAJ.js.map +1 -0
- package/dist/storage-ls-Z555BXZI.js +2 -0
- package/dist/storage-ls-Z555BXZI.js.map +1 -0
- package/dist/storage-mkdir-PODYCT7K.js +2 -0
- package/dist/storage-mkdir-PODYCT7K.js.map +1 -0
- package/dist/storage-mv-KHOZW76V.js +2 -0
- package/dist/storage-mv-KHOZW76V.js.map +1 -0
- package/dist/storage-rm-XJME2PBW.js +2 -0
- package/dist/storage-rm-XJME2PBW.js.map +1 -0
- package/dist/storage-search-2M3QMF4E.js +2 -0
- package/dist/storage-search-2M3QMF4E.js.map +1 -0
- package/dist/storage-share-6DANEN4S.js +2 -0
- package/dist/storage-share-6DANEN4S.js.map +1 -0
- package/dist/storage-tag-QGPV7RX3.js +2 -0
- package/dist/storage-tag-QGPV7RX3.js.map +1 -0
- package/dist/storage-unshare-DJCEMHE3.js +2 -0
- package/dist/storage-unshare-DJCEMHE3.js.map +1 -0
- package/dist/storage-upload-UKQYASCU.js +2 -0
- package/dist/storage-upload-UKQYASCU.js.map +1 -0
- package/dist/time-list-32LQSLS3.js +2 -0
- package/dist/time-list-32LQSLS3.js.map +1 -0
- package/dist/time-lock-5RHHTCYW.js +2 -0
- package/dist/time-lock-5RHHTCYW.js.map +1 -0
- package/dist/time-proof-7F7MGTC7.js +2 -0
- package/dist/time-proof-7F7MGTC7.js.map +1 -0
- package/dist/time-status-OC5Y5DI5.js +2 -0
- package/dist/time-status-OC5Y5DI5.js.map +1 -0
- package/dist/time-unlock-23PW3U3H.js +2 -0
- package/dist/time-unlock-23PW3U3H.js.map +1 -0
- package/dist/update-VAIGKTAJ.js +2 -0
- package/dist/update-VAIGKTAJ.js.map +1 -0
- package/dist/upload-ME5JGLCS.js +2 -0
- package/dist/upload-ME5JGLCS.js.map +1 -0
- package/dist/usage-HWFCDFQQ.js +2 -0
- package/dist/usage-HWFCDFQQ.js.map +1 -0
- package/dist/version-TFYCABEC.js +2 -0
- package/dist/version-TFYCABEC.js.map +1 -0
- package/dist/whoami-A65QZCK3.js +2 -0
- package/dist/whoami-A65QZCK3.js.map +1 -0
- package/package.json +29 -45
- package/dist/auth-revoke-NEWOUC3A.js +0 -2
- package/dist/auth-revoke-NEWOUC3A.js.map +0 -1
- package/dist/auth-sessions-JOC7PEUT.js +0 -2
- package/dist/auth-sessions-JOC7PEUT.js.map +0 -1
- package/dist/auth-status-FUO72AA4.js +0 -2
- package/dist/auth-status-FUO72AA4.js.map +0 -1
- package/dist/chunk-23ZOP633.js +0 -2
- package/dist/chunk-23ZOP633.js.map +0 -1
- package/dist/chunk-2MWPBWUD.js +0 -3
- package/dist/chunk-2MWPBWUD.js.map +0 -1
- package/dist/chunk-3OYNZIJC.js +0 -2
- package/dist/chunk-3OYNZIJC.js.map +0 -1
- package/dist/chunk-3OZ4O4NE.js +0 -2
- package/dist/chunk-3OZ4O4NE.js.map +0 -1
- package/dist/chunk-3YAAQAPA.js +0 -2
- package/dist/chunk-3YAAQAPA.js.map +0 -1
- package/dist/chunk-4MW5J5VT.js +0 -2
- package/dist/chunk-4MW5J5VT.js.map +0 -1
- package/dist/chunk-4N7AHGIY.js +0 -2
- package/dist/chunk-4N7AHGIY.js.map +0 -1
- package/dist/chunk-4USNCNOY.js +0 -2
- package/dist/chunk-4USNCNOY.js.map +0 -1
- package/dist/chunk-4VJET5IM.js +0 -2
- package/dist/chunk-4VJET5IM.js.map +0 -1
- package/dist/chunk-52WHEL73.js +0 -2
- package/dist/chunk-52WHEL73.js.map +0 -1
- package/dist/chunk-54BNCBLD.js +0 -2
- package/dist/chunk-54BNCBLD.js.map +0 -1
- package/dist/chunk-54MZLE2R.js +0 -2
- package/dist/chunk-54MZLE2R.js.map +0 -1
- package/dist/chunk-57X5IOZ5.js +0 -2
- package/dist/chunk-57X5IOZ5.js.map +0 -1
- package/dist/chunk-5DXTXML2.js +0 -2
- package/dist/chunk-5DXTXML2.js.map +0 -1
- package/dist/chunk-5JPIAFB2.js +0 -2
- package/dist/chunk-5JPIAFB2.js.map +0 -1
- package/dist/chunk-5TMR6Y7L.js +0 -2
- package/dist/chunk-5TMR6Y7L.js.map +0 -1
- package/dist/chunk-5Z3A46OK.js +0 -2
- package/dist/chunk-5Z3A46OK.js.map +0 -1
- package/dist/chunk-6CK2UBNM.js +0 -2
- package/dist/chunk-6CK2UBNM.js.map +0 -1
- package/dist/chunk-6RI4Z6IY.js +0 -2
- package/dist/chunk-6RI4Z6IY.js.map +0 -1
- package/dist/chunk-6VDGYAGT.js +0 -2
- package/dist/chunk-6VDGYAGT.js.map +0 -1
- package/dist/chunk-74TMDLBA.js +0 -2
- package/dist/chunk-74TMDLBA.js.map +0 -1
- package/dist/chunk-7DPXZUZY.js +0 -2
- package/dist/chunk-7DPXZUZY.js.map +0 -1
- package/dist/chunk-7VVZS6US.js +0 -2
- package/dist/chunk-7VVZS6US.js.map +0 -1
- package/dist/chunk-A6WS3TOF.js +0 -2
- package/dist/chunk-A6WS3TOF.js.map +0 -1
- package/dist/chunk-ADOHZ74F.js +0 -2
- package/dist/chunk-ADOHZ74F.js.map +0 -1
- package/dist/chunk-BC3STHFS.js +0 -3
- package/dist/chunk-BC3STHFS.js.map +0 -1
- package/dist/chunk-BQGHHBGH.js +0 -2
- package/dist/chunk-BQGHHBGH.js.map +0 -1
- package/dist/chunk-CJYNYLZF.js +0 -2
- package/dist/chunk-CJYNYLZF.js.map +0 -1
- package/dist/chunk-CQAXMUFB.js +0 -3
- package/dist/chunk-CQAXMUFB.js.map +0 -1
- package/dist/chunk-DNCVZK7V.js +0 -44
- package/dist/chunk-DNCVZK7V.js.map +0 -1
- package/dist/chunk-E2QGSNDB.js +0 -2
- package/dist/chunk-E2QGSNDB.js.map +0 -1
- package/dist/chunk-EGVPYRIE.js +0 -2
- package/dist/chunk-EGVPYRIE.js.map +0 -1
- package/dist/chunk-EUJ26UNW.js +0 -2
- package/dist/chunk-EUJ26UNW.js.map +0 -1
- package/dist/chunk-EWFYKNK7.js +0 -2
- package/dist/chunk-EWFYKNK7.js.map +0 -1
- package/dist/chunk-F6IK5BFP.js +0 -2
- package/dist/chunk-F6IK5BFP.js.map +0 -1
- package/dist/chunk-F6Z2OAHW.js +0 -2
- package/dist/chunk-F6Z2OAHW.js.map +0 -1
- package/dist/chunk-FBSVAPQ6.js +0 -3
- package/dist/chunk-FBSVAPQ6.js.map +0 -1
- package/dist/chunk-FJZYWFE2.js +0 -2
- package/dist/chunk-FJZYWFE2.js.map +0 -1
- package/dist/chunk-FMJZFIA2.js +0 -3
- package/dist/chunk-FMJZFIA2.js.map +0 -1
- package/dist/chunk-GAP2HHZR.js +0 -2
- package/dist/chunk-GAP2HHZR.js.map +0 -1
- package/dist/chunk-GIADGCQF.js +0 -9
- package/dist/chunk-GIADGCQF.js.map +0 -1
- package/dist/chunk-H2WQ3ECX.js +0 -2
- package/dist/chunk-H2WQ3ECX.js.map +0 -1
- package/dist/chunk-HJWONDZI.js +0 -2
- package/dist/chunk-HJWONDZI.js.map +0 -1
- package/dist/chunk-HMBPN7ID.js +0 -2
- package/dist/chunk-HMBPN7ID.js.map +0 -1
- package/dist/chunk-HTDV42AD.js +0 -2
- package/dist/chunk-HTDV42AD.js.map +0 -1
- package/dist/chunk-IBYIEHIZ.js +0 -2
- package/dist/chunk-IBYIEHIZ.js.map +0 -1
- package/dist/chunk-IJ3JNWT6.js +0 -3
- package/dist/chunk-IJ3JNWT6.js.map +0 -1
- package/dist/chunk-JCZENRYY.js +0 -2
- package/dist/chunk-JCZENRYY.js.map +0 -1
- package/dist/chunk-JLC5WGYQ.js +0 -2
- package/dist/chunk-JLC5WGYQ.js.map +0 -1
- package/dist/chunk-JSYPWAKP.js +0 -2
- package/dist/chunk-JSYPWAKP.js.map +0 -1
- package/dist/chunk-JTIGFOL5.js +0 -2
- package/dist/chunk-JTIGFOL5.js.map +0 -1
- package/dist/chunk-JTMKKTKL.js +0 -2
- package/dist/chunk-JTMKKTKL.js.map +0 -1
- package/dist/chunk-KO2JCGEV.js +0 -2
- package/dist/chunk-KO2JCGEV.js.map +0 -1
- package/dist/chunk-KQMBXJUL.js +0 -2
- package/dist/chunk-KQMBXJUL.js.map +0 -1
- package/dist/chunk-LSYYM7EZ.js +0 -2
- package/dist/chunk-LSYYM7EZ.js.map +0 -1
- package/dist/chunk-LW4AQT2F.js +0 -2
- package/dist/chunk-LW4AQT2F.js.map +0 -1
- package/dist/chunk-MCJLSHUC.js +0 -2
- package/dist/chunk-MCJLSHUC.js.map +0 -1
- package/dist/chunk-MNSBJ6HR.js +0 -2
- package/dist/chunk-MNSBJ6HR.js.map +0 -1
- package/dist/chunk-N52M225G.js +0 -2
- package/dist/chunk-N52M225G.js.map +0 -1
- package/dist/chunk-NCD7PEEP.js +0 -2
- package/dist/chunk-NCD7PEEP.js.map +0 -1
- package/dist/chunk-NDB6KXYI.js +0 -3
- package/dist/chunk-NDB6KXYI.js.map +0 -1
- package/dist/chunk-NDG5MZ2E.js +0 -2
- package/dist/chunk-NDG5MZ2E.js.map +0 -1
- package/dist/chunk-NKEQVDH2.js +0 -2
- package/dist/chunk-NKEQVDH2.js.map +0 -1
- package/dist/chunk-NKPRDJXY.js +0 -2
- package/dist/chunk-NKPRDJXY.js.map +0 -1
- package/dist/chunk-NLUUDXEF.js +0 -3
- package/dist/chunk-NLUUDXEF.js.map +0 -1
- package/dist/chunk-NQAQKZPN.js +0 -14
- package/dist/chunk-NQAQKZPN.js.map +0 -1
- package/dist/chunk-O45EVN3E.js +0 -3
- package/dist/chunk-O45EVN3E.js.map +0 -1
- package/dist/chunk-OFJLZCDA.js +0 -2
- package/dist/chunk-OFJLZCDA.js.map +0 -1
- package/dist/chunk-OWUWBBTM.js +0 -2
- package/dist/chunk-OWUWBBTM.js.map +0 -1
- package/dist/chunk-P6UN7Y3F.js +0 -2
- package/dist/chunk-P6UN7Y3F.js.map +0 -1
- package/dist/chunk-PMRLA27Q.js +0 -2
- package/dist/chunk-PMRLA27Q.js.map +0 -1
- package/dist/chunk-Q25B7YZU.js +0 -2
- package/dist/chunk-Q25B7YZU.js.map +0 -1
- package/dist/chunk-RN4IKWVM.js +0 -2
- package/dist/chunk-RN4IKWVM.js.map +0 -1
- package/dist/chunk-RNCPG3CD.js +0 -2
- package/dist/chunk-RNCPG3CD.js.map +0 -1
- package/dist/chunk-SA36QQCL.js +0 -2
- package/dist/chunk-SA36QQCL.js.map +0 -1
- package/dist/chunk-SAE75K6H.js +0 -3
- package/dist/chunk-SAE75K6H.js.map +0 -1
- package/dist/chunk-SB7XE246.js +0 -2
- package/dist/chunk-SB7XE246.js.map +0 -1
- package/dist/chunk-T23UIAGN.js +0 -2
- package/dist/chunk-T23UIAGN.js.map +0 -1
- package/dist/chunk-TE7L3ICT.js +0 -2
- package/dist/chunk-TE7L3ICT.js.map +0 -1
- package/dist/chunk-UEZJYSCK.js +0 -2
- package/dist/chunk-UEZJYSCK.js.map +0 -1
- package/dist/chunk-UPZC233Y.js +0 -2
- package/dist/chunk-UPZC233Y.js.map +0 -1
- package/dist/chunk-VJNDCFHN.js +0 -2
- package/dist/chunk-VJNDCFHN.js.map +0 -1
- package/dist/chunk-W74CXS6L.js +0 -2
- package/dist/chunk-W74CXS6L.js.map +0 -1
- package/dist/chunk-WNB2L5T6.js +0 -2
- package/dist/chunk-WNB2L5T6.js.map +0 -1
- package/dist/chunk-WRKYGGYI.js +0 -2
- package/dist/chunk-WRKYGGYI.js.map +0 -1
- package/dist/chunk-XBUJYUM3.js +0 -2
- package/dist/chunk-XBUJYUM3.js.map +0 -1
- package/dist/chunk-XFLWSNBM.js +0 -2
- package/dist/chunk-XFLWSNBM.js.map +0 -1
- package/dist/chunk-XM4MU7IT.js +0 -2
- package/dist/chunk-XM4MU7IT.js.map +0 -1
- package/dist/chunk-XTV6ABCU.js +0 -2
- package/dist/chunk-XTV6ABCU.js.map +0 -1
- package/dist/chunk-XWVREJPG.js +0 -2
- package/dist/chunk-XWVREJPG.js.map +0 -1
- package/dist/chunk-Y4LKANAN.js +0 -2
- package/dist/chunk-Y4LKANAN.js.map +0 -1
- package/dist/chunk-YAN3ZX5N.js +0 -2
- package/dist/chunk-YAN3ZX5N.js.map +0 -1
- package/dist/chunk-YMVR2Y7T.js +0 -2
- package/dist/chunk-YMVR2Y7T.js.map +0 -1
- package/dist/chunk-YRA3NRLD.js +0 -2
- package/dist/chunk-YRA3NRLD.js.map +0 -1
- package/dist/chunk-YZWZNR6K.js +0 -6
- package/dist/chunk-YZWZNR6K.js.map +0 -1
- package/dist/chunk-Z6CJWDEP.js +0 -2
- package/dist/chunk-Z6CJWDEP.js.map +0 -1
- package/dist/chunk-ZBT5KBPZ.js +0 -2
- package/dist/chunk-ZBT5KBPZ.js.map +0 -1
- package/dist/chunk-ZJ7BKNXN.js +0 -3
- package/dist/chunk-ZJ7BKNXN.js.map +0 -1
- package/dist/chunk-ZP2A2JZ2.js +0 -2
- package/dist/chunk-ZP2A2JZ2.js.map +0 -1
- package/dist/chunk-ZX2YDSZP.js +0 -2
- package/dist/chunk-ZX2YDSZP.js.map +0 -1
- package/dist/client-LLUV4KQV.js +0 -2
- package/dist/client-LLUV4KQV.js.map +0 -1
- package/dist/collab-activity-HHMCCSM6.js +0 -2
- package/dist/collab-activity-HHMCCSM6.js.map +0 -1
- package/dist/collab-invite-CGTTTC5E.js +0 -2
- package/dist/collab-invite-CGTTTC5E.js.map +0 -1
- package/dist/collab-leave-XQ4TYSSV.js +0 -2
- package/dist/collab-leave-XQ4TYSSV.js.map +0 -1
- package/dist/collab-list-QHZLDEQY.js +0 -2
- package/dist/collab-list-QHZLDEQY.js.map +0 -1
- package/dist/collab-remove-WEOMPRY4.js +0 -2
- package/dist/collab-remove-WEOMPRY4.js.map +0 -1
- package/dist/collab-transfer-4UAT62Q6.js +0 -2
- package/dist/collab-transfer-4UAT62Q6.js.map +0 -1
- package/dist/completion-I2ARGA2U.js +0 -2
- package/dist/completion-I2ARGA2U.js.map +0 -1
- package/dist/config-B5FDVP6Q.js +0 -2
- package/dist/config-B5FDVP6Q.js.map +0 -1
- package/dist/config-delete-3GEWPGA3.js +0 -2
- package/dist/config-delete-3GEWPGA3.js.map +0 -1
- package/dist/config-get-4YKTVBHW.js +0 -2
- package/dist/config-get-4YKTVBHW.js.map +0 -1
- package/dist/config-reset-GCTQD5ZJ.js +0 -2
- package/dist/config-reset-GCTQD5ZJ.js.map +0 -1
- package/dist/config-set-VHEQM2RQ.js +0 -2
- package/dist/config-set-VHEQM2RQ.js.map +0 -1
- package/dist/doctor-ZYU3JBJF.js +0 -2
- package/dist/doctor-ZYU3JBJF.js.map +0 -1
- package/dist/feedback-N5EBJ566.js +0 -2
- package/dist/feedback-N5EBJ566.js.map +0 -1
- package/dist/forms-clear-RXJVD57O.js +0 -2
- package/dist/forms-clear-RXJVD57O.js.map +0 -1
- package/dist/forms-create-ADMTRYCJ.js +0 -2
- package/dist/forms-create-ADMTRYCJ.js.map +0 -1
- package/dist/forms-delete-RFXRQFH6.js +0 -2
- package/dist/forms-delete-RFXRQFH6.js.map +0 -1
- package/dist/forms-embed-CGKIBURZ.js +0 -2
- package/dist/forms-embed-CGKIBURZ.js.map +0 -1
- package/dist/forms-export-34JBMXAM.js +0 -2
- package/dist/forms-export-34JBMXAM.js.map +0 -1
- package/dist/forms-info-LQ5S4I24.js +0 -2
- package/dist/forms-info-LQ5S4I24.js.map +0 -1
- package/dist/forms-list-7JIQCCVQ.js +0 -2
- package/dist/forms-list-7JIQCCVQ.js.map +0 -1
- package/dist/forms-submissions-EMJNSTYT.js +0 -2
- package/dist/forms-submissions-EMJNSTYT.js.map +0 -1
- package/dist/login-I53VTO6L.js +0 -2
- package/dist/login-I53VTO6L.js.map +0 -1
- package/dist/logout-OJV7AZZO.js +0 -2
- package/dist/logout-OJV7AZZO.js.map +0 -1
- package/dist/logs-export-TX3TDMAL.js +0 -2
- package/dist/logs-export-TX3TDMAL.js.map +0 -1
- package/dist/logs-search-N6HWWLHZ.js +0 -2
- package/dist/logs-search-N6HWWLHZ.js.map +0 -1
- package/dist/logs-tail-SQ4XQW2A.js +0 -2
- package/dist/logs-tail-SQ4XQW2A.js.map +0 -1
- package/dist/monitor-D3LZU55W.js +0 -2
- package/dist/monitor-D3LZU55W.js.map +0 -1
- package/dist/monitor-automations-GFDMFRBU.js +0 -2
- package/dist/monitor-automations-GFDMFRBU.js.map +0 -1
- package/dist/monitor-pipelines-FRVVYKME.js +0 -2
- package/dist/monitor-pipelines-FRVVYKME.js.map +0 -1
- package/dist/monitor-sites-ATWU7HOA.js +0 -2
- package/dist/monitor-sites-ATWU7HOA.js.map +0 -1
- package/dist/monitor-storage-TGFNTOHB.js +0 -2
- package/dist/monitor-storage-TGFNTOHB.js.map +0 -1
- package/dist/scripts-cancel-R7NRYLVG.js +0 -2
- package/dist/scripts-cancel-R7NRYLVG.js.map +0 -1
- package/dist/scripts-delete-CFRV2B2G.js +0 -2
- package/dist/scripts-delete-CFRV2B2G.js.map +0 -1
- package/dist/scripts-disable-WQJAP6EW.js +0 -2
- package/dist/scripts-disable-WQJAP6EW.js.map +0 -1
- package/dist/scripts-enable-GJTRHEJG.js +0 -2
- package/dist/scripts-enable-GJTRHEJG.js.map +0 -1
- package/dist/scripts-init-XYDUEPHE.js +0 -2
- package/dist/scripts-init-XYDUEPHE.js.map +0 -1
- package/dist/scripts-list-I42J3TKN.js +0 -2
- package/dist/scripts-list-I42J3TKN.js.map +0 -1
- package/dist/scripts-logs-T2DBR47F.js +0 -2
- package/dist/scripts-logs-T2DBR47F.js.map +0 -1
- package/dist/scripts-run-A4V25Q5I.js +0 -2
- package/dist/scripts-run-A4V25Q5I.js.map +0 -1
- package/dist/scripts-status-5Q5Q76LC.js +0 -2
- package/dist/scripts-status-5Q5Q76LC.js.map +0 -1
- package/dist/scripts-validate-7525CAVN.js +0 -2
- package/dist/scripts-validate-7525CAVN.js.map +0 -1
- package/dist/scripts-watch-SB52KWBL.js +0 -2
- package/dist/scripts-watch-SB52KWBL.js.map +0 -1
- package/dist/sign-cancel-XKIUANS3.js +0 -2
- package/dist/sign-cancel-XKIUANS3.js.map +0 -1
- package/dist/sign-download-JLV45D2P.js +0 -2
- package/dist/sign-download-JLV45D2P.js.map +0 -1
- package/dist/sign-list-XW7YYI4K.js +0 -2
- package/dist/sign-list-XW7YYI4K.js.map +0 -1
- package/dist/sign-request-IDZFPWHL.js +0 -2
- package/dist/sign-request-IDZFPWHL.js.map +0 -1
- package/dist/sign-status-WMFCBO2Y.js +0 -2
- package/dist/sign-status-WMFCBO2Y.js.map +0 -1
- package/dist/sign-verify-MQDGGYPL.js +0 -2
- package/dist/sign-verify-MQDGGYPL.js.map +0 -1
- package/dist/sites-analytics-AU54PJC4.js +0 -2
- package/dist/sites-analytics-AU54PJC4.js.map +0 -1
- package/dist/sites-delete-ROETL6S7.js +0 -2
- package/dist/sites-delete-ROETL6S7.js.map +0 -1
- package/dist/sites-deploys-IKKCJFGI.js +0 -2
- package/dist/sites-deploys-IKKCJFGI.js.map +0 -1
- package/dist/sites-info-M7WDLFTW.js +0 -2
- package/dist/sites-info-M7WDLFTW.js.map +0 -1
- package/dist/sites-list-DQANT2J6.js +0 -2
- package/dist/sites-list-DQANT2J6.js.map +0 -1
- package/dist/sites-logs-NAOTBP7I.js +0 -2
- package/dist/sites-logs-NAOTBP7I.js.map +0 -1
- package/dist/sites-open-LYLLIXUE.js +0 -2
- package/dist/sites-open-LYLLIXUE.js.map +0 -1
- package/dist/sites-purge-TC26HZI3.js +0 -2
- package/dist/sites-purge-TC26HZI3.js.map +0 -1
- package/dist/sites-rename-UQNCLOFG.js +0 -2
- package/dist/sites-rename-UQNCLOFG.js.map +0 -1
- package/dist/sites-rollback-SQ5ITDAM.js +0 -2
- package/dist/sites-rollback-SQ5ITDAM.js.map +0 -1
- package/dist/sites-unpublish-UWBN253C.js +0 -2
- package/dist/sites-unpublish-UWBN253C.js.map +0 -1
- package/dist/sites-visibility-K4ECNWQ6.js +0 -2
- package/dist/sites-visibility-K4ECNWQ6.js.map +0 -1
- package/dist/storage-cat-FHO4FOCH.js +0 -2
- package/dist/storage-cat-FHO4FOCH.js.map +0 -1
- package/dist/storage-clean-PVEBOPCZ.js +0 -2
- package/dist/storage-clean-PVEBOPCZ.js.map +0 -1
- package/dist/storage-cp-432CZ24Q.js +0 -2
- package/dist/storage-cp-432CZ24Q.js.map +0 -1
- package/dist/storage-diff-3HUM7APQ.js +0 -2
- package/dist/storage-diff-3HUM7APQ.js.map +0 -1
- package/dist/storage-download-MEUZI6VE.js +0 -2
- package/dist/storage-download-MEUZI6VE.js.map +0 -1
- package/dist/storage-info-TXDUGMAZ.js +0 -2
- package/dist/storage-info-TXDUGMAZ.js.map +0 -1
- package/dist/storage-ls-UKF6RNFK.js +0 -2
- package/dist/storage-ls-UKF6RNFK.js.map +0 -1
- package/dist/storage-mkdir-DUCBLMFF.js +0 -2
- package/dist/storage-mkdir-DUCBLMFF.js.map +0 -1
- package/dist/storage-mv-TBFY3KYG.js +0 -2
- package/dist/storage-mv-TBFY3KYG.js.map +0 -1
- package/dist/storage-rm-5GL4JECX.js +0 -2
- package/dist/storage-rm-5GL4JECX.js.map +0 -1
- package/dist/storage-search-LOPWXFNT.js +0 -2
- package/dist/storage-search-LOPWXFNT.js.map +0 -1
- package/dist/storage-share-RAJJY3I5.js +0 -2
- package/dist/storage-share-RAJJY3I5.js.map +0 -1
- package/dist/storage-tag-WM33N7XA.js +0 -2
- package/dist/storage-tag-WM33N7XA.js.map +0 -1
- package/dist/storage-unshare-H5UBXLAT.js +0 -2
- package/dist/storage-unshare-H5UBXLAT.js.map +0 -1
- package/dist/storage-upload-XY2GN3VU.js +0 -2
- package/dist/storage-upload-XY2GN3VU.js.map +0 -1
- package/dist/time-list-WSRWMUGP.js +0 -2
- package/dist/time-list-WSRWMUGP.js.map +0 -1
- package/dist/time-lock-GOKLWQZ6.js +0 -2
- package/dist/time-lock-GOKLWQZ6.js.map +0 -1
- package/dist/time-proof-J7GT4M5G.js +0 -2
- package/dist/time-proof-J7GT4M5G.js.map +0 -1
- package/dist/time-status-SV3OA35J.js +0 -2
- package/dist/time-status-SV3OA35J.js.map +0 -1
- package/dist/time-unlock-6OF5VTV4.js +0 -2
- package/dist/time-unlock-6OF5VTV4.js.map +0 -1
- package/dist/update-M3RJEWWA.js +0 -2
- package/dist/update-M3RJEWWA.js.map +0 -1
- package/dist/version-QA4ZYKDW.js +0 -2
- package/dist/version-QA4ZYKDW.js.map +0 -1
- package/dist/whoami-BQMXFSCR.js +0 -2
- package/dist/whoami-BQMXFSCR.js.map +0 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { gcm } from '@noble/ciphers/aes.js';
|
|
2
|
+
import { randomBytes } from '@noble/hashes/utils.js';
|
|
3
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
4
|
+
import { bytesToHex } from './ssp.js';
|
|
5
|
+
function deriveRawKey(key) {
|
|
6
|
+
return new TextEncoder().encode(key.slice(0, 32).padEnd(32, '0'));
|
|
7
|
+
}
|
|
8
|
+
function uint8ArrayToBase64(bytes) {
|
|
9
|
+
return Buffer.from(bytes).toString('base64');
|
|
10
|
+
}
|
|
11
|
+
function base64ToUint8Array(b64) {
|
|
12
|
+
return new Uint8Array(Buffer.from(b64, 'base64'));
|
|
13
|
+
}
|
|
14
|
+
function generateEncryptionKey() {
|
|
15
|
+
return Buffer.from(randomBytes(32)).toString('hex');
|
|
16
|
+
}
|
|
17
|
+
const CHUNK_SIZE_SMALL = 1.5 * 1024 * 1024;
|
|
18
|
+
const CHUNK_SIZE_MEDIUM = 2 * 1024 * 1024;
|
|
19
|
+
const CHUNK_SIZE_LARGE = 2.5 * 1024 * 1024;
|
|
20
|
+
function determineChunkSize(fileSize) {
|
|
21
|
+
if (fileSize > 100 * 1024 * 1024)
|
|
22
|
+
return CHUNK_SIZE_LARGE;
|
|
23
|
+
if (fileSize > 10 * 1024 * 1024)
|
|
24
|
+
return CHUNK_SIZE_MEDIUM;
|
|
25
|
+
return CHUNK_SIZE_SMALL;
|
|
26
|
+
}
|
|
27
|
+
export function encryptFile(data, fileName, fileType, encryptionKey) {
|
|
28
|
+
const key = encryptionKey || generateEncryptionKey();
|
|
29
|
+
const keyBytes = deriveRawKey(key);
|
|
30
|
+
const chunkSize = determineChunkSize(data.length);
|
|
31
|
+
const totalChunks = Math.ceil(data.length / chunkSize);
|
|
32
|
+
const chunks = [];
|
|
33
|
+
const timestamp = Date.now();
|
|
34
|
+
for (let i = 0; i < totalChunks; i++) {
|
|
35
|
+
const offset = i * chunkSize;
|
|
36
|
+
const end = Math.min(offset + chunkSize, data.length);
|
|
37
|
+
const plaintext = data.subarray(offset, end);
|
|
38
|
+
const iv = randomBytes(12);
|
|
39
|
+
const ad = new TextEncoder().encode(`res54-v2-${timestamp}`);
|
|
40
|
+
const aes = gcm(keyBytes, iv, ad);
|
|
41
|
+
const encrypted = aes.encrypt(plaintext);
|
|
42
|
+
const combined = new Uint8Array(4 + ad.length + iv.length + encrypted.length);
|
|
43
|
+
const view = new DataView(combined.buffer, 0, 4);
|
|
44
|
+
view.setUint32(0, ad.length, true);
|
|
45
|
+
combined.set(ad, 4);
|
|
46
|
+
combined.set(iv, 4 + ad.length);
|
|
47
|
+
combined.set(encrypted, 4 + ad.length + iv.length);
|
|
48
|
+
chunks.push({
|
|
49
|
+
index: i,
|
|
50
|
+
totalChunks,
|
|
51
|
+
size: plaintext.length,
|
|
52
|
+
offset,
|
|
53
|
+
sha256: bytesToHex(sha256(plaintext)),
|
|
54
|
+
encryptedBase64: uint8ArrayToBase64(combined),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
encryptionKey: key,
|
|
59
|
+
fileName,
|
|
60
|
+
fileType,
|
|
61
|
+
fileSize: data.length,
|
|
62
|
+
chunks,
|
|
63
|
+
};
|
|
64
|
+
}
|
package/dist/lib/crypto/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{
|
|
2
|
-
|
|
1
|
+
export { sanitizeForTerminal, sanitizeFilename, zeroBuffer, zeroString } from './sanitize.js';
|
|
2
|
+
export { generateKeypair, generateNonce, hashPassword, computeDeviceFingerprint, computeSignPayload, deriveSharedSecret, deriveEncryptionKey, encryptSession, decryptSession, verifyServerSignature, signPayload, computeHMAC, bytesToHex, hexToBytes, } from './ssp.js';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const ANSI_PATTERN = /[\u001b\u009b][[\]()#;?]*(?:(?:(?:;[0-9a-fA-F]{1,4})*(?:;[0-9a-fA-F]{0,4})?)?[0-9A-PRZcf-nq-uy=><~])/g;
|
|
2
|
+
export function sanitizeForTerminal(input) {
|
|
3
|
+
return input.replace(ANSI_PATTERN, '');
|
|
4
|
+
}
|
|
5
|
+
export function sanitizeFilename(input) {
|
|
6
|
+
return input.replace(/[<>:"/\\|?*\x00-\x1f]/g, '_').trim();
|
|
7
|
+
}
|
|
8
|
+
export function zeroBuffer(buf) {
|
|
9
|
+
buf.fill(0);
|
|
10
|
+
}
|
|
11
|
+
export function zeroString(str) {
|
|
12
|
+
if (typeof str === 'string') {
|
|
13
|
+
const len = str.length;
|
|
14
|
+
str.valueOf = () => '';
|
|
15
|
+
for (let i = 0; i < len; i++) {
|
|
16
|
+
str = str[i] === str[i].charAt(0) ? '' : '';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { getPublicKey, sign, verify, etc, utils as edUtils } from '@noble/ed25519';
|
|
2
|
+
import { x25519 } from '@noble/curves/ed25519.js';
|
|
3
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
4
|
+
import { sha512 } from '@noble/hashes/sha2.js';
|
|
5
|
+
import { hmac } from '@noble/hashes/hmac.js';
|
|
6
|
+
import { hkdf } from '@noble/hashes/hkdf.js';
|
|
7
|
+
import { blake3 } from '@noble/hashes/blake3.js';
|
|
8
|
+
import { randomBytes, concatBytes } from '@noble/hashes/utils.js';
|
|
9
|
+
import { gcm } from '@noble/ciphers/aes.js';
|
|
10
|
+
import { pbkdf2Sync } from 'node:crypto';
|
|
11
|
+
import { hostname, platform, arch } from 'node:os';
|
|
12
|
+
etc.sha512Sync = (...msgs) => sha512(concatBytes(...msgs));
|
|
13
|
+
const HKDF_INFO = 'squidcloud-session-v1';
|
|
14
|
+
export function generateKeypair() {
|
|
15
|
+
const priv = edUtils.randomPrivateKey();
|
|
16
|
+
const pub = getPublicKey(priv);
|
|
17
|
+
return { pub, priv };
|
|
18
|
+
}
|
|
19
|
+
export function generateNonce() {
|
|
20
|
+
return randomBytes(32);
|
|
21
|
+
}
|
|
22
|
+
export function hashPassword(password, email) {
|
|
23
|
+
const salt = Buffer.from(email.slice(0, 32).padEnd(32, '\x00'));
|
|
24
|
+
return pbkdf2Sync(password, salt, 100000, 32, 'sha512');
|
|
25
|
+
}
|
|
26
|
+
export function computeDeviceFingerprint(machineId) {
|
|
27
|
+
const data = `${machineId}:${hostname()}:${platform()}:${arch()}`;
|
|
28
|
+
return Buffer.from(blake3(new TextEncoder().encode(data))).toString('hex');
|
|
29
|
+
}
|
|
30
|
+
export function computeSignPayload(clientNonce, serverNonce, clientPub, timestamp) {
|
|
31
|
+
const payload = new Uint8Array(clientNonce.length + serverNonce.length + clientPub.length + 8);
|
|
32
|
+
payload.set(clientNonce, 0);
|
|
33
|
+
payload.set(serverNonce, clientNonce.length);
|
|
34
|
+
payload.set(clientPub, clientNonce.length + serverNonce.length);
|
|
35
|
+
const tsBuf = new Uint8Array(8);
|
|
36
|
+
new DataView(tsBuf.buffer).setBigUint64(0, BigInt(timestamp), false);
|
|
37
|
+
payload.set(tsBuf, clientNonce.length + serverNonce.length + clientPub.length);
|
|
38
|
+
return blake3(payload);
|
|
39
|
+
}
|
|
40
|
+
export function deriveSharedSecret(pub, priv) {
|
|
41
|
+
return x25519.getSharedSecret(priv, pub);
|
|
42
|
+
}
|
|
43
|
+
export function deriveEncryptionKey(ecdhSecret, clientNonce, serverNonce) {
|
|
44
|
+
const salt = new Uint8Array(clientNonce.length + serverNonce.length);
|
|
45
|
+
salt.set(clientNonce, 0);
|
|
46
|
+
salt.set(serverNonce, clientNonce.length);
|
|
47
|
+
return hkdf(sha256, ecdhSecret, salt, new TextEncoder().encode(HKDF_INFO), 32);
|
|
48
|
+
}
|
|
49
|
+
export function encryptSession(session, key) {
|
|
50
|
+
const iv = randomBytes(12);
|
|
51
|
+
const plaintext = new TextEncoder().encode(JSON.stringify(session));
|
|
52
|
+
const aes = gcm(key, iv);
|
|
53
|
+
const encrypted = aes.encrypt(plaintext);
|
|
54
|
+
const ciphertext = encrypted.slice(0, -16);
|
|
55
|
+
const tag = encrypted.slice(-16);
|
|
56
|
+
return { ciphertext, iv, tag };
|
|
57
|
+
}
|
|
58
|
+
export function decryptSession(encrypted, iv, tag, key) {
|
|
59
|
+
const combined = new Uint8Array(encrypted.length + tag.length);
|
|
60
|
+
combined.set(encrypted, 0);
|
|
61
|
+
combined.set(tag, encrypted.length);
|
|
62
|
+
const aes = gcm(key, iv);
|
|
63
|
+
const plaintext = aes.decrypt(combined);
|
|
64
|
+
return JSON.parse(new TextDecoder().decode(plaintext));
|
|
65
|
+
}
|
|
66
|
+
export function verifyServerSignature(signature, payload, serverPub) {
|
|
67
|
+
return verify(signature, payload, serverPub);
|
|
68
|
+
}
|
|
69
|
+
export function signPayload(priv, payload) {
|
|
70
|
+
return sign(payload, priv);
|
|
71
|
+
}
|
|
72
|
+
export function computeHMAC(key, data) {
|
|
73
|
+
return Buffer.from(hmac(sha256, key, new TextEncoder().encode(data))).toString('hex');
|
|
74
|
+
}
|
|
75
|
+
export function bytesToHex(buf) {
|
|
76
|
+
return Buffer.from(buf).toString('hex');
|
|
77
|
+
}
|
|
78
|
+
export function hexToBytes(hex) {
|
|
79
|
+
return new Uint8Array(Buffer.from(hex, 'hex'));
|
|
80
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const ALLOWED_EXTENSIONS = new Set([
|
|
2
|
+
'.html', '.css', '.js', '.mjs', '.json', '.svg',
|
|
3
|
+
'.png', '.jpg', '.jpeg', '.gif', '.webp', '.avif', '.ico',
|
|
4
|
+
'.woff', '.woff2', '.ttf', '.otf', '.eot',
|
|
5
|
+
'.mp4', '.webm', '.ogg', '.mp3', '.wav',
|
|
6
|
+
'.pdf', '.txt', '.xml', '.map',
|
|
7
|
+
]);
|
|
8
|
+
export function isAllowedFile(filePath) {
|
|
9
|
+
const ext = filePath.toLowerCase().slice(filePath.lastIndexOf('.'));
|
|
10
|
+
if (!ext)
|
|
11
|
+
return false;
|
|
12
|
+
return ALLOWED_EXTENSIONS.has(ext);
|
|
13
|
+
}
|
|
14
|
+
export function getAllowedExtensions() {
|
|
15
|
+
return [...ALLOWED_EXTENSIONS];
|
|
16
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export async function detectProject(targetPath) {
|
|
4
|
+
const resolved = path.resolve(targetPath);
|
|
5
|
+
const stat = fs.statSync(resolved);
|
|
6
|
+
if (stat.isFile()) {
|
|
7
|
+
const ext = path.extname(resolved).toLowerCase();
|
|
8
|
+
if (ext === '.html') {
|
|
9
|
+
return {
|
|
10
|
+
type: 'single-file',
|
|
11
|
+
rootPath: resolved,
|
|
12
|
+
hasIndexHtml: true,
|
|
13
|
+
htmlFiles: [resolved],
|
|
14
|
+
totalFiles: 1,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return { type: 'invalid', rootPath: resolved, hasIndexHtml: false, htmlFiles: [], totalFiles: 0 };
|
|
18
|
+
}
|
|
19
|
+
if (stat.isDirectory()) {
|
|
20
|
+
const htmlFiles = [];
|
|
21
|
+
let totalFiles = 0;
|
|
22
|
+
function walk(dir) {
|
|
23
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
const fullPath = path.join(dir, entry.name);
|
|
26
|
+
if (entry.isDirectory()) {
|
|
27
|
+
if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {
|
|
28
|
+
walk(fullPath);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (entry.isFile()) {
|
|
32
|
+
totalFiles++;
|
|
33
|
+
if (entry.name.endsWith('.html')) {
|
|
34
|
+
htmlFiles.push(fullPath);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
walk(resolved);
|
|
40
|
+
if (htmlFiles.length === 0) {
|
|
41
|
+
return { type: 'invalid', rootPath: resolved, hasIndexHtml: false, htmlFiles: [], totalFiles };
|
|
42
|
+
}
|
|
43
|
+
const hasIndexHtml = htmlFiles.some(f => path.basename(f).toLowerCase() === 'index.html');
|
|
44
|
+
return {
|
|
45
|
+
type: 'codebase',
|
|
46
|
+
rootPath: resolved,
|
|
47
|
+
hasIndexHtml,
|
|
48
|
+
htmlFiles,
|
|
49
|
+
totalFiles,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return { type: 'invalid', rootPath: resolved, hasIndexHtml: false, htmlFiles: [], totalFiles: 0 };
|
|
53
|
+
}
|
package/dist/lib/deploy/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
1
|
+
export { isAllowedFile, getAllowedExtensions } from './allowlist.js';
|
|
2
|
+
export { detectProject } from './detector.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/deploy/allowlist.ts","../../../src/lib/deploy/detector.ts"],"names":["ALLOWED_EXTENSIONS","isAllowedFile","filePath","ext","getAllowedExtensions","detectProject","targetPath","resolved","path","stat","fs","walk","dir","entries","entry","fullPath","totalFiles","htmlFiles","hasIndexHtml","f"],"mappings":"sCAAA,IAAMA,CAAAA,CAAqB,IAAI,GAAA,CAAI,CACjC,OAAA,CAAS,MAAA,CAAQ,KAAA,CAAO,MAAA,CAAQ,OAAA,CAAS,MAAA,CACzC,MAAA,CAAQ,MAAA,CAAQ,OAAA,CAAS,MAAA,CAAQ,OAAA,CAAS,OAAA,CAAS,MAAA,CACnD,OAAA,CAAS,QAAA,CAAU,MAAA,CAAQ,MAAA,CAAQ,MAAA,CACnC,MAAA,CAAQ,OAAA,CAAS,MAAA,CAAQ,MAAA,CAAQ,MAAA,CACjC,MAAA,CAAQ,MAAA,CAAQ,MAAA,CAAQ,MAC1B,CAAC,CAAA,CAEM,SAASC,CAAAA,CAAcC,CAAAA,CAA2B,CACvD,IAAMC,CAAAA,CAAMD,CAAAA,CAAS,WAAA,EAAY,CAAE,KAAA,CAAMA,CAAAA,CAAS,WAAA,CAAY,GAAG,CAAC,CAAA,CAClE,OAAKC,CAAAA,CACEH,CAAAA,CAAmB,GAAA,CAAIG,CAAG,CAAA,CADhB,KAEnB,CAEO,SAASC,CAAAA,EAAiC,CAC/C,OAAO,CAAC,GAAGJ,CAAkB,CAC/B,CCHA,eAAsBK,CAAAA,CAAcC,CAAAA,CAA8C,CAChF,IAAMC,CAAAA,CAAWC,CAAAA,CAAK,OAAA,CAAQF,CAAU,CAAA,CAClCG,CAAAA,CAAOC,CAAAA,CAAG,QAAA,CAASH,CAAQ,CAAA,CAEjC,GAAIE,CAAAA,CAAK,MAAA,EAAO,CAEd,OADYD,CAAAA,CAAK,OAAA,CAAQD,CAAQ,CAAA,CAAE,WAAA,EAAY,GACnC,OAAA,CACH,CACL,IAAA,CAAM,aAAA,CACN,QAAA,CAAUA,CAAAA,CACV,YAAA,CAAc,IAAA,CACd,SAAA,CAAW,CAACA,CAAQ,CAAA,CACpB,UAAA,CAAY,CACd,CAAA,CAEK,CAAE,IAAA,CAAM,SAAA,CAAW,QAAA,CAAUA,CAAAA,CAAU,YAAA,CAAc,KAAA,CAAO,SAAA,CAAW,EAAC,CAAG,UAAA,CAAY,CAAE,CAAA,CAGlG,GAAIE,CAAAA,CAAK,WAAA,EAAY,CAAG,CAItB,IAASE,CAAAA,CAAT,SAAcC,CAAAA,CAAmB,CAC/B,IAAMC,CAAAA,CAAUH,CAAAA,CAAG,WAAA,CAAYE,CAAAA,CAAK,CAAE,aAAA,CAAe,IAAK,CAAC,CAAA,CAC3D,IAAA,IAAWE,CAAAA,IAASD,CAAAA,CAAS,CAC3B,IAAME,CAAAA,CAAWP,CAAAA,CAAK,IAAA,CAAKI,CAAAA,CAAKE,CAAAA,CAAM,IAAI,CAAA,CACtCA,CAAAA,CAAM,WAAA,EAAY,CAChB,CAACA,CAAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAKA,CAAAA,CAAM,IAAA,GAAS,cAAA,EAChDH,CAAAA,CAAKI,CAAQ,CAAA,CAEND,CAAAA,CAAM,MAAA,EAAO,GACtBE,CAAAA,EAAAA,CACIF,CAAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAC7BG,CAAAA,CAAU,IAAA,CAAKF,CAAQ,CAAA,EAG7B,CACF,CAAA,CAlBME,CAAAA,CAAsB,EAAC,CACzBD,CAAAA,CAAa,CAAA,CAqBjB,GAFAL,CAAAA,CAAKJ,CAAQ,CAAA,CAETU,CAAAA,CAAU,MAAA,GAAW,CAAA,CACvB,OAAO,CAAE,IAAA,CAAM,SAAA,CAAW,QAAA,CAAUV,CAAAA,CAAU,YAAA,CAAc,KAAA,CAAO,SAAA,CAAW,EAAC,CAAG,UAAA,CAAAS,CAAW,CAAA,CAG/F,IAAME,CAAAA,CAAeD,CAAAA,CAAU,IAAA,CAAKE,CAAAA,EAAKX,CAAAA,CAAK,QAAA,CAASW,CAAC,CAAA,CAAE,WAAA,EAAY,GAAM,YAAY,CAAA,CAExF,OAAO,CACL,IAAA,CAAM,UAAA,CACN,QAAA,CAAUZ,CAAAA,CACV,YAAA,CAAAW,CAAAA,CACA,SAAA,CAAAD,CAAAA,CACA,UAAA,CAAAD,CACF,CACF,CAEA,OAAO,CAAE,IAAA,CAAM,SAAA,CAAW,QAAA,CAAUT,CAAAA,CAAU,YAAA,CAAc,KAAA,CAAO,SAAA,CAAW,EAAC,CAAG,UAAA,CAAY,CAAE,CAClG","file":"index.js","sourcesContent":["const ALLOWED_EXTENSIONS = new Set([\n '.html', '.css', '.js', '.mjs', '.json', '.svg',\n '.png', '.jpg', '.jpeg', '.gif', '.webp', '.avif', '.ico',\n '.woff', '.woff2', '.ttf', '.otf', '.eot',\n '.mp4', '.webm', '.ogg', '.mp3', '.wav',\n '.pdf', '.txt', '.xml', '.map',\n])\n\nexport function isAllowedFile(filePath: string): boolean {\n const ext = filePath.toLowerCase().slice(filePath.lastIndexOf('.'))\n if (!ext) return false\n return ALLOWED_EXTENSIONS.has(ext)\n}\n\nexport function getAllowedExtensions(): string[] {\n return [...ALLOWED_EXTENSIONS]\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport type DeployType = 'single-file' | 'codebase' | 'invalid'\n\nexport interface DetectedProject {\n type: DeployType\n rootPath: string\n hasIndexHtml: boolean\n htmlFiles: string[]\n totalFiles: number\n}\n\nexport async function detectProject(targetPath: string): Promise<DetectedProject> {\n const resolved = path.resolve(targetPath)\n const stat = fs.statSync(resolved)\n\n if (stat.isFile()) {\n const ext = path.extname(resolved).toLowerCase()\n if (ext === '.html') {\n return {\n type: 'single-file',\n rootPath: resolved,\n hasIndexHtml: true,\n htmlFiles: [resolved],\n totalFiles: 1,\n }\n }\n return { type: 'invalid', rootPath: resolved, hasIndexHtml: false, htmlFiles: [], totalFiles: 0 }\n }\n\n if (stat.isDirectory()) {\n const htmlFiles: string[] = []\n let totalFiles = 0\n\n function walk(dir: string): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n walk(fullPath)\n }\n } else if (entry.isFile()) {\n totalFiles++\n if (entry.name.endsWith('.html')) {\n htmlFiles.push(fullPath)\n }\n }\n }\n }\n\n walk(resolved)\n\n if (htmlFiles.length === 0) {\n return { type: 'invalid', rootPath: resolved, hasIndexHtml: false, htmlFiles: [], totalFiles }\n }\n\n const hasIndexHtml = htmlFiles.some(f => path.basename(f).toLowerCase() === 'index.html')\n\n return {\n type: 'codebase',\n rootPath: resolved,\n hasIndexHtml,\n htmlFiles,\n totalFiles,\n }\n }\n\n return { type: 'invalid', rootPath: resolved, hasIndexHtml: false, htmlFiles: [], totalFiles: 0 }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default {};
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import net from 'node:net';
|
|
2
|
+
export class MicroRedis {
|
|
3
|
+
store = new Map();
|
|
4
|
+
server = null;
|
|
5
|
+
get(key) {
|
|
6
|
+
const e = this.store.get(key);
|
|
7
|
+
if (!e)
|
|
8
|
+
return null;
|
|
9
|
+
if (e.expiresAt && e.expiresAt <= Date.now()) {
|
|
10
|
+
this.store.delete(key);
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return e.value;
|
|
14
|
+
}
|
|
15
|
+
set(key, value, ttlMs) {
|
|
16
|
+
this.store.set(key, { value, expiresAt: ttlMs ? Date.now() + ttlMs : undefined });
|
|
17
|
+
}
|
|
18
|
+
setNx(key, value, ttlMs) {
|
|
19
|
+
if (this.get(key) !== null)
|
|
20
|
+
return false;
|
|
21
|
+
this.set(key, value, ttlMs);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
del(...keys) {
|
|
25
|
+
let n = 0;
|
|
26
|
+
for (const k of keys)
|
|
27
|
+
if (this.store.delete(k))
|
|
28
|
+
n++;
|
|
29
|
+
return n;
|
|
30
|
+
}
|
|
31
|
+
incr(key) {
|
|
32
|
+
const v = Number(this.get(key) ?? '0') + 1;
|
|
33
|
+
this.set(key, String(v));
|
|
34
|
+
return v;
|
|
35
|
+
}
|
|
36
|
+
expire(key, ttlMs) {
|
|
37
|
+
const e = this.store.get(key);
|
|
38
|
+
if (!e)
|
|
39
|
+
return false;
|
|
40
|
+
e.expiresAt = Date.now() + ttlMs;
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
ttl(key) {
|
|
44
|
+
const e = this.store.get(key);
|
|
45
|
+
if (!e)
|
|
46
|
+
return -2;
|
|
47
|
+
if (!e.expiresAt)
|
|
48
|
+
return -1;
|
|
49
|
+
return Math.max(0, Math.ceil((e.expiresAt - Date.now()) / 1000));
|
|
50
|
+
}
|
|
51
|
+
keys(pattern) {
|
|
52
|
+
const re = new RegExp('^' + pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
|
|
53
|
+
return [...this.store.keys()].filter((k) => re.test(k));
|
|
54
|
+
}
|
|
55
|
+
flushAll() {
|
|
56
|
+
this.store.clear();
|
|
57
|
+
}
|
|
58
|
+
/* ── programmatic helpers used by the security layer ── */
|
|
59
|
+
hitRate(bucket, limit, windowMs) {
|
|
60
|
+
const now = Date.now();
|
|
61
|
+
const winKey = `${bucket}:${Math.floor(now / windowMs)}`;
|
|
62
|
+
const count = this.incr(winKey);
|
|
63
|
+
this.expire(winKey, windowMs);
|
|
64
|
+
return {
|
|
65
|
+
ok: count <= limit,
|
|
66
|
+
remaining: Math.max(0, limit - count),
|
|
67
|
+
resetSec: Math.ceil((windowMs - (now % windowMs)) / 1000),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** Replay guard: true on first sight of the nonce within its TTL. */
|
|
71
|
+
seenNonce(nonce, ttlMs) {
|
|
72
|
+
return this.setNx(`nonce:${nonce}`, '1', ttlMs);
|
|
73
|
+
}
|
|
74
|
+
sweep() {
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
for (const [k, e] of this.store)
|
|
77
|
+
if (e.expiresAt && e.expiresAt <= now)
|
|
78
|
+
this.store.delete(k);
|
|
79
|
+
}
|
|
80
|
+
size() {
|
|
81
|
+
return this.store.size;
|
|
82
|
+
}
|
|
83
|
+
/* ── RESP server ── */
|
|
84
|
+
listen(port, host = '127.0.0.1') {
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
const server = net.createServer((socket) => {
|
|
87
|
+
let buf = '';
|
|
88
|
+
let respMode = null;
|
|
89
|
+
const flushLine = (line) => {
|
|
90
|
+
if (respMode?.active) {
|
|
91
|
+
// RESP bulk-string lines arrive as "$len" then payload
|
|
92
|
+
if (line.startsWith('$'))
|
|
93
|
+
return;
|
|
94
|
+
respMode.parts.push(line);
|
|
95
|
+
if (respMode.parts.length >= respMode.count) {
|
|
96
|
+
try {
|
|
97
|
+
socket.write(this.executeArray(respMode.parts));
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
socket.write('-ERR internal\r\n');
|
|
101
|
+
}
|
|
102
|
+
respMode = null;
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (line.startsWith('*')) {
|
|
107
|
+
const n = Number(line.slice(1));
|
|
108
|
+
if (!Number.isNaN(n)) {
|
|
109
|
+
respMode = { active: true, count: n, parts: [] };
|
|
110
|
+
// A RESP array of N elements has N "$len" header lines we skip,
|
|
111
|
+
// so total scanned lines is handled lazily above.
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (line.trim().length === 0)
|
|
116
|
+
return;
|
|
117
|
+
try {
|
|
118
|
+
socket.write(this.executeInline(line));
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
socket.write('-ERR internal\r\n');
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
socket.on('data', (chunk) => {
|
|
125
|
+
buf += chunk.toString('utf8');
|
|
126
|
+
let idx;
|
|
127
|
+
while ((idx = buf.indexOf('\r\n')) !== -1) {
|
|
128
|
+
const line = buf.slice(0, idx);
|
|
129
|
+
buf = buf.slice(idx + 2);
|
|
130
|
+
flushLine(line);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
server.on('error', reject);
|
|
135
|
+
server.listen(port, host, () => {
|
|
136
|
+
this.server = server;
|
|
137
|
+
resolve(port);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
close() {
|
|
142
|
+
this.server?.close();
|
|
143
|
+
this.server = null;
|
|
144
|
+
}
|
|
145
|
+
/** Inline protocol: "CMD arg arg" */
|
|
146
|
+
executeInline(raw) {
|
|
147
|
+
return this.run(raw.trim().split(/\s+/));
|
|
148
|
+
}
|
|
149
|
+
/** RESP array (values only, bulk headers already stripped). */
|
|
150
|
+
executeArray(parts) {
|
|
151
|
+
return this.run(parts.map(String));
|
|
152
|
+
}
|
|
153
|
+
run(parts) {
|
|
154
|
+
if (!parts || parts.length === 0)
|
|
155
|
+
return '-ERR empty\r\n';
|
|
156
|
+
const cmd = (parts[0] || '').toUpperCase();
|
|
157
|
+
const args = parts.slice(1).map(String);
|
|
158
|
+
switch (cmd) {
|
|
159
|
+
case 'PING': return '+PONG\r\n';
|
|
160
|
+
case 'ECHO': return `$${args[0]?.length ?? 0}\r\n${args[0] ?? ''}\r\n`;
|
|
161
|
+
case 'SET':
|
|
162
|
+
if (args.length < 2)
|
|
163
|
+
return '-ERR wrong arity\r\n';
|
|
164
|
+
this.set(args[0], args.slice(1).join(' '));
|
|
165
|
+
return '+OK\r\n';
|
|
166
|
+
case 'GET': {
|
|
167
|
+
const v = this.get(args[0]);
|
|
168
|
+
return v === null ? '$-1\r\n' : `$${Buffer.byteLength(v)}\r\n${v}\r\n`;
|
|
169
|
+
}
|
|
170
|
+
case 'DEL': return `:${this.del(...args)}\r\n`;
|
|
171
|
+
case 'INCR': return `:${this.incr(args[0])}\r\n`;
|
|
172
|
+
case 'EXPIRE': {
|
|
173
|
+
const ok = this.expire(args[0], Number(args[1]) * 1000);
|
|
174
|
+
return ok ? ':1\r\n' : ':0\r\n';
|
|
175
|
+
}
|
|
176
|
+
case 'TTL': return `:${this.ttl(args[0])}\r\n`;
|
|
177
|
+
case 'KEYS': {
|
|
178
|
+
const ks = this.keys(args[0] ?? '*');
|
|
179
|
+
let out = `*${ks.length}\r\n`;
|
|
180
|
+
for (const k of ks)
|
|
181
|
+
out += `$${k.length}\r\n${k}\r\n`;
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
case 'DBSIZE': return `:${this.size()}\r\n`;
|
|
185
|
+
case 'FLUSHALL':
|
|
186
|
+
this.flushAll();
|
|
187
|
+
return '+OK\r\n';
|
|
188
|
+
default: return `-ERR unknown command '${cmd}'\r\n`;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
const PROFILES = {
|
|
3
|
+
standard: {
|
|
4
|
+
requireKey: false, requireHmac: false, requireTimestamp: false,
|
|
5
|
+
maxBodyBytes: 512 * 1024 * 1024, rpsPerKey: 50, burstPerKey: 100,
|
|
6
|
+
allowIps: ['127.0.0.1', '::1'], nonceTtlMs: 60_000,
|
|
7
|
+
lockoutThreshold: 25, lockoutMs: 60_000, cacheTtlMs: 5_000,
|
|
8
|
+
},
|
|
9
|
+
hardened: {
|
|
10
|
+
requireKey: true, requireHmac: false, requireTimestamp: true,
|
|
11
|
+
maxBodyBytes: 512 * 1024 * 1024, rpsPerKey: 120, burstPerKey: 240,
|
|
12
|
+
allowIps: ['127.0.0.1', '::1'], nonceTtlMs: 300_000,
|
|
13
|
+
lockoutThreshold: 10, lockoutMs: 300_000, cacheTtlMs: 15_000,
|
|
14
|
+
},
|
|
15
|
+
paranoid: {
|
|
16
|
+
requireKey: true, requireHmac: true, requireTimestamp: true,
|
|
17
|
+
maxBodyBytes: 64 * 1024 * 1024, rpsPerKey: 200, burstPerKey: 400,
|
|
18
|
+
allowIps: ['127.0.0.1', '::1'], nonceTtlMs: 600_000,
|
|
19
|
+
lockoutThreshold: 3, lockoutMs: 900_000, cacheTtlMs: 30_000,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
export function resolveProfile(profileName, overrides = {}) {
|
|
23
|
+
const base = PROFILES[profileName in PROFILES ? profileName : 'standard'];
|
|
24
|
+
const cfg = {
|
|
25
|
+
profile: profileName in PROFILES ? profileName : 'standard',
|
|
26
|
+
...base,
|
|
27
|
+
};
|
|
28
|
+
if (overrides.mode === 'open')
|
|
29
|
+
cfg.requireKey = false;
|
|
30
|
+
if (overrides.mode === 'keyed')
|
|
31
|
+
cfg.requireKey = true;
|
|
32
|
+
if (overrides.hmac)
|
|
33
|
+
cfg.requireHmac = true;
|
|
34
|
+
if (overrides.rps)
|
|
35
|
+
cfg.rpsPerKey = overrides.rps;
|
|
36
|
+
if (overrides.maxBody) {
|
|
37
|
+
const m = overrides.maxBody.match(/^(\d+)([kmg]?)b?$/i);
|
|
38
|
+
if (m) {
|
|
39
|
+
const mult = m[2]?.toLowerCase() === 'g' ? 1024 ** 3 : m[2]?.toLowerCase() === 'm' ? 1024 ** 2 : m[2]?.toLowerCase() === 'k' ? 1024 : 1;
|
|
40
|
+
cfg.maxBodyBytes = Number(m[1]) * mult;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (overrides.ips && overrides.ips.length > 0)
|
|
44
|
+
cfg.allowIps = overrides.ips;
|
|
45
|
+
return cfg;
|
|
46
|
+
}
|
|
47
|
+
/** Local API keys — sk_live-…, stored hashed inside MicroRedis. */
|
|
48
|
+
export function generateApiKey() {
|
|
49
|
+
const raw = crypto.randomBytes(24).toString('hex');
|
|
50
|
+
const key = `sk_local-${raw}`;
|
|
51
|
+
return { key, hash: sha256(key), prefix: key.slice(0, 14) };
|
|
52
|
+
}
|
|
53
|
+
export function sha256(input) {
|
|
54
|
+
return crypto.createHash('sha256').update(input).digest('hex');
|
|
55
|
+
}
|
|
56
|
+
export function hmacSignature(secret, method, path, timestamp, bodyHash) {
|
|
57
|
+
return crypto.createHmac('sha256', secret).update(`${method.toUpperCase()}|${path}|${timestamp}|${bodyHash}`).digest('hex');
|
|
58
|
+
}
|
|
59
|
+
export function authenticateRequest(req, cfg, redis, bodyBuffer) {
|
|
60
|
+
const ip = normalizeIp(req.socket.remoteAddress);
|
|
61
|
+
// IP pinning — loopback unless explicitly widened.
|
|
62
|
+
if (!cfg.allowIps.some((a) => a === '*' || a === ip)) {
|
|
63
|
+
return { ok: false, status: 403, error: `IP ${ip} is not allowed by this profile` };
|
|
64
|
+
}
|
|
65
|
+
const hdr = (n) => {
|
|
66
|
+
const v = req.headers[n];
|
|
67
|
+
return Array.isArray(v) ? v[0] ?? '' : v ?? '';
|
|
68
|
+
};
|
|
69
|
+
const authHeader = hdr('authorization');
|
|
70
|
+
let keyId = 'anonymous';
|
|
71
|
+
if (cfg.requireKey) {
|
|
72
|
+
const token = authHeader.replace(/^Bearer\s+/i, '');
|
|
73
|
+
if (!token.startsWith('sk_local-')) {
|
|
74
|
+
return { ok: false, status: 401, error: 'Missing or malformed local key (expected: Authorization: Bearer sk_local-…)' };
|
|
75
|
+
}
|
|
76
|
+
const hash = sha256(token);
|
|
77
|
+
if (!redis.get(`key:${hash}`)) {
|
|
78
|
+
// Brute-force lockout per IP.
|
|
79
|
+
const fails = redis.incr(`fail:${ip}`);
|
|
80
|
+
redis.expire(`fail:${ip}`, cfg.lockoutMs);
|
|
81
|
+
if (fails >= cfg.lockoutThreshold) {
|
|
82
|
+
redis.set(`lock:${ip}`, '1', cfg.lockoutMs);
|
|
83
|
+
}
|
|
84
|
+
return { ok: false, status: 401, error: 'Invalid local key' };
|
|
85
|
+
}
|
|
86
|
+
if (redis.get(`lock:${ip}`)) {
|
|
87
|
+
return { ok: false, status: 429, error: 'Locked out — too many invalid keys from this IP' };
|
|
88
|
+
}
|
|
89
|
+
keyId = redis.get(`key:${hash}`) || 'local';
|
|
90
|
+
// Per-key rate bucket.
|
|
91
|
+
const bucket = `rate:${hash}`;
|
|
92
|
+
const win = Math.max(1, cfg.burstPerKey > cfg.rpsPerKey ? 1000 : 1000);
|
|
93
|
+
const rate = redis.hitRate(bucket, cfg.rpsPerKey * (win / 1000), win);
|
|
94
|
+
if (!rate.ok) {
|
|
95
|
+
return { ok: false, status: 429, error: `Local rate limit exceeded (${cfg.rpsPerKey} req/s/key)` };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// Open mode still gets an anonymous bucket so one runaway client cannot
|
|
100
|
+
// hammer SquidCloud through the host.
|
|
101
|
+
const rate = redis.hitRate(`anon:${ip}`, cfg.rpsPerKey, 1000);
|
|
102
|
+
if (!rate.ok)
|
|
103
|
+
return { ok: false, status: 429, error: `Rate limit exceeded (${cfg.rpsPerKey} req/s)` };
|
|
104
|
+
}
|
|
105
|
+
// Timestamp + replay guard.
|
|
106
|
+
if (cfg.requireTimestamp) {
|
|
107
|
+
const ts = Number(hdr('x-timestamp'));
|
|
108
|
+
if (!ts || Math.abs(Date.now() - ts) > 60_000) {
|
|
109
|
+
return { ok: false, status: 401, error: 'Missing/stale X-Timestamp (±60s window)' };
|
|
110
|
+
}
|
|
111
|
+
const nonce = hdr('x-nonce') || `${ts}:${bodyHashOf(bodyBuffer)}`;
|
|
112
|
+
if (!redis.seenNonce(nonce, cfg.nonceTtlMs)) {
|
|
113
|
+
return { ok: false, status: 409, error: 'Replayed request (nonce already seen)' };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// HMAC request signing (paranoid / opt-in).
|
|
117
|
+
if (cfg.requireHmac) {
|
|
118
|
+
const secret = process.env.SQUIDCLOUD_HOST_HMAC_SECRET || redis.get('host:hmac-secret') || '';
|
|
119
|
+
if (!secret)
|
|
120
|
+
return { ok: false, status: 500, error: 'HMAC required but no secret configured (--hmac-secret)' };
|
|
121
|
+
const sig = hdr('x-signature');
|
|
122
|
+
const ts = hdr('x-timestamp') || String(Date.now());
|
|
123
|
+
const expected = hmacSignature(secret, req.method || '', (req.url || '/').split('?')[0], ts, bodyHashOf(bodyBuffer));
|
|
124
|
+
if (!sig || !safeEqual(sig, expected)) {
|
|
125
|
+
return { ok: false, status: 401, error: 'Invalid X-Signature' };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return { ok: true, keyId };
|
|
129
|
+
}
|
|
130
|
+
function bodyHashOf(buf) {
|
|
131
|
+
return buf && buf.length > 0 ? crypto.createHash('sha256').update(buf).digest('hex') : 'empty';
|
|
132
|
+
}
|
|
133
|
+
function safeEqual(a, b) {
|
|
134
|
+
const ab = Buffer.from(a);
|
|
135
|
+
const bb = Buffer.from(b);
|
|
136
|
+
return ab.length === bb.length && crypto.timingSafeEqual(ab, bb);
|
|
137
|
+
}
|
|
138
|
+
function normalizeIp(ip) {
|
|
139
|
+
if (!ip)
|
|
140
|
+
return '';
|
|
141
|
+
return ip.replace(/^::ffff:/, '');
|
|
142
|
+
}
|