in src/generic/request_ap.c [44:153]
int requestFillRequestValues_AP(Tcl_Interp * interp, RequestData * requestData)
{
request_rec *r = NULL;
#ifndef APACHE2
array_header *hdrs_arr = NULL;
table_entry *hdrs = NULL;
#else /* APACHE2 */
apr_array_header_t *hdrs_arr = NULL;
apr_table_entry_t *hdrs = NULL;
#endif /* APACHE2 */
int i = 0;
int remote_user = 0;
Tcl_Obj *valo = NULL;
if (interp == NULL)
return TCL_ERROR;
/* fetch request object */
r = (request_rec *) Tcl_GetAssocData(interp, WEB_AP_ASSOC_DATA, NULL);
if (r == NULL) {
Tcl_SetResult(interp, "error accessing httpd request object", NULL);
return TCL_ERROR;
}
#ifndef APACHE2
hdrs_arr = ap_table_elts(r->subprocess_env);
hdrs = (table_entry *) hdrs_arr->elts;
#else /* APACHE2 */
hdrs_arr = (apr_array_header_t *) apr_table_elts(r->subprocess_env);
hdrs = (apr_table_entry_t *) hdrs_arr->elts;
#endif /* APACHE2 */
for (i = 0; i < hdrs_arr->nelts; ++i) {
if (!hdrs[i].key)
continue;
if (!hdrs[i].val)
valo = Tcl_NewObj();
else
valo = Tcl_NewStringObj(hdrs[i].val, -1);
if (paramListAdd(requestData->request, hdrs[i].key, valo) != TCL_OK)
/* fatal case */
return TCL_ERROR;
if (!remote_user && !strcmp(hdrs[i].key, "REMOTE_USER")) {
remote_user = 1;
}
}
paramListSetAsWhole(requestData->request, "GATEWAY_INTERFACE",
Tcl_NewStringObj("CGI-websh/1.1", -1));
/* create AUTH_USER and AUTH_PW if not set (i.e. if not handeled by Apache),
otherwise don't set them for security reasons */
if (!remote_user) {
const char *pw = NULL;
const char *user = NULL;
const char *auth_line;
/* Check to see if a Authorization header is there */
#ifndef APACHE2
auth_line = (char *)ap_table_get(r->headers_in, "Authorization");
#else /* APACHE2 */
auth_line = (char *)apr_table_get(r->headers_in, "Authorization");
#endif
if (auth_line) {
char *decoded_line;
int length;
/* check if we know how to handle the Auth string */
if (!strcasecmp((char *)ap_getword(r->pool, &auth_line, ' '), "Basic")) {
/* Skip leading spaces. */
while (isspace((int)*auth_line)) {
auth_line++;
}
#ifndef APACHE2
decoded_line = (char *) ap_palloc(r->pool, ap_base64decode_len(auth_line) + 1);
length = ap_base64decode(decoded_line, auth_line);
#else /* APACHE2 */
decoded_line = (char *) apr_palloc(r->pool, apr_base64_decode_len(auth_line) + 1);
length = apr_base64_decode(decoded_line, auth_line);
#endif
/* Null-terminate the string. */
decoded_line[length] = '\0';
user = ap_getword_nulls(r->pool, (const char**)&decoded_line, ':');
pw = decoded_line;
if (paramListAdd(requestData->request, "AUTH_USER", Tcl_NewStringObj(user, -1)) != TCL_OK)
/* fatal case */
return TCL_ERROR;
if (paramListAdd(requestData->request, "AUTH_PW", Tcl_NewStringObj(pw, -1)) != TCL_OK)
/* fatal case */
return TCL_ERROR;
}
}
}
return TCL_OK;
}