Skip to content

CDRIVER-4689 Additional partial implementation of OIDC authentication #2018

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 184 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
184 commits
Select commit Hold shift + click to select a range
8edcfb8
CDRIVER-4689 OIDC: Implement Machine Callback Mechanism
kkloberdanz Mar 20, 2024
95bc11a
add structs for callback parameters and return value
kkloberdanz Mar 20, 2024
9f4ee29
fix function names and type signatures
kkloberdanz Mar 20, 2024
23fcf55
refactor
kkloberdanz Mar 20, 2024
7e5f296
can call oidc_callback stub
kkloberdanz Mar 20, 2024
eafa4c5
update signature for OIDC callback function
kkloberdanz Mar 21, 2024
56c330b
initialize and destroy oidc_credential within client
kkloberdanz Mar 21, 2024
63b4d12
Working on OIDC SASL One Step Conversation
kkloberdanz Mar 21, 2024
007f606
Connect to server and get a reply
kkloberdanz Mar 21, 2024
4761477
unify error handling
kkloberdanz Mar 21, 2024
cf2a532
add TODO
kkloberdanz Mar 22, 2024
60a9542
check for NULL
kkloberdanz Mar 22, 2024
01d5e6d
got a successful server reply
kkloberdanz Mar 26, 2024
a06a26e
cleanup
kkloberdanz Mar 26, 2024
d4dca48
add test with user callback
kkloberdanz Mar 27, 2024
095fd52
fix use after free
kkloberdanz Mar 28, 2024
380b04d
make this function void
kkloberdanz Mar 28, 2024
118bfa6
Add OIDC token caching and retry logic
kkloberdanz Mar 28, 2024
5ae571e
working on speculative auth
kkloberdanz Apr 1, 2024
b437935
skeleton for handling requthenticaion with OIDC
kkloberdanz Apr 1, 2024
fac328f
move OIDC stuff to topology
kkloberdanz Apr 3, 2024
e6def2d
Make mongoc_topology_scanner_start take a topology struct as a parame…
kkloberdanz Apr 4, 2024
be2655e
fix mongoc_topology_t forward declaration
kkloberdanz Apr 4, 2024
0247171
comment out unused function _mongoc_oidc_credential_destroy
kkloberdanz Apr 4, 2024
f023ef4
fix no noline at end of file error
kkloberdanz Apr 4, 2024
fcdce66
use the timeout and version variables
kkloberdanz Apr 4, 2024
2454bad
clang-format
kkloberdanz Apr 4, 2024
6ba9e4d
clang-format
kkloberdanz Apr 4, 2024
7dcf2c3
implement locking for OIDC credential
kkloberdanz Apr 4, 2024
32e532f
init and cleanup
kkloberdanz Apr 4, 2024
6d85912
fix deadlock
kkloberdanz Apr 5, 2024
af9e003
fmt
kkloberdanz Apr 5, 2024
1c1d7dd
fmt
kkloberdanz Apr 5, 2024
6ca7dac
rename pthread to bson
kkloberdanz Apr 5, 2024
9526fbc
fix bson mutex initialize
kkloberdanz Apr 5, 2024
e281e07
fmt
kkloberdanz Apr 5, 2024
bda20b8
check for null
kkloberdanz Apr 5, 2024
46c3972
fix memory leak
kkloberdanz Apr 8, 2024
6a4c1bd
fixup pool behavior
kkloberdanz Apr 8, 2024
093863d
remove unused variable
kkloberdanz Apr 8, 2024
f794ee5
fmt
kkloberdanz Apr 8, 2024
d203086
make mongoc_topology_scanner_node_setup take a topology object as an …
kkloberdanz Apr 8, 2024
c4ceb20
remove unused function
kkloberdanz Apr 8, 2024
afbf34f
remove unused function
kkloberdanz Apr 8, 2024
1bd5cd5
pass topology object into mongoc_topology_scanner_node_setup_tcp and …
kkloberdanz Apr 8, 2024
960a885
add oidc to speculative auth
kkloberdanz Apr 8, 2024
9008c85
pass topology through
kkloberdanz Apr 9, 2024
6e99e31
got spec auth working
kkloberdanz Apr 9, 2024
f48f308
fix oidc spec auth
kkloberdanz Apr 9, 2024
eeb7ee6
use portable threading library
kkloberdanz Apr 10, 2024
874150f
debug reauthenticate
kkloberdanz Apr 10, 2024
a1fde66
fmt
kkloberdanz Apr 10, 2024
7a17e77
fmt
kkloberdanz Apr 10, 2024
596bee4
fmt
kkloberdanz Apr 10, 2024
dfe3c90
debugging unified test: mongodb-oidc-no-retry.json
kkloberdanz Apr 11, 2024
8ca58b6
add authMechanism support to test suite
kkloberdanz Apr 11, 2024
33ed531
remove print
kkloberdanz Apr 11, 2024
cab5ac8
clarify error message when an oidc_callback is not set
kkloberdanz Apr 12, 2024
b97ab13
add OIDC callback function when auth mechanism is MONGODB-OIDC
kkloberdanz Apr 15, 2024
a4370a2
compiling
kkloberdanz Apr 16, 2024
09dccfc
working on reauth
kkloberdanz Apr 16, 2024
995973d
fixed reauthentication
kkloberdanz Apr 17, 2024
43201f2
cleanup
kkloberdanz Apr 17, 2024
bb2462f
cleanup
kkloberdanz Apr 17, 2024
33d26ca
cleanup
kkloberdanz Apr 17, 2024
144eef8
debug
kkloberdanz Apr 17, 2024
1274098
db: "$external" is needed for speculative auth but not for regular auth
kkloberdanz Apr 19, 2024
bb4b65d
add MONGODB-OIDC to checking if we have auth
kkloberdanz Apr 22, 2024
09e93cc
fix comment
kkloberdanz Apr 22, 2024
40aaec7
fixed wrong error code failure
kkloberdanz Apr 23, 2024
1f1d655
fmt
kkloberdanz Apr 23, 2024
1cde3c6
fix compiler warnings
kkloberdanz Apr 23, 2024
773fd46
fix warning
kkloberdanz Apr 23, 2024
c91ec2e
fix
kkloberdanz Apr 23, 2024
6eae29b
cleanup noise
kkloberdanz Apr 24, 2024
b4d32fd
fix happy eyeballs
kkloberdanz Apr 24, 2024
16e39de
fix test-mongoc-topology-scanner
kkloberdanz Apr 24, 2024
7297c80
a bug in older clang compilers triggers a warning when zero initializ…
kkloberdanz Apr 24, 2024
69bc209
fix memory leak
kkloberdanz Apr 24, 2024
b6544af
memory leaks
kkloberdanz Apr 24, 2024
181384c
take master
kkloberdanz Apr 24, 2024
78018bd
reduce noise in tests
kkloberdanz Apr 25, 2024
fe9e284
add steps to setup OIDC tokens in CI
kkloberdanz Apr 25, 2024
a18ec0f
add setup-oidc-token.sh CI script
kkloberdanz Apr 25, 2024
f1c27cc
try this
kkloberdanz Apr 25, 2024
9078fe6
try this
kkloberdanz Apr 25, 2024
6eec0c7
try this
kkloberdanz Apr 25, 2024
77d47ac
try this
kkloberdanz Apr 25, 2024
589d24c
working on bootstrap oidc
kkloberdanz Apr 25, 2024
f2caec2
try this
kkloberdanz Apr 25, 2024
6c6659c
try this
kkloberdanz Apr 25, 2024
e73cb92
where is this directory?
kkloberdanz Apr 25, 2024
aa01748
try this
kkloberdanz Apr 25, 2024
f380535
try this
kkloberdanz Apr 25, 2024
b5fba1b
try this
kkloberdanz Apr 25, 2024
bf20d9e
try this
kkloberdanz Apr 25, 2024
86f2c31
OIDC scripts require Python version of at least 3.6
kkloberdanz Apr 29, 2024
08d1175
OIDC Setup scripts do not work on Z Series, skip this platform.
kkloberdanz Apr 29, 2024
3b1b187
run oidc setup.sh
kkloberdanz Apr 29, 2024
7069a81
try this
kkloberdanz Apr 30, 2024
31c58a0
try this
kkloberdanz Apr 30, 2024
bdf7e81
try setting env vars
kkloberdanz Apr 30, 2024
ee06065
revert this
kkloberdanz Apr 30, 2024
a123458
expand env vars
kkloberdanz Apr 30, 2024
b83d1d6
add example task
kkloberdanz Apr 30, 2024
4cbca20
add fetch source function
kkloberdanz Apr 30, 2024
fec77bd
try this
kkloberdanz May 2, 2024
02785a1
assume ec2 role
kkloberdanz May 2, 2024
83bbc9c
remove teardown task for now
kkloberdanz May 2, 2024
f5019c6
try expansion
kkloberdanz May 2, 2024
b05c7c7
try without that
kkloberdanz May 2, 2024
e838d4e
where is this stuff at?
kkloberdanz May 2, 2024
3cd3690
try this
kkloberdanz May 2, 2024
904bd29
try this
kkloberdanz May 2, 2024
f1dfbbf
remove bootstrap-oidc
kkloberdanz May 2, 2024
e6ef5b3
try running tests
kkloberdanz May 2, 2024
0f4bdd3
try this
kkloberdanz May 2, 2024
9d12c7b
try this
kkloberdanz May 2, 2024
11b8c64
try this, fix teardown.sh
kkloberdanz May 7, 2024
27915ee
try this, remove teardown.sh
kkloberdanz May 9, 2024
b0429c0
run setup stuff
kkloberdanz May 9, 2024
bb8bb81
fix yaml syntax
kkloberdanz May 9, 2024
9f1a059
try this
kkloberdanz May 9, 2024
8106c60
try this
kkloberdanz May 9, 2024
8f43d22
try this
kkloberdanz May 9, 2024
d2bfa2f
try this config
kkloberdanz May 10, 2024
c55e15b
Revert "try this config"
kkloberdanz May 10, 2024
f67905b
try this
kkloberdanz May 10, 2024
f39dd63
try this
kkloberdanz May 10, 2024
b823f44
try this
kkloberdanz May 10, 2024
973aebe
try this
kkloberdanz May 13, 2024
583768a
fetch source first
kkloberdanz May 13, 2024
e5903f3
debug this script
kkloberdanz May 14, 2024
e598d56
something is wrong with curl_mo.txt
kkloberdanz May 14, 2024
0be13c2
debug
kkloberdanz May 20, 2024
9623b23
debug
kkloberdanz May 20, 2024
d56b714
debug
kkloberdanz May 20, 2024
1ba7a0d
debug second curl_mo.txt
kkloberdanz May 20, 2024
3b5767a
cat log files
kkloberdanz May 20, 2024
3400813
try removing bootstrap-mongo-orchestration
kkloberdanz May 20, 2024
7e61392
check if AWS env vars are set
kkloberdanz May 21, 2024
79fcedf
see if unsetting AWS_SESSION_TOKEN works
kkloberdanz May 21, 2024
4144fa9
try limiting to OIDC tests only
kkloberdanz May 21, 2024
5e65140
fix sasl-cyrus-openssl-compile
kkloberdanz May 21, 2024
7c3ed75
try this
kkloberdanz May 21, 2024
2edd241
re-add fetch-source
kkloberdanz May 21, 2024
e07a7e2
Try to fix the following error:
kkloberdanz May 21, 2024
24d7f9a
debug with netstat
kkloberdanz May 21, 2024
aaf8141
see if mongod is running
kkloberdanz May 21, 2024
dda7bb9
try this
kkloberdanz May 23, 2024
792e74c
find the config file
kkloberdanz May 28, 2024
8252e2d
check the config files
kkloberdanz May 28, 2024
a127d4a
remove SSL
kkloberdanz May 28, 2024
41eb6a0
remove this
kkloberdanz May 28, 2024
a58634f
debug auth failure in CI
kkloberdanz May 28, 2024
df4301b
fix
kkloberdanz May 28, 2024
3f9447d
get error message
kkloberdanz May 30, 2024
883d816
add /unified/runOnRequirement-authMechanism-type.json spec test
kkloberdanz Jun 12, 2024
c33f788
add /unified/runOnRequirement-authMechanism-type.json spec test
kkloberdanz Jun 12, 2024
9d61c51
add prose tests
kkloberdanz Jun 24, 2024
e8a2daa
working on latest version of tests
kkloberdanz Jun 25, 2024
d85fba1
mongoc_oidc_callback_copy
mdbmes May 13, 2025
fcc2eff
Updated set_oidc_callback for new mongoc_oidc_callback_t
mdbmes May 13, 2025
a2e14f1
Changes to support new oidc callback and param/response types
mdbmes May 13, 2025
b1bab92
Support the move of AUTH_ERROR_AND_FAIL into mongoc-cluster-sasl-priv…
mdbmes May 13, 2025
5528291
Update stored OIDC data types in mongoc_topology_t
mdbmes May 13, 2025
1ebce0e
Formatting and include fixes
mdbmes May 13, 2025
6d07b1c
Zero tokens on free, moved from Kyle's patch to new oidc_credential
mdbmes May 13, 2025
e89e2b6
Update to current APIs, add comments, try to invalidate correct token
mdbmes May 14, 2025
4a7c869
Update test-oidcauth for current APIs
mdbmes May 16, 2025
a751f01
Use portable thread handle type
mdbmes May 17, 2025
6e5f251
Fix NULL'ed required parameters when testing mongoc_topology_scanner_new
mdbmes May 17, 2025
fbbcdbc
Revert unneeded changes to src/libmongoc/tests/unified/operation.c
mdbmes May 17, 2025
980da44
Revert unneeded parts of src/libmongoc/tests/unified/runner.c change
mdbmes May 17, 2025
2402386
Revert changes to .evergreen/scripts/integration-tests.sh
mdbmes May 17, 2025
50f5024
Partial revert of .evergreen/scripts/run-tests.sh
mdbmes May 17, 2025
01bbb8a
check_var_opt OIDC
mdbmes May 17, 2025
c277754
Check bson item types in check_run_on_requirement
mdbmes May 18, 2025
c901c65
Remove runOnRequirement-authMechanism-type invalid test
mdbmes May 18, 2025
df988aa
For OIDC tests, leave URI password unset
mdbmes May 18, 2025
5e780dd
Test OIDC env var in authMechanism run_on_requirement
mdbmes May 18, 2025
3219218
Portability fix, use BSON_THREAD_RETURN
mdbmes May 19, 2025
44163bf
Merge branch 'master' into CDRIVER-4689-kyle-rebase
mdbmes May 19, 2025
588e927
Merge branch 'master' into CDRIVER-4689-kyle-rebase
mdbmes May 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .evergreen/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,4 @@ include:
- filename: .evergreen/generated_configs/task_groups.yml
- filename: .evergreen/generated_configs/tasks.yml
- filename: .evergreen/generated_configs/variants.yml
- filename: .evergreen/example-config.yml
60 changes: 60 additions & 0 deletions .evergreen/example-config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# The following task can be run with the `evergreen` CLI as follows:
# evergreen patch --project=mongo-c-driver \
# --description="Run example-task" \
# --yes --finalize \
# -v example-variant -t example-task

