Example #1
0
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);
}
Example #2
0
/* 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;
}
Example #3
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);
}
Example #4
0
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, "&nbsp;", 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);
}
Example #5
0
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\">&nbsp;</td></tr>\n", NULL);
		badge_emit_text(r, "Badge", badge, 1, "", 0, 0);
		}

	ap_rvputs(r, "</tbody></table>\n", NULL);
}
Example #6
0
/*
 * 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);
}
Example #7
0
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;
}
Example #8
0
/* 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;
}
Example #9
0
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;
}