@opentdf/sdk 0.1.0-beta.1701
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 +52 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/src/access.js +155 -0
- package/dist/cjs/src/auth/Eas.js +60 -0
- package/dist/cjs/src/auth/auth.js +79 -0
- package/dist/cjs/src/auth/oidc-clientcredentials-provider.js +26 -0
- package/dist/cjs/src/auth/oidc-externaljwt-provider.js +33 -0
- package/dist/cjs/src/auth/oidc-refreshtoken-provider.js +34 -0
- package/dist/cjs/src/auth/oidc.js +222 -0
- package/dist/cjs/src/auth/providers.js +143 -0
- package/dist/cjs/src/encodings/base64.js +154 -0
- package/dist/cjs/src/encodings/hex.js +70 -0
- package/dist/cjs/src/encodings/index.js +29 -0
- package/dist/cjs/src/errors.js +138 -0
- package/dist/cjs/src/index.js +344 -0
- package/dist/cjs/src/nanotdf/Client.js +296 -0
- package/dist/cjs/src/nanotdf/NanoTDF.js +94 -0
- package/dist/cjs/src/nanotdf/browser-entry.js +19 -0
- package/dist/cjs/src/nanotdf/constants.js +5 -0
- package/dist/cjs/src/nanotdf/decrypt.js +17 -0
- package/dist/cjs/src/nanotdf/encrypt-dataset.js +38 -0
- package/dist/cjs/src/nanotdf/encrypt.js +132 -0
- package/dist/cjs/src/nanotdf/enum/CipherEnum.js +13 -0
- package/dist/cjs/src/nanotdf/enum/CurveNameEnum.js +15 -0
- package/dist/cjs/src/nanotdf/enum/EncodingEnum.js +8 -0
- package/dist/cjs/src/nanotdf/enum/PolicyTypeEnum.js +11 -0
- package/dist/cjs/src/nanotdf/enum/ProtocolEnum.js +10 -0
- package/dist/cjs/src/nanotdf/enum/ResourceLocatorIdentifierEnum.js +11 -0
- package/dist/cjs/src/nanotdf/helpers/calculateByCurve.js +29 -0
- package/dist/cjs/src/nanotdf/helpers/getHkdfSalt.js +11 -0
- package/dist/cjs/src/nanotdf/index.js +25 -0
- package/dist/cjs/src/nanotdf/interfaces/PolicyInterface.js +3 -0
- package/dist/cjs/src/nanotdf/models/Ciphers.js +61 -0
- package/dist/cjs/src/nanotdf/models/DefaultParams.js +27 -0
- package/dist/cjs/src/nanotdf/models/EcCurves.js +39 -0
- package/dist/cjs/src/nanotdf/models/Header.js +255 -0
- package/dist/cjs/src/nanotdf/models/Payload.js +158 -0
- package/dist/cjs/src/nanotdf/models/Policy/AbstractPolicy.js +73 -0
- package/dist/cjs/src/nanotdf/models/Policy/EmbeddedPolicy.js +82 -0
- package/dist/cjs/src/nanotdf/models/Policy/PolicyFactory.js +38 -0
- package/dist/cjs/src/nanotdf/models/Policy/RemotePolicy.js +62 -0
- package/dist/cjs/src/nanotdf/models/ResourceLocator.js +211 -0
- package/dist/cjs/src/nanotdf/models/Signature.js +77 -0
- package/dist/cjs/src/nanotdf-crypto/ciphers.js +17 -0
- package/dist/cjs/src/nanotdf-crypto/decrypt.js +24 -0
- package/dist/cjs/src/nanotdf-crypto/digest.js +7 -0
- package/dist/cjs/src/nanotdf-crypto/ecdsaSignature.js +83 -0
- package/dist/cjs/src/nanotdf-crypto/encrypt.js +24 -0
- package/dist/cjs/src/nanotdf-crypto/enums.js +52 -0
- package/dist/cjs/src/nanotdf-crypto/exportCryptoKey.js +20 -0
- package/dist/cjs/src/nanotdf-crypto/generateKeyPair.js +13 -0
- package/dist/cjs/src/nanotdf-crypto/generateRandomNumber.js +12 -0
- package/dist/cjs/src/nanotdf-crypto/importRawKey.js +18 -0
- package/dist/cjs/src/nanotdf-crypto/index.js +52 -0
- package/dist/cjs/src/nanotdf-crypto/keyAgreement.js +91 -0
- package/dist/cjs/src/nanotdf-crypto/pemPublicToCrypto.js +225 -0
- package/dist/cjs/src/policy/api.js +58 -0
- package/dist/cjs/src/policy/attributes.js +3 -0
- package/dist/cjs/src/policy/granter.js +146 -0
- package/dist/cjs/src/tdf/AttributeObject.js +15 -0
- package/dist/cjs/src/tdf/AttributeObjectJwt.js +3 -0
- package/dist/cjs/src/tdf/Crypto.js +47 -0
- package/dist/cjs/src/tdf/EntityObject.js +3 -0
- package/dist/cjs/src/tdf/NanoTDF/NanoTDF.js +38 -0
- package/dist/cjs/src/tdf/Policy.js +50 -0
- package/dist/cjs/src/tdf/PolicyObject.js +3 -0
- package/dist/cjs/src/tdf/TypedArray.js +3 -0
- package/dist/cjs/src/tdf/index.js +35 -0
- package/dist/cjs/src/types/index.js +3 -0
- package/dist/cjs/src/utils.js +147 -0
- package/dist/cjs/src/version.js +12 -0
- package/dist/cjs/tdf3/index.js +57 -0
- package/dist/cjs/tdf3/src/assertions.js +118 -0
- package/dist/cjs/tdf3/src/binary.js +153 -0
- package/dist/cjs/tdf3/src/ciphers/aes-gcm-cipher.js +56 -0
- package/dist/cjs/tdf3/src/ciphers/algorithms.js +8 -0
- package/dist/cjs/tdf3/src/ciphers/index.js +8 -0
- package/dist/cjs/tdf3/src/ciphers/symmetric-cipher-base.js +22 -0
- package/dist/cjs/tdf3/src/client/DecoratedReadableStream.js +116 -0
- package/dist/cjs/tdf3/src/client/builders.js +561 -0
- package/dist/cjs/tdf3/src/client/index.js +460 -0
- package/dist/cjs/tdf3/src/client/validation.js +63 -0
- package/dist/cjs/tdf3/src/crypto/crypto-utils.js +116 -0
- package/dist/cjs/tdf3/src/crypto/declarations.js +8 -0
- package/dist/cjs/tdf3/src/crypto/index.js +315 -0
- package/dist/cjs/tdf3/src/index.js +34 -0
- package/dist/cjs/tdf3/src/models/attribute-set.js +122 -0
- package/dist/cjs/tdf3/src/models/encryption-information.js +90 -0
- package/dist/cjs/tdf3/src/models/index.js +25 -0
- package/dist/cjs/tdf3/src/models/key-access.js +103 -0
- package/dist/cjs/tdf3/src/models/manifest.js +3 -0
- package/dist/cjs/tdf3/src/models/payload.js +3 -0
- package/dist/cjs/tdf3/src/models/policy.js +24 -0
- package/dist/cjs/tdf3/src/models/upsert-response.js +3 -0
- package/dist/cjs/tdf3/src/tdf.js +907 -0
- package/dist/cjs/tdf3/src/templates/default.html.js +98 -0
- package/dist/cjs/tdf3/src/templates/escaper.js +15 -0
- package/dist/cjs/tdf3/src/templates/index.js +12 -0
- package/dist/cjs/tdf3/src/utils/buffer-crc32.js +48 -0
- package/dist/cjs/tdf3/src/utils/chunkers.js +106 -0
- package/dist/cjs/tdf3/src/utils/index.js +296 -0
- package/dist/cjs/tdf3/src/utils/keysplit.js +61 -0
- package/dist/cjs/tdf3/src/utils/zip-reader.js +253 -0
- package/dist/cjs/tdf3/src/utils/zip-writer.js +308 -0
- package/dist/cjs/tdf3/src/version.js +6 -0
- package/dist/types/src/access.d.ts +47 -0
- package/dist/types/src/access.d.ts.map +1 -0
- package/dist/types/src/auth/Eas.d.ts +34 -0
- package/dist/types/src/auth/Eas.d.ts.map +1 -0
- package/dist/types/src/auth/auth.d.ts +86 -0
- package/dist/types/src/auth/auth.d.ts.map +1 -0
- package/dist/types/src/auth/oidc-clientcredentials-provider.d.ts +9 -0
- package/dist/types/src/auth/oidc-clientcredentials-provider.d.ts.map +1 -0
- package/dist/types/src/auth/oidc-externaljwt-provider.d.ts +10 -0
- package/dist/types/src/auth/oidc-externaljwt-provider.d.ts.map +1 -0
- package/dist/types/src/auth/oidc-refreshtoken-provider.d.ts +10 -0
- package/dist/types/src/auth/oidc-refreshtoken-provider.d.ts.map +1 -0
- package/dist/types/src/auth/oidc.d.ts +104 -0
- package/dist/types/src/auth/oidc.d.ts.map +1 -0
- package/dist/types/src/auth/providers.d.ts +67 -0
- package/dist/types/src/auth/providers.d.ts.map +1 -0
- package/dist/types/src/encodings/base64.d.ts +18 -0
- package/dist/types/src/encodings/base64.d.ts.map +1 -0
- package/dist/types/src/encodings/hex.d.ts +5 -0
- package/dist/types/src/encodings/hex.d.ts.map +1 -0
- package/dist/types/src/encodings/index.d.ts +3 -0
- package/dist/types/src/encodings/index.d.ts.map +1 -0
- package/dist/types/src/errors.d.ts +72 -0
- package/dist/types/src/errors.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +138 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/nanotdf/Client.d.ts +95 -0
- package/dist/types/src/nanotdf/Client.d.ts.map +1 -0
- package/dist/types/src/nanotdf/NanoTDF.d.ts +25 -0
- package/dist/types/src/nanotdf/NanoTDF.d.ts.map +1 -0
- package/dist/types/src/nanotdf/browser-entry.d.ts +17 -0
- package/dist/types/src/nanotdf/browser-entry.d.ts.map +1 -0
- package/dist/types/src/nanotdf/constants.d.ts +2 -0
- package/dist/types/src/nanotdf/constants.d.ts.map +1 -0
- package/dist/types/src/nanotdf/decrypt.d.ts +9 -0
- package/dist/types/src/nanotdf/decrypt.d.ts.map +1 -0
- package/dist/types/src/nanotdf/encrypt-dataset.d.ts +12 -0
- package/dist/types/src/nanotdf/encrypt-dataset.d.ts.map +1 -0
- package/dist/types/src/nanotdf/encrypt.d.ts +14 -0
- package/dist/types/src/nanotdf/encrypt.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/CipherEnum.d.ts +10 -0
- package/dist/types/src/nanotdf/enum/CipherEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/CurveNameEnum.d.ts +12 -0
- package/dist/types/src/nanotdf/enum/CurveNameEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/EncodingEnum.d.ts +5 -0
- package/dist/types/src/nanotdf/enum/EncodingEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/PolicyTypeEnum.d.ts +8 -0
- package/dist/types/src/nanotdf/enum/PolicyTypeEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/ProtocolEnum.d.ts +7 -0
- package/dist/types/src/nanotdf/enum/ProtocolEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/enum/ResourceLocatorIdentifierEnum.d.ts +8 -0
- package/dist/types/src/nanotdf/enum/ResourceLocatorIdentifierEnum.d.ts.map +1 -0
- package/dist/types/src/nanotdf/helpers/calculateByCurve.d.ts +20 -0
- package/dist/types/src/nanotdf/helpers/calculateByCurve.d.ts.map +1 -0
- package/dist/types/src/nanotdf/helpers/getHkdfSalt.d.ts +9 -0
- package/dist/types/src/nanotdf/helpers/getHkdfSalt.d.ts.map +1 -0
- package/dist/types/src/nanotdf/index.d.ts +9 -0
- package/dist/types/src/nanotdf/index.d.ts.map +1 -0
- package/dist/types/src/nanotdf/interfaces/PolicyInterface.d.ts +17 -0
- package/dist/types/src/nanotdf/interfaces/PolicyInterface.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Ciphers.d.ts +14 -0
- package/dist/types/src/nanotdf/models/Ciphers.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/DefaultParams.d.ts +21 -0
- package/dist/types/src/nanotdf/models/DefaultParams.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/EcCurves.d.ts +15 -0
- package/dist/types/src/nanotdf/models/EcCurves.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Header.d.ts +73 -0
- package/dist/types/src/nanotdf/models/Header.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Payload.d.ts +47 -0
- package/dist/types/src/nanotdf/models/Payload.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Policy/AbstractPolicy.d.ts +52 -0
- package/dist/types/src/nanotdf/models/Policy/AbstractPolicy.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Policy/EmbeddedPolicy.d.ts +35 -0
- package/dist/types/src/nanotdf/models/Policy/EmbeddedPolicy.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Policy/PolicyFactory.d.ts +11 -0
- package/dist/types/src/nanotdf/models/Policy/PolicyFactory.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Policy/RemotePolicy.d.ts +31 -0
- package/dist/types/src/nanotdf/models/Policy/RemotePolicy.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/ResourceLocator.d.ts +65 -0
- package/dist/types/src/nanotdf/models/ResourceLocator.d.ts.map +1 -0
- package/dist/types/src/nanotdf/models/Signature.d.ts +33 -0
- package/dist/types/src/nanotdf/models/Signature.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/ciphers.d.ts +8 -0
- package/dist/types/src/nanotdf-crypto/ciphers.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/decrypt.d.ts +14 -0
- package/dist/types/src/nanotdf-crypto/decrypt.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/digest.d.ts +3 -0
- package/dist/types/src/nanotdf-crypto/digest.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/ecdsaSignature.d.ts +35 -0
- package/dist/types/src/nanotdf-crypto/ecdsaSignature.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/encrypt.d.ts +14 -0
- package/dist/types/src/nanotdf-crypto/encrypt.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/enums.d.ts +42 -0
- package/dist/types/src/nanotdf-crypto/enums.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/exportCryptoKey.d.ts +7 -0
- package/dist/types/src/nanotdf-crypto/exportCryptoKey.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/generateKeyPair.d.ts +10 -0
- package/dist/types/src/nanotdf-crypto/generateKeyPair.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/generateRandomNumber.d.ts +5 -0
- package/dist/types/src/nanotdf-crypto/generateRandomNumber.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/importRawKey.d.ts +13 -0
- package/dist/types/src/nanotdf-crypto/importRawKey.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/index.d.ts +12 -0
- package/dist/types/src/nanotdf-crypto/index.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/keyAgreement.d.ts +28 -0
- package/dist/types/src/nanotdf-crypto/keyAgreement.d.ts.map +1 -0
- package/dist/types/src/nanotdf-crypto/pemPublicToCrypto.d.ts +28 -0
- package/dist/types/src/nanotdf-crypto/pemPublicToCrypto.d.ts.map +1 -0
- package/dist/types/src/policy/api.d.ts +4 -0
- package/dist/types/src/policy/api.d.ts.map +1 -0
- package/dist/types/src/policy/attributes.d.ts +95 -0
- package/dist/types/src/policy/attributes.d.ts.map +1 -0
- package/dist/types/src/policy/granter.d.ts +23 -0
- package/dist/types/src/policy/granter.d.ts.map +1 -0
- package/dist/types/src/tdf/AttributeObject.d.ts +13 -0
- package/dist/types/src/tdf/AttributeObject.d.ts.map +1 -0
- package/dist/types/src/tdf/AttributeObjectJwt.d.ts +4 -0
- package/dist/types/src/tdf/AttributeObjectJwt.d.ts.map +1 -0
- package/dist/types/src/tdf/Crypto.d.ts +37 -0
- package/dist/types/src/tdf/Crypto.d.ts.map +1 -0
- package/dist/types/src/tdf/EntityObject.d.ts +18 -0
- package/dist/types/src/tdf/EntityObject.d.ts.map +1 -0
- package/dist/types/src/tdf/NanoTDF/NanoTDF.d.ts +99 -0
- package/dist/types/src/tdf/NanoTDF/NanoTDF.d.ts.map +1 -0
- package/dist/types/src/tdf/Policy.d.ts +28 -0
- package/dist/types/src/tdf/Policy.d.ts.map +1 -0
- package/dist/types/src/tdf/PolicyObject.d.ts +11 -0
- package/dist/types/src/tdf/PolicyObject.d.ts.map +1 -0
- package/dist/types/src/tdf/TypedArray.d.ts +3 -0
- package/dist/types/src/tdf/TypedArray.d.ts.map +1 -0
- package/dist/types/src/tdf/index.d.ts +7 -0
- package/dist/types/src/tdf/index.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +45 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/utils.d.ts +45 -0
- package/dist/types/src/utils.d.ts.map +1 -0
- package/dist/types/src/version.d.ts +9 -0
- package/dist/types/src/version.d.ts.map +1 -0
- package/dist/types/tdf3/index.d.ts +16 -0
- package/dist/types/tdf3/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/assertions.d.ts +63 -0
- package/dist/types/tdf3/src/assertions.d.ts.map +1 -0
- package/dist/types/tdf3/src/binary.d.ts +38 -0
- package/dist/types/tdf3/src/binary.d.ts.map +1 -0
- package/dist/types/tdf3/src/ciphers/aes-gcm-cipher.d.ts +18 -0
- package/dist/types/tdf3/src/ciphers/aes-gcm-cipher.d.ts.map +1 -0
- package/dist/types/tdf3/src/ciphers/algorithms.d.ts +4 -0
- package/dist/types/tdf3/src/ciphers/algorithms.d.ts.map +1 -0
- package/dist/types/tdf3/src/ciphers/index.d.ts +3 -0
- package/dist/types/tdf3/src/ciphers/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/ciphers/symmetric-cipher-base.d.ts +14 -0
- package/dist/types/tdf3/src/ciphers/symmetric-cipher-base.d.ts.map +1 -0
- package/dist/types/tdf3/src/client/DecoratedReadableStream.d.ts +53 -0
- package/dist/types/tdf3/src/client/DecoratedReadableStream.d.ts.map +1 -0
- package/dist/types/tdf3/src/client/builders.d.ts +436 -0
- package/dist/types/tdf3/src/client/builders.d.ts.map +1 -0
- package/dist/types/tdf3/src/client/index.d.ts +139 -0
- package/dist/types/tdf3/src/client/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/client/validation.d.ts +8 -0
- package/dist/types/tdf3/src/client/validation.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/crypto-utils.d.ts +34 -0
- package/dist/types/tdf3/src/crypto/crypto-utils.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/declarations.d.ts +60 -0
- package/dist/types/tdf3/src/crypto/declarations.d.ts.map +1 -0
- package/dist/types/tdf3/src/crypto/index.d.ts +103 -0
- package/dist/types/tdf3/src/crypto/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/index.d.ts +5 -0
- package/dist/types/tdf3/src/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/attribute-set.d.ts +65 -0
- package/dist/types/tdf3/src/models/attribute-set.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/encryption-information.d.ts +49 -0
- package/dist/types/tdf3/src/models/encryption-information.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/index.d.ts +9 -0
- package/dist/types/tdf3/src/models/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/key-access.d.ts +42 -0
- package/dist/types/tdf3/src/models/key-access.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/manifest.d.ts +9 -0
- package/dist/types/tdf3/src/models/manifest.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/payload.d.ts +7 -0
- package/dist/types/tdf3/src/models/payload.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/policy.d.ts +13 -0
- package/dist/types/tdf3/src/models/policy.d.ts.map +1 -0
- package/dist/types/tdf3/src/models/upsert-response.d.ts +16 -0
- package/dist/types/tdf3/src/models/upsert-response.d.ts.map +1 -0
- package/dist/types/tdf3/src/tdf.d.ts +152 -0
- package/dist/types/tdf3/src/tdf.d.ts.map +1 -0
- package/dist/types/tdf3/src/templates/default.html.d.ts +8 -0
- package/dist/types/tdf3/src/templates/default.html.d.ts.map +1 -0
- package/dist/types/tdf3/src/templates/escaper.d.ts +6 -0
- package/dist/types/tdf3/src/templates/escaper.d.ts.map +1 -0
- package/dist/types/tdf3/src/templates/index.d.ts +3 -0
- package/dist/types/tdf3/src/templates/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/buffer-crc32.d.ts +2 -0
- package/dist/types/tdf3/src/utils/buffer-crc32.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/chunkers.d.ts +29 -0
- package/dist/types/tdf3/src/utils/chunkers.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/index.d.ts +36 -0
- package/dist/types/tdf3/src/utils/index.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/keysplit.d.ts +19 -0
- package/dist/types/tdf3/src/utils/keysplit.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/zip-reader.d.ts +63 -0
- package/dist/types/tdf3/src/utils/zip-reader.d.ts.map +1 -0
- package/dist/types/tdf3/src/utils/zip-writer.d.ts +35 -0
- package/dist/types/tdf3/src/utils/zip-writer.d.ts.map +1 -0
- package/dist/types/tdf3/src/version.d.ts +3 -0
- package/dist/types/tdf3/src/version.d.ts.map +1 -0
- package/dist/web/package.json +3 -0
- package/dist/web/src/access.js +147 -0
- package/dist/web/src/auth/Eas.js +55 -0
- package/dist/web/src/auth/auth.js +71 -0
- package/dist/web/src/auth/oidc-clientcredentials-provider.js +22 -0
- package/dist/web/src/auth/oidc-externaljwt-provider.js +29 -0
- package/dist/web/src/auth/oidc-refreshtoken-provider.js +30 -0
- package/dist/web/src/auth/oidc.js +215 -0
- package/dist/web/src/auth/providers.js +119 -0
- package/dist/web/src/encodings/base64.js +147 -0
- package/dist/web/src/encodings/hex.js +63 -0
- package/dist/web/src/encodings/index.js +3 -0
- package/dist/web/src/errors.js +123 -0
- package/dist/web/src/index.js +313 -0
- package/dist/web/src/nanotdf/Client.js +268 -0
- package/dist/web/src/nanotdf/NanoTDF.js +89 -0
- package/dist/web/src/nanotdf/browser-entry.js +14 -0
- package/dist/web/src/nanotdf/constants.js +2 -0
- package/dist/web/src/nanotdf/decrypt.js +14 -0
- package/dist/web/src/nanotdf/encrypt-dataset.js +32 -0
- package/dist/web/src/nanotdf/encrypt.js +126 -0
- package/dist/web/src/nanotdf/enum/CipherEnum.js +11 -0
- package/dist/web/src/nanotdf/enum/CurveNameEnum.js +13 -0
- package/dist/web/src/nanotdf/enum/EncodingEnum.js +6 -0
- package/dist/web/src/nanotdf/enum/PolicyTypeEnum.js +9 -0
- package/dist/web/src/nanotdf/enum/ProtocolEnum.js +8 -0
- package/dist/web/src/nanotdf/enum/ResourceLocatorIdentifierEnum.js +9 -0
- package/dist/web/src/nanotdf/helpers/calculateByCurve.js +24 -0
- package/dist/web/src/nanotdf/helpers/getHkdfSalt.js +8 -0
- package/dist/web/src/nanotdf/index.js +11 -0
- package/dist/web/src/nanotdf/interfaces/PolicyInterface.js +2 -0
- package/dist/web/src/nanotdf/models/Ciphers.js +54 -0
- package/dist/web/src/nanotdf/models/DefaultParams.js +22 -0
- package/dist/web/src/nanotdf/models/EcCurves.js +32 -0
- package/dist/web/src/nanotdf/models/Header.js +250 -0
- package/dist/web/src/nanotdf/models/Payload.js +156 -0
- package/dist/web/src/nanotdf/models/Policy/AbstractPolicy.js +71 -0
- package/dist/web/src/nanotdf/models/Policy/EmbeddedPolicy.js +77 -0
- package/dist/web/src/nanotdf/models/Policy/PolicyFactory.js +33 -0
- package/dist/web/src/nanotdf/models/Policy/RemotePolicy.js +57 -0
- package/dist/web/src/nanotdf/models/ResourceLocator.js +206 -0
- package/dist/web/src/nanotdf/models/Signature.js +74 -0
- package/dist/web/src/nanotdf-crypto/ciphers.js +14 -0
- package/dist/web/src/nanotdf-crypto/decrypt.js +21 -0
- package/dist/web/src/nanotdf-crypto/digest.js +4 -0
- package/dist/web/src/nanotdf-crypto/ecdsaSignature.js +77 -0
- package/dist/web/src/nanotdf-crypto/encrypt.js +21 -0
- package/dist/web/src/nanotdf-crypto/enums.js +49 -0
- package/dist/web/src/nanotdf-crypto/exportCryptoKey.js +17 -0
- package/dist/web/src/nanotdf-crypto/generateKeyPair.js +10 -0
- package/dist/web/src/nanotdf-crypto/generateRandomNumber.js +9 -0
- package/dist/web/src/nanotdf-crypto/importRawKey.js +15 -0
- package/dist/web/src/nanotdf-crypto/index.js +12 -0
- package/dist/web/src/nanotdf-crypto/keyAgreement.js +87 -0
- package/dist/web/src/nanotdf-crypto/pemPublicToCrypto.js +197 -0
- package/dist/web/src/policy/api.js +54 -0
- package/dist/web/src/policy/attributes.js +2 -0
- package/dist/web/src/policy/granter.js +141 -0
- package/dist/web/src/tdf/AttributeObject.js +11 -0
- package/dist/web/src/tdf/AttributeObjectJwt.js +2 -0
- package/dist/web/src/tdf/Crypto.js +44 -0
- package/dist/web/src/tdf/EntityObject.js +2 -0
- package/dist/web/src/tdf/NanoTDF/NanoTDF.js +35 -0
- package/dist/web/src/tdf/Policy.js +48 -0
- package/dist/web/src/tdf/PolicyObject.js +2 -0
- package/dist/web/src/tdf/TypedArray.js +2 -0
- package/dist/web/src/tdf/index.js +4 -0
- package/dist/web/src/types/index.js +2 -0
- package/dist/web/src/utils.js +133 -0
- package/dist/web/src/version.js +9 -0
- package/dist/web/tdf3/index.js +13 -0
- package/dist/web/tdf3/src/assertions.js +111 -0
- package/dist/web/tdf3/src/binary.js +149 -0
- package/dist/web/tdf3/src/ciphers/aes-gcm-cipher.js +52 -0
- package/dist/web/tdf3/src/ciphers/algorithms.js +5 -0
- package/dist/web/tdf3/src/ciphers/index.js +3 -0
- package/dist/web/tdf3/src/ciphers/symmetric-cipher-base.js +18 -0
- package/dist/web/tdf3/src/client/DecoratedReadableStream.js +107 -0
- package/dist/web/tdf3/src/client/builders.js +557 -0
- package/dist/web/tdf3/src/client/index.js +423 -0
- package/dist/web/tdf3/src/client/validation.js +58 -0
- package/dist/web/tdf3/src/crypto/crypto-utils.js +107 -0
- package/dist/web/tdf3/src/crypto/declarations.js +5 -0
- package/dist/web/tdf3/src/crypto/index.js +296 -0
- package/dist/web/tdf3/src/index.js +5 -0
- package/dist/web/tdf3/src/models/attribute-set.js +118 -0
- package/dist/web/tdf3/src/models/encryption-information.js +86 -0
- package/dist/web/tdf3/src/models/index.js +9 -0
- package/dist/web/tdf3/src/models/key-access.js +74 -0
- package/dist/web/tdf3/src/models/manifest.js +2 -0
- package/dist/web/tdf3/src/models/payload.js +2 -0
- package/dist/web/tdf3/src/models/policy.js +20 -0
- package/dist/web/tdf3/src/models/upsert-response.js +2 -0
- package/dist/web/tdf3/src/tdf.js +866 -0
- package/dist/web/tdf3/src/templates/default.html.js +96 -0
- package/dist/web/tdf3/src/templates/escaper.js +10 -0
- package/dist/web/tdf3/src/templates/index.js +3 -0
- package/dist/web/tdf3/src/utils/buffer-crc32.js +44 -0
- package/dist/web/tdf3/src/utils/chunkers.js +96 -0
- package/dist/web/tdf3/src/utils/index.js +248 -0
- package/dist/web/tdf3/src/utils/keysplit.js +55 -0
- package/dist/web/tdf3/src/utils/zip-reader.js +247 -0
- package/dist/web/tdf3/src/utils/zip-writer.js +302 -0
- package/dist/web/tdf3/src/version.js +3 -0
- package/package.json +126 -0
- package/src/access.ts +198 -0
- package/src/auth/Eas.ts +79 -0
- package/src/auth/auth.ts +141 -0
- package/src/auth/oidc-clientcredentials-provider.ts +32 -0
- package/src/auth/oidc-externaljwt-provider.ts +41 -0
- package/src/auth/oidc-refreshtoken-provider.ts +41 -0
- package/src/auth/oidc.ts +307 -0
- package/src/auth/providers.ts +139 -0
- package/src/encodings/base64.ts +160 -0
- package/src/encodings/hex.ts +69 -0
- package/src/encodings/index.ts +2 -0
- package/src/errors.ts +113 -0
- package/src/index.ts +441 -0
- package/src/nanotdf/Client.ts +349 -0
- package/src/nanotdf/NanoTDF.ts +121 -0
- package/src/nanotdf/browser-entry.ts +20 -0
- package/src/nanotdf/constants.ts +1 -0
- package/src/nanotdf/decrypt.ts +19 -0
- package/src/nanotdf/encrypt-dataset.ts +52 -0
- package/src/nanotdf/encrypt.ts +197 -0
- package/src/nanotdf/enum/CipherEnum.ts +10 -0
- package/src/nanotdf/enum/CurveNameEnum.ts +12 -0
- package/src/nanotdf/enum/EncodingEnum.ts +5 -0
- package/src/nanotdf/enum/PolicyTypeEnum.ts +8 -0
- package/src/nanotdf/enum/ProtocolEnum.ts +7 -0
- package/src/nanotdf/enum/ResourceLocatorIdentifierEnum.ts +8 -0
- package/src/nanotdf/helpers/calculateByCurve.ts +26 -0
- package/src/nanotdf/helpers/getHkdfSalt.ts +15 -0
- package/src/nanotdf/index.ts +10 -0
- package/src/nanotdf/interfaces/PolicyInterface.ts +27 -0
- package/src/nanotdf/models/Ciphers.ts +67 -0
- package/src/nanotdf/models/DefaultParams.ts +24 -0
- package/src/nanotdf/models/EcCurves.ts +40 -0
- package/src/nanotdf/models/Header.ts +322 -0
- package/src/nanotdf/models/Payload.ts +196 -0
- package/src/nanotdf/models/Policy/AbstractPolicy.ts +90 -0
- package/src/nanotdf/models/Policy/EmbeddedPolicy.ts +101 -0
- package/src/nanotdf/models/Policy/PolicyFactory.ts +48 -0
- package/src/nanotdf/models/Policy/RemotePolicy.ts +74 -0
- package/src/nanotdf/models/ResourceLocator.ts +212 -0
- package/src/nanotdf/models/Signature.ts +85 -0
- package/src/nanotdf-crypto/ciphers.ts +13 -0
- package/src/nanotdf-crypto/decrypt.ts +30 -0
- package/src/nanotdf-crypto/digest.ts +8 -0
- package/src/nanotdf-crypto/ecdsaSignature.ts +109 -0
- package/src/nanotdf-crypto/encrypt.ts +30 -0
- package/src/nanotdf-crypto/enums.ts +47 -0
- package/src/nanotdf-crypto/exportCryptoKey.ts +17 -0
- package/src/nanotdf-crypto/generateKeyPair.ts +19 -0
- package/src/nanotdf-crypto/generateRandomNumber.ts +8 -0
- package/src/nanotdf-crypto/importRawKey.ts +19 -0
- package/src/nanotdf-crypto/index.ts +11 -0
- package/src/nanotdf-crypto/keyAgreement.ts +139 -0
- package/src/nanotdf-crypto/pemPublicToCrypto.ts +232 -0
- package/src/package-lock.json +6 -0
- package/src/package.json +3 -0
- package/src/platform/authorization/authorization_connect.d.ts +44 -0
- package/src/platform/authorization/authorization_connect.js +44 -0
- package/src/platform/authorization/authorization_pb.d.ts +707 -0
- package/src/platform/authorization/authorization_pb.js +372 -0
- package/src/platform/common/common_pb.d.ts +129 -0
- package/src/platform/common/common_pb.js +58 -0
- package/src/platform/entityresolution/entity_resolution_connect.d.ts +35 -0
- package/src/platform/entityresolution/entity_resolution_connect.js +35 -0
- package/src/platform/entityresolution/entity_resolution_pb.d.ts +242 -0
- package/src/platform/entityresolution/entity_resolution_pb.js +139 -0
- package/src/platform/kas/kas_connect.d.ts +59 -0
- package/src/platform/kas/kas_connect.js +59 -0
- package/src/platform/kas/kas_pb.d.ts +200 -0
- package/src/platform/kas/kas_pb.js +84 -0
- package/src/platform/policy/attributes/attributes_connect.d.ts +168 -0
- package/src/platform/policy/attributes/attributes_connect.js +168 -0
- package/src/platform/policy/attributes/attributes_pb.d.ts +929 -0
- package/src/platform/policy/attributes/attributes_pb.js +363 -0
- package/src/platform/policy/kasregistry/key_access_server_registry_connect.d.ts +62 -0
- package/src/platform/policy/kasregistry/key_access_server_registry_connect.js +62 -0
- package/src/platform/policy/kasregistry/key_access_server_registry_pb.d.ts +283 -0
- package/src/platform/policy/kasregistry/key_access_server_registry_pb.js +113 -0
- package/src/platform/policy/namespaces/namespaces_connect.d.ts +62 -0
- package/src/platform/policy/namespaces/namespaces_connect.js +62 -0
- package/src/platform/policy/namespaces/namespaces_pb.d.ts +270 -0
- package/src/platform/policy/namespaces/namespaces_pb.js +110 -0
- package/src/platform/policy/objects_pb.d.ts +725 -0
- package/src/platform/policy/objects_pb.js +288 -0
- package/src/platform/policy/resourcemapping/resource_mapping_connect.d.ts +259 -0
- package/src/platform/policy/resourcemapping/resource_mapping_connect.js +259 -0
- package/src/platform/policy/resourcemapping/resource_mapping_pb.d.ts +314 -0
- package/src/platform/policy/resourcemapping/resource_mapping_pb.js +142 -0
- package/src/platform/policy/selectors_pb.d.ts +269 -0
- package/src/platform/policy/selectors_pb.js +110 -0
- package/src/platform/policy/subjectmapping/subject_mapping_connect.d.ts +118 -0
- package/src/platform/policy/subjectmapping/subject_mapping_connect.js +118 -0
- package/src/platform/policy/subjectmapping/subject_mapping_pb.d.ts +672 -0
- package/src/platform/policy/subjectmapping/subject_mapping_pb.js +260 -0
- package/src/platform/wellknownconfiguration/wellknown_configuration_connect.d.ts +26 -0
- package/src/platform/wellknownconfiguration/wellknown_configuration_connect.js +26 -0
- package/src/platform/wellknownconfiguration/wellknown_configuration_pb.d.ts +75 -0
- package/src/platform/wellknownconfiguration/wellknown_configuration_pb.js +35 -0
- package/src/policy/api.ts +61 -0
- package/src/policy/attributes.ts +117 -0
- package/src/policy/granter.ts +181 -0
- package/src/tdf/AttributeObject.ts +27 -0
- package/src/tdf/AttributeObjectJwt.ts +3 -0
- package/src/tdf/Crypto.ts +42 -0
- package/src/tdf/EntityObject.ts +18 -0
- package/src/tdf/NanoTDF/NanoTDF.ts +120 -0
- package/src/tdf/Policy.ts +51 -0
- package/src/tdf/PolicyObject.ts +12 -0
- package/src/tdf/TypedArray.ts +12 -0
- package/src/tdf/index.ts +6 -0
- package/src/types/index.ts +55 -0
- package/src/utils.ts +149 -0
- package/src/version.ts +9 -0
- package/tdf3/index.ts +91 -0
- package/tdf3/package-lock.json +6 -0
- package/tdf3/package.json +3 -0
- package/tdf3/src/assertions.ts +191 -0
- package/tdf3/src/binary.ts +195 -0
- package/tdf3/src/ciphers/aes-gcm-cipher.ts +76 -0
- package/tdf3/src/ciphers/algorithms.ts +9 -0
- package/tdf3/src/ciphers/index.ts +2 -0
- package/tdf3/src/ciphers/symmetric-cipher-base.ts +38 -0
- package/tdf3/src/client/DecoratedReadableStream.ts +148 -0
- package/tdf3/src/client/builders.ts +701 -0
- package/tdf3/src/client/index.ts +637 -0
- package/tdf3/src/client/validation.ts +79 -0
- package/tdf3/src/crypto/crypto-utils.ts +119 -0
- package/tdf3/src/crypto/declarations.ts +89 -0
- package/tdf3/src/crypto/index.ts +394 -0
- package/tdf3/src/index.ts +4 -0
- package/tdf3/src/models/attribute-set.ts +142 -0
- package/tdf3/src/models/encryption-information.ts +172 -0
- package/tdf3/src/models/index.ts +8 -0
- package/tdf3/src/models/key-access.ts +128 -0
- package/tdf3/src/models/manifest.ts +9 -0
- package/tdf3/src/models/payload.ts +6 -0
- package/tdf3/src/models/policy.ts +35 -0
- package/tdf3/src/models/upsert-response.ts +17 -0
- package/tdf3/src/tdf.ts +1351 -0
- package/tdf3/src/templates/default.html.ts +105 -0
- package/tdf3/src/templates/escaper.ts +10 -0
- package/tdf3/src/templates/index.ts +2 -0
- package/tdf3/src/utils/buffer-crc32.ts +46 -0
- package/tdf3/src/utils/chunkers.ts +118 -0
- package/tdf3/src/utils/index.ts +309 -0
- package/tdf3/src/utils/keysplit.ts +63 -0
- package/tdf3/src/utils/zip-reader.ts +341 -0
- package/tdf3/src/utils/zip-writer.ts +375 -0
- package/tdf3/src/version.ts +2 -0
- package/tdf3/types.d.ts +14 -0
|
@@ -0,0 +1,460 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.withHeaders = exports.fromDataSource = exports.HttpRequest = exports.EncryptParamsBuilder = exports.DecryptParamsBuilder = exports.AppIdAuthProvider = exports.Client = exports.createSessionKeys = exports.uploadBinaryToS3 = void 0;
|
|
30
|
+
const uuid_1 = require("uuid");
|
|
31
|
+
const axios_1 = __importDefault(require("axios"));
|
|
32
|
+
const index_js_1 = require("../utils/index.js");
|
|
33
|
+
Object.defineProperty(exports, "fromDataSource", { enumerable: true, get: function () { return index_js_1.fromDataSource; } });
|
|
34
|
+
const index_js_2 = require("../../../src/encodings/index.js");
|
|
35
|
+
const tdf_js_1 = require("../tdf.js");
|
|
36
|
+
const oidc_refreshtoken_provider_js_1 = require("../../../src/auth/oidc-refreshtoken-provider.js");
|
|
37
|
+
const oidc_externaljwt_provider_js_1 = require("../../../src/auth/oidc-externaljwt-provider.js");
|
|
38
|
+
const auth_js_1 = require("../../../src/auth/auth.js");
|
|
39
|
+
Object.defineProperty(exports, "AppIdAuthProvider", { enumerable: true, get: function () { return auth_js_1.AppIdAuthProvider; } });
|
|
40
|
+
Object.defineProperty(exports, "HttpRequest", { enumerable: true, get: function () { return auth_js_1.HttpRequest; } });
|
|
41
|
+
Object.defineProperty(exports, "withHeaders", { enumerable: true, get: function () { return auth_js_1.withHeaders; } });
|
|
42
|
+
const Eas_js_1 = __importDefault(require("../../../src/auth/Eas.js"));
|
|
43
|
+
const utils_js_1 = require("../../../src/utils.js");
|
|
44
|
+
const DecoratedReadableStream_js_1 = require("./DecoratedReadableStream.js");
|
|
45
|
+
const builders_js_1 = require("./builders.js");
|
|
46
|
+
Object.defineProperty(exports, "DecryptParamsBuilder", { enumerable: true, get: function () { return builders_js_1.DecryptParamsBuilder; } });
|
|
47
|
+
Object.defineProperty(exports, "EncryptParamsBuilder", { enumerable: true, get: function () { return builders_js_1.EncryptParamsBuilder; } });
|
|
48
|
+
const access_js_1 = require("../../../src/access.js");
|
|
49
|
+
const errors_js_1 = require("../../../src/errors.js");
|
|
50
|
+
const aes_gcm_cipher_js_1 = require("../ciphers/aes-gcm-cipher.js");
|
|
51
|
+
const crypto_utils_js_1 = require("../crypto/crypto-utils.js");
|
|
52
|
+
const defaultCryptoService = __importStar(require("../crypto/index.js"));
|
|
53
|
+
const index_js_3 = require("../models/index.js");
|
|
54
|
+
const granter_js_1 = require("../../../src/policy/granter.js");
|
|
55
|
+
const api_js_1 = require("../../../src/policy/api.js");
|
|
56
|
+
const GLOBAL_BYTE_LIMIT = 64 * 1000 * 1000 * 1000; // 64 GB, see WS-9363.
|
|
57
|
+
const HTML_BYTE_LIMIT = 100 * 1000 * 1000; // 100 MB, see WS-9476.
|
|
58
|
+
// No default config for now. Delegate to Virtru wrapper for endpoints.
|
|
59
|
+
const defaultClientConfig = { oidcOrigin: '', cryptoService: defaultCryptoService };
|
|
60
|
+
const uploadBinaryToS3 = async function (stream, uploadUrl, fileSize) {
|
|
61
|
+
try {
|
|
62
|
+
const body = await (0, index_js_1.streamToBuffer)(stream);
|
|
63
|
+
await axios_1.default.put(uploadUrl, body, {
|
|
64
|
+
headers: {
|
|
65
|
+
'Content-Length': fileSize,
|
|
66
|
+
'content-type': 'application/zip',
|
|
67
|
+
'cache-control': 'no-store',
|
|
68
|
+
},
|
|
69
|
+
maxContentLength: Infinity,
|
|
70
|
+
maxBodyLength: Infinity,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
console.error(e);
|
|
75
|
+
throw e;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
exports.uploadBinaryToS3 = uploadBinaryToS3;
|
|
79
|
+
const getFirstTwoBytes = async (chunker) => new TextDecoder().decode(await chunker(0, 2));
|
|
80
|
+
const makeChunkable = async (source) => {
|
|
81
|
+
if (!source) {
|
|
82
|
+
throw new errors_js_1.ConfigurationError('invalid source');
|
|
83
|
+
}
|
|
84
|
+
// dump stream to buffer
|
|
85
|
+
// we don't support streams anyways (see zipreader.js)
|
|
86
|
+
let initialChunker;
|
|
87
|
+
let buf = null;
|
|
88
|
+
switch (source.type) {
|
|
89
|
+
case 'stream':
|
|
90
|
+
buf = await (0, index_js_1.streamToBuffer)(source.location);
|
|
91
|
+
initialChunker = (0, index_js_1.fromBuffer)(buf);
|
|
92
|
+
break;
|
|
93
|
+
case 'buffer':
|
|
94
|
+
buf = source.location;
|
|
95
|
+
initialChunker = (0, index_js_1.fromBuffer)(buf);
|
|
96
|
+
break;
|
|
97
|
+
case 'chunker':
|
|
98
|
+
initialChunker = source.location;
|
|
99
|
+
break;
|
|
100
|
+
default:
|
|
101
|
+
initialChunker = await (0, index_js_1.fromDataSource)(source);
|
|
102
|
+
}
|
|
103
|
+
const magic = await getFirstTwoBytes(initialChunker);
|
|
104
|
+
// Pull first two bytes from source.
|
|
105
|
+
if (magic === 'PK') {
|
|
106
|
+
return initialChunker;
|
|
107
|
+
}
|
|
108
|
+
// Unwrap if it's html.
|
|
109
|
+
// If NOT zip (html), convert/dump to buffer, unwrap, and continue.
|
|
110
|
+
const htmlBuf = buf ?? (await initialChunker());
|
|
111
|
+
const zipBuf = (0, tdf_js_1.unwrapHtml)(htmlBuf);
|
|
112
|
+
return (0, index_js_1.fromBuffer)(zipBuf);
|
|
113
|
+
};
|
|
114
|
+
/*
|
|
115
|
+
* Extract a keypair provided as part of the options dict.
|
|
116
|
+
* Default to using the clientwide keypair, generating one if necessary.
|
|
117
|
+
*
|
|
118
|
+
* Additionally, update the auth injector with the (potentially new) pubkey
|
|
119
|
+
*/
|
|
120
|
+
async function createSessionKeys({ authProvider,
|
|
121
|
+
// FIXME use cryptoservice to generate keys again
|
|
122
|
+
cryptoService, dpopKeys, }) {
|
|
123
|
+
let signingKeys;
|
|
124
|
+
if (dpopKeys) {
|
|
125
|
+
signingKeys = await dpopKeys;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
const keys = await cryptoService.generateSigningKeyPair();
|
|
129
|
+
// signingKeys = await crypto.subtle.generateKey(rsaPkcs1Sha256(), true, ['sign']);
|
|
130
|
+
signingKeys = await (0, crypto_utils_js_1.toCryptoKeyPair)(keys);
|
|
131
|
+
}
|
|
132
|
+
// This will contact the auth server and forcibly refresh the auth token claims,
|
|
133
|
+
// binding the token and the (new) pubkey together.
|
|
134
|
+
// Note that we base64 encode the PEM string here as a quick workaround, simply because
|
|
135
|
+
// a formatted raw PEM string isn't a valid header value and sending it raw makes keycloak's
|
|
136
|
+
// header parser barf. There are more subtle ways to solve this, but this works for now.
|
|
137
|
+
if (authProvider && !(0, index_js_1.isAppIdProviderCheck)(authProvider)) {
|
|
138
|
+
await authProvider?.updateClientPublicKey(signingKeys);
|
|
139
|
+
}
|
|
140
|
+
return signingKeys;
|
|
141
|
+
}
|
|
142
|
+
exports.createSessionKeys = createSessionKeys;
|
|
143
|
+
/*
|
|
144
|
+
* Create a policy object for an encrypt operation.
|
|
145
|
+
*/
|
|
146
|
+
function asPolicy(scope) {
|
|
147
|
+
if (scope.policyObject) {
|
|
148
|
+
// use the client override if provided
|
|
149
|
+
return scope.policyObject;
|
|
150
|
+
}
|
|
151
|
+
const policyId = scope.policyId ?? (0, uuid_1.v4)();
|
|
152
|
+
let dataAttributes;
|
|
153
|
+
if (scope.attributeValues) {
|
|
154
|
+
dataAttributes = scope.attributeValues
|
|
155
|
+
.filter(({ fqn }) => !!fqn)
|
|
156
|
+
.map(({ fqn }) => {
|
|
157
|
+
return { attribute: fqn };
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
dataAttributes = (scope.attributes ?? []).map((attribute) => typeof attribute === 'string' ? { attribute } : attribute);
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
uuid: policyId,
|
|
165
|
+
body: {
|
|
166
|
+
dataAttributes,
|
|
167
|
+
dissem: scope.dissem ?? [],
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
class Client {
|
|
172
|
+
/**
|
|
173
|
+
* An abstraction for protecting and accessing data using TDF3 services.
|
|
174
|
+
* @param {Object} [config.keypair] - keypair generated for signing. Optional, will be generated by sdk if not passed
|
|
175
|
+
* @param {String} [config.clientId]
|
|
176
|
+
* @param {String} [config.kasEndpoint] - Key Access Server url
|
|
177
|
+
* @param {String} [config.refreshToken] - After logging in to browser OIDC interface user
|
|
178
|
+
* receives fresh token that needed by SDK for auth needs
|
|
179
|
+
* @param {String} [config.externalJwt] - JWT from external authority (eg Google)
|
|
180
|
+
* @param {String} [config.oidcOrigin] - Endpoint of authentication service
|
|
181
|
+
*/
|
|
182
|
+
constructor(config) {
|
|
183
|
+
this.kasKeys = {};
|
|
184
|
+
const clientConfig = { ...defaultClientConfig, ...config };
|
|
185
|
+
this.cryptoService = clientConfig.cryptoService;
|
|
186
|
+
this.dpopEnabled = !!(clientConfig.dpopEnabled || clientConfig.dpopKeys);
|
|
187
|
+
clientConfig.readerUrl && (this.readerUrl = clientConfig.readerUrl);
|
|
188
|
+
if (clientConfig.kasEndpoint) {
|
|
189
|
+
this.kasEndpoint = clientConfig.kasEndpoint;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// handle Deprecated `kasRewrapEndpoint` parameter
|
|
193
|
+
if (!clientConfig.keyRewrapEndpoint) {
|
|
194
|
+
throw new errors_js_1.ConfigurationError('KAS definition not found');
|
|
195
|
+
}
|
|
196
|
+
this.kasEndpoint = clientConfig.keyRewrapEndpoint.replace(/\/rewrap$/, '');
|
|
197
|
+
}
|
|
198
|
+
this.kasEndpoint = (0, utils_js_1.rstrip)(this.kasEndpoint, '/');
|
|
199
|
+
if (clientConfig.policyEndpoint) {
|
|
200
|
+
this.policyEndpoint = (0, utils_js_1.rstrip)(clientConfig.policyEndpoint, '/');
|
|
201
|
+
}
|
|
202
|
+
else if (this.kasEndpoint.endsWith('/kas')) {
|
|
203
|
+
this.policyEndpoint = this.kasEndpoint.slice(0, -4);
|
|
204
|
+
}
|
|
205
|
+
const kasOrigin = new URL(this.kasEndpoint).origin;
|
|
206
|
+
if (clientConfig.allowedKases) {
|
|
207
|
+
this.allowedKases = new access_js_1.OriginAllowList(clientConfig.allowedKases, !!clientConfig.ignoreAllowList);
|
|
208
|
+
if (!(0, utils_js_1.validateSecureUrl)(this.kasEndpoint) && !this.allowedKases.allows(kasOrigin)) {
|
|
209
|
+
throw new errors_js_1.ConfigurationError(`Invalid KAS endpoint [${this.kasEndpoint}]`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
if (!(0, utils_js_1.validateSecureUrl)(this.kasEndpoint)) {
|
|
214
|
+
throw new errors_js_1.ConfigurationError(`Invalid KAS endpoint [${this.kasEndpoint}]; to force, please list it among allowedKases`);
|
|
215
|
+
}
|
|
216
|
+
this.allowedKases = new access_js_1.OriginAllowList([kasOrigin], !!clientConfig.ignoreAllowList);
|
|
217
|
+
}
|
|
218
|
+
this.authProvider = config.authProvider;
|
|
219
|
+
this.clientConfig = clientConfig;
|
|
220
|
+
if (this.authProvider && (0, index_js_1.isAppIdProviderCheck)(this.authProvider)) {
|
|
221
|
+
this.eas = new Eas_js_1.default({
|
|
222
|
+
authProvider: this.authProvider,
|
|
223
|
+
endpoint: clientConfig.entityObjectEndpoint ?? `${clientConfig.easEndpoint}/api/entityobject`,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
this.clientId = clientConfig.clientId;
|
|
227
|
+
if (!this.authProvider) {
|
|
228
|
+
if (!clientConfig.clientId) {
|
|
229
|
+
throw new errors_js_1.ConfigurationError('Client ID or custom AuthProvider must be defined');
|
|
230
|
+
}
|
|
231
|
+
//Are we exchanging a refreshToken for a bearer token (normal AuthCode browser auth flow)?
|
|
232
|
+
//If this is a browser context, we expect the caller to handle the initial
|
|
233
|
+
//browser-based OIDC login and authentication process against the OIDC endpoint using their chosen method,
|
|
234
|
+
//and provide us with a valid refresh token/clientId obtained from that process.
|
|
235
|
+
if (clientConfig.refreshToken) {
|
|
236
|
+
this.authProvider = new oidc_refreshtoken_provider_js_1.OIDCRefreshTokenProvider({
|
|
237
|
+
clientId: clientConfig.clientId,
|
|
238
|
+
refreshToken: clientConfig.refreshToken,
|
|
239
|
+
oidcOrigin: clientConfig.oidcOrigin,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
else if (clientConfig.externalJwt) {
|
|
243
|
+
//Are we exchanging a JWT previously issued by a trusted external entity (e.g. Google) for a bearer token?
|
|
244
|
+
this.authProvider = new oidc_externaljwt_provider_js_1.OIDCExternalJwtProvider({
|
|
245
|
+
clientId: clientConfig.clientId,
|
|
246
|
+
externalJwt: clientConfig.externalJwt,
|
|
247
|
+
oidcOrigin: clientConfig.oidcOrigin,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
this.dpopKeys = createSessionKeys({
|
|
252
|
+
authProvider: this.authProvider,
|
|
253
|
+
cryptoService: this.cryptoService,
|
|
254
|
+
dpopKeys: clientConfig.dpopKeys,
|
|
255
|
+
});
|
|
256
|
+
if (clientConfig.kasPublicKey) {
|
|
257
|
+
this.kasKeys[this.kasEndpoint] = Promise.resolve({
|
|
258
|
+
url: this.kasEndpoint,
|
|
259
|
+
algorithm: 'rsa:2048',
|
|
260
|
+
key: (0, utils_js_1.pemToCryptoPublicKey)(clientConfig.kasPublicKey),
|
|
261
|
+
publicKey: clientConfig.kasPublicKey,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Encrypt plaintext into TDF ciphertext. One of the core operations of the Virtru SDK.
|
|
267
|
+
*
|
|
268
|
+
* @param scope dissem and attributes for constructing the policy
|
|
269
|
+
* @param source source object of unencrypted data
|
|
270
|
+
* @param [asHtml] If we should wrap the TDF data in a self-opening HTML wrapper. Defaults to false
|
|
271
|
+
* @param [autoconfigure] If we should use scope.attributes to configure KAOs
|
|
272
|
+
* @param [metadata] Additional non-secret data to store with the TDF
|
|
273
|
+
* @param [opts] Test only
|
|
274
|
+
* @param [mimeType] mime type of source. defaults to `unknown`
|
|
275
|
+
* @param [offline] Where to store the policy. Defaults to `false` - which results in `upsert` events to store/update a policy
|
|
276
|
+
* @param [windowSize] - segment size in bytes. Defaults to a a million bytes.
|
|
277
|
+
* @param [keyMiddleware] - function that handle keys
|
|
278
|
+
* @param [streamMiddleware] - function that handle stream
|
|
279
|
+
* @param [eo] - (deprecated) entity object
|
|
280
|
+
* @return a {@link https://nodejs.org/api/stream.html#stream_class_stream_readable|Readable} a new stream containing the TDF ciphertext
|
|
281
|
+
*/
|
|
282
|
+
async encrypt({ scope = { attributes: [], dissem: [] }, autoconfigure, source, asHtml = false, metadata, mimeType, offline = false, windowSize = builders_js_1.DEFAULT_SEGMENT_SIZE, eo, keyMiddleware = index_js_1.keyMiddleware, streamMiddleware = async (stream) => stream, splitPlan, assertionConfigs = [], }) {
|
|
283
|
+
const dpopKeys = await this.dpopKeys;
|
|
284
|
+
const policyObject = asPolicy(scope);
|
|
285
|
+
(0, tdf_js_1.validatePolicyObject)(policyObject);
|
|
286
|
+
if (!splitPlan && autoconfigure) {
|
|
287
|
+
let avs = scope.attributeValues ?? [];
|
|
288
|
+
const fqns = scope.attributes
|
|
289
|
+
? scope.attributes.map((attribute) => typeof attribute === 'string' ? attribute : attribute.attribute)
|
|
290
|
+
: [];
|
|
291
|
+
if (!avs.length && fqns.length) {
|
|
292
|
+
// Hydrate avs from policy endpoint givnen the fqns
|
|
293
|
+
if (!this.policyEndpoint) {
|
|
294
|
+
throw new errors_js_1.ConfigurationError('policyEndpoint not set in TDF3 Client constructor');
|
|
295
|
+
}
|
|
296
|
+
avs = await (0, api_js_1.attributeFQNsAsValues)(this.policyEndpoint, this.authProvider, ...fqns);
|
|
297
|
+
}
|
|
298
|
+
else if (scope.attributeValues) {
|
|
299
|
+
avs = scope.attributeValues;
|
|
300
|
+
if (!scope.attributes) {
|
|
301
|
+
scope.attributes = avs.map(({ fqn }) => fqn);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (avs.length != scope.attributes?.length ||
|
|
305
|
+
!avs.map(({ fqn }) => fqn).every((a) => fqns.indexOf(a) >= 0)) {
|
|
306
|
+
throw new errors_js_1.ConfigurationError(`Attribute mismatch between [${fqns}] and explicit values ${JSON.stringify(avs.map(({ fqn }) => fqn))}`);
|
|
307
|
+
}
|
|
308
|
+
const detailedPlan = (0, granter_js_1.plan)(avs);
|
|
309
|
+
splitPlan = detailedPlan.map((kat) => {
|
|
310
|
+
const { kas, sid } = kat;
|
|
311
|
+
if (kas?.publicKey?.cached?.keys && !(kas.uri in this.kasKeys)) {
|
|
312
|
+
const keys = kas.publicKey.cached.keys.filter(({ alg }) => alg == 'KAS_PUBLIC_KEY_ALG_ENUM_RSA_2048');
|
|
313
|
+
if (keys?.length) {
|
|
314
|
+
const key = keys[0];
|
|
315
|
+
this.kasKeys[kas.uri] = Promise.resolve({
|
|
316
|
+
key: (0, utils_js_1.pemToCryptoPublicKey)(key.pem),
|
|
317
|
+
publicKey: key.pem,
|
|
318
|
+
url: kas.uri,
|
|
319
|
+
algorithm: 'rsa:2048',
|
|
320
|
+
kid: key.kid,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return { kas: kas.uri, sid };
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
// TODO: Refactor underlying builder to remove some of this unnecessary config.
|
|
328
|
+
const byteLimit = asHtml ? HTML_BYTE_LIMIT : GLOBAL_BYTE_LIMIT;
|
|
329
|
+
const encryptionInformation = new index_js_3.SplitKey(new aes_gcm_cipher_js_1.AesGcmCipher(this.cryptoService));
|
|
330
|
+
let attributeSet;
|
|
331
|
+
let entity;
|
|
332
|
+
if (eo) {
|
|
333
|
+
entity = eo;
|
|
334
|
+
const s = new index_js_3.AttributeSet();
|
|
335
|
+
eo.attributes.forEach((attr) => s.addJwtAttribute(attr));
|
|
336
|
+
attributeSet = s;
|
|
337
|
+
}
|
|
338
|
+
const splits = splitPlan?.length ? splitPlan : [{ kas: this.kasEndpoint }];
|
|
339
|
+
encryptionInformation.keyAccess = await Promise.all(splits.map(async ({ kas, sid }) => {
|
|
340
|
+
if (!(kas in this.kasKeys)) {
|
|
341
|
+
this.kasKeys[kas] = (0, tdf_js_1.fetchKasPublicKey)(kas);
|
|
342
|
+
}
|
|
343
|
+
const kasPublicKey = await this.kasKeys[kas];
|
|
344
|
+
return (0, tdf_js_1.buildKeyAccess)({
|
|
345
|
+
attributeSet,
|
|
346
|
+
type: offline ? 'wrapped' : 'remote',
|
|
347
|
+
url: kasPublicKey.url,
|
|
348
|
+
kid: kasPublicKey.kid,
|
|
349
|
+
publicKey: kasPublicKey.publicKey,
|
|
350
|
+
metadata,
|
|
351
|
+
sid,
|
|
352
|
+
});
|
|
353
|
+
}));
|
|
354
|
+
const { keyForEncryption, keyForManifest } = await keyMiddleware();
|
|
355
|
+
const ecfg = {
|
|
356
|
+
allowList: this.allowedKases,
|
|
357
|
+
attributeSet,
|
|
358
|
+
byteLimit,
|
|
359
|
+
cryptoService: this.cryptoService,
|
|
360
|
+
dpopKeys,
|
|
361
|
+
encryptionInformation,
|
|
362
|
+
entity,
|
|
363
|
+
segmentSizeDefault: windowSize,
|
|
364
|
+
integrityAlgorithm: 'HS256',
|
|
365
|
+
segmentIntegrityAlgorithm: 'GMAC',
|
|
366
|
+
contentStream: source,
|
|
367
|
+
mimeType,
|
|
368
|
+
policy: policyObject,
|
|
369
|
+
authProvider: this.authProvider,
|
|
370
|
+
progressHandler: this.clientConfig.progressHandler,
|
|
371
|
+
keyForEncryption,
|
|
372
|
+
keyForManifest,
|
|
373
|
+
assertionConfigs,
|
|
374
|
+
};
|
|
375
|
+
const stream = await streamMiddleware(await (0, tdf_js_1.writeStream)(ecfg));
|
|
376
|
+
if (!asHtml) {
|
|
377
|
+
return stream;
|
|
378
|
+
}
|
|
379
|
+
// Wrap if it's html.
|
|
380
|
+
if (!stream.manifest) {
|
|
381
|
+
throw new Error('internal: missing manifest in encrypt function');
|
|
382
|
+
}
|
|
383
|
+
const htmlBuf = (0, tdf_js_1.wrapHtml)(await stream.toBuffer(), stream.manifest, this.readerUrl ?? '');
|
|
384
|
+
return new DecoratedReadableStream_js_1.DecoratedReadableStream({
|
|
385
|
+
pull(controller) {
|
|
386
|
+
controller.enqueue(htmlBuf);
|
|
387
|
+
controller.close();
|
|
388
|
+
},
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Decrypt TDF ciphertext into plaintext. One of the core operations of the Virtru SDK.
|
|
393
|
+
*
|
|
394
|
+
* @param params keyMiddleware fucntion to process key
|
|
395
|
+
* @param params streamMiddleware fucntion to process streamMiddleware
|
|
396
|
+
* @param params.source A data stream object, one of remote, stream, buffer, etc. types.
|
|
397
|
+
* @param params.eo Optional entity object (legacy AuthZ)
|
|
398
|
+
* @param params.assertionVerificationKeys Optional verification keys for assertions.
|
|
399
|
+
* @return a {@link https://nodejs.org/api/stream.html#stream_class_stream_readable|Readable} stream containing the decrypted plaintext.
|
|
400
|
+
* @see DecryptParamsBuilder
|
|
401
|
+
*/
|
|
402
|
+
async decrypt({ eo, source, keyMiddleware = async (key) => key, streamMiddleware = async (stream) => stream, assertionVerificationKeys, noVerifyAssertions, }) {
|
|
403
|
+
const dpopKeys = await this.dpopKeys;
|
|
404
|
+
let entityObject;
|
|
405
|
+
if (this.eas || eo) {
|
|
406
|
+
const sessionPublicKey = await (0, utils_js_1.cryptoPublicToPem)(dpopKeys.publicKey);
|
|
407
|
+
if (eo && eo.publicKey == sessionPublicKey) {
|
|
408
|
+
entityObject = eo;
|
|
409
|
+
}
|
|
410
|
+
else if (this.eas) {
|
|
411
|
+
entityObject = await this.eas.fetchEntityObject({
|
|
412
|
+
publicKey: sessionPublicKey,
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
if (!this.authProvider) {
|
|
417
|
+
throw new errors_js_1.ConfigurationError('AuthProvider missing');
|
|
418
|
+
}
|
|
419
|
+
const chunker = await makeChunkable(source);
|
|
420
|
+
// Await in order to catch any errors from this call.
|
|
421
|
+
// TODO: Write error event to stream and don't await.
|
|
422
|
+
return await streamMiddleware(await (0, tdf_js_1.readStream)({
|
|
423
|
+
allowList: this.allowedKases,
|
|
424
|
+
authProvider: this.authProvider,
|
|
425
|
+
chunker,
|
|
426
|
+
cryptoService: this.cryptoService,
|
|
427
|
+
dpopKeys,
|
|
428
|
+
entity: entityObject,
|
|
429
|
+
fileStreamServiceWorker: this.clientConfig.fileStreamServiceWorker,
|
|
430
|
+
keyMiddleware,
|
|
431
|
+
progressHandler: this.clientConfig.progressHandler,
|
|
432
|
+
assertionVerificationKeys,
|
|
433
|
+
noVerifyAssertions,
|
|
434
|
+
}));
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Get the unique policyId associated with TDF ciphertext. Useful for managing authorization policies of encrypted data.
|
|
438
|
+
* <br/><br/>
|
|
439
|
+
* The policyId is embedded in the ciphertext so this is a local operation.
|
|
440
|
+
*
|
|
441
|
+
* @param {object} source - Required. TDF data stream,
|
|
442
|
+
* generated using {@link DecryptParamsBuilder#build|DecryptParamsBuilder's build()}.
|
|
443
|
+
* @return {string} - the unique policyId, which can be used for tracking purposes or policy management operations.
|
|
444
|
+
* @see DecryptParamsBuilder
|
|
445
|
+
*/
|
|
446
|
+
async getPolicyId({ source }) {
|
|
447
|
+
const chunker = await makeChunkable(source);
|
|
448
|
+
const zipHelper = new index_js_1.ZipReader(chunker);
|
|
449
|
+
const centralDirectory = await zipHelper.getCentralDirectory();
|
|
450
|
+
const manifest = await zipHelper.getManifest(centralDirectory, '0.manifest.json');
|
|
451
|
+
const policyJson = index_js_2.base64.decode(manifest.encryptionInformation.policy);
|
|
452
|
+
return JSON.parse(policyJson).uuid;
|
|
453
|
+
}
|
|
454
|
+
async loadTDFStream({ source }) {
|
|
455
|
+
const chunker = await makeChunkable(source);
|
|
456
|
+
return (0, tdf_js_1.loadTDFStream)(chunker);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
exports.Client = Client;
|
|
460
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZGYzL3NyYy9jbGllbnQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBMEI7QUFDMUIsa0RBQTBCO0FBQzFCLGdEQVEyQjtBQWduQnpCLCtGQXJuQkEseUJBQWMsT0FxbkJBO0FBL21CaEIsOERBQXlEO0FBQ3pELHNDQVVtQjtBQUNuQixtR0FBMkY7QUFDM0YsaUdBQXlGO0FBRXpGLHVEQUttQztBQXNsQmpDLGtHQXpsQkEsMkJBQWlCLE9BeWxCQTtBQUlqQiw0RkE1bEJBLHFCQUFXLE9BNGxCQTtBQUVYLDRGQTdsQkEscUJBQVcsT0E2bEJBO0FBM2xCYixzRUFBMkM7QUFDM0Msb0RBSytCO0FBVy9CLDZFQUF1RTtBQUV2RSwrQ0FLdUI7QUE4akJyQixxR0Fqa0JBLGtDQUFvQixPQWlrQkE7QUFFcEIscUdBamtCQSxrQ0FBb0IsT0Fpa0JBO0FBL2pCdEIsc0RBQTJFO0FBQzNFLHNEQUE0RDtBQUc1RCxvRUFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELHlFQUEyRDtBQUMzRCxpREFBK0Y7QUFDL0YsK0RBQXNEO0FBQ3RELHVEQUFtRTtBQUduRSxNQUFNLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLHNCQUFzQjtBQUN6RSxNQUFNLGVBQWUsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLHVCQUF1QjtBQUVsRSx1RUFBdUU7QUFDdkUsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLENBQUM7QUFFN0UsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLFdBQ25DLE1BQWtDLEVBQ2xDLFNBQWlCLEVBQ2pCLFFBQWdCO0lBRWhCLElBQUk7UUFDRixNQUFNLElB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
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateAttribute = exports.validateAttributeObject = exports.ATTR_ATTRIBUTE_PATTERN = exports.ATTR_VALUE = exports.ATTR_NAME = exports.ATTR_VALUE_PROP_NAME = exports.ATTR_NAME_PROP_NAME = void 0;
|
|
4
|
+
const errors_js_1 = require("../../../src/errors.js");
|
|
5
|
+
const sageGetMatch = (match) => (match ? match[0] : null);
|
|
6
|
+
exports.ATTR_NAME_PROP_NAME = 'attr';
|
|
7
|
+
exports.ATTR_VALUE_PROP_NAME = 'value';
|
|
8
|
+
// Validate attribute url protocol starts with `http://` or `https://`
|
|
9
|
+
const SCHEME = '(https?://)';
|
|
10
|
+
// validate url host be like `localhost:4000`
|
|
11
|
+
const HOST_PORT = '([a-z0-9][a-z0-9]{1,}:[0-9]{1,4})';
|
|
12
|
+
// validate url host be like `www.example.com`
|
|
13
|
+
const WWW_HOST = '([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}';
|
|
14
|
+
// validate url host be like `127.0.0.1:4000`
|
|
15
|
+
const IP_HOST_PORT = '([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}:[0-9]{1,4})';
|
|
16
|
+
// validate host is one of those above
|
|
17
|
+
const HOST = `(${HOST_PORT}|${WWW_HOST}|${IP_HOST_PORT})`;
|
|
18
|
+
// validate attr name be like `/attr/<attr_name>`
|
|
19
|
+
exports.ATTR_NAME = `(/${exports.ATTR_NAME_PROP_NAME}/[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]?)`;
|
|
20
|
+
// validate value pattern
|
|
21
|
+
exports.ATTR_VALUE = `(/${exports.ATTR_VALUE_PROP_NAME}/[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]?)`;
|
|
22
|
+
// validate attribute authority e.g. https://example.com
|
|
23
|
+
const ATTR_AUTHORITY_PATTERN = `(${SCHEME}${HOST})`;
|
|
24
|
+
// validate attribute namespace e.g. https://example.com/attr/someattribute
|
|
25
|
+
const ATTR_NAMESPACE_PATTERN = `(${ATTR_AUTHORITY_PATTERN}${exports.ATTR_NAME})`;
|
|
26
|
+
// validate whole attribute e.g. https://example.com/attr/someattribute/value/somevalue
|
|
27
|
+
exports.ATTR_ATTRIBUTE_PATTERN = `^(${ATTR_NAMESPACE_PATTERN}${exports.ATTR_VALUE})$`;
|
|
28
|
+
const validateAttributeObject = (attr) => {
|
|
29
|
+
const isObject = typeof attr === 'object';
|
|
30
|
+
if (!isObject) {
|
|
31
|
+
throw new errors_js_1.AttributeValidationError(`attribute should be an object`, attr);
|
|
32
|
+
}
|
|
33
|
+
const { attribute } = attr;
|
|
34
|
+
const isString = typeof attribute === 'string';
|
|
35
|
+
if (!isString) {
|
|
36
|
+
throw new errors_js_1.AttributeValidationError(`attribute prop should be a string`, attr);
|
|
37
|
+
}
|
|
38
|
+
return validateAttribute(attribute);
|
|
39
|
+
};
|
|
40
|
+
exports.validateAttributeObject = validateAttributeObject;
|
|
41
|
+
function validateAttribute(attribute) {
|
|
42
|
+
if (!attribute.match(exports.ATTR_ATTRIBUTE_PATTERN)) {
|
|
43
|
+
throw new errors_js_1.AttributeValidationError(`attribute is in invalid format [${attribute}]`, attribute);
|
|
44
|
+
}
|
|
45
|
+
const ATTR_NAME_PREFIX = `/${exports.ATTR_NAME_PROP_NAME}/`;
|
|
46
|
+
const ATTR_VALUE_PREFIX = `/${exports.ATTR_VALUE_PROP_NAME}/`;
|
|
47
|
+
const attrNameMatch = sageGetMatch(attribute.match(exports.ATTR_NAME));
|
|
48
|
+
const attrValueMatch = sageGetMatch(attribute.match(exports.ATTR_VALUE));
|
|
49
|
+
if (!attrNameMatch) {
|
|
50
|
+
throw new errors_js_1.AttributeValidationError(`attribute name matching error`, attribute);
|
|
51
|
+
}
|
|
52
|
+
if (!attrValueMatch) {
|
|
53
|
+
throw new errors_js_1.AttributeValidationError(`attribute value matching error`, attribute);
|
|
54
|
+
}
|
|
55
|
+
const attributeName = attrNameMatch.slice(ATTR_NAME_PREFIX.length);
|
|
56
|
+
const attributeValue = attrValueMatch.slice(ATTR_VALUE_PREFIX.length);
|
|
57
|
+
if (attributeName === attributeValue) {
|
|
58
|
+
throw new errors_js_1.AttributeValidationError(`attribute name should be unique with its value`, attribute);
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
exports.validateAttribute = validateAttribute;
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RkZjMvc3JjL2NsaWVudC92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFrRTtBQUVsRSxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQThCLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRXRFLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDO0FBQzdCLFFBQUEsb0JBQW9CLEdBQUcsT0FBTyxDQUFDO0FBRTVDLHNFQUFzRTtBQUN0RSxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUM7QUFFN0IsNkNBQTZDO0FBQzdDLE1BQU0sU0FBUyxHQUFHLG1DQUFtQyxDQUFDO0FBRXRELDhDQUE4QztBQUM5QyxNQUFNLFFBQVEsR0FBRyxnREFBZ0QsQ0FBQztBQUVsRSw2Q0FBNkM7QUFDN0MsTUFBTSxZQUFZLEdBQUcsZ0VBQWdFLENBQUM7QUFFdEYsc0NBQXNDO0FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksU0FBUyxJQUFJLFFBQVEsSUFBSSxZQUFZLEdBQUcsQ0FBQztBQUUxRCxrREFBa0Q7QUFDckMsUUFBQSxTQUFTLEdBQUcsS0FBSywyQkFBbUIsd0NBQXdDLENBQUM7QUFFMUYseUJBQXlCO0FBQ1osUUFBQSxVQUFVLEdBQUcsS0FBSyw0QkFBb0Isd0NBQXdDLENBQUM7QUFFNUYseURBQXlEO0FBQ3pELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFFcEQsMkVBQTJFO0FBQzNFLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxzQkFBc0IsR0FBRyxpQkFBUyxHQUFHLENBQUM7QUFFekUsdUZBQXVGO0FBQzFFLFFBQUEsc0JBQXNCLEdBQUcsS0FBSyxzQkFBc0IsR0FBRyxrQkFBVSxJQUFJLENBQUM7QUFFNUUsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLElBQWEsRUFBZ0IsRUFBRTtJQUNyRSxNQUFNLFFBQVEsR0FBRyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUM7SUFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLE1BQU0sSUFBSSxvQ0FBd0IsQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUMzRTtJQUVELE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUErQixDQUFDO0lBQ3RELE1BQU0sUUFBUSxHQUFHLE9BQU8sU0FBUyxLQUFLLFFBQVEsQ0FBQztJQUMvQyxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2IsTUFBTSxJQUFJLG9DQUF3QixDQUFDLG1DQUFtQyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQy9FO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFiVyxRQUFBLHVCQUF1QiwyQkFhbEM7QUFFRixTQUFnQixpQkFBaUIsQ0FBQyxTQUFpQjtJQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyw4QkFBc0IsQ0FBQyxFQUFFO1FBQzVDLE1BQU0sSUFBSSxvQ0FBd0IsQ0FBQyxtQ0FBbUMsU0FBUyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDaEc7SUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUksMkJBQW1CLEdBQUcsQ0FBQztJQUNwRCxNQUFNLGlCQUFpQixHQUFHLElBQUksNEJBQW9CLEdBQUcsQ0FBQztJQUN0RCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxpQkFBUyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxrQkFBVSxDQUFDLENBQUMsQ0FBQztJQUVqRSxJQUFJLENBQUMsYUFBYSxFQUFFO1FBQ2xCLE1BQU0sSUFBSSxvQ0FBd0IsQ0FBQywrQkFBK0IsRUFBRSxTQUFTLENBQUMsQ0FBQztLQUNoRjtJQUVELElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsTUFBTSxJQUFJLG9DQUF3QixDQUFDLGdDQUFnQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ2pGO0lBRUQsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuRSxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXRFLElBQUksYUFBYSxLQUFLLGNBQWMsRUFBRTtRQUNwQyxNQUFNLElBQUksb0NBQXdCLENBQUMsZ0RBQWdELEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDakc7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUExQkQsOENBMEJDIn0=
|