tasks:
- name: example-task
run_on: ubuntu2204-small
commands:
- command: shell.exec
params:
shell: bash
script: |-
echo "Hello from example-task!"
- name: test-asan-sasl-openssl-ubuntu2204-clang-compile
run_on: ubuntu2204-large
commands:
- func: fetch-source
- func: sasl-cyrus-openssl-compile
- func: upload-build
- name: run-tests-task
run_on: ubuntu2204-small
depends_on: [{ name: test-asan-sasl-openssl-ubuntu2204-clang-compile }]
commands:
- func: fetch-build
vars:
BUILD_NAME: test-asan-sasl-openssl-ubuntu2204-clang-compile
- command: expansions.update
params:
updates:
- { key: CC, value: clang }
- { key: AUTH, value: auth }
- { key: OIDC, value: oidc }
- { key: MONGODB_VERSION, value: "latest" }
- { key: TOPOLOGY, value: replica_set }
- func: run-tests
task_groups:
- name: testoidc_task_group
setup_group:
- func: fetch-det
- func: "assume ec2 role" # Get necessary AWS credentials
- command: subprocess.exec
params:
binary: bash
include_expansions_in_env: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN"]
args:
- ./drivers-evergreen-tools/.evergreen/auth_oidc/setup.sh
setup_group_can_fail_task: true
setup_group_timeout_secs: 1800
tasks:
- example-task
- test-asan-sasl-openssl-ubuntu2204-clang-compile
- run-tests-task

