--- /dev/null
+/*
+ * mod_msff.c: Microsoft Free Fridays: reject MSIE on Friday.
+ *
+ * Michael Anthony <m@beanpod.net>
+ * You may use this software free for any purpose.
+ * It has no warranty.
+ *
+ * You might find success by trying to build it like this:
+ *
+ * gcc -c -I<apache include dir> -fpic -DSHARED_MODULE mod_msff.c
+ * gcc -shared -o mod_msff.so mod_msff.o
+ *
+ * But you also might not. After you do that, you'll want the
+ * resulting .so file in your Apache installation's libexec directory.
+ *
+ * Enable the module by putting this line right around where the
+ * LoadModule line for mod_auth is:
+ *
+ * LoadModule msff_module libexec/mod_msff.so
+ *
+ * and put this line right around where the AddModule line for
+ * mod_auth is:
+ *
+ * AddModule mod_msff.c
+ *
+ */
+
+#include "httpd.h"
+#include "http_core.h"
+#include "http_config.h"
+#include "http_log.h"
+#include "http_request.h"
+#include <string.h>
+#include <ctype.h>
+
+static void dump_message (request_rec *r)
+{
+ r->content_type = "text/html";
+ r->status = FORBIDDEN;
+ ap_send_http_header (r);
+
+ if (! r->header_only)
+ {
+ ap_rprintf (
+ r,
+ "<html xml:lang=\"en\" lang=\"en\">\n"
+ "<head>\n"
+ "<title>Go home, Billy!</title>\n"
+ "</head>\n"
+ "<body>\n"
+ "<p><h1>Happy "
+ "<a href=\"http://davenet.userland.com/2001/06/13\">"
+ "Microsoft-Free Friday</a>!</h1></p>\n"
+ "<p>In support of freedom of choice in browser software, this"
+ " web site is Microsoft-Free on Fridays. Please use any"
+ " browser except MSIE to access this web site today.</p>\n"
+ "</body>\n"
+ "</html>\n");
+ }
+}
+
+static int msff (request_rec *r)
+{
+ int ret = 0;
+ time_t now;
+ struct tm *tmp;
+ char *agent = 0;
+ const char *foo;
+ char *p;
+
+ foo = ap_table_get (r->headers_in, "User-Agent");
+ if (foo)
+ {
+ agent = ap_pstrdup (r->pool, foo);
+ for (p = agent; *p; ++p)
+ {
+ if (isupper (*p))
+ {
+ *p = tolower (*p);
+ }
+ }
+ }
+
+ if (agent
+ && strstr (agent, "msie")
+ && ! strstr (agent, "opera")
+ && ! strstr (agent, "oregano"))
+ {
+ time (&now);
+ tmp = localtime (&now);
+ if (tmp->tm_wday == 5)
+ {
+ ret = 1;
+ }
+ }
+
+ return ret;
+}
+
+static int handle_msff (request_rec *r)
+{
+ if (msff (r))
+ {
+ dump_message (r);
+ return OK;
+ }
+ else
+ {
+ return DECLINED;
+ }
+}
+
+module MODULE_VAR_EXPORT msff_module;
+
+static const command_rec msff_cmds[] =
+{
+ { NULL }
+};
+
+static const handler_rec msff_handlers[] =
+{
+ { "*/*", handle_msff },
+ { NULL }
+};
+
+module MODULE_VAR_EXPORT msff_module =
+{
+ STANDARD_MODULE_STUFF,
+ NULL, /* initializer */
+ NULL, /* dir config creater */
+ NULL, /* dir merger --- default is to override */
+ NULL, /* server config */
+ NULL, /* merge server config */
+ msff_cmds, /* command table */
+ msff_handlers, /* handlers */
+ NULL, /* filename translation */
+ NULL, /* check_user_id */
+ NULL, /* check auth */
+ NULL, /* check access */
+ NULL, /* type_checker */
+ NULL, /* fixups */
+ NULL, /* logger */
+ NULL, /* header parser */
+ NULL, /* child_init */
+ NULL, /* child_exit */
+ NULL /* post read-request */
+};