You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by si...@tecbiz.ch on 2007/08/07 10:11:37 UTC
mod_auth_sspi
ello
I extend the module mod_auth_sspi to provide some password features
(password revoked, Password must change ...). All works fine but i think
that the modul has a bug and i don't know how to resolv it. i'm not the
absolute programmer but small things are ok for me. :-) I think you can
help me. The Module provide a negotiate method and a normal Basic auth.
Within the basic auth the Auth-name that was specified in the configuration
will not be displayed on the basic auth box on Windows Firefox or Internet
Explorer. When the Module receive a Http Header with Basic Auth data in it
but not correct Username or Password the basic Auth Pop-op and the Authname
will displayed. I check the code but all things ok. Can you help me?
Sorry for my english.
I hope you understand me.
Cheers Simon
static int check_cleartext_auth(sspi_auth_ctx* ctx)
{
int ret;
int i_exp_err;
DWORD cbOut, cbIn, maxTokenSize;
BYTE *clientbuf, *serverbuf;
SECURITY_STATUS ss;
maxTokenSize = get_package_max_token_size(sspiModuleInfo.pkgInfo,
sspiModuleInfo.numPackages, ctx->scr->package);
serverbuf = apr_palloc(ctx->r->pool, maxTokenSize);
clientbuf = NULL;
cbOut = 0;
do {
cbIn = cbOut;
cbOut = maxTokenSize;
ss = gen_client_context(sspiModuleInfo.functable,
&ctx->scr->client_credentials, &ctx->scr->client_context,
&ctx->scr->client_ctxtexpiry, clientbuf, &cbIn, serverbuf, &cbOut,
ctx->scr->package);
if (ss == SEC_E_OK || ss == SEC_I_CONTINUE_NEEDED || ss ==
SEC_I_COMPLETE_AND_CONTINUE) {
if (clientbuf == NULL) {
clientbuf = apr_palloc(ctx->r->pool, maxTokenSize);
}
cbIn = cbOut;
cbOut = maxTokenSize;
ss = gen_server_context(sspiModuleInfo.functable,
&ctx->scr->server_credentials, &ctx->scr->server_context,
&ctx->scr->server_ctxtexpiry, serverbuf, &cbIn, clientbuf, &cbOut);
}
} while (ss == SEC_I_CONTINUE_NEEDED || ss == SEC_I_COMPLETE_AND_CONTINUE);
switch (ss) {
case SEC_E_OK:
return OK;
case SEC_E_INVALID_HANDLE:
case SEC_E_INTERNAL_ERROR:
case SEC_E_NO_AUTHENTICATING_AUTHORITY:
case SEC_E_INSUFFICIENT_MEMORY:
ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(GetLastError()),
ctx->r, "access to %s failed, reason: cannot generate context",
ctx->r->uri);
return HTTP_INTERNAL_SERVER_ERROR;
case SEC_E_INVALID_TOKEN:
case SEC_E_LOGON_DENIED:
default:
i_exp_err = GetLastError(); log_sspi_logon_denied(ctx->r, &ctx->hdr,
APR_FROM_OS_ERROR(GetLastError())); if (SSPI_PWDEXPIRED)
{
ret = ctx->crec->sspi_pwdexpired_httpcode;
ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(GetLastError()),
ctx->r,
"access to %s failed, reason: pw must change", ctx->r->uri);
return ret;
}
else
{ ret = HTTP_UNAUTHORIZED;
note_sspi_auth_failure(ctx->r);
cleanup_sspi_connection(ctx->scr);
return ret;
}
}
int get_sspi_header(sspi_auth_ctx* ctx)
{
char* scheme;
char* basicline = 0;
//const char *auth_hdr = get_authenticate_header_name(r);
const char *auth_line = apr_table_get(ctx->r->headers_in,
get_authorization_header_name(ctx->r));
/*
* If the client didn't supply an Authorization: (or Proxy-Authorization)
* header, we need to reply 401 and supply a WWW-Authenticate
* (or Proxy-Authenticate) header indicating acceptable authentication
* schemes.
*/
if (!auth_line) {
note_sspi_auth_failure(ctx->r); return HTTP_UNAUTHORIZED;
}
/*
* Do a quick check of the Authorization: header. If it is 'Basic', and
we're * allowed, try a cleartext logon. Else if it isn't the selected
package
* and we're authoritative, reply 401 again.
*/
scheme = ap_getword_white(ctx->r->pool, &auth_line);
if (ctx->crec->sspi_offersspi && 0 == check_package_valid(ctx, scheme)) {
if (0 == ctx->scr->package)
ctx->scr->package = apr_pstrdup(ctx->r->connection->pool, scheme);
return get_sspi_userpass(ctx, auth_line);
} else if (ctx->crec->sspi_offerbasic && 0 == lstrcmpi(scheme, "Basic")) {
ctx->scr->package = ctx->crec->sspi_package_basic;
return get_basic_userpass(ctx, auth_line);
}
if (ctx->crec->sspi_authoritative) {
ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, ctx->r,
"client used wrong authentication scheme: %s for %s (needed %s)",
ctx->scr->package, ctx->r->uri, ctx->crec->sspi_packages);
note_sspi_auth_failure(ctx->r);
return HTTP_UNAUTHORIZED;
} else {
return DECLINED;
}
return HTTP_INTERNAL_SERVER_ERROR;
}
void note_sspi_auth_failure(request_rec *r)
{
const char *auth_hdr = get_authenticate_header_name(r);
sspi_config_rec *crec = get_sspi_config_rec(r);
char* basicline = 0;
apr_table_unset(r->err_headers_out, auth_hdr);
if (crec->sspi_offerbasic)
{
basicline = apr_psprintf(r->pool, "Basic realm=TESTSTSTSTST"); //,
//ap_auth_name(r));
}
if (crec->sspi_offersspi)
{
sspi_connection_rec* scr = 0;
apr_pool_userdata_get(&scr, sspiModuleInfo.userDataKeyString,
r->connection->pool); if (scr == 0 || scr->sspi_failing == 0)
{
char* w;
const char* package_list = crec->sspi_packages;
if (crec->sspi_offerbasic && crec->sspi_basicpreferred)
{
apr_table_addn(r->err_headers_out, auth_hdr, basicline);
basicline = 0;
}
if (package_list) while (*package_list)
{
w = ap_getword_white(r->pool, &package_list);
if (w[0])
{
apr_table_addn(r->err_headers_out, auth_hdr, w);
}
}
}
}
apr_table_addn(r->err_headers_out, auth_hdr, basicline);
if (basicline != 0)
{
apr_table_addn(r->err_headers_out, auth_hdr, basicline);
}
}
Re: mod_auth_sspi
Posted by Guenter Knauf <fu...@apache.org>.
Hello Simon,
> I extend the module mod_auth_sspi to provide some password features
> (password revoked, Password must change ...). All works fine but i think
> that the modul has a bug and i don't know how to resolv it. i'm not the
> absolute programmer but small things are ok for me. :-) I think you can
> help me. The Module provide a negotiate method and a normal Basic auth.
> Within the basic auth the Auth-name that was specified in the
> configuration
> will not be displayed on the basic auth box on Windows Firefox or Internet
> Explorer. When the Module receive a Http Header with Basic Auth data in it
> but not correct Username or Password the basic Auth Pop-op and the
> Authname
> will displayed. I check the code but all things ok. Can you help me?
as I replied already privately to the mail you directly sent to me:
mod_auth_sspi lives at SourceForge, and not here; so please use the SF BugTracker:
http://mod-auth-sspi.sourceforge.net/
or my forum to submit your patch, and ask your questions; you will probably have more luck there since those who contributed to the module in the past might listen....
I am not the initial developer of the module, but only the one who maintained the module in the past years; the original developer has no time currently, but he reads the bug reports, and might give you some hints.
greets, Guenter.