moth/packages/mcp/src/puzzler.cgi.c

80 lines
1.6 KiB
C
Raw Normal View History

2011-02-23 17:29:34 -07:00
#include <stdio.h>
#include <stdlib.h>
2010-09-16 12:21:16 -06:00
#include <ctype.h>
#include "common.h"
int
main(int argc, char *argv[])
{
2010-09-14 18:04:33 -06:00
char team[TEAM_MAX] = {0};
char category[CAT_MAX] = {0};
char points_str[11] = {0};
char answer[500] = {0};
long points = 0;
if (-1 == cgi_init(argv)) {
return 0;
}
/* Read in team and answer */
while (1) {
size_t len;
char key[20];
len = cgi_item(key, sizeof(key));
if (0 == len) break;
switch (key[0]) {
case 't':
cgi_item(team, sizeof(team));
break;
case 'c':
cgi_item(category, sizeof(category));
break;
case 'p':
cgi_item(points_str, sizeof(points_str));
2010-09-12 22:00:58 -06:00
points = atol(points_str);
break;
case 'a':
cgi_item(answer, sizeof(answer));
break;
}
}
/* Validate category name (prevent directory traversal) */
{
char *p;
for (p = category; *p; p += 1) {
2010-10-22 11:15:37 -06:00
if ((! isalnum(*p)) && ('-' != *p)) {
cgi_page("Invalid category", "");
}
}
}
/* Check answer (also assures category exists) */
{
2010-09-12 22:00:58 -06:00
char needle[400];
2010-09-23 18:23:00 -06:00
my_snprintf(needle, sizeof(needle), "%ld %s", points, answer);
2011-02-23 17:29:34 -07:00
2012-05-30 18:04:24 -06:00
if (! anchored_search(package_path("%s/answers.txt", category), needle, 0)) {
cgi_page("Wrong answer", "");
}
}
2010-09-14 18:04:33 -06:00
{
2012-05-30 18:04:24 -06:00
int ret = award_points(team, category, points, "P");
if (ret < 0) {
cgi_fail(ret);
}
2010-09-14 18:04:33 -06:00
}
cgi_page("Points awarded",
2010-09-24 22:28:40 -06:00
("<p>%d points for %s.</p>\n"
"<p><a href=\"/puzzles.html\">Back to puzzles</a></p>\n"
"<!-- awarded %d -->"),
points, team, points);
return 0;
}