#include "config.h"
-#define MODAUTHKERB_VERSION "5.0-rc5"
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#define MODAUTHKERB_VERSION "5.0-rc6"
+#define MECH_NEGOTIATE "Negotiate"
#include <httpd.h>
#include <http_config.h>
#include <netdb.h> /* gethostbyname() */
#endif /* KRB4 */
+#ifdef WIN32
+#define vsnprintf _vsnprintf
+#define snprintf _snprintf
+#else
/* XXX remove dependency on unistd.h ??? */
#include <unistd.h>
+#endif
#ifdef STANDARD20_MODULE_STUFF
module AP_MODULE_DECLARE_DATA auth_kerb_module;
#define command(name, func, var, type, usage) \
AP_INIT_ ## type (name, func, \
(void*)APR_XtOffsetOf(kerb_auth_config, var), \
- OR_AUTHCFG, usage)
+ OR_AUTHCFG | RSRC_CONF, usage)
#else
#define command(name, func, var, type, usage) \
{ name, func, \
(void*)XtOffsetOf(kerb_auth_config, var), \
- OR_AUTHCFG, type, usage }
+ OR_AUTHCFG | RSRC_CONF, type, usage }
#endif
static const command_rec kerb_auth_cmds[] = {
{ NULL }
};
+#ifdef WIN32
+int
+mkstemp(char *template)
+{
+ int start, i;
+ pid_t val;
+ val = getpid();
+ start = strlen(template) - 1;
+ while(template[start] == 'X') {
+ template[start] = '0' + val % 10;
+ val /= 10;
+ start--;
+ }
+
+ do{
+ int fd;
+ fd = open(template, O_RDWR | O_CREAT | O_EXCL, 0600);
+ if(fd >= 0 || errno != EEXIST)
+ return fd;
+ i = start + 1;
+ do{
+ if(template[i] == 0)
+ return -1;
+ template[i]++;
+ if(template[i] == '9' + 1)
+ template[i] = 'a';
+ if(template[i] <= 'z')
+ break;
+ template[i] = 'a';
+ i++;
+ }while(1);
+ }while(1);
+}
+#endif
+
#if defined(KRB5) && !defined(HEIMDAL)
/* Needed to work around problems with replay caches */
#include "mit-internals.h"
int ret;
gss_name_t client_name = GSS_C_NO_NAME;
gss_cred_id_t delegated_cred = GSS_C_NO_CREDENTIAL;
- OM_uint32 (*accept_sec_token)();
+ OM_uint32
+ (*accept_sec_token)(OM_uint32 *, gss_ctx_id_t *, const gss_cred_id_t,
+ const gss_buffer_t, const gss_channel_bindings_t,
+ gss_name_t *, gss_OID *, gss_buffer_t, OM_uint32 *,
+ OM_uint32 *, gss_cred_id_t *);
gss_OID_desc spnego_oid;
gss_ctx_id_t context = GSS_C_NO_CONTEXT;
gss_cred_id_t server_creds = GSS_C_NO_CREDENTIAL;
*negotiate_ret_value = token;
log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
"GSS-API token of length %d bytes will be sent back",
- major_status, output_token.length);
+ output_token.length);
gss_release_buffer(&minor_status2, &output_token);
}
goto end;
}
- MK_AUTH_TYPE = "Negotiate";
+ MK_AUTH_TYPE = MECH_NEGOTIATE;
MK_USER = ap_pstrdup(r->pool, output_token.value);
if (conf->krb_save_credentials && delegated_cred != GSS_C_NO_CREDENTIAL)
{
if (ap_is_initial_req(r) || MK_AUTH_TYPE == NULL)
return 0;
- if (strcmp(MK_AUTH_TYPE, "Negotiate") ||
+ if (strcmp(MK_AUTH_TYPE, MECH_NEGOTIATE) ||
(strcmp(MK_AUTH_TYPE, "Basic") && strchr(MK_USER, '@')))
return 1;
return 0;
* apache in the proxy mode should retain client's authN headers? */
#ifdef KRB5
if (negotiate_ret_value != NULL && conf->krb_method_gssapi) {
- negoauth_param = (*negotiate_ret_value == '\0') ? "Negotiate" :
- ap_pstrcat(r->pool, "Negotiate ", negotiate_ret_value, NULL);
+ negoauth_param = (*negotiate_ret_value == '\0') ? MECH_NEGOTIATE :
+ ap_pstrcat(r->pool, MECH_NEGOTIATE " ", negotiate_ret_value, NULL);
ap_table_add(r->err_headers_out, header_name, negoauth_param);
}
if ((use_krb5pwd && conf->krb_method_k5pass) || conf->krb_delegate_basic) {
#ifdef KRB5
if (use_krb5 && conf->krb_method_gssapi &&
- strcasecmp(auth_type, "Negotiate") == 0) {
+ strcasecmp(auth_type, MECH_NEGOTIATE) == 0) {
ret = authenticate_user_gss(r, conf, auth_line, &negotiate_ret_value);
} else if (use_krb5 && conf->krb_method_k5pass &&
strcasecmp(auth_type, "Basic") == 0) {