buildvariants:
- name: example-variant
display_name: Example Variant
tasks:
- name: testoidc_task_group
119 changes: 119 additions & 0 deletions .evergreen/generated_configs/functions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,125 @@ functions:
local_file: mongoc/mongoc-man-pages.html
permissions: public-read
remote_file: ${project}/man-pages/libmongoc/${CURRENT_VERSION}/index.html
"assume ec2 role":
- command: ec2.assume_role
params:
role_arn: ${aws_test_secrets_role}
"fetch source":
# Executes clone and applies the submitted patch, if any
- command: git.get_project
params:
directory: "src"
# Applies the submitted patch, if any
# Deprecated. Should be removed. But still needed for certain agents (ZAP)
- command: git.apply_patch
# Make an evergreen expansion file with dynamic values
- command: shell.exec
params:
working_dir: "src"
script: |
set +x
# Get the current unique version of this checkout
if [ "${is_patch}" = "true" ]; then
CURRENT_VERSION=$(git describe)-patch-${version_id}
else
CURRENT_VERSION=latest
fi

export DRIVERS_TOOLS="$(dirname $(pwd))/drivers-tools"
export PROJECT_DIRECTORY="$(pwd)"

# Python has cygwin path problems on Windows. Detect prospective mongo-orchestration home directory
if [ "Windows_NT" = "$OS" ]; then # Magic variable in cygwin
export DRIVERS_TOOLS=$(cygpath -m $DRIVERS_TOOLS)
export PROJECT_DIRECTORY=$(cygpath -m $PROJECT_DIRECTORY)
fi

