@@ -126,15 +126,17 @@ gss_result* server_principal_details(const char* service, const char* hostname)
126
126
return result;
127
127
}
128
128
129
- gss_result* authenticate_gss_client_init (const char * service, const char * principal, long int gss_flags, gss_OID mech_oid, gss_client_state* state)
129
+ gss_result* authenticate_gss_client_init (
130
+ const char * service, const char * principal, long int gss_flags,
131
+ gss_server_state* delegatestate, gss_OID mech_oid, gss_client_state* state
132
+ )
130
133
{
131
134
OM_uint32 maj_stat;
132
135
OM_uint32 min_stat;
133
136
gss_buffer_desc name_token = GSS_C_EMPTY_BUFFER;
134
137
gss_buffer_desc principal_token = GSS_C_EMPTY_BUFFER;
135
138
gss_result* ret = NULL ;
136
139
137
- gss_OID mech;
138
140
state->server_name = GSS_C_NO_NAME;
139
141
state->mech_oid = mech_oid;
140
142
state->context = GSS_C_NO_CONTEXT;
@@ -147,22 +149,22 @@ gss_result* authenticate_gss_client_init(const char* service, const char* princi
147
149
name_token.length = strlen (service);
148
150
name_token.value = (char *)service;
149
151
150
- // could be in principal name format, i.e. service/fqdn@REALM
151
- if (strchr (service, ' /' ))
152
- mech = GSS_C_NO_OID;
153
- else
154
- mech = gss_krb5_nt_service_name;
155
-
156
- maj_stat = gss_import_name (&min_stat, &name_token, mech, &state->server_name );
152
+ maj_stat = gss_import_name (
153
+ &min_stat, &name_token, gss_krb5_nt_service_name, &state->server_name
154
+ );
157
155
158
156
if (GSS_ERROR (maj_stat))
159
157
{
160
158
ret = gss_error_result (maj_stat, min_stat);
161
159
goto end;
162
160
}
163
161
164
- // Get credential for principal
165
- if (principal && *principal)
162
+ // Use the delegate credentials if they exist
163
+ if (delegatestate && delegatestate->client_creds != GSS_C_NO_CREDENTIAL) {
164
+ state->client_creds = delegatestate->client_creds ;
165
+ }
166
+ // If available use the principal to extract its associated credentials
167
+ else if (principal && *principal)
166
168
{
167
169
gss_name_t name;
168
170
principal_token.length = strlen (principal);
@@ -175,8 +177,10 @@ gss_result* authenticate_gss_client_init(const char* service, const char* princi
175
177
goto end;
176
178
}
177
179
178
- maj_stat = gss_acquire_cred (&min_stat, name, GSS_C_INDEFINITE, GSS_C_NO_OID_SET, GSS_C_INITIATE,
179
- &state->client_creds , NULL , NULL );
180
+ maj_stat = gss_acquire_cred (
181
+ &min_stat, name, GSS_C_INDEFINITE, GSS_C_NO_OID_SET,
182
+ GSS_C_INITIATE, &state->client_creds , NULL , NULL
183
+ );
180
184
if (GSS_ERROR (maj_stat))
181
185
{
182
186
ret = gss_error_result (maj_stat, min_stat);
@@ -189,8 +193,7 @@ gss_result* authenticate_gss_client_init(const char* service, const char* princi
189
193
ret = gss_error_result (maj_stat, min_stat);
190
194
goto end;
191
195
}
192
-
193
- }
196
+ }
194
197
195
198
ret = gss_success_result (AUTH_GSS_COMPLETE);
196
199
end:
@@ -199,14 +202,15 @@ gss_result* authenticate_gss_client_init(const char* service, const char* princi
199
202
200
203
int authenticate_gss_client_clean (gss_client_state *state)
201
204
{
205
+ OM_uint32 maj_stat;
202
206
OM_uint32 min_stat;
203
207
int ret = AUTH_GSS_COMPLETE;
204
208
205
209
if (state->context != GSS_C_NO_CONTEXT)
206
210
gss_delete_sec_context (&min_stat, &state->context , GSS_C_NO_BUFFER);
207
211
if (state->server_name != GSS_C_NO_NAME)
208
212
gss_release_name (&min_stat, &state->server_name );
209
- if (state->client_creds != GSS_C_NO_CREDENTIAL)
213
+ if (state->client_creds != GSS_C_NO_CREDENTIAL && !(state-> gss_flags & GSS_C_DELEG_FLAG) )
210
214
gss_release_cred (&min_stat, &state->client_creds );
211
215
if (state->username != NULL )
212
216
{
@@ -226,7 +230,6 @@ gss_result* authenticate_gss_client_step(gss_client_state* state, const char* ch
226
230
{
227
231
OM_uint32 maj_stat;
228
232
OM_uint32 min_stat;
229
- OM_uint32 ret_flags; // Not used, but may be necessary for gss call.
230
233
gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER;
231
234
gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER;
232
235
gss_result* ret = NULL ;
@@ -265,7 +268,7 @@ gss_result* authenticate_gss_client_step(gss_client_state* state, const char* ch
265
268
&input_token,
266
269
NULL ,
267
270
&output_token,
268
- &ret_flags,
271
+ NULL
269
272
NULL );
270
273
271
274
if ((maj_stat != GSS_S_COMPLETE) && (maj_stat != GSS_S_CONTINUE_NEEDED))
0 commit comments