xref: /aosp_15_r20/external/aws-crt-java/src/native/credentials_provider.c (revision 3c7ae9de214676c52d19f01067dc1a404272dc11)
1*3c7ae9deSAndroid Build Coastguard Worker /**
2*3c7ae9deSAndroid Build Coastguard Worker  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3*3c7ae9deSAndroid Build Coastguard Worker  * SPDX-License-Identifier: Apache-2.0.
4*3c7ae9deSAndroid Build Coastguard Worker  */
5*3c7ae9deSAndroid Build Coastguard Worker 
6*3c7ae9deSAndroid Build Coastguard Worker #include "credentials.h"
7*3c7ae9deSAndroid Build Coastguard Worker #include "crt.h"
8*3c7ae9deSAndroid Build Coastguard Worker #include "http_connection_manager.h"
9*3c7ae9deSAndroid Build Coastguard Worker #include "java_class_ids.h"
10*3c7ae9deSAndroid Build Coastguard Worker 
11*3c7ae9deSAndroid Build Coastguard Worker #include <http_proxy_options.h>
12*3c7ae9deSAndroid Build Coastguard Worker #include <jni.h>
13*3c7ae9deSAndroid Build Coastguard Worker #include <string.h>
14*3c7ae9deSAndroid Build Coastguard Worker 
15*3c7ae9deSAndroid Build Coastguard Worker #include <aws/auth/credentials.h>
16*3c7ae9deSAndroid Build Coastguard Worker #include <aws/common/clock.h>
17*3c7ae9deSAndroid Build Coastguard Worker #include <aws/common/string.h>
18*3c7ae9deSAndroid Build Coastguard Worker #include <aws/http/connection.h>
19*3c7ae9deSAndroid Build Coastguard Worker #include <aws/http/proxy.h>
20*3c7ae9deSAndroid Build Coastguard Worker #include <aws/io/tls_channel_handler.h>
21*3c7ae9deSAndroid Build Coastguard Worker 
22*3c7ae9deSAndroid Build Coastguard Worker /* on 32-bit platforms, casting pointers to longs throws a warning we don't need */
23*3c7ae9deSAndroid Build Coastguard Worker #if UINTPTR_MAX == 0xffffffff
24*3c7ae9deSAndroid Build Coastguard Worker #    if defined(_MSC_VER)
25*3c7ae9deSAndroid Build Coastguard Worker #        pragma warning(push)
26*3c7ae9deSAndroid Build Coastguard Worker #        pragma warning(disable : 4305) /* 'type cast': truncation from 'jlong' to 'jni_tls_ctx_options *' */
27*3c7ae9deSAndroid Build Coastguard Worker #    else
28*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic push
29*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
30*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
31*3c7ae9deSAndroid Build Coastguard Worker #    endif
32*3c7ae9deSAndroid Build Coastguard Worker #endif
33*3c7ae9deSAndroid Build Coastguard Worker 
34*3c7ae9deSAndroid Build Coastguard Worker struct aws_credentials_provider_callback_data {
35*3c7ae9deSAndroid Build Coastguard Worker     JavaVM *jvm;
36*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider;
37*3c7ae9deSAndroid Build Coastguard Worker     jweak java_crt_credentials_provider;
38*3c7ae9deSAndroid Build Coastguard Worker 
39*3c7ae9deSAndroid Build Coastguard Worker     jobject jni_delegate_credential_handler;
40*3c7ae9deSAndroid Build Coastguard Worker };
41*3c7ae9deSAndroid Build Coastguard Worker 
s_callback_data_clean_up(JNIEnv * env,struct aws_allocator * allocator,struct aws_credentials_provider_callback_data * callback_data)42*3c7ae9deSAndroid Build Coastguard Worker static void s_callback_data_clean_up(
43*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
44*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator,
45*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data) {
46*3c7ae9deSAndroid Build Coastguard Worker 
47*3c7ae9deSAndroid Build Coastguard Worker     (*env)->DeleteWeakGlobalRef(env, callback_data->java_crt_credentials_provider);
48*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->jni_delegate_credential_handler != NULL) {
49*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteGlobalRef(env, callback_data->jni_delegate_credential_handler);
50*3c7ae9deSAndroid Build Coastguard Worker     }
51*3c7ae9deSAndroid Build Coastguard Worker 
52*3c7ae9deSAndroid Build Coastguard Worker     aws_mem_release(allocator, callback_data);
53*3c7ae9deSAndroid Build Coastguard Worker }
54*3c7ae9deSAndroid Build Coastguard Worker 
s_on_shutdown_complete(void * user_data)55*3c7ae9deSAndroid Build Coastguard Worker static void s_on_shutdown_complete(void *user_data) {
56*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data = user_data;
57*3c7ae9deSAndroid Build Coastguard Worker 
58*3c7ae9deSAndroid Build Coastguard Worker     AWS_LOGF_DEBUG(AWS_LS_AUTH_CREDENTIALS_PROVIDER, "Credentials providers shutdown complete");
59*3c7ae9deSAndroid Build Coastguard Worker 
60*3c7ae9deSAndroid Build Coastguard Worker     // Tell the Java credentials providers that shutdown is done.  This lets it release its references.
61*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV ACQUIRE **********/
62*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env = aws_jni_acquire_thread_env(callback_data->jvm);
63*3c7ae9deSAndroid Build Coastguard Worker     if (env == NULL) {
64*3c7ae9deSAndroid Build Coastguard Worker         /* If we can't get an environment, then the JVM is probably shutting down.  Don't crash. */
65*3c7ae9deSAndroid Build Coastguard Worker         return;
66*3c7ae9deSAndroid Build Coastguard Worker     }
67*3c7ae9deSAndroid Build Coastguard Worker 
68*3c7ae9deSAndroid Build Coastguard Worker     jobject java_crt_credentials_provider = (*env)->NewLocalRef(env, callback_data->java_crt_credentials_provider);
69*3c7ae9deSAndroid Build Coastguard Worker     if (java_crt_credentials_provider != NULL) {
70*3c7ae9deSAndroid Build Coastguard Worker         (*env)->CallVoidMethod(
71*3c7ae9deSAndroid Build Coastguard Worker             env, java_crt_credentials_provider, credentials_provider_properties.on_shutdown_complete_method_id);
72*3c7ae9deSAndroid Build Coastguard Worker 
73*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteLocalRef(env, java_crt_credentials_provider);
74*3c7ae9deSAndroid Build Coastguard Worker         AWS_FATAL_ASSERT(!aws_jni_check_and_clear_exception(env));
75*3c7ae9deSAndroid Build Coastguard Worker     }
76*3c7ae9deSAndroid Build Coastguard Worker 
77*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
78*3c7ae9deSAndroid Build Coastguard Worker     // We're done with this callback data, clean it up.
79*3c7ae9deSAndroid Build Coastguard Worker 
80*3c7ae9deSAndroid Build Coastguard Worker     JavaVM *jvm = callback_data->jvm;
81*3c7ae9deSAndroid Build Coastguard Worker     s_callback_data_clean_up(env, allocator, callback_data);
82*3c7ae9deSAndroid Build Coastguard Worker 
83*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_release_thread_env(jvm, env);
84*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV RELEASE **********/
85*3c7ae9deSAndroid Build Coastguard Worker }
86*3c7ae9deSAndroid Build Coastguard Worker 
87*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jlong JNICALL
Java_software_amazon_awssdk_crt_auth_credentials_StaticCredentialsProvider_staticCredentialsProviderNew(JNIEnv * env,jclass jni_class,jobject java_crt_credentials_provider,jbyteArray access_key_id,jbyteArray secret_access_key,jbyteArray session_token)88*3c7ae9deSAndroid Build Coastguard Worker     Java_software_amazon_awssdk_crt_auth_credentials_StaticCredentialsProvider_staticCredentialsProviderNew(
89*3c7ae9deSAndroid Build Coastguard Worker         JNIEnv *env,
90*3c7ae9deSAndroid Build Coastguard Worker         jclass jni_class,
91*3c7ae9deSAndroid Build Coastguard Worker         jobject java_crt_credentials_provider,
92*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray access_key_id,
93*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray secret_access_key,
94*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray session_token) {
95*3c7ae9deSAndroid Build Coastguard Worker 
96*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
97*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
98*3c7ae9deSAndroid Build Coastguard Worker 
99*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
100*3c7ae9deSAndroid Build Coastguard Worker 
101*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data =
102*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_callback_data));
103*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewWeakGlobalRef(env, java_crt_credentials_provider);
104*3c7ae9deSAndroid Build Coastguard Worker 
105*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
106*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
107*3c7ae9deSAndroid Build Coastguard Worker 
108*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_static_options options;
109*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(options);
110*3c7ae9deSAndroid Build Coastguard Worker     options.access_key_id = aws_jni_byte_cursor_from_jbyteArray_acquire(env, access_key_id);
111*3c7ae9deSAndroid Build Coastguard Worker     options.secret_access_key = aws_jni_byte_cursor_from_jbyteArray_acquire(env, secret_access_key);
112*3c7ae9deSAndroid Build Coastguard Worker     if (session_token) {
113*3c7ae9deSAndroid Build Coastguard Worker         options.session_token = aws_jni_byte_cursor_from_jbyteArray_acquire(env, session_token);
114*3c7ae9deSAndroid Build Coastguard Worker     }
115*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_callback = s_on_shutdown_complete;
116*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_user_data = callback_data;
117*3c7ae9deSAndroid Build Coastguard Worker 
118*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = aws_credentials_provider_new_static(allocator, &options);
119*3c7ae9deSAndroid Build Coastguard Worker     if (provider == NULL) {
120*3c7ae9deSAndroid Build Coastguard Worker         s_callback_data_clean_up(env, allocator, callback_data);
121*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create static credentials provider");
122*3c7ae9deSAndroid Build Coastguard Worker     } else {
123*3c7ae9deSAndroid Build Coastguard Worker         callback_data->provider = provider;
124*3c7ae9deSAndroid Build Coastguard Worker     }
125*3c7ae9deSAndroid Build Coastguard Worker 
126*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_byte_cursor_from_jbyteArray_release(env, access_key_id, options.access_key_id);
127*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_byte_cursor_from_jbyteArray_release(env, secret_access_key, options.secret_access_key);
128*3c7ae9deSAndroid Build Coastguard Worker 
129*3c7ae9deSAndroid Build Coastguard Worker     if (session_token) {
130*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, session_token, options.session_token);
131*3c7ae9deSAndroid Build Coastguard Worker     }
132*3c7ae9deSAndroid Build Coastguard Worker 
133*3c7ae9deSAndroid Build Coastguard Worker     return (jlong)provider;
134*3c7ae9deSAndroid Build Coastguard Worker }
135*3c7ae9deSAndroid Build Coastguard Worker 
136*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jlong JNICALL
Java_software_amazon_awssdk_crt_auth_credentials_DefaultChainCredentialsProvider_defaultChainCredentialsProviderNew(JNIEnv * env,jclass jni_class,jobject java_crt_credentials_provider,jlong bootstrapHandle)137*3c7ae9deSAndroid Build Coastguard Worker     Java_software_amazon_awssdk_crt_auth_credentials_DefaultChainCredentialsProvider_defaultChainCredentialsProviderNew(
138*3c7ae9deSAndroid Build Coastguard Worker         JNIEnv *env,
139*3c7ae9deSAndroid Build Coastguard Worker         jclass jni_class,
140*3c7ae9deSAndroid Build Coastguard Worker         jobject java_crt_credentials_provider,
141*3c7ae9deSAndroid Build Coastguard Worker         jlong bootstrapHandle) {
142*3c7ae9deSAndroid Build Coastguard Worker 
143*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
144*3c7ae9deSAndroid Build Coastguard Worker     (void)env;
145*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
146*3c7ae9deSAndroid Build Coastguard Worker 
147*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
148*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data =
149*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_callback_data));
150*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewWeakGlobalRef(env, java_crt_credentials_provider);
151*3c7ae9deSAndroid Build Coastguard Worker 
152*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
153*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
154*3c7ae9deSAndroid Build Coastguard Worker 
155*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_chain_default_options options;
156*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(options);
157*3c7ae9deSAndroid Build Coastguard Worker     options.bootstrap = (struct aws_client_bootstrap *)bootstrapHandle;
158*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_callback = s_on_shutdown_complete;
159*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_user_data = callback_data;
160*3c7ae9deSAndroid Build Coastguard Worker 
161*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = aws_credentials_provider_new_chain_default(allocator, &options);
162*3c7ae9deSAndroid Build Coastguard Worker     if (provider == NULL) {
163*3c7ae9deSAndroid Build Coastguard Worker         s_callback_data_clean_up(env, allocator, callback_data);
164*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create default credentials provider chain");
165*3c7ae9deSAndroid Build Coastguard Worker     } else {
166*3c7ae9deSAndroid Build Coastguard Worker         callback_data->provider = provider;
167*3c7ae9deSAndroid Build Coastguard Worker     }
168*3c7ae9deSAndroid Build Coastguard Worker 
169*3c7ae9deSAndroid Build Coastguard Worker     return (jlong)provider;
170*3c7ae9deSAndroid Build Coastguard Worker }
171*3c7ae9deSAndroid Build Coastguard Worker 
172*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jlong JNICALL
Java_software_amazon_awssdk_crt_auth_credentials_ProfileCredentialsProvider_profileCredentialsProviderNew(JNIEnv * env,jclass jni_class,jobject java_crt_credentials_provider,jlong bootstrapHandle,jlong tls_context_handle,jbyteArray profile_name_override,jbyteArray config_file_name_override,jbyteArray credentials_file_name_override)173*3c7ae9deSAndroid Build Coastguard Worker     Java_software_amazon_awssdk_crt_auth_credentials_ProfileCredentialsProvider_profileCredentialsProviderNew(
174*3c7ae9deSAndroid Build Coastguard Worker         JNIEnv *env,
175*3c7ae9deSAndroid Build Coastguard Worker         jclass jni_class,
176*3c7ae9deSAndroid Build Coastguard Worker         jobject java_crt_credentials_provider,
177*3c7ae9deSAndroid Build Coastguard Worker         jlong bootstrapHandle,
178*3c7ae9deSAndroid Build Coastguard Worker         jlong tls_context_handle,
179*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray profile_name_override,
180*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray config_file_name_override,
181*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray credentials_file_name_override) {
182*3c7ae9deSAndroid Build Coastguard Worker 
183*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
184*3c7ae9deSAndroid Build Coastguard Worker     (void)env;
185*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
186*3c7ae9deSAndroid Build Coastguard Worker 
187*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
188*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data =
189*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_callback_data));
190*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewWeakGlobalRef(env, java_crt_credentials_provider);
191*3c7ae9deSAndroid Build Coastguard Worker 
192*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
193*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
194*3c7ae9deSAndroid Build Coastguard Worker 
195*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_profile_options options;
196*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(options);
197*3c7ae9deSAndroid Build Coastguard Worker     options.bootstrap = (struct aws_client_bootstrap *)bootstrapHandle;
198*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_callback = s_on_shutdown_complete;
199*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_user_data = callback_data;
200*3c7ae9deSAndroid Build Coastguard Worker     options.tls_ctx = (struct aws_tls_ctx *)tls_context_handle;
201*3c7ae9deSAndroid Build Coastguard Worker 
202*3c7ae9deSAndroid Build Coastguard Worker     if (profile_name_override) {
203*3c7ae9deSAndroid Build Coastguard Worker         options.profile_name_override = aws_jni_byte_cursor_from_jbyteArray_acquire(env, profile_name_override);
204*3c7ae9deSAndroid Build Coastguard Worker     }
205*3c7ae9deSAndroid Build Coastguard Worker 
206*3c7ae9deSAndroid Build Coastguard Worker     if (config_file_name_override) {
207*3c7ae9deSAndroid Build Coastguard Worker         options.config_file_name_override = aws_jni_byte_cursor_from_jbyteArray_acquire(env, config_file_name_override);
208*3c7ae9deSAndroid Build Coastguard Worker     }
209*3c7ae9deSAndroid Build Coastguard Worker 
210*3c7ae9deSAndroid Build Coastguard Worker     if (credentials_file_name_override) {
211*3c7ae9deSAndroid Build Coastguard Worker         options.credentials_file_name_override =
212*3c7ae9deSAndroid Build Coastguard Worker             aws_jni_byte_cursor_from_jbyteArray_acquire(env, credentials_file_name_override);
213*3c7ae9deSAndroid Build Coastguard Worker     }
214*3c7ae9deSAndroid Build Coastguard Worker 
215*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = aws_credentials_provider_new_profile(allocator, &options);
216*3c7ae9deSAndroid Build Coastguard Worker     if (provider == NULL) {
217*3c7ae9deSAndroid Build Coastguard Worker         s_callback_data_clean_up(env, allocator, callback_data);
218*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create profile credentials provider");
219*3c7ae9deSAndroid Build Coastguard Worker     } else {
220*3c7ae9deSAndroid Build Coastguard Worker         callback_data->provider = provider;
221*3c7ae9deSAndroid Build Coastguard Worker     }
222*3c7ae9deSAndroid Build Coastguard Worker 
223*3c7ae9deSAndroid Build Coastguard Worker     if (profile_name_override) {
224*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, profile_name_override, options.profile_name_override);
225*3c7ae9deSAndroid Build Coastguard Worker     }
226*3c7ae9deSAndroid Build Coastguard Worker 
227*3c7ae9deSAndroid Build Coastguard Worker     if (config_file_name_override) {
228*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, config_file_name_override, options.config_file_name_override);
229*3c7ae9deSAndroid Build Coastguard Worker     }
230*3c7ae9deSAndroid Build Coastguard Worker 
231*3c7ae9deSAndroid Build Coastguard Worker     if (credentials_file_name_override) {
232*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(
233*3c7ae9deSAndroid Build Coastguard Worker             env, credentials_file_name_override, options.credentials_file_name_override);
234*3c7ae9deSAndroid Build Coastguard Worker     }
235*3c7ae9deSAndroid Build Coastguard Worker 
236*3c7ae9deSAndroid Build Coastguard Worker     return (jlong)provider;
237*3c7ae9deSAndroid Build Coastguard Worker }
238*3c7ae9deSAndroid Build Coastguard Worker 
239*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jlong JNICALL
Java_software_amazon_awssdk_crt_auth_credentials_EcsCredentialsProvider_ecsCredentialsProviderNew(JNIEnv * env,jclass jni_class,jobject java_crt_credentials_provider,jlong bootstrapHandle,jlong tls_context_handle,jbyteArray host,jbyteArray path_and_query,jbyteArray auth_token)240*3c7ae9deSAndroid Build Coastguard Worker     Java_software_amazon_awssdk_crt_auth_credentials_EcsCredentialsProvider_ecsCredentialsProviderNew(
241*3c7ae9deSAndroid Build Coastguard Worker         JNIEnv *env,
242*3c7ae9deSAndroid Build Coastguard Worker         jclass jni_class,
243*3c7ae9deSAndroid Build Coastguard Worker         jobject java_crt_credentials_provider,
244*3c7ae9deSAndroid Build Coastguard Worker         jlong bootstrapHandle,
245*3c7ae9deSAndroid Build Coastguard Worker         jlong tls_context_handle,
246*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray host,
247*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray path_and_query,
248*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray auth_token) {
249*3c7ae9deSAndroid Build Coastguard Worker 
250*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
251*3c7ae9deSAndroid Build Coastguard Worker     (void)env;
252*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
253*3c7ae9deSAndroid Build Coastguard Worker 
254*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
255*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data =
256*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_callback_data));
257*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewWeakGlobalRef(env, java_crt_credentials_provider);
258*3c7ae9deSAndroid Build Coastguard Worker 
259*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
260*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
261*3c7ae9deSAndroid Build Coastguard Worker 
262*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_ecs_options options;
263*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(options);
264*3c7ae9deSAndroid Build Coastguard Worker     options.bootstrap = (struct aws_client_bootstrap *)bootstrapHandle;
265*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_callback = s_on_shutdown_complete;
266*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_user_data = callback_data;
267*3c7ae9deSAndroid Build Coastguard Worker     options.tls_ctx = (struct aws_tls_ctx *)tls_context_handle;
268*3c7ae9deSAndroid Build Coastguard Worker 
269*3c7ae9deSAndroid Build Coastguard Worker     if (host) {
270*3c7ae9deSAndroid Build Coastguard Worker         options.host = aws_jni_byte_cursor_from_jbyteArray_acquire(env, host);
271*3c7ae9deSAndroid Build Coastguard Worker     }
272*3c7ae9deSAndroid Build Coastguard Worker 
273*3c7ae9deSAndroid Build Coastguard Worker     if (path_and_query) {
274*3c7ae9deSAndroid Build Coastguard Worker         options.path_and_query = aws_jni_byte_cursor_from_jbyteArray_acquire(env, path_and_query);
275*3c7ae9deSAndroid Build Coastguard Worker     }
276*3c7ae9deSAndroid Build Coastguard Worker 
277*3c7ae9deSAndroid Build Coastguard Worker     if (auth_token) {
278*3c7ae9deSAndroid Build Coastguard Worker         options.auth_token = aws_jni_byte_cursor_from_jbyteArray_acquire(env, auth_token);
279*3c7ae9deSAndroid Build Coastguard Worker     }
280*3c7ae9deSAndroid Build Coastguard Worker 
281*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = aws_credentials_provider_new_ecs(allocator, &options);
282*3c7ae9deSAndroid Build Coastguard Worker     if (provider == NULL) {
283*3c7ae9deSAndroid Build Coastguard Worker         s_callback_data_clean_up(env, allocator, callback_data);
284*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create ECS credentials provider");
285*3c7ae9deSAndroid Build Coastguard Worker     } else {
286*3c7ae9deSAndroid Build Coastguard Worker         callback_data->provider = provider;
287*3c7ae9deSAndroid Build Coastguard Worker     }
288*3c7ae9deSAndroid Build Coastguard Worker 
289*3c7ae9deSAndroid Build Coastguard Worker     if (host) {
290*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, host, options.host);
291*3c7ae9deSAndroid Build Coastguard Worker     }
292*3c7ae9deSAndroid Build Coastguard Worker 
293*3c7ae9deSAndroid Build Coastguard Worker     if (path_and_query) {
294*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, path_and_query, options.path_and_query);
295*3c7ae9deSAndroid Build Coastguard Worker     }
296*3c7ae9deSAndroid Build Coastguard Worker 
297*3c7ae9deSAndroid Build Coastguard Worker     if (auth_token) {
298*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, auth_token, options.auth_token);
299*3c7ae9deSAndroid Build Coastguard Worker     }
300*3c7ae9deSAndroid Build Coastguard Worker 
301*3c7ae9deSAndroid Build Coastguard Worker     return (jlong)provider;
302*3c7ae9deSAndroid Build Coastguard Worker }
303*3c7ae9deSAndroid Build Coastguard Worker 
304*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jlong JNICALL
Java_software_amazon_awssdk_crt_auth_credentials_StsCredentialsProvider_stsCredentialsProviderNew(JNIEnv * env,jclass jni_class,jobject java_crt_credentials_provider,jlong bootstrapHandle,jlong tls_context_handle,jlong creds_provider,jbyteArray role_arn,jbyteArray session_name,jlong duration_seconds)305*3c7ae9deSAndroid Build Coastguard Worker     Java_software_amazon_awssdk_crt_auth_credentials_StsCredentialsProvider_stsCredentialsProviderNew(
306*3c7ae9deSAndroid Build Coastguard Worker         JNIEnv *env,
307*3c7ae9deSAndroid Build Coastguard Worker         jclass jni_class,
308*3c7ae9deSAndroid Build Coastguard Worker         jobject java_crt_credentials_provider,
309*3c7ae9deSAndroid Build Coastguard Worker         jlong bootstrapHandle,
310*3c7ae9deSAndroid Build Coastguard Worker         jlong tls_context_handle,
311*3c7ae9deSAndroid Build Coastguard Worker         jlong creds_provider,
312*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray role_arn,
313*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray session_name,
314*3c7ae9deSAndroid Build Coastguard Worker         jlong duration_seconds) {
315*3c7ae9deSAndroid Build Coastguard Worker 
316*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
317*3c7ae9deSAndroid Build Coastguard Worker     (void)env;
318*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
319*3c7ae9deSAndroid Build Coastguard Worker 
320*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
321*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data =
322*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_callback_data));
323*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewWeakGlobalRef(env, java_crt_credentials_provider);
324*3c7ae9deSAndroid Build Coastguard Worker 
325*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
326*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
327*3c7ae9deSAndroid Build Coastguard Worker 
328*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_sts_options options;
329*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(options);
330*3c7ae9deSAndroid Build Coastguard Worker     options.bootstrap = (struct aws_client_bootstrap *)bootstrapHandle;
331*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_callback = s_on_shutdown_complete;
332*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_user_data = callback_data;
333*3c7ae9deSAndroid Build Coastguard Worker     options.tls_ctx = (struct aws_tls_ctx *)tls_context_handle;
334*3c7ae9deSAndroid Build Coastguard Worker 
335*3c7ae9deSAndroid Build Coastguard Worker     options.creds_provider = (struct aws_credentials_provider *)creds_provider;
336*3c7ae9deSAndroid Build Coastguard Worker 
337*3c7ae9deSAndroid Build Coastguard Worker     if (role_arn) {
338*3c7ae9deSAndroid Build Coastguard Worker         options.role_arn = aws_jni_byte_cursor_from_jbyteArray_acquire(env, role_arn);
339*3c7ae9deSAndroid Build Coastguard Worker     }
340*3c7ae9deSAndroid Build Coastguard Worker 
341*3c7ae9deSAndroid Build Coastguard Worker     if (session_name) {
342*3c7ae9deSAndroid Build Coastguard Worker         options.session_name = aws_jni_byte_cursor_from_jbyteArray_acquire(env, session_name);
343*3c7ae9deSAndroid Build Coastguard Worker     }
344*3c7ae9deSAndroid Build Coastguard Worker 
345*3c7ae9deSAndroid Build Coastguard Worker     options.duration_seconds =
346*3c7ae9deSAndroid Build Coastguard Worker         (uint16_t)aws_timestamp_convert(duration_seconds, AWS_TIMESTAMP_SECS, AWS_TIMESTAMP_SECS, NULL);
347*3c7ae9deSAndroid Build Coastguard Worker 
348*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = aws_credentials_provider_new_sts(allocator, &options);
349*3c7ae9deSAndroid Build Coastguard Worker     if (provider == NULL) {
350*3c7ae9deSAndroid Build Coastguard Worker         s_callback_data_clean_up(env, allocator, callback_data);
351*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create STS credentials provider");
352*3c7ae9deSAndroid Build Coastguard Worker     } else {
353*3c7ae9deSAndroid Build Coastguard Worker         callback_data->provider = provider;
354*3c7ae9deSAndroid Build Coastguard Worker     }
355*3c7ae9deSAndroid Build Coastguard Worker 
356*3c7ae9deSAndroid Build Coastguard Worker     if (role_arn) {
357*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, role_arn, options.role_arn);
358*3c7ae9deSAndroid Build Coastguard Worker     }
359*3c7ae9deSAndroid Build Coastguard Worker 
360*3c7ae9deSAndroid Build Coastguard Worker     if (session_name) {
361*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, session_name, options.session_name);
362*3c7ae9deSAndroid Build Coastguard Worker     }
363*3c7ae9deSAndroid Build Coastguard Worker 
364*3c7ae9deSAndroid Build Coastguard Worker     return (jlong)provider;
365*3c7ae9deSAndroid Build Coastguard Worker }
366*3c7ae9deSAndroid Build Coastguard Worker 
367*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jlong JNICALL
Java_software_amazon_awssdk_crt_auth_credentials_StsWebIdentityCredentialsProvider_stsWebIdentityCredentialsProviderNew(JNIEnv * env,jclass jni_class,jobject java_crt_credentials_provider,jlong bootstrapHandle,jlong tls_context_handle)368*3c7ae9deSAndroid Build Coastguard Worker     Java_software_amazon_awssdk_crt_auth_credentials_StsWebIdentityCredentialsProvider_stsWebIdentityCredentialsProviderNew(
369*3c7ae9deSAndroid Build Coastguard Worker         JNIEnv *env,
370*3c7ae9deSAndroid Build Coastguard Worker         jclass jni_class,
371*3c7ae9deSAndroid Build Coastguard Worker         jobject java_crt_credentials_provider,
372*3c7ae9deSAndroid Build Coastguard Worker         jlong bootstrapHandle,
373*3c7ae9deSAndroid Build Coastguard Worker         jlong tls_context_handle) {
374*3c7ae9deSAndroid Build Coastguard Worker 
375*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
376*3c7ae9deSAndroid Build Coastguard Worker     (void)env;
377*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
378*3c7ae9deSAndroid Build Coastguard Worker 
379*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
380*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data =
381*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_callback_data));
382*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewWeakGlobalRef(env, java_crt_credentials_provider);
383*3c7ae9deSAndroid Build Coastguard Worker 
384*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
385*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
386*3c7ae9deSAndroid Build Coastguard Worker 
387*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_sts_web_identity_options options;
388*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(options);
389*3c7ae9deSAndroid Build Coastguard Worker     options.bootstrap = (struct aws_client_bootstrap *)bootstrapHandle;
390*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_callback = s_on_shutdown_complete;
391*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_user_data = callback_data;
392*3c7ae9deSAndroid Build Coastguard Worker     options.tls_ctx = (struct aws_tls_ctx *)tls_context_handle;
393*3c7ae9deSAndroid Build Coastguard Worker 
394*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = aws_credentials_provider_new_sts_web_identity(allocator, &options);
395*3c7ae9deSAndroid Build Coastguard Worker     if (provider == NULL) {
396*3c7ae9deSAndroid Build Coastguard Worker         s_callback_data_clean_up(env, allocator, callback_data);
397*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create STS web identity credentials provider");
398*3c7ae9deSAndroid Build Coastguard Worker     } else {
399*3c7ae9deSAndroid Build Coastguard Worker         callback_data->provider = provider;
400*3c7ae9deSAndroid Build Coastguard Worker     }
401*3c7ae9deSAndroid Build Coastguard Worker 
402*3c7ae9deSAndroid Build Coastguard Worker     return (jlong)provider;
403*3c7ae9deSAndroid Build Coastguard Worker }
404*3c7ae9deSAndroid Build Coastguard Worker 
405*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jlong JNICALL
Java_software_amazon_awssdk_crt_auth_credentials_X509CredentialsProvider_x509CredentialsProviderNew(JNIEnv * env,jclass jni_class,jobject java_crt_credentials_provider,jlong bootstrap_handle,jlong tls_context_handle,jbyteArray thing_name,jbyteArray role_alias,jbyteArray endpoint,jint proxy_connection_type,jbyteArray jni_proxy_host,jint jni_proxy_port,jlong jni_proxy_tls_context,jint jni_proxy_authorization_type,jbyteArray jni_proxy_authorization_username,jbyteArray jni_proxy_authorization_password)406*3c7ae9deSAndroid Build Coastguard Worker     Java_software_amazon_awssdk_crt_auth_credentials_X509CredentialsProvider_x509CredentialsProviderNew(
407*3c7ae9deSAndroid Build Coastguard Worker         JNIEnv *env,
408*3c7ae9deSAndroid Build Coastguard Worker         jclass jni_class,
409*3c7ae9deSAndroid Build Coastguard Worker         jobject java_crt_credentials_provider,
410*3c7ae9deSAndroid Build Coastguard Worker         jlong bootstrap_handle,
411*3c7ae9deSAndroid Build Coastguard Worker         jlong tls_context_handle,
412*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray thing_name,
413*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray role_alias,
414*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray endpoint,
415*3c7ae9deSAndroid Build Coastguard Worker         jint proxy_connection_type,
416*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray jni_proxy_host,
417*3c7ae9deSAndroid Build Coastguard Worker         jint jni_proxy_port,
418*3c7ae9deSAndroid Build Coastguard Worker         jlong jni_proxy_tls_context,
419*3c7ae9deSAndroid Build Coastguard Worker         jint jni_proxy_authorization_type,
420*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray jni_proxy_authorization_username,
421*3c7ae9deSAndroid Build Coastguard Worker         jbyteArray jni_proxy_authorization_password) {
422*3c7ae9deSAndroid Build Coastguard Worker 
423*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
424*3c7ae9deSAndroid Build Coastguard Worker     (void)env;
425*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
426*3c7ae9deSAndroid Build Coastguard Worker 
427*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
428*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data =
429*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_callback_data));
430*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewWeakGlobalRef(env, java_crt_credentials_provider);
431*3c7ae9deSAndroid Build Coastguard Worker 
432*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
433*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
434*3c7ae9deSAndroid Build Coastguard Worker 
435*3c7ae9deSAndroid Build Coastguard Worker     struct aws_tls_connection_options tls_connection_options;
436*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(tls_connection_options);
437*3c7ae9deSAndroid Build Coastguard Worker     aws_tls_connection_options_init_from_ctx(&tls_connection_options, (struct aws_tls_ctx *)tls_context_handle);
438*3c7ae9deSAndroid Build Coastguard Worker 
439*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_x509_options options;
440*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(options);
441*3c7ae9deSAndroid Build Coastguard Worker     options.bootstrap = (struct aws_client_bootstrap *)bootstrap_handle;
442*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_callback = s_on_shutdown_complete;
443*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_user_data = callback_data;
444*3c7ae9deSAndroid Build Coastguard Worker     options.tls_connection_options = &tls_connection_options;
445*3c7ae9deSAndroid Build Coastguard Worker     options.thing_name = aws_jni_byte_cursor_from_jbyteArray_acquire(env, thing_name);
446*3c7ae9deSAndroid Build Coastguard Worker     options.role_alias = aws_jni_byte_cursor_from_jbyteArray_acquire(env, role_alias);
447*3c7ae9deSAndroid Build Coastguard Worker     options.endpoint = aws_jni_byte_cursor_from_jbyteArray_acquire(env, endpoint);
448*3c7ae9deSAndroid Build Coastguard Worker 
449*3c7ae9deSAndroid Build Coastguard Worker     struct aws_tls_connection_options proxy_tls_connection_options;
450*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(proxy_tls_connection_options);
451*3c7ae9deSAndroid Build Coastguard Worker     struct aws_http_proxy_options proxy_options;
452*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(proxy_options);
453*3c7ae9deSAndroid Build Coastguard Worker 
454*3c7ae9deSAndroid Build Coastguard Worker     aws_http_proxy_options_jni_init(
455*3c7ae9deSAndroid Build Coastguard Worker         env,
456*3c7ae9deSAndroid Build Coastguard Worker         &proxy_options,
457*3c7ae9deSAndroid Build Coastguard Worker         proxy_connection_type,
458*3c7ae9deSAndroid Build Coastguard Worker         &proxy_tls_connection_options,
459*3c7ae9deSAndroid Build Coastguard Worker         jni_proxy_host,
460*3c7ae9deSAndroid Build Coastguard Worker         jni_proxy_port,
461*3c7ae9deSAndroid Build Coastguard Worker         jni_proxy_authorization_username,
462*3c7ae9deSAndroid Build Coastguard Worker         jni_proxy_authorization_password,
463*3c7ae9deSAndroid Build Coastguard Worker         jni_proxy_authorization_type,
464*3c7ae9deSAndroid Build Coastguard Worker         (struct aws_tls_ctx *)jni_proxy_tls_context);
465*3c7ae9deSAndroid Build Coastguard Worker 
466*3c7ae9deSAndroid Build Coastguard Worker     if (jni_proxy_host != NULL) {
467*3c7ae9deSAndroid Build Coastguard Worker         options.proxy_options = &proxy_options;
468*3c7ae9deSAndroid Build Coastguard Worker     }
469*3c7ae9deSAndroid Build Coastguard Worker 
470*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = aws_credentials_provider_new_x509(allocator, &options);
471*3c7ae9deSAndroid Build Coastguard Worker     if (provider == NULL) {
472*3c7ae9deSAndroid Build Coastguard Worker         s_callback_data_clean_up(env, allocator, callback_data);
473*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create X509 credentials provider");
474*3c7ae9deSAndroid Build Coastguard Worker     } else {
475*3c7ae9deSAndroid Build Coastguard Worker         callback_data->provider = provider;
476*3c7ae9deSAndroid Build Coastguard Worker     }
477*3c7ae9deSAndroid Build Coastguard Worker 
478*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_byte_cursor_from_jbyteArray_release(env, thing_name, options.thing_name);
479*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_byte_cursor_from_jbyteArray_release(env, role_alias, options.role_alias);
480*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_byte_cursor_from_jbyteArray_release(env, endpoint, options.endpoint);
481*3c7ae9deSAndroid Build Coastguard Worker 
482*3c7ae9deSAndroid Build Coastguard Worker     aws_http_proxy_options_jni_clean_up(
483*3c7ae9deSAndroid Build Coastguard Worker         env, &proxy_options, jni_proxy_host, jni_proxy_authorization_username, jni_proxy_authorization_password);
484*3c7ae9deSAndroid Build Coastguard Worker 
485*3c7ae9deSAndroid Build Coastguard Worker     aws_tls_connection_options_clean_up(&tls_connection_options);
486*3c7ae9deSAndroid Build Coastguard Worker 
487*3c7ae9deSAndroid Build Coastguard Worker     return (jlong)provider;
488*3c7ae9deSAndroid Build Coastguard Worker }
489*3c7ae9deSAndroid Build Coastguard Worker 
490*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jlong JNICALL
Java_software_amazon_awssdk_crt_auth_credentials_CachedCredentialsProvider_cachedCredentialsProviderNew(JNIEnv * env,jclass jni_class,jobject java_crt_credentials_provider,jint cached_duration_in_seconds,jlong native_cached_provider)491*3c7ae9deSAndroid Build Coastguard Worker     Java_software_amazon_awssdk_crt_auth_credentials_CachedCredentialsProvider_cachedCredentialsProviderNew(
492*3c7ae9deSAndroid Build Coastguard Worker         JNIEnv *env,
493*3c7ae9deSAndroid Build Coastguard Worker         jclass jni_class,
494*3c7ae9deSAndroid Build Coastguard Worker         jobject java_crt_credentials_provider,
495*3c7ae9deSAndroid Build Coastguard Worker         jint cached_duration_in_seconds,
496*3c7ae9deSAndroid Build Coastguard Worker         jlong native_cached_provider) {
497*3c7ae9deSAndroid Build Coastguard Worker 
498*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
499*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
500*3c7ae9deSAndroid Build Coastguard Worker 
501*3c7ae9deSAndroid Build Coastguard Worker     if (native_cached_provider == 0) {
502*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(
503*3c7ae9deSAndroid Build Coastguard Worker             env, "CachedCredentialsProviderials.cachedCredentialsProviderNew: cached provider is null");
504*3c7ae9deSAndroid Build Coastguard Worker         return 0;
505*3c7ae9deSAndroid Build Coastguard Worker     }
506*3c7ae9deSAndroid Build Coastguard Worker 
507*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
508*3c7ae9deSAndroid Build Coastguard Worker 
509*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data =
510*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_callback_data));
511*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewWeakGlobalRef(env, java_crt_credentials_provider);
512*3c7ae9deSAndroid Build Coastguard Worker 
513*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
514*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
515*3c7ae9deSAndroid Build Coastguard Worker 
516*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_cached_options options;
517*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(options);
518*3c7ae9deSAndroid Build Coastguard Worker     options.refresh_time_in_milliseconds =
519*3c7ae9deSAndroid Build Coastguard Worker         aws_timestamp_convert(cached_duration_in_seconds, AWS_TIMESTAMP_SECS, AWS_TIMESTAMP_MILLIS, NULL);
520*3c7ae9deSAndroid Build Coastguard Worker     options.source = (struct aws_credentials_provider *)native_cached_provider;
521*3c7ae9deSAndroid Build Coastguard Worker 
522*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_callback = s_on_shutdown_complete;
523*3c7ae9deSAndroid Build Coastguard Worker     options.shutdown_options.shutdown_user_data = callback_data;
524*3c7ae9deSAndroid Build Coastguard Worker 
525*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = aws_credentials_provider_new_cached(allocator, &options);
526*3c7ae9deSAndroid Build Coastguard Worker     if (provider == NULL) {
527*3c7ae9deSAndroid Build Coastguard Worker         s_callback_data_clean_up(env, allocator, callback_data);
528*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create cached credentials provider");
529*3c7ae9deSAndroid Build Coastguard Worker     } else {
530*3c7ae9deSAndroid Build Coastguard Worker         callback_data->provider = provider;
531*3c7ae9deSAndroid Build Coastguard Worker     }
532*3c7ae9deSAndroid Build Coastguard Worker 
533*3c7ae9deSAndroid Build Coastguard Worker     return (jlong)provider;
534*3c7ae9deSAndroid Build Coastguard Worker }
535*3c7ae9deSAndroid Build Coastguard Worker 
s_credentials_provider_delegate_get_credentials(void * delegate_user_data,aws_on_get_credentials_callback_fn callback,void * callback_user_data)536*3c7ae9deSAndroid Build Coastguard Worker static int s_credentials_provider_delegate_get_credentials(
537*3c7ae9deSAndroid Build Coastguard Worker     void *delegate_user_data,
538*3c7ae9deSAndroid Build Coastguard Worker     aws_on_get_credentials_callback_fn callback,
539*3c7ae9deSAndroid Build Coastguard Worker     void *callback_user_data) {
540*3c7ae9deSAndroid Build Coastguard Worker 
541*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data = delegate_user_data;
542*3c7ae9deSAndroid Build Coastguard Worker 
543*3c7ae9deSAndroid Build Coastguard Worker     int return_value = AWS_OP_ERR;
544*3c7ae9deSAndroid Build Coastguard Worker 
545*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV ACQUIRE **********/
546*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env = aws_jni_acquire_thread_env(callback_data->jvm);
547*3c7ae9deSAndroid Build Coastguard Worker     if (env == NULL) {
548*3c7ae9deSAndroid Build Coastguard Worker         /* If we can't get an environment, then the JVM is probably shutting down.  Don't crash. */
549*3c7ae9deSAndroid Build Coastguard Worker         return AWS_OP_ERR;
550*3c7ae9deSAndroid Build Coastguard Worker     }
551*3c7ae9deSAndroid Build Coastguard Worker 
552*3c7ae9deSAndroid Build Coastguard Worker     // Fetch credentials from java
553*3c7ae9deSAndroid Build Coastguard Worker     jobject java_credentials = (*env)->CallObjectMethod(
554*3c7ae9deSAndroid Build Coastguard Worker         env,
555*3c7ae9deSAndroid Build Coastguard Worker         callback_data->jni_delegate_credential_handler,
556*3c7ae9deSAndroid Build Coastguard Worker         credentials_handler_properties.on_handler_get_credentials_method_id);
557*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
558*3c7ae9deSAndroid Build Coastguard Worker         aws_raise_error(AWS_ERROR_HTTP_CALLBACK_FAILURE);
559*3c7ae9deSAndroid Build Coastguard Worker         goto done;
560*3c7ae9deSAndroid Build Coastguard Worker     }
561*3c7ae9deSAndroid Build Coastguard Worker 
562*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials *native_credentials = aws_credentials_new_from_java_credentials(env, java_credentials);
563*3c7ae9deSAndroid Build Coastguard Worker     if (!native_credentials) {
564*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create native credentials");
565*3c7ae9deSAndroid Build Coastguard Worker         // error has been raised from creating function
566*3c7ae9deSAndroid Build Coastguard Worker         goto done;
567*3c7ae9deSAndroid Build Coastguard Worker     }
568*3c7ae9deSAndroid Build Coastguard Worker     callback(native_credentials, AWS_ERROR_SUCCESS, callback_user_data);
569*3c7ae9deSAndroid Build Coastguard Worker     aws_credentials_release(native_credentials);
570*3c7ae9deSAndroid Build Coastguard Worker 
571*3c7ae9deSAndroid Build Coastguard Worker     return_value = AWS_OP_SUCCESS;
572*3c7ae9deSAndroid Build Coastguard Worker 
573*3c7ae9deSAndroid Build Coastguard Worker done:
574*3c7ae9deSAndroid Build Coastguard Worker     (*env)->DeleteLocalRef(env, java_credentials);
575*3c7ae9deSAndroid Build Coastguard Worker 
576*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_release_thread_env(callback_data->jvm, env);
577*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV RELEASE **********/
578*3c7ae9deSAndroid Build Coastguard Worker 
579*3c7ae9deSAndroid Build Coastguard Worker     return return_value;
580*3c7ae9deSAndroid Build Coastguard Worker }
581*3c7ae9deSAndroid Build Coastguard Worker 
582*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jlong JNICALL
Java_software_amazon_awssdk_crt_auth_credentials_DelegateCredentialsProvider_delegateCredentialsProviderNew(JNIEnv * env,jclass jni_class,jobject java_crt_credentials_provider,jobject jni_delegate_credential_handler)583*3c7ae9deSAndroid Build Coastguard Worker     Java_software_amazon_awssdk_crt_auth_credentials_DelegateCredentialsProvider_delegateCredentialsProviderNew(
584*3c7ae9deSAndroid Build Coastguard Worker         JNIEnv *env,
585*3c7ae9deSAndroid Build Coastguard Worker         jclass jni_class,
586*3c7ae9deSAndroid Build Coastguard Worker         jobject java_crt_credentials_provider,
587*3c7ae9deSAndroid Build Coastguard Worker         jobject jni_delegate_credential_handler) {
588*3c7ae9deSAndroid Build Coastguard Worker 
589*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
590*3c7ae9deSAndroid Build Coastguard Worker     (void)env;
591*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
592*3c7ae9deSAndroid Build Coastguard Worker 
593*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
594*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data =
595*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_callback_data));
596*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewWeakGlobalRef(env, java_crt_credentials_provider);
597*3c7ae9deSAndroid Build Coastguard Worker     callback_data->jni_delegate_credential_handler = (*env)->NewGlobalRef(env, jni_delegate_credential_handler);
598*3c7ae9deSAndroid Build Coastguard Worker 
599*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_delegate_options options = {
600*3c7ae9deSAndroid Build Coastguard Worker         .get_credentials = s_credentials_provider_delegate_get_credentials,
601*3c7ae9deSAndroid Build Coastguard Worker         .delegate_user_data = callback_data,
602*3c7ae9deSAndroid Build Coastguard Worker         .shutdown_options =
603*3c7ae9deSAndroid Build Coastguard Worker             {
604*3c7ae9deSAndroid Build Coastguard Worker                 .shutdown_callback = s_on_shutdown_complete,
605*3c7ae9deSAndroid Build Coastguard Worker                 .shutdown_user_data = callback_data,
606*3c7ae9deSAndroid Build Coastguard Worker             },
607*3c7ae9deSAndroid Build Coastguard Worker     };
608*3c7ae9deSAndroid Build Coastguard Worker 
609*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
610*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
611*3c7ae9deSAndroid Build Coastguard Worker 
612*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = aws_credentials_provider_new_delegate(allocator, &options);
613*3c7ae9deSAndroid Build Coastguard Worker     if (provider == NULL) {
614*3c7ae9deSAndroid Build Coastguard Worker         s_callback_data_clean_up(env, allocator, callback_data);
615*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create delegate credentials provider");
616*3c7ae9deSAndroid Build Coastguard Worker     } else {
617*3c7ae9deSAndroid Build Coastguard Worker         callback_data->provider = provider;
618*3c7ae9deSAndroid Build Coastguard Worker     }
619*3c7ae9deSAndroid Build Coastguard Worker 
620*3c7ae9deSAndroid Build Coastguard Worker     return (jlong)provider;
621*3c7ae9deSAndroid Build Coastguard Worker }
622*3c7ae9deSAndroid Build Coastguard Worker 
s_fill_in_logins(struct aws_array_list * logins,struct aws_byte_cursor marshalled_logins)623*3c7ae9deSAndroid Build Coastguard Worker static int s_fill_in_logins(struct aws_array_list *logins, struct aws_byte_cursor marshalled_logins) {
624*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor logins_cursor = marshalled_logins;
625*3c7ae9deSAndroid Build Coastguard Worker     uint32_t field_len = 0;
626*3c7ae9deSAndroid Build Coastguard Worker 
627*3c7ae9deSAndroid Build Coastguard Worker     while (logins_cursor.len > 0) {
628*3c7ae9deSAndroid Build Coastguard Worker         if (!aws_byte_cursor_read_be32(&logins_cursor, &field_len)) {
629*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
630*3c7ae9deSAndroid Build Coastguard Worker         }
631*3c7ae9deSAndroid Build Coastguard Worker 
632*3c7ae9deSAndroid Build Coastguard Worker         struct aws_byte_cursor identity_provider_name = aws_byte_cursor_advance(&logins_cursor, field_len);
633*3c7ae9deSAndroid Build Coastguard Worker 
634*3c7ae9deSAndroid Build Coastguard Worker         if (!aws_byte_cursor_read_be32(&logins_cursor, &field_len)) {
635*3c7ae9deSAndroid Build Coastguard Worker             return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
636*3c7ae9deSAndroid Build Coastguard Worker         }
637*3c7ae9deSAndroid Build Coastguard Worker 
638*3c7ae9deSAndroid Build Coastguard Worker         struct aws_byte_cursor identity_provider_token = aws_byte_cursor_advance(&logins_cursor, field_len);
639*3c7ae9deSAndroid Build Coastguard Worker 
640*3c7ae9deSAndroid Build Coastguard Worker         struct aws_cognito_identity_provider_token_pair login_pair = {
641*3c7ae9deSAndroid Build Coastguard Worker             .identity_provider_name = identity_provider_name,
642*3c7ae9deSAndroid Build Coastguard Worker             .identity_provider_token = identity_provider_token,
643*3c7ae9deSAndroid Build Coastguard Worker         };
644*3c7ae9deSAndroid Build Coastguard Worker 
645*3c7ae9deSAndroid Build Coastguard Worker         aws_array_list_push_back(logins, &login_pair);
646*3c7ae9deSAndroid Build Coastguard Worker     }
647*3c7ae9deSAndroid Build Coastguard Worker 
648*3c7ae9deSAndroid Build Coastguard Worker     return AWS_OP_SUCCESS;
649*3c7ae9deSAndroid Build Coastguard Worker }
650*3c7ae9deSAndroid Build Coastguard Worker 
651*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT
Java_software_amazon_awssdk_crt_auth_credentials_CognitoCredentialsProvider_cognitoCredentialsProviderNew(JNIEnv * env,jclass jni_class,jobject crt_credentials_provider,jlong native_bootstrap,jlong native_tls_context,jstring endpoint,jstring identity,jstring custom_role_arn,jbyteArray marshalled_logins,jint proxy_connection_type,jbyteArray proxy_host,jint proxy_port,jlong native_proxy_tls_context,jint proxy_authorization_type,jbyteArray proxy_authorization_username,jbyteArray proxy_authorization_password)652*3c7ae9deSAndroid Build Coastguard Worker jlong JNICALL Java_software_amazon_awssdk_crt_auth_credentials_CognitoCredentialsProvider_cognitoCredentialsProviderNew(
653*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
654*3c7ae9deSAndroid Build Coastguard Worker     jclass jni_class,
655*3c7ae9deSAndroid Build Coastguard Worker     jobject crt_credentials_provider,
656*3c7ae9deSAndroid Build Coastguard Worker     jlong native_bootstrap,
657*3c7ae9deSAndroid Build Coastguard Worker     jlong native_tls_context,
658*3c7ae9deSAndroid Build Coastguard Worker     jstring endpoint,
659*3c7ae9deSAndroid Build Coastguard Worker     jstring identity,
660*3c7ae9deSAndroid Build Coastguard Worker     jstring custom_role_arn,
661*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray marshalled_logins,
662*3c7ae9deSAndroid Build Coastguard Worker     jint proxy_connection_type,
663*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray proxy_host,
664*3c7ae9deSAndroid Build Coastguard Worker     jint proxy_port,
665*3c7ae9deSAndroid Build Coastguard Worker     jlong native_proxy_tls_context,
666*3c7ae9deSAndroid Build Coastguard Worker     jint proxy_authorization_type,
667*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray proxy_authorization_username,
668*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray proxy_authorization_password) {
669*3c7ae9deSAndroid Build Coastguard Worker 
670*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
671*3c7ae9deSAndroid Build Coastguard Worker     (void)env;
672*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
673*3c7ae9deSAndroid Build Coastguard Worker 
674*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
675*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = NULL;
676*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_callback_data *callback_data = NULL;
677*3c7ae9deSAndroid Build Coastguard Worker 
678*3c7ae9deSAndroid Build Coastguard Worker     struct aws_tls_connection_options proxy_tls_connection_options;
679*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(proxy_tls_connection_options);
680*3c7ae9deSAndroid Build Coastguard Worker     struct aws_http_proxy_options proxy_options;
681*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(proxy_options);
682*3c7ae9deSAndroid Build Coastguard Worker 
683*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor endpoint_cursor;
684*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(endpoint_cursor);
685*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor identity_cursor;
686*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(identity_cursor);
687*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor custom_role_arn_cursor;
688*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(custom_role_arn_cursor);
689*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor logins_cursor;
690*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(logins_cursor);
691*3c7ae9deSAndroid Build Coastguard Worker 
692*3c7ae9deSAndroid Build Coastguard Worker     struct aws_array_list logins;
693*3c7ae9deSAndroid Build Coastguard Worker     aws_array_list_init_dynamic(&logins, allocator, 0, sizeof(struct aws_cognito_identity_provider_token_pair));
694*3c7ae9deSAndroid Build Coastguard Worker 
695*3c7ae9deSAndroid Build Coastguard Worker     if (endpoint == NULL || identity == NULL) {
696*3c7ae9deSAndroid Build Coastguard Worker         goto done;
697*3c7ae9deSAndroid Build Coastguard Worker     }
698*3c7ae9deSAndroid Build Coastguard Worker 
699*3c7ae9deSAndroid Build Coastguard Worker     endpoint_cursor = aws_jni_byte_cursor_from_jstring_acquire(env, endpoint);
700*3c7ae9deSAndroid Build Coastguard Worker     identity_cursor = aws_jni_byte_cursor_from_jstring_acquire(env, identity);
701*3c7ae9deSAndroid Build Coastguard Worker 
702*3c7ae9deSAndroid Build Coastguard Worker     callback_data = aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_callback_data));
703*3c7ae9deSAndroid Build Coastguard Worker 
704*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
705*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
706*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewWeakGlobalRef(env, crt_credentials_provider);
707*3c7ae9deSAndroid Build Coastguard Worker 
708*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_cognito_options options = {
709*3c7ae9deSAndroid Build Coastguard Worker         .shutdown_options =
710*3c7ae9deSAndroid Build Coastguard Worker             {
711*3c7ae9deSAndroid Build Coastguard Worker                 .shutdown_callback = s_on_shutdown_complete,
712*3c7ae9deSAndroid Build Coastguard Worker                 .shutdown_user_data = callback_data,
713*3c7ae9deSAndroid Build Coastguard Worker             },
714*3c7ae9deSAndroid Build Coastguard Worker         .endpoint = endpoint_cursor,
715*3c7ae9deSAndroid Build Coastguard Worker         .identity = identity_cursor,
716*3c7ae9deSAndroid Build Coastguard Worker         .bootstrap = (void *)native_bootstrap,
717*3c7ae9deSAndroid Build Coastguard Worker         .tls_ctx = (void *)native_tls_context,
718*3c7ae9deSAndroid Build Coastguard Worker     };
719*3c7ae9deSAndroid Build Coastguard Worker 
720*3c7ae9deSAndroid Build Coastguard Worker     if (custom_role_arn != NULL) {
721*3c7ae9deSAndroid Build Coastguard Worker         custom_role_arn_cursor = aws_jni_byte_cursor_from_jstring_acquire(env, custom_role_arn);
722*3c7ae9deSAndroid Build Coastguard Worker         options.custom_role_arn = &custom_role_arn_cursor;
723*3c7ae9deSAndroid Build Coastguard Worker     }
724*3c7ae9deSAndroid Build Coastguard Worker 
725*3c7ae9deSAndroid Build Coastguard Worker     if (marshalled_logins != NULL) {
726*3c7ae9deSAndroid Build Coastguard Worker         logins_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, marshalled_logins);
727*3c7ae9deSAndroid Build Coastguard Worker         if (s_fill_in_logins(&logins, logins_cursor)) {
728*3c7ae9deSAndroid Build Coastguard Worker             goto done;
729*3c7ae9deSAndroid Build Coastguard Worker         }
730*3c7ae9deSAndroid Build Coastguard Worker 
731*3c7ae9deSAndroid Build Coastguard Worker         options.logins = logins.data;
732*3c7ae9deSAndroid Build Coastguard Worker         options.login_count = aws_array_list_length(&logins);
733*3c7ae9deSAndroid Build Coastguard Worker     }
734*3c7ae9deSAndroid Build Coastguard Worker 
735*3c7ae9deSAndroid Build Coastguard Worker     if (proxy_host != NULL) {
736*3c7ae9deSAndroid Build Coastguard Worker         aws_http_proxy_options_jni_init(
737*3c7ae9deSAndroid Build Coastguard Worker             env,
738*3c7ae9deSAndroid Build Coastguard Worker             &proxy_options,
739*3c7ae9deSAndroid Build Coastguard Worker             proxy_connection_type,
740*3c7ae9deSAndroid Build Coastguard Worker             &proxy_tls_connection_options,
741*3c7ae9deSAndroid Build Coastguard Worker             proxy_host,
742*3c7ae9deSAndroid Build Coastguard Worker             proxy_port,
743*3c7ae9deSAndroid Build Coastguard Worker             proxy_authorization_username,
744*3c7ae9deSAndroid Build Coastguard Worker             proxy_authorization_password,
745*3c7ae9deSAndroid Build Coastguard Worker             proxy_authorization_type,
746*3c7ae9deSAndroid Build Coastguard Worker             (struct aws_tls_ctx *)native_proxy_tls_context);
747*3c7ae9deSAndroid Build Coastguard Worker 
748*3c7ae9deSAndroid Build Coastguard Worker         options.http_proxy_options = &proxy_options;
749*3c7ae9deSAndroid Build Coastguard Worker     }
750*3c7ae9deSAndroid Build Coastguard Worker 
751*3c7ae9deSAndroid Build Coastguard Worker     provider = aws_credentials_provider_new_cognito(allocator, &options);
752*3c7ae9deSAndroid Build Coastguard Worker     if (provider != NULL) {
753*3c7ae9deSAndroid Build Coastguard Worker         callback_data->provider = provider;
754*3c7ae9deSAndroid Build Coastguard Worker     }
755*3c7ae9deSAndroid Build Coastguard Worker 
756*3c7ae9deSAndroid Build Coastguard Worker done:
757*3c7ae9deSAndroid Build Coastguard Worker 
758*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_byte_cursor_from_jstring_release(env, endpoint, endpoint_cursor);
759*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_byte_cursor_from_jstring_release(env, identity, identity_cursor);
760*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_byte_cursor_from_jstring_release(env, custom_role_arn, custom_role_arn_cursor);
761*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_byte_cursor_from_jbyteArray_release(env, marshalled_logins, logins_cursor);
762*3c7ae9deSAndroid Build Coastguard Worker 
763*3c7ae9deSAndroid Build Coastguard Worker     aws_http_proxy_options_jni_clean_up(
764*3c7ae9deSAndroid Build Coastguard Worker         env, &proxy_options, proxy_host, proxy_authorization_username, proxy_authorization_password);
765*3c7ae9deSAndroid Build Coastguard Worker 
766*3c7ae9deSAndroid Build Coastguard Worker     aws_array_list_clean_up(&logins);
767*3c7ae9deSAndroid Build Coastguard Worker 
768*3c7ae9deSAndroid Build Coastguard Worker     if (provider == NULL) {
769*3c7ae9deSAndroid Build Coastguard Worker         s_callback_data_clean_up(env, allocator, callback_data);
770*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create native cognito credentials provider");
771*3c7ae9deSAndroid Build Coastguard Worker     }
772*3c7ae9deSAndroid Build Coastguard Worker 
773*3c7ae9deSAndroid Build Coastguard Worker     return (jlong)provider;
774*3c7ae9deSAndroid Build Coastguard Worker }
775*3c7ae9deSAndroid Build Coastguard Worker 
776*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT
Java_software_amazon_awssdk_crt_auth_credentials_CredentialsProvider_credentialsProviderDestroy(JNIEnv * env,jclass jni_cp,jobject cp_object,jlong cp_addr)777*3c7ae9deSAndroid Build Coastguard Worker void JNICALL Java_software_amazon_awssdk_crt_auth_credentials_CredentialsProvider_credentialsProviderDestroy(
778*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
779*3c7ae9deSAndroid Build Coastguard Worker     jclass jni_cp,
780*3c7ae9deSAndroid Build Coastguard Worker     jobject cp_object,
781*3c7ae9deSAndroid Build Coastguard Worker     jlong cp_addr) {
782*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_cp;
783*3c7ae9deSAndroid Build Coastguard Worker     (void)cp_object;
784*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
785*3c7ae9deSAndroid Build Coastguard Worker 
786*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = (struct aws_credentials_provider *)cp_addr;
787*3c7ae9deSAndroid Build Coastguard Worker     if (!provider) {
788*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(
789*3c7ae9deSAndroid Build Coastguard Worker             env, "CredentialsProvider.credentialsProviderDestroy: instance should be non-null at destruction time");
790*3c7ae9deSAndroid Build Coastguard Worker         return;
791*3c7ae9deSAndroid Build Coastguard Worker     }
792*3c7ae9deSAndroid Build Coastguard Worker 
793*3c7ae9deSAndroid Build Coastguard Worker     aws_credentials_provider_release(provider);
794*3c7ae9deSAndroid Build Coastguard Worker }
795*3c7ae9deSAndroid Build Coastguard Worker 
796*3c7ae9deSAndroid Build Coastguard Worker struct aws_credentials_provider_get_credentials_callback_data {
797*3c7ae9deSAndroid Build Coastguard Worker     JavaVM *jvm;
798*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider;
799*3c7ae9deSAndroid Build Coastguard Worker     jobject java_crt_credentials_provider;
800*3c7ae9deSAndroid Build Coastguard Worker     jobject java_credentials_future;
801*3c7ae9deSAndroid Build Coastguard Worker };
802*3c7ae9deSAndroid Build Coastguard Worker 
s_cp_callback_data_clean_up(struct aws_credentials_provider_get_credentials_callback_data * callback_data,JNIEnv * env)803*3c7ae9deSAndroid Build Coastguard Worker static void s_cp_callback_data_clean_up(
804*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_get_credentials_callback_data *callback_data,
805*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env) {
806*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data == NULL || env == NULL) {
807*3c7ae9deSAndroid Build Coastguard Worker         return;
808*3c7ae9deSAndroid Build Coastguard Worker     }
809*3c7ae9deSAndroid Build Coastguard Worker 
810*3c7ae9deSAndroid Build Coastguard Worker     (*env)->DeleteGlobalRef(env, callback_data->java_crt_credentials_provider);
811*3c7ae9deSAndroid Build Coastguard Worker     (*env)->DeleteGlobalRef(env, callback_data->java_credentials_future);
812*3c7ae9deSAndroid Build Coastguard Worker 
813*3c7ae9deSAndroid Build Coastguard Worker     aws_credentials_provider_release(callback_data->provider);
814*3c7ae9deSAndroid Build Coastguard Worker 
815*3c7ae9deSAndroid Build Coastguard Worker     // We're done with this callback data, free it.
816*3c7ae9deSAndroid Build Coastguard Worker     aws_mem_release(aws_jni_get_allocator(), callback_data);
817*3c7ae9deSAndroid Build Coastguard Worker }
818*3c7ae9deSAndroid Build Coastguard Worker 
s_on_get_credentials_callback(struct aws_credentials * credentials,int error_code,void * user_data)819*3c7ae9deSAndroid Build Coastguard Worker static void s_on_get_credentials_callback(struct aws_credentials *credentials, int error_code, void *user_data) {
820*3c7ae9deSAndroid Build Coastguard Worker     (void)error_code;
821*3c7ae9deSAndroid Build Coastguard Worker 
822*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_get_credentials_callback_data *callback_data = user_data;
823*3c7ae9deSAndroid Build Coastguard Worker 
824*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV ACQUIRE **********/
825*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env = aws_jni_acquire_thread_env(callback_data->jvm);
826*3c7ae9deSAndroid Build Coastguard Worker     if (env == NULL) {
827*3c7ae9deSAndroid Build Coastguard Worker         /* If we can't get an environment, then the JVM is probably shutting down.  Don't crash. */
828*3c7ae9deSAndroid Build Coastguard Worker         return;
829*3c7ae9deSAndroid Build Coastguard Worker     }
830*3c7ae9deSAndroid Build Coastguard Worker 
831*3c7ae9deSAndroid Build Coastguard Worker     jobject java_credentials = NULL;
832*3c7ae9deSAndroid Build Coastguard Worker 
833*3c7ae9deSAndroid Build Coastguard Worker     if (credentials) {
834*3c7ae9deSAndroid Build Coastguard Worker         java_credentials = aws_java_credentials_from_native_new(env, credentials);
835*3c7ae9deSAndroid Build Coastguard Worker     }
836*3c7ae9deSAndroid Build Coastguard Worker 
837*3c7ae9deSAndroid Build Coastguard Worker     (*env)->CallVoidMethod(
838*3c7ae9deSAndroid Build Coastguard Worker         env,
839*3c7ae9deSAndroid Build Coastguard Worker         callback_data->java_crt_credentials_provider,
840*3c7ae9deSAndroid Build Coastguard Worker         credentials_provider_properties.on_get_credentials_complete_method_id,
841*3c7ae9deSAndroid Build Coastguard Worker         callback_data->java_credentials_future,
842*3c7ae9deSAndroid Build Coastguard Worker         java_credentials);
843*3c7ae9deSAndroid Build Coastguard Worker 
844*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(!aws_jni_check_and_clear_exception(env));
845*3c7ae9deSAndroid Build Coastguard Worker 
846*3c7ae9deSAndroid Build Coastguard Worker     if (java_credentials != NULL) {
847*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteLocalRef(env, java_credentials);
848*3c7ae9deSAndroid Build Coastguard Worker     }
849*3c7ae9deSAndroid Build Coastguard Worker 
850*3c7ae9deSAndroid Build Coastguard Worker     JavaVM *jvm = callback_data->jvm;
851*3c7ae9deSAndroid Build Coastguard Worker     s_cp_callback_data_clean_up(callback_data, env);
852*3c7ae9deSAndroid Build Coastguard Worker 
853*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_release_thread_env(jvm, env);
854*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV RELEASE **********/
855*3c7ae9deSAndroid Build Coastguard Worker }
856*3c7ae9deSAndroid Build Coastguard Worker 
857*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT
Java_software_amazon_awssdk_crt_auth_credentials_CredentialsProvider_credentialsProviderGetCredentials(JNIEnv * env,jclass jni_cp,jobject java_crt_credentials_provider,jobject java_credentials_future,jlong native_credentials_provider)858*3c7ae9deSAndroid Build Coastguard Worker void JNICALL Java_software_amazon_awssdk_crt_auth_credentials_CredentialsProvider_credentialsProviderGetCredentials(
859*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
860*3c7ae9deSAndroid Build Coastguard Worker     jclass jni_cp,
861*3c7ae9deSAndroid Build Coastguard Worker     jobject java_crt_credentials_provider,
862*3c7ae9deSAndroid Build Coastguard Worker     jobject java_credentials_future,
863*3c7ae9deSAndroid Build Coastguard Worker     jlong native_credentials_provider) {
864*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_cp;
865*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
866*3c7ae9deSAndroid Build Coastguard Worker 
867*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider *provider = (struct aws_credentials_provider *)native_credentials_provider;
868*3c7ae9deSAndroid Build Coastguard Worker     if (!provider) {
869*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(
870*3c7ae9deSAndroid Build Coastguard Worker             env, "CredentialsProvider.credentialsProviderGetCredentials: instance should be non-null");
871*3c7ae9deSAndroid Build Coastguard Worker         return;
872*3c7ae9deSAndroid Build Coastguard Worker     }
873*3c7ae9deSAndroid Build Coastguard Worker 
874*3c7ae9deSAndroid Build Coastguard Worker     if (java_crt_credentials_provider == NULL || java_credentials_future == NULL) {
875*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(
876*3c7ae9deSAndroid Build Coastguard Worker             env, "CredentialsProvider.credentialsProviderGetCredentials: called with null parameters");
877*3c7ae9deSAndroid Build Coastguard Worker         return;
878*3c7ae9deSAndroid Build Coastguard Worker     }
879*3c7ae9deSAndroid Build Coastguard Worker 
880*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
881*3c7ae9deSAndroid Build Coastguard Worker     struct aws_credentials_provider_get_credentials_callback_data *callback_data =
882*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct aws_credentials_provider_get_credentials_callback_data));
883*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_crt_credentials_provider = (*env)->NewGlobalRef(env, java_crt_credentials_provider);
884*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_credentials_future = (*env)->NewGlobalRef(env, java_credentials_future);
885*3c7ae9deSAndroid Build Coastguard Worker     callback_data->provider = provider;
886*3c7ae9deSAndroid Build Coastguard Worker 
887*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
888*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
889*3c7ae9deSAndroid Build Coastguard Worker 
890*3c7ae9deSAndroid Build Coastguard Worker     aws_credentials_provider_acquire(provider);
891*3c7ae9deSAndroid Build Coastguard Worker 
892*3c7ae9deSAndroid Build Coastguard Worker     if (aws_credentials_provider_get_credentials(provider, s_on_get_credentials_callback, callback_data)) {
893*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "CrtCredentialsProvider.credentialsProviderGetCredentials: call failure");
894*3c7ae9deSAndroid Build Coastguard Worker         /* callback will not be invoked on failure, clean up the resource here. */
895*3c7ae9deSAndroid Build Coastguard Worker         s_cp_callback_data_clean_up(callback_data, env);
896*3c7ae9deSAndroid Build Coastguard Worker     }
897*3c7ae9deSAndroid Build Coastguard Worker }
898*3c7ae9deSAndroid Build Coastguard Worker 
899*3c7ae9deSAndroid Build Coastguard Worker #if UINTPTR_MAX == 0xffffffff
900*3c7ae9deSAndroid Build Coastguard Worker #    if defined(_MSC_VER)
901*3c7ae9deSAndroid Build Coastguard Worker #        pragma warning(pop)
902*3c7ae9deSAndroid Build Coastguard Worker #    else
903*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic pop
904*3c7ae9deSAndroid Build Coastguard Worker #    endif
905*3c7ae9deSAndroid Build Coastguard Worker #endif
906