export MONGO_ORCHESTRATION_HOME="$DRIVERS_TOOLS/.evergreen/orchestration"
export MONGODB_BINARIES="$DRIVERS_TOOLS/mongodb/bin"
export UPLOAD_BUCKET="${project}"

cat <<EOT > expansion.yml
CURRENT_VERSION: "$CURRENT_VERSION"
DRIVERS_TOOLS: "$DRIVERS_TOOLS"
MONGO_ORCHESTRATION_HOME: "$MONGO_ORCHESTRATION_HOME"
MONGODB_BINARIES: "$MONGODB_BINARIES"
UPLOAD_BUCKET: "$UPLOAD_BUCKET"
PROJECT_DIRECTORY: "$PROJECT_DIRECTORY"
PREPARE_SHELL: |
set -o errexit
export SKIP_LEGACY_SHELL=1
export DRIVERS_TOOLS="$DRIVERS_TOOLS"
export MONGO_ORCHESTRATION_HOME="$MONGO_ORCHESTRATION_HOME"
export MONGODB_BINARIES="$MONGODB_BINARIES"
export UPLOAD_BUCKET="$UPLOAD_BUCKET"
export PROJECT_DIRECTORY="$PROJECT_DIRECTORY"

export TMPDIR="$MONGO_ORCHESTRATION_HOME/db"
export PATH="$MONGODB_BINARIES:$PATH"
export PROJECT="${project}"
export PIP_QUIET=1
EOT

