static void badge_emit_text(request_rec * r, const char * label, const char * value, int rdonly, const char * name, int pwflg, int errflg) { /** *** Generate the given text value as an html table row, either *** as normal text or as an input field according to *** the `rdonly' flag. **/ if (!value) value = ""; else value = ap_escape_html(r->pool, value); ap_rvputs(r, "<tr><td>", label, "</td><td", badge_arg_err(errflg), ">", NULL); if (rdonly) ap_rvputs(r, value, "</td></tr>\n", NULL); else ap_rvputs(r, "<input type=\"", pwflg? "password": "******", "\" name=\"", name, "\" value=\"", value, "\" /></td></tr>\n", NULL); }
/* A bit like mod_status: add a location: <Location /svn-status> SetHandler svn-status </Location> and then point a browser at http://server/svn-status. */ int dav_svn__status(request_rec *r) { svn_cache__info_t *info; svn_string_t *text_stats; apr_array_header_t *lines; int i; if (r->method_number != M_GET || strcmp(r->handler, "svn-status")) return DECLINED; info = svn_cache__membuffer_get_global_info(r->pool); text_stats = svn_cache__format_info(info, FALSE, r->pool); lines = svn_cstring_split(text_stats->data, "\n", FALSE, r->pool); ap_set_content_type(r, "text/html; charset=ISO-8859-1"); ap_rvputs(r, DOCTYPE_HTML_3_2 "<html><head>\n" "<title>Apache SVN Status</title>\n" "</head><body>\n" "<h1>Apache SVN Cache Status for ", ap_escape_html(r->pool, ap_get_server_name(r)), " (via ", r->connection->local_ip, ")</h1>\n<dl>\n<dt>Server Version: ", ap_get_server_description(), "</dt>\n<dt>Current Time: ", ap_ht_time(r->pool, apr_time_now(), DEFAULT_TIME_FORMAT, 0), "</dt>\n", SVN_VA_NULL); #if defined(WIN32) || (defined(HAVE_UNISTD_H) && defined(HAVE_GETPID)) /* On Unix the server is generally multiple processes and this request only shows the status of the single process that handles the request. Ideally we would iterate over all processes but that would need some MPM support, so we settle for simply showing the process ID. */ ap_rprintf(r, "<dt>Server process id: %d</dt>\n", (int)getpid()); #endif for (i = 0; i < lines->nelts; ++i) { const char *line = APR_ARRAY_IDX(lines, i, const char *); ap_rvputs(r, "<dt>", line, "</dt>\n", SVN_VA_NULL); } ap_rvputs(r, "</dl></body></html>\n", SVN_VA_NULL); return 0; }
static void badge_emit_timestamp(request_rec * r, const char * fromto, time_t value, int rdonly, badge_timestamp * ts, int errflags, int yearerr, int montherr, int dayerr, int hourerr, int minerr, int secerr) { apr_time_exp_t exptime; apr_time_t aprtime; apr_size_t len; char buf[100]; /** *** Emit a timestamp in an html table row, either as normal text *** from `value' or as input fields with values from `*ts' *** according to the `rdonly' flag. **/ ap_rvputs(r, "<tr><td>Valid ", fromto, "</td><td>", NULL); if (rdonly) { apr_time_ansi_put(&aprtime, value); apr_time_exp_tz(&exptime, aprtime, 0); apr_strftime(buf, &len, sizeof buf - 1, "%c", &exptime); buf[len] = '\0'; ap_rvputs(r, ap_escape_html(r->pool, buf), NULL); } else { ap_rvputs(r, "Y<input type=\"text\" name=\"", fromto, "-year\" value=\"", ts->year? ap_escape_html(r->pool, ts->year): "", "\"", badge_arg_err(errflags & yearerr), " />", NULL); badge_emit_range_select(r, "M", fromto, "month", 1, 12, ts->month, errflags & montherr); badge_emit_range_select(r, "D", fromto, "day", 1, 31, ts->day, errflags & dayerr); badge_emit_range_select(r, "H", fromto, "hour", 0, 23, ts->hour, errflags & hourerr); badge_emit_range_select(r, "M", fromto, "min", 0, 59, ts->min, errflags & minerr); badge_emit_range_select(r, "S", fromto, "sec", 0, 59, ts->sec, errflags & secerr); } ap_rvputs(r, "</td></tr>\n", NULL); }
static void badge_emit_range_select(request_rec * r, const char * label, const char * name1, const char * name2, int low, int high, const char * curval, int errflag) { int selval; char buf[10]; /** *** Generate an html select for a given integer range. **/ selval = curval? atoi(curval): 0; ap_rvputs(r, " ", label, "<select name=\"", name1, "-", name2, "\"", badge_arg_err(errflag), ">\n", NULL); for (; low <= high; low++) { snprintf(buf, sizeof buf, "%d", low); ap_rvputs(r, " <option", selval == low? " selected=\"yes\"": "", " value=\"", buf, "\">", buf, "</option>\n", NULL); } ap_rvputs(r, "</select>", NULL); }
void badge_show(request_rec * r, const badge_data * b, const char * badge, const char * key_file, const char * verify, badge_timestamp * from, badge_timestamp * to, apr_array_header_t * keys, int errstatus) { int isform; badge_entry * * bep; const char * cp; int i; /** *** Display badge data or input form. **/ isform = !badge; ap_rvputs(r, "<table border=\"0\"><tbody>\n", NULL); /** *** Key file path entry. **/ ap_rvputs(r, "<tr><td>Key file path</td>\n", "<td", badge_arg_err(errstatus & BADGE_KEY_FILE), ">", NULL); if (!isform) ap_rvputs(r, ap_escape_html(r->pool, key_file), NULL); else { bep = (badge_entry * *) keys->elts; if (!key_file) key_file = (*bep)->sslfile; if (keys->nelts == 1) { cp = ap_escape_html(r->pool, key_file); ap_rvputs(r, "<input type=\"hidden\" name=\"key-file\"", " value=\"", cp, "\" />", cp, NULL); } else { ap_rvputs(r, "<select name=\"key-file\">\n", NULL); for (i = 0; i < keys->nelts; i++) { ap_rvputs(r, " <option", strcmp(key_file, (*bep)->sslfile)? "": " selected=\"yes\"", ">", ap_escape_html(r->pool, (*bep)->sslfile), "</option>\n", NULL); bep++; } ap_rvputs(r, "</select>", NULL); } } ap_rvputs(r, "</td></tr>\n", NULL); /** *** Replacement path entry. **/ badge_emit_text(r, "Replacement path prefix", b->path, !isform, "path-prefix", 0, errstatus & BADGE_PATH_PREFIX); /** *** "Valid from" timestamp entry. **/ badge_emit_timestamp(r, "from", b->from, !isform, from, errstatus, BADGE_FROM_YEAR, BADGE_FROM_MONTH, BADGE_FROM_DAY, BADGE_FROM_HOUR, BADGE_FROM_MIN, BADGE_FROM_SEC); /** *** "Valid to" timestamp entry. **/ badge_emit_timestamp(r, "to", b->to, !isform, to, errstatus, BADGE_TO_YEAR, BADGE_TO_MONTH, BADGE_TO_DAY, BADGE_TO_HOUR, BADGE_TO_MIN, BADGE_TO_SEC); /** *** User name entry. **/ if (isform || (b->user && *b->user)) badge_emit_text(r, "Authentication user", b->user, !isform, "username", 0, errstatus & BADGE_USERNAME); /** *** Password entry. **/ if (isform || (b->user && *b->user)) badge_emit_text(r, "Password", !badge? b->passwd: b->passwd && *b->passwd? "set": "unset", !isform, "password", 1, errstatus & BADGE_PASSWORD); /** *** Password verify entry. **/ if (isform) badge_emit_text(r, "Verify password", verify, 0, "verify", 1, errstatus & BADGE_PASSWORD); /** *** If a badge has been generated, show it. **/ if (badge) { ap_rvputs(r, "<tr><td colspan=\"2\"> </td></tr>\n", NULL); badge_emit_text(r, "Badge", badge, 1, "", 0, 0); } ap_rvputs(r, "</tbody></table>\n", NULL); }
/* * This routine puts the standard HTML header at the top of the index page. * We include the DOCTYPE because we may be using features therefrom (i.e., * HEIGHT and WIDTH attributes on the icons if we're FancyIndexing). */ static void emit_preamble(request_rec *r, char *title) { ap_rvputs(r, DOCTYPE_HTML_3_2, "<HTML>\n <HEAD>\n <TITLE>Index of ", title, "</TITLE>\n </HEAD>\n <BODY>\n", NULL); }
static int mediarss_index_directory(request_rec* r) { apr_status_t status; apr_dir_t* dir; apr_finfo_t dirent; if ((status = apr_dir_open(&dir, r->filename, r->pool)) != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, "Can't open directory for index: %s", r->filename); return HTTP_FORBIDDEN; } /* Content header */ char* url; url = ap_construct_url(r->pool, r->uri, r); ap_set_content_type(r, "text/xml; charset=utf-8"); ap_rputs("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n\n", r); if (strcmp(r->args, "format=mediarss") == 0) { ap_rputs("<rss version=\"2.0\" xmlns:media=\"http://search.yahoo.com/mrss/\">\n", r); } else { ap_rputs("<rss version=\"2.0\">\n", r); } ap_rputs(" <channel>\n", r); ap_rvputs(r, " <title>Index of ", url, "</title>\n", NULL); ap_rvputs(r, " <link>", url, "</link>\n", NULL); /* Collect information about the files in the directory */ while (1) { status = apr_dir_read(&dirent, APR_FINFO_MIN | APR_FINFO_NAME, dir); if (APR_STATUS_IS_INCOMPLETE(status)) { continue; /* ignore un-stat()able files */ } else if (status != APR_SUCCESS) { break; } /* We are only interested in regular files. TODO Deal with symlinks. */ if (dirent.filetype == APR_REG) { request_rec* rr; rr = ap_sub_req_lookup_dirent(&dirent, r, AP_SUBREQ_NO_ARGS, NULL); if (rr != NULL) { if (rr->finfo.filetype == APR_REG && rr->status == HTTP_OK) { /* In case of media rss, only include the item if it is a media type */ if (strcmp(r->args, "format=mediarss") == 0 && mediarss_is_media_content(rr->content_type) == 0) { continue; } char size[16]; snprintf(size, sizeof(size), "%d", dirent.size); char date[APR_RFC822_DATE_LEN]; apr_rfc822_date(date, dirent.mtime); char* guid = ap_md5(r->pool, (unsigned char*) apr_pstrcat(r->pool, url, dirent.name, NULL)); ap_rputs(" <item>\n", r); ap_rvputs(r, " <guid>", guid, "</guid>\n", NULL); ap_rvputs(r, " <title>", dirent.name, "</title>\n", NULL); ap_rvputs(r, " <pubDate>", date, "</pubDate>\n", NULL); ap_rvputs(r, " <enclosure url=\"", url, dirent.name, "\" length=\"", size, "\"\n", NULL); ap_rvputs(r, " type=\"", rr->content_type, "\"/>\n", NULL); if (strcmp(r->args, "format=mediarss") == 0) { ap_rvputs(r, " <media:content url=\"", url, dirent.name, "\" fileSize=\"", size, "\"\n", NULL); ap_rvputs(r, " type=\"", rr->content_type, "\"/>\n", NULL); } ap_rputs(" </item>\n", r); } ap_destroy_sub_req(rr); } } } /* Content footer */ ap_rputs(" </channel>\n", r); ap_rputs("</rss>\n", r); apr_dir_close(dir); return OK; }
/* Manages the loadfactors and member status */ static int balancer_handler(request_rec *r) { void *sconf = r->server->module_config; proxy_server_conf *conf = (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); proxy_balancer *balancer, *bsel = NULL; proxy_worker *worker, *wsel = NULL; apr_table_t *params = apr_table_make(r->pool, 10); int access_status; int i, n; const char *name; /* is this for us? */ if (strcmp(r->handler, "balancer-manager")) return DECLINED; r->allowed = (AP_METHOD_BIT << M_GET); if (r->method_number != M_GET) return DECLINED; if (r->args) { char *args = apr_pstrdup(r->pool, r->args); char *tok, *val; while (args && *args) { if ((val = ap_strchr(args, '='))) { *val++ = '\0'; if ((tok = ap_strchr(val, '&'))) *tok++ = '\0'; /* * Special case: workers are allowed path information */ if ((access_status = ap_unescape_url(val)) != OK) if (strcmp(args, "w") || (access_status != HTTP_NOT_FOUND)) return access_status; apr_table_setn(params, args, val); args = tok; } else return HTTP_BAD_REQUEST; } } /* Check that the supplied nonce matches this server's nonce; * otherwise ignore all parameters, to prevent a CSRF attack. */ if ((name = apr_table_get(params, "nonce")) == NULL || strcmp(balancer_nonce, name) != 0) { apr_table_clear(params); } if ((name = apr_table_get(params, "b"))) bsel = ap_proxy_get_balancer(r->pool, conf, apr_pstrcat(r->pool, "balancer://", name, NULL)); if ((name = apr_table_get(params, "w"))) { proxy_worker *ws; ws = ap_proxy_get_worker(r->pool, conf, name); if (bsel && ws) { worker = (proxy_worker *)bsel->workers->elts; for (n = 0; n < bsel->workers->nelts; n++) { if (strcasecmp(worker->name, ws->name) == 0) { wsel = worker; break; } ++worker; } } } /* First set the params */ /* * Note that it is not possible set the proxy_balancer because it is not * in shared memory. */ if (wsel) { const char *val; if ((val = apr_table_get(params, "lf"))) { int ival = atoi(val); if (ival >= 1 && ival <= 100) { wsel->s->lbfactor = ival; if (bsel) recalc_factors(bsel); } } if ((val = apr_table_get(params, "wr"))) { if (strlen(val) && strlen(val) < PROXY_WORKER_MAX_ROUTE_SIZ) strcpy(wsel->s->route, val); else *wsel->s->route = '\0'; } if ((val = apr_table_get(params, "rr"))) { if (strlen(val) && strlen(val) < PROXY_WORKER_MAX_ROUTE_SIZ) strcpy(wsel->s->redirect, val); else *wsel->s->redirect = '\0'; } if ((val = apr_table_get(params, "dw"))) { if (!strcasecmp(val, "Disable")) wsel->s->status |= PROXY_WORKER_DISABLED; else if (!strcasecmp(val, "Enable")) wsel->s->status &= ~PROXY_WORKER_DISABLED; } if ((val = apr_table_get(params, "ls"))) { int ival = atoi(val); if (ival >= 0 && ival <= 99) { wsel->s->lbset = ival; } } } if (apr_table_get(params, "xml")) { ap_set_content_type(r, "text/xml"); ap_rputs("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n", r); ap_rputs("<httpd:manager xmlns:httpd=\"http://httpd.apache.org\">\n", r); ap_rputs(" <httpd:balancers>\n", r); balancer = (proxy_balancer *)conf->balancers->elts; for (i = 0; i < conf->balancers->nelts; i++) { ap_rputs(" <httpd:balancer>\n", r); ap_rvputs(r, " <httpd:name>", balancer->name, "</httpd:name>\n", NULL); ap_rputs(" <httpd:workers>\n", r); worker = (proxy_worker *)balancer->workers->elts; for (n = 0; n < balancer->workers->nelts; n++) { ap_rputs(" <httpd:worker>\n", r); ap_rvputs(r, " <httpd:scheme>", worker->scheme, "</httpd:scheme>\n", NULL); ap_rvputs(r, " <httpd:hostname>", worker->hostname, "</httpd:hostname>\n", NULL); ap_rprintf(r, " <httpd:loadfactor>%d</httpd:loadfactor>\n", worker->s->lbfactor); ap_rputs(" </httpd:worker>\n", r); ++worker; } ap_rputs(" </httpd:workers>\n", r); ap_rputs(" </httpd:balancer>\n", r); ++balancer; } ap_rputs(" </httpd:balancers>\n", r); ap_rputs("</httpd:manager>", r); } else { ap_set_content_type(r, "text/html; charset=ISO-8859-1"); ap_rputs(DOCTYPE_HTML_3_2 "<html><head><title>Balancer Manager</title></head>\n", r); ap_rputs("<body><h1>Load Balancer Manager for ", r); ap_rvputs(r, ap_get_server_name(r), "</h1>\n\n", NULL); ap_rvputs(r, "<dl><dt>Server Version: ", ap_get_server_description(), "</dt>\n", NULL); ap_rvputs(r, "<dt>Server Built: ", ap_get_server_built(), "\n</dt></dl>\n", NULL); balancer = (proxy_balancer *)conf->balancers->elts; for (i = 0; i < conf->balancers->nelts; i++) { ap_rputs("<hr />\n<h3>LoadBalancer Status for ", r); ap_rvputs(r, balancer->name, "</h3>\n\n", NULL); ap_rputs("\n\n<table border=\"0\" style=\"text-align: left;\"><tr>" "<th>StickySession</th><th>Timeout</th><th>FailoverAttempts</th><th>Method</th>" "</tr>\n<tr>", r); if (balancer->sticky) { ap_rvputs(r, "<td>", balancer->sticky, NULL); } else { ap_rputs("<td> - ", r); } ap_rprintf(r, "</td><td>%" APR_TIME_T_FMT "</td>", apr_time_sec(balancer->timeout)); ap_rprintf(r, "<td>%d</td>\n", balancer->max_attempts); ap_rprintf(r, "<td>%s</td>\n", balancer->lbmethod->name); ap_rputs("</table>\n<br />", r); ap_rputs("\n\n<table border=\"0\" style=\"text-align: left;\"><tr>" "<th>Worker URL</th>" "<th>Route</th><th>RouteRedir</th>" "<th>Factor</th><th>Set</th><th>Status</th>" "<th>Elected</th><th>To</th><th>From</th>" "</tr>\n", r); worker = (proxy_worker *)balancer->workers->elts; for (n = 0; n < balancer->workers->nelts; n++) { char fbuf[50]; ap_rvputs(r, "<tr>\n<td><a href=\"", r->uri, "?b=", balancer->name + sizeof("balancer://") - 1, "&w=", ap_escape_uri(r->pool, worker->name), "&nonce=", balancer_nonce, "\">", NULL); ap_rvputs(r, worker->name, "</a></td>", NULL); ap_rvputs(r, "<td>", ap_escape_html(r->pool, worker->s->route), NULL); ap_rvputs(r, "</td><td>", ap_escape_html(r->pool, worker->s->redirect), NULL); ap_rprintf(r, "</td><td>%d</td>", worker->s->lbfactor); ap_rprintf(r, "<td>%d</td><td>", worker->s->lbset); if (worker->s->status & PROXY_WORKER_DISABLED) ap_rputs("Dis ", r); if (worker->s->status & PROXY_WORKER_IN_ERROR) ap_rputs("Err ", r); if (worker->s->status & PROXY_WORKER_STOPPED) ap_rputs("Stop ", r); if (worker->s->status & PROXY_WORKER_HOT_STANDBY) ap_rputs("Stby ", r); if (PROXY_WORKER_IS_USABLE(worker)) ap_rputs("Ok", r); if (!PROXY_WORKER_IS_INITIALIZED(worker)) ap_rputs("-", r); ap_rputs("</td>", r); ap_rprintf(r, "<td>%" APR_SIZE_T_FMT "</td><td>", worker->s->elected); ap_rputs(apr_strfsize(worker->s->transferred, fbuf), r); ap_rputs("</td><td>", r); ap_rputs(apr_strfsize(worker->s->read, fbuf), r); ap_rputs("</td></tr>\n", r); ++worker; } ap_rputs("</table>\n", r); ++balancer; } ap_rputs("<hr />\n", r); if (wsel && bsel) { ap_rputs("<h3>Edit worker settings for ", r); ap_rvputs(r, wsel->name, "</h3>\n", NULL); ap_rvputs(r, "<form method=\"GET\" action=\"", NULL); ap_rvputs(r, r->uri, "\">\n<dl>", NULL); ap_rputs("<table><tr><td>Load factor:</td><td><input name=\"lf\" type=text ", r); ap_rprintf(r, "value=\"%d\"></td></tr>\n", wsel->s->lbfactor); ap_rputs("<tr><td>LB Set:</td><td><input name=\"ls\" type=text ", r); ap_rprintf(r, "value=\"%d\"></td></tr>\n", wsel->s->lbset); ap_rputs("<tr><td>Route:</td><td><input name=\"wr\" type=text ", r); ap_rvputs(r, "value=\"", ap_escape_html(r->pool, wsel->s->route), NULL); ap_rputs("\"></td></tr>\n", r); ap_rputs("<tr><td>Route Redirect:</td><td><input name=\"rr\" type=text ", r); ap_rvputs(r, "value=\"", ap_escape_html(r->pool, wsel->s->redirect), NULL); ap_rputs("\"></td></tr>\n", r); ap_rputs("<tr><td>Status:</td><td>Disabled: <input name=\"dw\" value=\"Disable\" type=radio", r); if (wsel->s->status & PROXY_WORKER_DISABLED) ap_rputs(" checked", r); ap_rputs("> | Enabled: <input name=\"dw\" value=\"Enable\" type=radio", r); if (!(wsel->s->status & PROXY_WORKER_DISABLED)) ap_rputs(" checked", r); ap_rputs("></td></tr>\n", r); ap_rputs("<tr><td colspan=2><input type=submit value=\"Submit\"></td></tr>\n", r); ap_rvputs(r, "</table>\n<input type=hidden name=\"w\" ", NULL); ap_rvputs(r, "value=\"", ap_escape_uri(r->pool, wsel->name), "\">\n", NULL); ap_rvputs(r, "<input type=hidden name=\"b\" ", NULL); ap_rvputs(r, "value=\"", bsel->name + sizeof("balancer://") - 1, "\">\n", NULL); ap_rvputs(r, "<input type=hidden name=\"nonce\" value=\"", balancer_nonce, "\">\n", NULL); ap_rvputs(r, "</form>\n", NULL); ap_rputs("<hr />\n", r); } ap_rputs(ap_psignature("",r), r); ap_rputs("</body></html>\n", r); } return OK; }
int badge_factory_handler(request_rec * r) { apr_array_header_t * keys; badge_entry * * bep; badge_entry * e; badge_data b; badge_timestamp from; badge_timestamp to; const char * key_file; const char * verify; const char * badge; int errflags; char * myself; int i; keys = badge_unique_key_files(r->pool, ap_get_module_config(r->per_dir_config, &badge_module)); /** *** Check parameters: if all are OK, display the result page. *** Else show the input form. *** *** Parameters: *** from-year UTC YYYY *** from-month UTC MM *** from-day UTC DD *** from-hour UTC HH *** from-min UTC MM *** from-sec UTC SS *** to-year UTC YYYY *** to-month UTC MM *** to-day UTC DD *** to-hour UTC HH *** to-min UTC MM *** to-sec UTC SS *** key-file Key/certificate file path name. *** path-prefix Path prefix replacement. *** username Auth user name. optional *** password Password optional *** verify Password (should match). **/ badge_parse_query(r, "from-year", &from.year, 1, "from-month", &from.month, 1, "from-day", &from.day, 1, "from-hour", &from.hour, 1, "from-min", &from.min, 1, "from-sec", &from.sec, 1, "to-year", &to.year, 1, "to-month", &to.month, 1, "to-day", &to.day, 1, "to-hour", &to.hour, 1, "to-min", &to.min, 1, "to-sec", &to.sec, 1, "key-file", &key_file, 1, "path-prefix", &b.path, 1, "username", &b.user, 1, "password", &b.passwd, 0, "verify", &verify, 0, NULL); /** *** Check validity of arguments. **/ errflags = 0; e = NULL; if (r->args) { errflags |= badge_get_time_arg(&b.from, &from, BADGE_FROM_YEAR, BADGE_FROM_MONTH, BADGE_FROM_DAY, BADGE_FROM_HOUR, BADGE_FROM_MIN, BADGE_FROM_SEC); errflags |= badge_get_time_arg(&b.to, &to, BADGE_TO_YEAR, BADGE_TO_MONTH, BADGE_TO_DAY, BADGE_TO_HOUR, BADGE_TO_MIN, BADGE_TO_SEC); if (!errflags && b.from > b.to) errflags |= BADGE_FROM_YEAR | BADGE_FROM_MONTH | BADGE_FROM_DAY | BADGE_FROM_HOUR | BADGE_FROM_MIN | BADGE_FROM_SEC | BADGE_TO_YEAR | BADGE_TO_MONTH | BADGE_TO_DAY | BADGE_TO_HOUR | BADGE_TO_MIN | BADGE_TO_SEC; if (!b.path || !*b.path) errflags |= BADGE_PATH_PREFIX; bep = (badge_entry * *) keys->elts; if (key_file) { errflags |= BADGE_KEY_FILE; for (i = 0; i < keys->nelts; i++) { if (!strcmp(key_file, (e = *bep)->sslfile)) { errflags &= ~BADGE_KEY_FILE; break; } bep++; } } else if (keys->nelts == 1) key_file = (e = *bep)->sslfile; else errflags |= BADGE_KEY_FILE; if (!b.user) b.user = ""; if (strchr(b.user, ':')) errflags |= BADGE_USERNAME; if (!b.passwd) b.passwd = ""; if (!verify) verify = ""; if (strcmp(b.passwd, verify)) errflags |= BADGE_PASSWORD; if (!*b.user && *b.passwd) errflags |= BADGE_USERNAME | BADGE_PASSWORD; } /** *** Start the output page. **/ myself = ap_escape_html(r->pool, r->uri); ap_set_content_type(r, "text/html"); ap_rvputs(r, DOCTYPE_HTML_4_0S, "<html>\n", " <head>\n", " <title>Generate a badge</title>\n", " <style type=\"text/css\">\n", " <!--\n", " .err { background-color: red; }\n", " -->\n", " </style>\n", " </head>\n", " <body>\n", "<h1>Generate a badge</h1>\n", NULL); /** *** If we do have all necessary information, generate a badge. **/ if (!errflags && b.path) { b.path = badge_canonicalize_path(r->pool, NULL, b.path) + 1; badge = badge_encode(r->pool, &b, e); } else { badge = NULL; ap_rvputs(r, "<form method=\"get\" action=\"", myself, "\">\n", NULL); } /** *** Display badge data or input form. **/ badge_show(r, &b, badge, key_file, verify, &from, &to, keys, errflags); if (!badge) { if (errflags) ap_rvputs(r, "<br /><p><span", badge_arg_err(1), ">Please fix the highlighted field(s) and", " retry</span></p>\n", NULL); ap_rvputs(r, "<input type=\"submit\" value=\"Generate\" />", "</form>\n", NULL); } else ap_rvputs(r, "<a href=\"", ap_escape_html(r->pool, r->uri), "\">Generate another badge</a>\n", NULL); ap_rvputs(r, " </body>\n", "</html>\n", NULL); return OK; }