diff --git a/.github/workflows/build-golang-macos.yaml b/.github/workflows/build-golang-macos.yaml index 620f701..626de1d 100644 --- a/.github/workflows/build-golang-macos.yaml +++ b/.github/workflows/build-golang-macos.yaml @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: true matrix: - go-version: [1.22.x] + go-version: [1.24.x] python3_version: [ "3.11", "3.12" ] steps: @@ -47,4 +47,4 @@ jobs: # - uses: ./.github/workflows/platform-integration-test.yaml # with: - # wheel: dist/otdf_python-0.2.12-py3-none-any.whl + # wheel: dist/otdf_python-0.2.14-py3-none-any.whl diff --git a/.github/workflows/build-golang-ubuntu.yaml b/.github/workflows/build-golang-ubuntu.yaml index 4388c00..282a1d0 100644 --- a/.github/workflows/build-golang-ubuntu.yaml +++ b/.github/workflows/build-golang-ubuntu.yaml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: true matrix: - go-version: [1.22.x] + go-version: [1.24.x] python3_version: [ "3.11", "3.12" ] steps: @@ -43,12 +43,12 @@ jobs: - uses: actions/cache/restore@v4 with: - path: dist/otdf_python-0.2.12-py3-none-any.whl + path: dist/otdf_python-0.2.14-py3-none-any.whl key: ${{ runner.os }}${{ matrix.python3_version }}-data-${{ github.sha }} - uses: actions/cache/save@v4 with: - path: dist/otdf_python-0.2.12-py3-none-any.whl + path: dist/otdf_python-0.2.14-py3-none-any.whl key: ${{ runner.os }}${{ matrix.python3_version }}-data-${{ github.sha }} restore-keys: | ${{ runner.os }}${{ matrix.python3_version }}-data- @@ -61,5 +61,5 @@ jobs: needs: build uses: ./.github/workflows/platform-integration-test.yaml with: - wheel: dist/otdf_python-0.2.12-py3-none-any.whl + wheel: dist/otdf_python-0.2.14-py3-none-any.whl python_version: ${{ matrix.python3_version }} diff --git a/.github/workflows/build-python.yaml b/.github/workflows/build-python.yaml index 84f2eb1..9f28d46 100644 --- a/.github/workflows/build-python.yaml +++ b/.github/workflows/build-python.yaml @@ -12,8 +12,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - go-version: [1.22.x] - # go-version: [ '1.19', '1.20', '1.22.x' ] + go-version: [1.24.x] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/lint-on-macos.yaml b/.github/workflows/lint-on-macos.yaml index 53ffb2d..b7ccd8e 100644 --- a/.github/workflows/lint-on-macos.yaml +++ b/.github/workflows/lint-on-macos.yaml @@ -12,8 +12,7 @@ jobs: strategy: fail-fast: true matrix: - go-version: [1.22.x] - # go-version: [ '1.19', '1.20', '1.22.x' ] + go-version: [1.24.x] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/lint-on-ubuntu.yaml b/.github/workflows/lint-on-ubuntu.yaml index 244bd0a..90b74b8 100644 --- a/.github/workflows/lint-on-ubuntu.yaml +++ b/.github/workflows/lint-on-ubuntu.yaml @@ -12,8 +12,7 @@ jobs: strategy: fail-fast: true matrix: - go-version: [1.22.x] - # go-version: [ '1.19', '1.20', '1.22.x' ] + go-version: [1.24.x] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/platform-integration-test.yaml b/.github/workflows/platform-integration-test.yaml index d0f4bb8..b9aee0e 100644 --- a/.github/workflows/platform-integration-test.yaml +++ b/.github/workflows/platform-integration-test.yaml @@ -29,7 +29,7 @@ jobs: - uses: actions/cache/restore@v4 with: - path: dist/otdf_python-0.2.12-py3-none-any.whl + path: dist/otdf_python-0.2.14-py3-none-any.whl key: ${{ runner.os }}${{ inputs.python_version }}-data-${{ github.sha }} - name: Prove that the input file is available @@ -52,7 +52,7 @@ jobs: - name: Set up go uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 with: - go-version: "1.22.x" + go-version: "1.24.x" check-latest: false cache-dependency-path: | platform/service/go.sum @@ -125,6 +125,7 @@ jobs: OPENTDF_HOSTNAME: "localhost:8080" OIDC_TOKEN_ENDPOINT: "http://localhost:8888/auth/realms/opentdf/protocol/openid-connect/token" OPENTDF_KAS_URL: "http://localhost:8080/kas" + INSECURE_SKIP_VERIFY: "TRUE" run: | mkdir validation wheel="$(basename ${{ inputs.wheel }} )" @@ -136,119 +137,7 @@ jobs: pip install ./"$wheel" python validate_otdf_python.py - # - name: Validate the SDK through the command line interface - # run: | - # printf 'here is some data to encrypt' > data - - # java -jar target/cmdline.jar \ - # --client-id=opentdf-sdk \ - # --client-secret=secret \ - # --platform-endpoint=localhost:8080 \ - # -i \ - # encrypt --kas-url=localhost:8080 --mime-type=text/plain --attr https://example.com/attr/attr1/value/value1 --autoconfigure=false -f data -m 'here is some metadata' > test.tdf - - # java -jar target/cmdline.jar \ - # --client-id=opentdf-sdk \ - # --client-secret=secret \ - # --platform-endpoint=localhost:8080 \ - # -i \ - # decrypt -f test.tdf > decrypted - - # java -jar target/cmdline.jar \ - # --client-id=opentdf-sdk \ - # --client-secret=secret \ - # --platform-endpoint=localhost:8080 \ - # -i \ - # metadata -f test.tdf > metadata - - # if ! diff -q data decrypted; then - # printf 'decrypted data is incorrect [%s]' "$(< decrypted)" - # exit 1 - # fi - - # if [ "$(< metadata)" != 'here is some metadata' ]; then - # printf 'metadata is incorrect [%s]\n' "$(< metadata)" - # exit 1 - # fi - # working-directory: cmdline - - # - name: Encrypt/Decrypt NanoTDF - # run: | - # echo 'here is some data to encrypt' > data - - # java -jar target/cmdline.jar \ - # --client-id=opentdf-sdk \ - # --client-secret=secret \ - # --platform-endpoint=localhost:8080 \ - # -i \ - # encryptnano --kas-url=http://localhost:8080 --attr https://example.com/attr/attr1/value/value1 -f data -m 'here is some metadata' > nano.ntdf - - # java -jar target/cmdline.jar \ - # --client-id=opentdf-sdk \ - # --client-secret=secret \ - # --platform-endpoint=localhost:8080 \ - # -i \ - # decryptnano -f nano.ntdf > decrypted - - # if ! diff -q data decrypted; then - # printf 'decrypted data is incorrect [%s]' "$(< decrypted)" - # exit 1 - # fi - # working-directory: cmdline - - # - uses: JarvusInnovations/background-action@2428e7b970a846423095c79d43f759abf979a635 - # name: start another KAS server in background - # with: - # run: > - # opentdf-beta.yaml yq e ' - # (.server.port = 8282) - # | (.mode = ["kas"]) - # | (.sdk_config = {"endpoint":"http://localhost:8080","plaintext":true,"client_id":"opentdf","client_secret":"secret"}) - # ' - # && go run ./service --config-file ./opentdf-beta.yaml start - # wait-on: | - # tcp:localhost:8282 - # log-output-if: true - # wait-for: 90s - # working-directory: platform - # - name: Make sure that the second platform is up - # run: | - # grpcurl -plaintext localhost:8282 kas.AccessService/PublicKey - # - name: Validate multikas through the command line interface - # run: | - # printf 'here is some data to encrypt' > data - - # java -jar target/cmdline.jar \ - # --client-id=opentdf-sdk \ - # --client-secret=secret \ - # --platform-endpoint=localhost:8080 \ - # -i \ - # encrypt --kas-url=localhost:8080,localhost:8282 -f data -m 'here is some metadata' > test.tdf - - # java -jar target/cmdline.jar \ - # --client-id=opentdf-sdk \ - # --client-secret=secret \ - # --platform-endpoint=localhost:8080 \ - # -i \ - # decrypt -f test.tdf > decrypted - - # java -jar target/cmdline.jar \ - # --client-id=opentdf-sdk \ - # --client-secret=secret \ - # --platform-endpoint=localhost:8080 \ - # -i \ - # metadata -f test.tdf > metadata - - # if ! diff -q data decrypted; then - # printf 'decrypted data is incorrect [%s]' "$(< decrypted)" - # exit 1 - # fi - # if [ "$(< metadata)" != 'here is some metadata' ]; then - # printf 'metadata is incorrect [%s]\n' "$(< metadata)" - # exit 1 - # fi - # working-directory: cmdline # platform-xtest: # permissions: diff --git a/.github/workflows/publish-test.yaml b/.github/workflows/publish-test.yaml index af9bebb..3566c47 100644 --- a/.github/workflows/publish-test.yaml +++ b/.github/workflows/publish-test.yaml @@ -30,7 +30,7 @@ jobs: - name: set up Go uses: actions/setup-go@v3 with: - go-version: "1.22.x" + go-version: "1.24.x" - name: Setup project files run: | @@ -103,7 +103,7 @@ jobs: CIBW_ENVIRONMENT: > PATH=$PATH:/usr/local/go/bin CIBW_BEFORE_ALL_LINUX: | - curl -o go.tar.gz https://dl.google.com/go/go1.22.7.linux-amd64.tar.gz + curl -o go.tar.gz https://dl.google.com/go/go1.24.3.linux-amd64.tar.gz tar -C /usr/local -xzf go.tar.gz go install github.com/go-python/gopy@v0.4.10 go install golang.org/x/tools/cmd/goimports@latest @@ -154,7 +154,7 @@ jobs: CIBW_ENVIRONMENT: > PATH=$PATH:/usr/local/go/bin CIBW_BEFORE_ALL_LINUX: | - curl -o go.tar.gz https://dl.google.com/go/go1.22.7.linux-arm64.tar.gz + curl -o go.tar.gz https://dl.google.com/go/go1.24.3.linux-arm64.tar.gz tar -C /usr/local -xzf go.tar.gz go install github.com/go-python/gopy@v0.4.10 go install golang.org/x/tools/cmd/goimports@latest @@ -181,7 +181,7 @@ jobs: # - name: set up Go # uses: actions/setup-go@v3 # with: -# go-version: "1.22.x" +# go-version: "1.24.x" # - name: install gopy # run: go install github.com/go-python/gopy@v0.4.10 diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index ca73a26..09f174f 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -30,7 +30,7 @@ jobs: - name: set up Go uses: actions/setup-go@v3 with: - go-version: "1.22.x" + go-version: "1.24.x" - name: Setup project files run: | @@ -103,7 +103,7 @@ jobs: CIBW_ENVIRONMENT: > PATH=$PATH:/usr/local/go/bin CIBW_BEFORE_ALL_LINUX: | - curl -o go.tar.gz https://dl.google.com/go/go1.22.7.linux-amd64.tar.gz + curl -o go.tar.gz https://dl.google.com/go/go1.24.3.linux-amd64.tar.gz tar -C /usr/local -xzf go.tar.gz go install github.com/go-python/gopy@v0.4.10 go install golang.org/x/tools/cmd/goimports@latest @@ -154,7 +154,7 @@ jobs: CIBW_ENVIRONMENT: > PATH=$PATH:/usr/local/go/bin CIBW_BEFORE_ALL_LINUX: | - curl -o go.tar.gz https://dl.google.com/go/go1.22.7.linux-arm64.tar.gz + curl -o go.tar.gz https://dl.google.com/go/go1.24.3.linux-arm64.tar.gz tar -C /usr/local -xzf go.tar.gz go install github.com/go-python/gopy@v0.4.10 go install golang.org/x/tools/cmd/goimports@latest @@ -181,7 +181,7 @@ jobs: # - name: set up Go # uses: actions/setup-go@v3 # with: -# go-version: "1.22.x" +# go-version: "1.24.x" # - name: install gopy # run: go install github.com/go-python/gopy@v0.4.10 diff --git a/README.md b/README.md index 50b5655..685ebc1 100644 --- a/README.md +++ b/README.md @@ -27,10 +27,10 @@ Install from the [Python Package Index (PyPI)](https://pypi.org): pip install otdf_python # Install a pinned version -pip install otdf-python==0.2.12 +pip install otdf-python==0.2.14 # Install a pinned version, from test.pypi.org -pip install -i https://test.pypi.org/simple/ otdf-python==0.2.12 +pip install -i https://test.pypi.org/simple/ otdf-python==0.2.14 ``` ## Usage diff --git a/build-scripts/ci-build.sh b/build-scripts/ci-build.sh index a5ed904..3263ff0 100755 --- a/build-scripts/ci-build.sh +++ b/build-scripts/ci-build.sh @@ -72,4 +72,4 @@ echo "✨✨✨ Build wheel" poetry run python3 setup.py bdist_wheel echo "✨✨✨ Install wheel" -pip install dist/otdf_python-0.2.12-py3-none-any.whl +pip install dist/otdf_python-0.2.14-py3-none-any.whl diff --git a/build-scripts/make_and_validate_script.sh b/build-scripts/make_and_validate_script.sh index b5b1c42..2a232a2 100755 --- a/build-scripts/make_and_validate_script.sh +++ b/build-scripts/make_and_validate_script.sh @@ -47,7 +47,7 @@ python3 -m pip install --upgrade setuptools wheel python3 setup.py bdist_wheel # Prove that the wheel can be installed -pip install dist/otdf_python-0.2.12-py3-none-any.whl +pip install dist/otdf_python-0.2.14-py3-none-any.whl if [[ "$SKIP_TESTS" == "-s" || "$SKIP_TESTS" == "--skip-tests" ]]; then echo "Build is complete, skipping tests." diff --git a/build-scripts/uv_make_and_validate_script.sh b/build-scripts/uv_make_and_validate_script.sh index d84db1c..8263d37 100755 --- a/build-scripts/uv_make_and_validate_script.sh +++ b/build-scripts/uv_make_and_validate_script.sh @@ -70,7 +70,7 @@ loud_print "Installing wheel" uv venv .venv-wheel --python 3.12 "$PY_TYPE" source "${BUILD_ROOT}/.venv-wheel/bin/activate" pip install pybindgen -pip install dist/otdf_python-0.2.12-py3-none-any.whl +pip install dist/otdf_python-0.2.14-py3-none-any.whl if [[ "$SKIP_TESTS" == "-s" || "$SKIP_TESTS" == "--skip-tests" ]]; then echo "Build is complete, skipping tests." diff --git a/go.mod b/go.mod index ff4dce9..820d150 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module gotdf_python -go 1.24.0 - -toolchain go1.24.2 +go 1.24.3 require github.com/opentdf/platform/sdk v0.4.4 @@ -13,7 +11,7 @@ require ( github.com/goccy/go-json v0.10.5 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gowebpki/jcs v1.0.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect github.com/lestrrat-go/blackmagic v1.0.3 // indirect github.com/lestrrat-go/httpcc v1.0.1 // indirect @@ -27,13 +25,13 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/oauth2 v0.29.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/text v0.24.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 // indirect + golang.org/x/crypto v0.38.0 // indirect + golang.org/x/net v0.40.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.25.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 // indirect google.golang.org/grpc v1.72.0 // indirect google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/go.sum b/go.sum index 4aacd19..0a55bbf 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,3 @@ -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.5-20250307204501-0409229c3780.1 h1:j+l4+E1EEo83GVIxuqinfFOTyImSQUH90WfufE86xaI= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.5-20250307204501-0409229c3780.1/go.mod h1:eOqrCVUfhh7SLo00urDe/XhJHljj0dWMZirS0aX7cmc= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250307204501-0409229c3780.1 h1:zgJPqo17m28+Lf5BW4xv3PvU20BnrmTcGYrog22lLIU= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250307204501-0409229c3780.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1 h1:YhMSc48s25kr7kv31Z8vf7sPUIq5YJva9z1mn/hAt0M= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= @@ -63,12 +59,12 @@ github.com/gowebpki/jcs v1.0.1 h1:Qjzg8EOkrOTuWP7DqQ1FbYtcpEbeTzUoTN9bptp8FOU= github.com/gowebpki/jcs v1.0.1/go.mod h1:CID1cNZ+sHp1CCpAR8mPf6QRtagFBgPJE0FCUQ6+BrI= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 h1:KcFzXwzM/kGhIRHvc8jdixfIJjVzuUJdnv+5xsPutog= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k= -github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= github.com/lestrrat-go/blackmagic v1.0.3 h1:94HXkVLxkZO9vJI/w2u1T0DAoprShFd13xtnSINtDWs= github.com/lestrrat-go/blackmagic v1.0.3/go.mod h1:6AWFyKNNj0zEXQYfTMPfZrAXUWUfTIZ5ECEUEJaijtw= github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= @@ -77,10 +73,6 @@ github.com/lestrrat-go/httprc v1.0.6 h1:qgmgIRhpvBqexMJjA/PmwSvhNk679oqD1RbovdCG github.com/lestrrat-go/httprc v1.0.6/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx/v2 v2.1.4 h1:uBCMmJX8oRZStmKuMMOFb0Yh9xmEMgNJLgjuKKt4/qc= -github.com/lestrrat-go/jwx/v2 v2.1.4/go.mod h1:nWRbDFR1ALG2Z6GJbBXzfQaYyvn751KuuyySN2yR6is= -github.com/lestrrat-go/jwx/v2 v2.1.5 h1:PQI5gzadLfJ22ckLrejPVX6eGXKM4M4eGi5fW2jjA3o= -github.com/lestrrat-go/jwx/v2 v2.1.5/go.mod h1:Y722kU5r/8mV7fYDifjug0r8FK8mZdw0K0GpJw/l8pU= github.com/lestrrat-go/jwx/v2 v2.1.6 h1:hxM1gfDILk/l5ylers6BX/Eq1m/pnxe9NBwW6lVfecA= github.com/lestrrat-go/jwx/v2 v2.1.6/go.mod h1:Y722kU5r/8mV7fYDifjug0r8FK8mZdw0K0GpJw/l8pU= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= @@ -111,12 +103,8 @@ github.com/opentdf/platform/lib/fixtures v0.2.10 h1:R688b98ctsEiDRlQSvLxmAWT7bXv github.com/opentdf/platform/lib/fixtures v0.2.10/go.mod h1:wGhclxDeDXf8bp5VAWztT1nY2gWVNGQLd8rWs5wtXV0= github.com/opentdf/platform/lib/ocrypto v0.1.9 h1:GvgPB7CoK7JmWvsSvJ0hc+RC0wezgcuRpy3q2oYKjdA= github.com/opentdf/platform/lib/ocrypto v0.1.9/go.mod h1:UTtqh8mvhAYA+sEnaMxpr/406e84L5Q1sAxtKGIXfu4= -github.com/opentdf/platform/protocol/go v0.3.0 h1:8m5r2d0drQsiKX/ztQ0ngI2N0EuBati7WQnKc6L1umY= -github.com/opentdf/platform/protocol/go v0.3.0/go.mod h1:3nolWMso+6FV8v1UgKO45EvxrVMPF7xHQq76/YRhR8I= github.com/opentdf/platform/protocol/go v0.3.2 h1:WugeSl7RSRM7e7c5jJumZOIW2jr+sMqwDzpGUGyeC5k= github.com/opentdf/platform/protocol/go v0.3.2/go.mod h1:nErYkgt32GW22CNqSyLO+JE49C3JndI1TsVdF+CUYd4= -github.com/opentdf/platform/sdk v0.4.2 h1:pRtsLffsDHxt2EZTJQkjOdEFO87RfHkDdA3WMJWr1Pc= -github.com/opentdf/platform/sdk v0.4.2/go.mod h1:N7wjlJbUqqZd0YQhv8BSR6uAw6wL3b+zU47kglQtw3Q= github.com/opentdf/platform/sdk v0.4.4 h1:jBJPXZBOodmanla9aS1aaPQgcg7zqOEbBTLF0c0BULM= github.com/opentdf/platform/sdk v0.4.4/go.mod h1:xPjymAKCbFzo+z+PvFVa10NOT+9i5ljxmJaGJ9tkPrw= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= @@ -174,42 +162,34 @@ go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= -golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= -golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= -golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= -google.golang.org/genproto/googleapis/api v0.0.0-20250313205543-e70fdf4c4cb4 h1:IFnXJq3UPB3oBREOodn1v1aGQeZYQclEmvWRMN0PSsY= -google.golang.org/genproto/googleapis/api v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:c8q6Z6OCqnfVIqUFJkCzKcrj8eCvUrz+K4KRzSTuANg= -google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e h1:UdXH7Kzbj+Vzastr5nVfccbmFsmYNygVLSPk1pEfDoY= -google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e/go.mod h1:085qFyf2+XaZlRdCgKNCIZ3afY2p4HHZdoIRpId8F4A= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34 h1:0PeQib/pH3nB/5pEmFeVQJotzGohV0dq4Vcp09H5yhE= google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34/go.mod h1:0awUlEkap+Pb1UMeJwJQQAdJQrt3moU7J2moTy69irI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0= +google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw= google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 h1:h6p3mQqrmT1XkHVTfzLdNz1u7IhINeZkz67/xTbOuWs= google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= -google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= -google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2 h1:IqsN8hx+lWLqlN+Sc3DoMy/watjofWiU8sRFgQ8fhKM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= diff --git a/main.go b/main.go index b803362..cff45c3 100644 --- a/main.go +++ b/main.go @@ -42,26 +42,17 @@ type OpentdfConfig struct { KasUrl string } -/* -Based on: https://stackoverflow.com/a/42849112 -func inputValidation(normalConfig DecryptionConfig) (*DecryptionConfig, error) { - // Convert our Struct to a Map - var inInterface map[string]interface{} - inrec, _ := json.Marshal(normalConfig) - json.Unmarshal(inrec, &inInterface) - - // Iterate through fields in the map and fail if empty value found - for field, val := range inInterface { - if val == nil || val == "" { - // fmt.Println("KV Pair: ", field, val) - return nil, errors.New("Missing configuration value for field " + field) - } +func getEnv(key, defaultValue string) string { + if value, ok := os.LookupEnv(key); ok { + return value } - - return &normalConfig, nil + return defaultValue } -*/ +/* +NOTE: When the environment variable 'INSECURE_SKIP_VERIFY' is set to 'TRUE', +this option for the OpenTDF SDK will be set. +*/ func newSdkClient(config OpentdfConfig, authScopes []string) (*sdk.SDK, error) { // NOTE: The 'platformEndpoint' is sometimes referenced as 'host' if strings.Count(config.TokenEndpoint, "http://") == 1 { @@ -71,16 +62,25 @@ func newSdkClient(config OpentdfConfig, authScopes []string) (*sdk.SDK, error) { sdk.WithInsecurePlaintextConn(), ) } else if strings.Count(config.TokenEndpoint, "https://") == 1 { - return sdk.New(config.PlatformEndpoint, + opts := []sdk.Option{ sdk.WithClientCredentials(config.ClientId, config.ClientSecret, authScopes), sdk.WithTokenEndpoint(config.TokenEndpoint), - sdk.WithInsecureSkipVerifyConn(), - ) + } + + if getEnv("INSECURE_SKIP_VERIFY", "FALSE") == "TRUE" { + opts = append(opts, sdk.WithInsecureSkipVerifyConn()) + } + + return sdk.New(config.PlatformEndpoint, opts...) } else { return nil, errors.New("invalid TokenEndpoint given") } } +/* +NOTE: When the environment variable 'INSECURE_SKIP_VERIFY' is set to 'TRUE', +this option for the OpenTDF SDK will be set. +*/ func peSdkClient(config OpentdfConfig, authScopes []string, token TokenAuth) (*sdk.SDK, error) { // NOTE: The 'platformEndpoint' is sometimes referenced as 'host' if strings.Count(config.TokenEndpoint, "http://") == 1 { @@ -91,12 +91,17 @@ func peSdkClient(config OpentdfConfig, authScopes []string, token TokenAuth) (*s sdk.WithInsecurePlaintextConn(), ) } else if strings.Count(config.TokenEndpoint, "https://") == 1 { - return sdk.New(config.PlatformEndpoint, + opts := []sdk.Option{ sdk.WithClientCredentials(config.ClientId, config.ClientSecret, authScopes), sdk.WithTokenEndpoint(config.TokenEndpoint), sdk.WithTokenExchange(token.AccessToken, []string{token.NpeClientId}), - sdk.WithInsecureSkipVerifyConn(), - ) + } + + if getEnv("INSECURE_SKIP_VERIFY", "FALSE") == "TRUE" { + opts = append(opts, sdk.WithInsecureSkipVerifyConn()) + } + + return sdk.New(config.PlatformEndpoint, opts...) } else { return nil, errors.New("invalid TokenEndpoint given") } diff --git a/otdf_python_test.go b/otdf_python_test.go index 0df601b..009ac5c 100644 --- a/otdf_python_test.go +++ b/otdf_python_test.go @@ -1,11 +1,10 @@ -package gotdf_python_test +package gotdf_python import ( "crypto/tls" "encoding/json" "errors" "fmt" - "gotdf_python" "io" "log" "net/http" @@ -18,13 +17,6 @@ import ( var defaultAuthScopes = []string{"email"} -func getEnv(key, defaultValue string) string { - if value, ok := os.LookupEnv(key); ok { - return value - } - return defaultValue -} - type TestConfiguration struct { platformEndpoint string tokenEndpoint string @@ -67,7 +59,7 @@ A basic HTTP request Based on: https://stackoverflow.com/q/24493116 */ -func authHelper(form url.Values, isPEAuth bool) (gotdf_python.TokenAuth, error) { +func authHelper(form url.Values, isPEAuth bool) (TokenAuth, error) { tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } @@ -94,26 +86,26 @@ func authHelper(form url.Values, isPEAuth bool) (gotdf_python.TokenAuth, error) val, ok := jsonMap["access_token"].(string) // If the key exists if !ok { - return gotdf_python.TokenAuth{}, errors.New("Unable to obtain 'access_token', cannot continue") + return TokenAuth{}, errors.New("Unable to obtain 'access_token', cannot continue") } if isPEAuth { fmt.Println("Successfully auth'd PE", config.peUsername) - return gotdf_python.TokenAuth{ + return TokenAuth{ AccessToken: val, NpeClientId: config.npeClientId, }, nil } else { fmt.Println("Successfully auth'd NPE", config.npeClientId) - return gotdf_python.TokenAuth{ + return TokenAuth{ AccessToken: val, }, nil } } -func AuthenticatePE() (gotdf_python.TokenAuth, error) { +func AuthenticatePE() (TokenAuth, error) { form := url.Values{} form.Add("grant_type", "password") form.Add("client_id", config.npeClientId) @@ -123,7 +115,7 @@ func AuthenticatePE() (gotdf_python.TokenAuth, error) { return authHelper(form, true) } -func AuthenticateNPE() (gotdf_python.TokenAuth, error) { +func AuthenticateNPE() (TokenAuth, error) { form := url.Values{} form.Add("grant_type", "client_credentials") form.Add("client_id", config.npeClientId) @@ -140,7 +132,7 @@ func getMultiDataAttribute(config TestConfiguration) []string { func doEncryptString(t *testing.T, dataAttributes []string) { - got, err := gotdf_python.EncryptString("Hello, world", gotdf_python.OpentdfConfig{ + got, err := EncryptString("Hello, world", OpentdfConfig{ ClientId: config.npeClientId, ClientSecret: config.npeClientSecret, PlatformEndpoint: config.platformEndpoint, @@ -205,7 +197,7 @@ func encrypt_file_NPE(t *testing.T, dataAttributes []string) string { } defer tmpOutputFile.Close() - got, err := gotdf_python.EncryptFile(tmpInputFile.Name(), tmpOutputFile.Name(), gotdf_python.OpentdfConfig{ + got, err := EncryptFile(tmpInputFile.Name(), tmpOutputFile.Name(), OpentdfConfig{ ClientId: config.npeClientId, ClientSecret: config.npeClientSecret, PlatformEndpoint: config.platformEndpoint, @@ -228,7 +220,7 @@ func encrypt_file_NPE(t *testing.T, dataAttributes []string) string { return got } -func encrypt_file_PE(t *testing.T, dataAttributes []string, tokenAuth gotdf_python.TokenAuth) string { +func encrypt_file_PE(t *testing.T, dataAttributes []string, tokenAuth TokenAuth) string { tmpInputFile, err := os.CreateTemp("", "input-file-*.txt") if err != nil { log.Fatal("Could not create input file", err) @@ -251,7 +243,7 @@ func encrypt_file_PE(t *testing.T, dataAttributes []string, tokenAuth gotdf_pyth } defer tmpOutputFile.Close() - got, err := gotdf_python.EncryptFilePE(tmpInputFile.Name(), tmpOutputFile.Name(), gotdf_python.OpentdfConfig{ + got, err := EncryptFilePE(tmpInputFile.Name(), tmpOutputFile.Name(), OpentdfConfig{ ClientId: config.npeClientId, ClientSecret: config.npeClientSecret, PlatformEndpoint: config.platformEndpoint, @@ -308,7 +300,7 @@ func e2e_test_as_PE(t *testing.T, dataAttributes []string) { if err != nil { t.Error(err) } - got, err := gotdf_python.DecryptFilePE(input_TDF_path, plaintext_output_path.Name(), gotdf_python.OpentdfConfig{ + got, err := DecryptFilePE(input_TDF_path, plaintext_output_path.Name(), OpentdfConfig{ ClientId: config.npeClientId, ClientSecret: config.npeClientSecret, PlatformEndpoint: config.platformEndpoint, @@ -383,7 +375,7 @@ func Test_Multifile_NPE_Encrypt_Files_In_Dir_Nil_Attributes(t *testing.T) { t.Fatal("Unable to write to temporary file", err) } - cfg := gotdf_python.OpentdfConfig{ + cfg := OpentdfConfig{ ClientId: config.npeClientId, ClientSecret: config.npeClientSecret, PlatformEndpoint: config.platformEndpoint, @@ -391,7 +383,7 @@ func Test_Multifile_NPE_Encrypt_Files_In_Dir_Nil_Attributes(t *testing.T) { KasUrl: config.kasEndpoint, } - got, err := gotdf_python.EncryptFilesWithExtensionsNPE(tmpDir, []string{".txt", ".csv"}, cfg, nil, defaultAuthScopes) + got, err := EncryptFilesWithExtensionsNPE(tmpDir, []string{".txt", ".csv"}, cfg, nil, defaultAuthScopes) if err != nil { t.Fatal("Failed to EncryptFilesWithExtensionsNPE()!", err) } @@ -416,7 +408,7 @@ func Test_Multifile_NPE_Encrypt_Files_With_Extensions_Nil_Attributes(t *testing. numFiles := createTestFiles(t, tmpDir) // Call the EncryptFilesWithExtensionsNPE function - got, err := gotdf_python.EncryptFilesWithExtensionsNPE(tmpDir, []string{".txt", ".csv", ".pdf"}, gotdf_python.OpentdfConfig{ + got, err := EncryptFilesWithExtensionsNPE(tmpDir, []string{".txt", ".csv", ".pdf"}, OpentdfConfig{ ClientId: config.npeClientId, ClientSecret: config.npeClientSecret, PlatformEndpoint: config.platformEndpoint, @@ -447,7 +439,7 @@ func Test_Multifile_NPE_Decrypt_Files_In_Dir_Nil_Attributes(t *testing.T) { numFiles := createTestFiles(t, tmpDir) // Encrypt the file - _, err = gotdf_python.EncryptFilesInDirNPE(tmpDir, gotdf_python.OpentdfConfig{ + _, err = EncryptFilesInDirNPE(tmpDir, OpentdfConfig{ ClientId: config.npeClientId, ClientSecret: config.npeClientSecret, PlatformEndpoint: config.platformEndpoint, @@ -459,7 +451,7 @@ func Test_Multifile_NPE_Decrypt_Files_In_Dir_Nil_Attributes(t *testing.T) { } // Call the DecryptFilesInDirNPE function - got, err := gotdf_python.DecryptFilesInDirNPE(tmpDir, gotdf_python.OpentdfConfig{ + got, err := DecryptFilesInDirNPE(tmpDir, OpentdfConfig{ ClientId: config.npeClientId, ClientSecret: config.npeClientSecret, PlatformEndpoint: config.platformEndpoint, @@ -489,7 +481,7 @@ func Test_Multifile_NPE_Decrypt_Files_With_Extensions_Nil_Attributes(t *testing. numFiles := createTestFiles(t, tmpDir) // Encrypt the files - _, err = gotdf_python.EncryptFilesWithExtensionsNPE(tmpDir, []string{".txt", ".csv", ".pdf"}, gotdf_python.OpentdfConfig{ + _, err = EncryptFilesWithExtensionsNPE(tmpDir, []string{".txt", ".csv", ".pdf"}, OpentdfConfig{ ClientId: config.npeClientId, ClientSecret: config.npeClientSecret, PlatformEndpoint: config.platformEndpoint, @@ -501,7 +493,7 @@ func Test_Multifile_NPE_Decrypt_Files_With_Extensions_Nil_Attributes(t *testing. } // Call the DecryptFilesWithExtensionsNPE function - got, err := gotdf_python.DecryptFilesWithExtensionsNPE(tmpDir, []string{".tdf"}, gotdf_python.OpentdfConfig{ + got, err := DecryptFilesWithExtensionsNPE(tmpDir, []string{".tdf"}, OpentdfConfig{ ClientId: config.npeClientId, ClientSecret: config.npeClientSecret, PlatformEndpoint: config.platformEndpoint, diff --git a/pyproject.toml b/pyproject.toml index e78622e..ecb63a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "otdf-python" # Should match 'setup.py' version number (used for gopy/pybindgen) -version = "0.2.12" +version = "0.2.14" description = "Unofficial OpenTDF SDK for Python." authors = [ {name="b-long", email="b-long@users.noreply.github.com"} @@ -19,7 +19,7 @@ pybindgen = "^0.22.1" [tool.poetry] package-mode = false -version = "0.2.12" +version = "0.2.14" [tool.poetry.dependencies] python = ">=3.11,<3.14" diff --git a/setup.py b/setup.py index 7874f49..5015a6d 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ url="https://github.com/b-long/opentdf-python-sdk", package_data={"otdf_python": ["*.so"]}, # Should match 'pyproject.toml' version number - version="0.2.12", + version="0.2.14", author_email="b-long@users.noreply.github.com", include_package_data=True, ) diff --git a/setup_ci.py b/setup_ci.py index 86fddbe..3ad6da4 100644 --- a/setup_ci.py +++ b/setup_ci.py @@ -81,7 +81,7 @@ def build_extension(self, ext: Extension): setuptools.setup( name="otdf_python", - version="0.2.12", + version="0.2.14", author="b-long", description="Unofficial OpenTDF SDK for Python.", long_description_content_type="text/markdown", diff --git a/uv.lock b/uv.lock index 8446d8a..7385017 100644 --- a/uv.lock +++ b/uv.lock @@ -3,5 +3,5 @@ requires-python = ">=3.11" [[package]] name = "otdf-python" -version = "0.2.12" +version = "0.2.14" source = { editable = "." }