# Load the expansion file to make an evergreen variable with the current unique version
- command: expansions.update
params:
file: src/expansion.yml
bootstrap-oidc:
- command: ec2.assume_role
params:
role_arn: ${aws_test_secrets_role}
- command: shell.exec
type: test
params:
working_dir: "mongoc"
shell: bash
script: |
set -x
echo "RUNNING BOOTSTRAP OIDC"
if [[ ! -d drivers-evergreen-tools ]]; then
git clone --depth=1 [email protected]:mongodb-labs/drivers-evergreen-tools.git
fi
${PREPARE_SHELL}
if [ "${skip_EC2_auth_test}" = "true" ]; then
echo "This platform does not support the oidc auth test, skipping..."
exit 0
fi
cd drivers-evergreen-tools/.evergreen/auth_oidc
export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
export AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}
export OIDC_TOKEN_DIR=/tmp/tokens

# Z Series fails with the following error messages:
# error: can't find Rust compiler
# ModuleNotFoundError: No module named 'jwkest'
# We will skip this test on Z Series.
if [[ `uname -m` == "s390x" ]]; then
echo "OIDC Setup scripts do not work on Z Series, skipping."
exit 0
fi

. ./activate-authoidcvenv.sh

# The OIDC scripts require at least Python version 3.6 in order to function.
if python -c "import sys; sys.exit(0 if sys.version_info >= (3, 6) else 1)"; then
echo "Python version is 3.6 or greater, will run OIDC setup scripts"
else
echo "Python version is less than 3.6, cannot use OIDC setup scripts"
exit 0
fi

