*** ne_auth.c.orig 2009-03-20 11:05:48.000000000 +0100 --- ne_auth.c 2009-03-20 11:13:34.000000000 +0100 *************** *** 77,82 **** --- 77,86 ---- #include "ne_sspi.h" #endif + #ifdef HAVE_NTLM + #include "ne_ntlm.h" + #endif + #define HOOK_SERVER_ID "http://webdav.org/neon/hooks/server-auth" #define HOOK_PROXY_ID "http://webdav.org/neon/hooks/proxy-auth" *************** *** 173,178 **** --- 177,186 ---- char *sspi_token; void *sspi_context; #endif + #ifdef HAVE_NTLM + /* This is used for NTLM auth */ + void *ntlm_context; + #endif /* These all used for Digest auth */ char *realm; char *nonce; *************** *** 287,292 **** --- 295,304 ---- ne_sspi_destroy_context(sess->sspi_context); sess->sspi_context = NULL; #endif + #ifdef HAVE_NTLM + ne_ntlm_destroy_context(sess->ntlm_context); + sess->ntlm_context = NULL; + #endif sess->protocol = NULL; } *************** *** 688,693 **** --- 700,760 ---- return invalid; } + #ifdef HAVE_NTLM + + static char *request_ntlm(auth_session *sess, struct auth_request *request) + { + char *token = ne_ntlm_getRequestToken(sess->ntlm_context); + if (token) { + char * req = ne_concat(sess->protocol->name, " ", token, "\r\n", NULL); + ne_free(token); + return req; + } else { + return NULL; + } + } + + static int ntlm_challenge(auth_session *sess, int attempt, + struct auth_challenge *parms, + ne_buffer **errmsg) + { + int status; + + NE_DEBUG(NE_DBG_HTTPAUTH, "auth: NTLM challenge.\n"); + + if (!parms->opaque) { + char password[NE_ABUFSIZ]; + + if (get_credentials(sess, errmsg, attempt, parms, password)) { + /* Failed to get credentials */ + return -1; + } + + if (sess->ntlm_context) { + status = ne_ntlm_destroy_context(sess->ntlm_context); + sess->ntlm_context = NULL; + if (status) { + return status; + } + } + + status = ne_ntlm_create_context(&sess->ntlm_context, + sess->username, + password); + if (status) { + return status; + } + } + + status = ne_ntlm_authenticate(sess->ntlm_context, parms->opaque); + if (status) { + return status; + } + + return 0; + } + #endif /* HAVE_NTLM */ + /* Examine a digest challenge: return 0 if it is a valid Digest challenge, * else non-zero. */ static int digest_challenge(auth_session *sess, int attempt, *************** *** 1138,1143 **** --- 1205,1215 ---- sspi_challenge, request_sspi, NULL, AUTH_FLAG_OPAQUE_PARAM|AUTH_FLAG_VERIFY_NON40x|AUTH_FLAG_CONN_AUTH }, #endif + #ifdef HAVE_NTLM + { NE_AUTH_NEGOTIATE, 30, "NTLM", + ntlm_challenge, request_ntlm, NULL, + AUTH_FLAG_OPAQUE_PARAM|AUTH_FLAG_VERIFY_NON40x }, + #endif { 0 } }; *************** *** 1435,1440 **** --- 1507,1517 ---- ne_sspi_clear_context(sess->sspi_context); } #endif + #ifdef HAVE_NTLM + if (sess->ntlm_context) { + ne_ntlm_clear_context(sess->ntlm_context); + } + #endif return ret; }