export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
export AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}
export TOPOLOGY=replica_set
export ORCHESTRATION_FILE=auth-oidc.json
echo "RUNNING OIDC SETUP"
./setup.sh

#python oidc_write_orchestration.py
#python oidc_get_tokens.py
upload-mo-artifacts:
- command: subprocess.exec
params:
Expand Down
6 changes: 6 additions & 0 deletions .evergreen/scripts/run-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ check_var_opt SINGLE_MONGOS_LB_URI
check_var_opt SKIP_CRYPT_SHARED_LIB
check_var_opt SSL "nossl"
check_var_opt URI
check_var_opt OIDC

declare script_dir
script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")"
Expand Down Expand Up @@ -241,6 +242,11 @@ if [[ "${LOADBALANCED}" != "noloadbalanced" ]]; then
test_args+=("-l" "/command_monitoring/unified/*")
fi

if [[ "${OIDC}" == "oidc" ]]; then
test_args+=("-l" "/unified/mongodb-oidc-no-retry")
echo "TESTING OIDC"
fi

if [[ ! "${test_args[*]}" =~ "-l" ]]; then
# /http tests are only run if the set of tests to execute were not limited.
echo "Waiting for simple HTTP server to start..."
Expand Down
2 changes: 2 additions & 0 deletions src/libmongoc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,7 @@ set (MONGOC_SOURCES
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-side-encryption.c
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster.c
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-aws.c
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-oidc.c
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-sasl.c
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-collection.c
${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-compression.c
Expand Down Expand Up @@ -1199,6 +1200,7 @@ if (ENABLE_TESTS)
mongoc_add_test (test-azurekms ${PROJECT_SOURCE_DIR}/tests/test-azurekms.c)
mongoc_add_test (test-gcpkms ${PROJECT_SOURCE_DIR}/tests/test-gcpkms.c)
mongoc_add_test (test-awsauth ${PROJECT_SOURCE_DIR}/tests/test-awsauth.c)
mongoc_add_test (test-oidcauth ${PROJECT_SOURCE_DIR}/tests/test-oidcauth.c)

# "make test" doesn't compile tests, so we create "make check" which compiles
# and runs tests: https://gitlab.kitware.com/cmake/cmake/issues/8774
Expand Down
33 changes: 33 additions & 0 deletions src/libmongoc/doc/mongoc_oidc_callback_copy.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
:man_page: mongoc_oidc_callback_copy

mongoc_oidc_callback_copy()
===========================

Synopsis
--------

.. code-block:: c

mongoc_oidc_callback_t *
mongoc_oidc_callback_copy (const mongoc_oidc_callback_t *callback)

Create a new :symbol:`mongoc_oidc_callback_t` object with the same callback function and user data pointer as an existing :symbol:`mongoc_oidc_callback_t`.

.. warning::

The lifetime of the object pointed to by ``user_data`` is managed the user, not by :symbol:`mongoc_oidc_callback_t`!

Parameters
----------

* ``callback``: a :symbol:`mongoc_oidc_callback_t` to copy. Must not be ``NULL``.

Returns
-------

A new :symbol:`mongoc_oidc_callback_t` that must be freed with :symbol:`mongoc_oidc_callback_destroy()`.

.. seealso::

- :symbol:`mongoc_oidc_callback_t`
- :symbol:`mongoc_oidc_callback_new`
1 change: 1 addition & 0 deletions src/libmongoc/doc/mongoc_oidc_callback_t.rst
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ The callback may be used to integrate with OIDC providers that are not supported

mongoc_oidc_callback_new
mongoc_oidc_callback_new_with_user_data
mongoc_oidc_callback_copy
mongoc_oidc_callback_destroy
mongoc_oidc_callback_get_fn
mongoc_oidc_callback_get_user_data
Expand Down
17 changes: 17 additions & 0 deletions src/libmongoc/src/mongoc/mongoc-client-pool.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,23 @@ mongoc_client_pool_new (const mongoc_uri_t *uri)
return pool;
}

void
mongoc_client_pool_set_oidc_callback (mongoc_client_pool_t *pool, const mongoc_oidc_callback_t *callback)
{
BSON_ASSERT_PARAM (pool);
BSON_ASSERT_PARAM (callback);

mongoc_oidc_callback_destroy (pool->topology->oidc_callback);
pool->topology->oidc_callback = mongoc_oidc_callback_copy (callback);
}

const mongoc_oidc_callback_t *
mongoc_client_pool_get_oidc_callback (const mongoc_client_pool_t *pool)
{
BSON_ASSERT_PARAM (pool);

return pool->topology->oidc_callback;
}

mongoc_client_pool_t *
mongoc_client_pool_new_with_error (const mongoc_uri_t *uri, bson_error_t *error)
Expand Down
6 changes: 6 additions & 0 deletions src/libmongoc/src/mongoc/mongoc-client-pool.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ typedef struct _mongoc_client_pool_t mongoc_client_pool_t;
MONGOC_EXPORT (mongoc_client_pool_t *)
mongoc_client_pool_new (const mongoc_uri_t *uri) BSON_GNUC_WARN_UNUSED_RESULT;

MONGOC_EXPORT (void)
mongoc_client_pool_set_oidc_callback (mongoc_client_pool_t *pool, const mongoc_oidc_callback_t *callback);

MONGOC_EXPORT (const mongoc_oidc_callback_t *)
mongoc_client_pool_get_oidc_callback (const mongoc_client_pool_t *pool);

MONGOC_EXPORT (mongoc_client_pool_t *)
mongoc_client_pool_new_with_error (const mongoc_uri_t *uri, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT;

Expand Down
56 changes: 56 additions & 0 deletions src/libmongoc/src/mongoc/mongoc-client.c
Original file line number Diff line number Diff line change
Expand Up @@ -1083,6 +1083,38 @@ mongoc_client_new_from_uri_with_error (const mongoc_uri_t *uri, bson_error_t *er
RETURN (client);
}

/*
* Spec:
* Drivers MUST have a way to invalidate a specific access token from the
* Client Cache. Invalidation MUST only clear the cached access token if it is
* the same as the invalid access token.
*
* https://github.com/mongodb/specifications/blob/master/source/auth/auth.md#credential-caching
*/
void
mongoc_client_oidc_credential_invalidate (mongoc_client_t *client, const char *access_token)
{
BSON_ASSERT_PARAM (client);
BSON_ASSERT_PARAM (access_token);

mongoc_topology_t *topology = client->topology;
BSON_ASSERT (topology);

bson_mutex_lock (&topology->oidc_mtx);

if (!topology->oidc_credential) {
goto done;
}

if (!strcmp (access_token, mongoc_oidc_credential_get_access_token (topology->oidc_credential))) {
mongoc_oidc_credential_destroy (topology->oidc_credential);
topology->oidc_credential = NULL;
}

done:
bson_mutex_unlock (&topology->oidc_mtx);
}


/* precondition: topology is valid */
mongoc_client_t *
Expand Down Expand Up @@ -2653,6 +2685,30 @@ mongoc_client_set_server_api (mongoc_client_t *client, const mongoc_server_api_t
return true;
}

void
mongoc_client_set_oidc_callback (mongoc_client_t *client, const mongoc_oidc_callback_t *callback)
{
BSON_ASSERT_PARAM (client);
BSON_ASSERT_PARAM (callback);

if (!client->topology->single_threaded) {
MONGOC_ERROR ("mongoc_client_set_oidc_callback must only be used for single threaded clients. "
"For client pools, use mongoc_client_pool_set_oidc_callback instead.");
return;
}

mongoc_oidc_callback_destroy (client->topology->oidc_callback);
client->topology->oidc_callback = mongoc_oidc_callback_copy (callback);
}

const mongoc_oidc_callback_t *
mongoc_client_get_oidc_callback (const mongoc_client_t *client)
{
BSON_ASSERT_PARAM (client);

return client->topology->oidc_callback;
}

mongoc_server_description_t *
mongoc_client_get_handshake_description (mongoc_client_t *client, uint32_t server_id, bson_t *opts, bson_error_t *error)
{
Expand Down
Loading