From a4b63af2e11d67a8f3f5b49290ec129ebc27bf2a Mon Sep 17 00:00:00 2001 From: stskeeps Date: Sat, 14 Jul 2001 21:04:16 +0000 Subject: [PATCH] +- Commited the web server prototype made by Stskeeps, web design by WildChild --- Changes | 1 + html/back/background.jpg | Bin 0 -> 48243 bytes html/html/index.phtml | 107 ++++++ html/html/main.html | 107 ++++++ html/icons/conffiles.jpg | Bin 0 -> 8113 bytes html/icons/modules.jpg | Bin 0 -> 8398 bytes html/icons/opers.jpg | Bin 0 -> 8360 bytes html/icons/settings.jpg | Bin 0 -> 8880 bytes html/icons/stats.jpg | Bin 0 -> 8908 bytes html/icons/users.jpg | Bin 0 -> 7848 bytes html/index.html | 56 +++ html/sections/active.gif | Bin 0 -> 116 bytes html/sections/inactive.gif | Bin 0 -> 79 bytes html/unrealircd.com/active.gif | Bin 0 -> 139 bytes html/unrealircd.com/inactive.gif | Bin 0 -> 132 bytes include/modules/web/httpd.h | 64 ++++ src/modules/Makefile.in | 5 + src/modules/web/httpd.c | 617 +++++++++++++++++++++++++++++++ src/modules/web/phtml.c | 184 +++++++++ src/modules/web/u_stats.c | 88 +++++ src/modules/web/vfs.c | 129 +++++++ 21 files changed, 1358 insertions(+) create mode 100644 html/back/background.jpg create mode 100644 html/html/index.phtml create mode 100644 html/html/main.html create mode 100644 html/icons/conffiles.jpg create mode 100644 html/icons/modules.jpg create mode 100644 html/icons/opers.jpg create mode 100644 html/icons/settings.jpg create mode 100644 html/icons/stats.jpg create mode 100644 html/icons/users.jpg create mode 100644 html/index.html create mode 100644 html/sections/active.gif create mode 100644 html/sections/inactive.gif create mode 100644 html/unrealircd.com/active.gif create mode 100644 html/unrealircd.com/inactive.gif create mode 100644 include/modules/web/httpd.h create mode 100644 src/modules/web/httpd.c create mode 100644 src/modules/web/phtml.c create mode 100644 src/modules/web/u_stats.c create mode 100644 src/modules/web/vfs.c diff --git a/Changes b/Changes index 5234d9bbf..328f50869 100644 --- a/Changes +++ b/Changes @@ -687,3 +687,4 @@ seen. gmtime warning still there - Documentation bug fix - Changed version to -beta1 - Various preparitions for beta1 +- Commited the web server prototype made by Stskeeps, web design by WildChild \ No newline at end of file diff --git a/html/back/background.jpg b/html/back/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c763fe71060b6b328101f32a4b15ed3565d5ad3f GIT binary patch literal 48243 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 literal 0 HcmV?d00001 diff --git a/html/html/index.phtml b/html/html/index.phtml new file mode 100644 index 000000000..589c37ed0 --- /dev/null +++ b/html/html/index.phtml @@ -0,0 +1,107 @@ + + + + + +$ TITLE + + + + + +
+
Operators
+ +
+
Stats
+
+
+
+ + +
+
+
+
+
+
+
+ +$ SECTION + +

+
+
+ + + + +
+$ DATA +
+
+

+
+

+ + + \ No newline at end of file diff --git a/html/html/main.html b/html/html/main.html new file mode 100644 index 000000000..84c85e81d --- /dev/null +++ b/html/html/main.html @@ -0,0 +1,107 @@ + + + + + UnrealIRCdConfig + + + + +
+
Operators
+ +
+
Stats
+
+
+
+ + +
+
+
+
+
+
+
+ Section Title +

+
+
+ + + + +
+

Radio one Radio two

+

+

+
+
+

+
+

+ + + \ No newline at end of file diff --git a/html/icons/conffiles.jpg b/html/icons/conffiles.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0ba962cffafebe71394f1f907608ed22e4f92c2 GIT binary patch literal 8113 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 bDYTZ5!bz`P?aMNjyrb_dIuBhMAtwJ13YJXX literal 0 HcmV?d00001 diff --git a/html/icons/modules.jpg b/html/icons/modules.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b908e3b6e13f083123c7fce5bd6019d1b5ea4c1a GIT binary patch literal 8398 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 F{|E4G?NtB( literal 0 HcmV?d00001 diff --git a/html/icons/opers.jpg b/html/icons/opers.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a84cc12f01f93fc71230f95ccb6fe14ae73370a GIT binary patch literal 8360 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

mc~0SD*8C{#Z#O;@rE?IPgs~?6`>ZWMo<{?wjv` zaC|-G9mf>qE~v}N(Ry*-*atR8h{Rq-qg(xmY@^i%n|Wb&AA~TAi3y-mT~Cedtz?l% zTCR!9=TuhUYG+B*DhTB`0TLLfL~hYJhvHo`1|1K&=amZKs%bJbIqOEQY?zWtmqZPO*Og` zZ^}~~X!}4(VFWwt+{AG3+wP-6YeVS!;KyM@*6x~}553igECdfBPu8d%?QF+sZB=>2 zUgwLECTne_Gq$<*%{hhFPUhRf-z3)HU_xkKwC5AgK(M%tqB$9D3`w!HwD1b>9dgr7 zB@!K6Uzod=chuXth#&x*{^8m&w^PVd>Cc5W{SWh0V_8)XnLSHueywW-{`~x&ii=ci z^<-~C@x=-39+Xu<16ct+qBcHWL;wburFhBGc+Te;sM@TK2OM1=M*30e^e;aRPKGTH zV>q1#jb@*&?rxVOVE-pu7*Ff@L3Q-0sICqTb4*2LAz%1gRSP{e_)~3Gh|cTBpK`1j zupVlIKzQG^CL*~9x@Kz*=1n^ok7c;j;#43y{+Qzeb59Cr^l$e%lM z+qz>yR8Tp{(@_b%2$kCK+qf0`e{!#)cfG5Oa!6}QT&c8sM8VJ2gKy@9ooV7J%#Wet zyVb1|9%mQlK&2#wro;0>`|L?ict&?ml-#s*;UN2 zRkkbXgdL!aI^y4}`(Y-Lkj$U~tpYW{U#g}gTfXUXZlbP$B{xR>+MzOktX``D+lMmp zYa}~_vTdc5w8ZK3IB`W42@-E(>Oe-JU*9sZ)==3x)V%${`NMN|fHOAs^QYl2#P;k= zbCK>M6|veSaRaFikxbc3DJ(ywnCN(ut>$t?Ha|_}TKtGpV6xzp-`MV8T9tBIIMX|U zt#dh?JTX}hP#;k7Z%ZK}Cf(lWbZV$17BGr{B(|vvck)xI3zv;FWh}N<8d1Elvs&ln z{nF!BJ?(dG+Y=NfW~SO6m*Waa$R~c7`Dzc4vH`At+hk{#y(`(gP7`U~{C@p~$dH;Z zfNK6o0y9T#W*-bOBUwn)DAs_Jz9b6>#LS6Ex0R2<}+mBj65w21lJ^od(T^W}J}=I1+OQH{d}0rQ)ppJJbe4A-nB1-;V7`K&4C?l}L~KZ{@a3Aftx$j@!fa6_oH)h*lJh^gB` z$awceWev|l%g{a@Zgte$Q)cDGT=cnD1EcDX;=tj`b zo2?snr%>0204YwtGw5c&a#{BNeHW?%jXEMrwdH0BDi@AumH|i}oBSRJ>xtL}Y-YJh zyv7_ojnsPcYQ_eBiQ~Wa-Ad$vy5q;0cQG?+k(EYTd?Ip?=?Hrzt3d~GnYHKBVnT7X zxK%PeI(n4GiPPCmB#{I}^q5-kf+PX1U6b}Id8 zx>{Ld`&CA`o{5s_I|jX# zy&PZRBtMGAjOZ$ZUmi0Tb8Wta5%366laGn<-7Fblg70#SZKfEUBQ3&XRW$8zS{*!K zx@5%cQ~Y6ihsS)U-e`^erj3m>#d>K1)RBy;T#tw8!{{Vm2#iCEEQdm8+?liO)ZcL$ zFw^9|_dA8Rdv+Y^71xP!o%42C@UF08;>q2Lcy2f}a0L3&>)jXe zAX3PvYN?`g*0@J#%C`QSZSaT4T&zU6lygSW;m@rXK|M5Nz$~ynR@00at*Z4AAE1eK z+c1&pq<+gpBnn-Q?r36ez`O|WBeVLreBIB|A`#K{{JqA-BhLFH<1Gc&;zA7uSHEaX zO_j$u&V4eVz&2_D{80`_W5AByW8td*rD;pmRziu72D>B1u|8iI>MY0&e>YomwQW>q zCcO0d#?k|mo)n)~kLvqe@%c~=@)Y78=GWeXWmiO4&!Kl&M0@-F2qa)I0jPy&^zuvP zeU}v;yCxK-6rPQl<2mKX1 z*T3%dp?~CEo$ZuN5u>`lhH~Hs*P2yj$efmwJY&a^6QI&3i^j!pkwH?lzF~jqcNGMx z4@2YXyFAmX8I^^Qhg#K52er@^iV>3DWuS`iyL1*J_Y6Q=rOuETj2>j0+c|LyjoL|I zE$yeSXX+haU$w4`QU&XN5)1et;xyN=9}dZ>T(hypOLyn@nE%CHH#cPOGd(;r)_LU; z-qUVXAWWZPCrcsB`KU7Cj$S8h#9seiV$9ckRaI2v?E{5h=`^!Lg{_qYP8fG<2dA2h zSP_;OJD(HoB)7GjEK_|coW|Uis!2gk6Qxzbh;Pa;*(o@>NM10aGhv!cAAe*6pM!`; zFP(eMv%B}0CL_B~+&sNPs2;+xsy}ELI~-DKzJ#^>-gcg>$k6G^sm=yXDgBLxlcBkV z@1lQ(Ks|qZASJIj`s}gIs}48&$PNqTw_8KdFZjH3zhOS*wPwlQV-kvvcIdo|yb1#K zhdZ6>>S{wkYm_X4xf+!vM{`c08F;U>fwcU^R{J0# z05Ne$NH(ULWj>lE5CTdRxnyjf)gwCovX^%_`&8q?9cK z(pHc1+Ex_1Xq3;Q-8eVjA%GngE&tDsx^kcBl;c-ALJzyfzUj;3jS64w$AF)ARmBge zO4kv1=max|I!z2_?~0Sk89_34aj<&3XR3rUpFJ3MslOQHhOP{8h9t&d7xPyt%~WaT zE(FksEUBw*obf? zEQ*zx$}RbsN(+_4pc&QZCh)mZL1bpj5*T4$RQ7(u^ifFQG^kZ6W38qc!>8LmAnuIB$ zu=V9L=GKQ0q4v`Jcn|g#SbLl!Ss3~p0rVW!K`X7cn_2E9R57EU8#vTn2wN>uoSuK( zO@Wxr)LSxEQgl!>zMZ;sv$*4PU1@yZU$bJRG{q`l#~3Y}z|VaW0gOOX8}}!oG!5q` zixB|#Z1dRQYUWf)P}=>Bd;JH7 zL}#^t43nLYiK+SU^pJj||xYoHE1r&2ldH1a;~2@#lDqjMFRIg5D}ZOj8~m!)Iz!0q?LB{A9Jn@9 zIC)h%9$&hm12>gtnJ6Wpx8iZZ5>^jt;7j*y%-OF6i4rklJhQ3ZS{Dv+lrJ=2+Uy?? zPmO-@SaqekL`*PB?PXP`?bX2gCu-RK6i@WRWN$3xv$LV4dJTeyUd25$a-k(mqpc9j zPHoW6W7-f2UuBn#^9BZ!`e1O8R(iYHuX4mh`b@yxh}w5Jqdlfa%H;*l($7#5DeGyW z?maxvE}HnKi_f2$U^l$sM8(EZxFU2Mc@}bacewUR^>Cv(4NT-${o%kwVVH-f))F_3 zt6+1{EU*oFg4LUVKPP`YN5}g_uhVwgi4T(FwhUe)2yUa}tqw0Offd!&t9AE=5Tr;y zf(NU7p6%!2!`B<8Gcr+RQ4R_4oDY#`Gkn-Yc%Ejp`YnCW@mQK|&e0%!-%oMt!T1NB z7o$)qBL)e{c>lW?@9w?M5?+CArmynb_gcCNj~GC}sY0OOcisp4c@N2D(Gy9YGUIbG zY$xV1q%w6^07ai5$jeKwNf844^nBUsRrDB!(kJhc7cpO8bPbu6ci^&Rq2klrMKW7g zMT2UA!lD*ZlM)v{Ykx5nm8LuA3T literal 0 HcmV?d00001 diff --git a/html/icons/settings.jpg b/html/icons/settings.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f04d9c1d4b596d2024b0148cedb46c908315a164 GIT binary patch literal 8880 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 literal 0 HcmV?d00001 diff --git a/html/icons/stats.jpg b/html/icons/stats.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd7f4e691d43834cb13a8dd052ab6240792eec53 GIT binary patch literal 8908 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 I6m;f)0Lk>)4*&oF literal 0 HcmV?d00001 diff --git a/html/icons/users.jpg b/html/icons/users.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0019333fc2c64140f827dc32909fc0fbbb03c093 GIT binary patch literal 7848 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 wvvkU@PQ7A loader + +





+

+ \ No newline at end of file diff --git a/html/sections/active.gif b/html/sections/active.gif new file mode 100644 index 0000000000000000000000000000000000000000..a8bbfc775d5557ae8263884465c6d9f0b618ef34 GIT binary patch literal 116 zcmV-)0E_=eNk%w1VQ&Bv0Du4hsnP%L_WvvZ0001Q022TJ0#k&KsmtvTqgqEX literal 0 HcmV?d00001 diff --git a/html/sections/inactive.gif b/html/sections/inactive.gif new file mode 100644 index 0000000000000000000000000000000000000000..2de35562a3729858bd349cf5baeaa1f62d5aea3c GIT binary patch literal 79 zcmZ?wbhEHb%x4g0XkcJ?_w7Fe1A`6_Gk`=GnDkouSDt>$zj)4;Tiu)Q?fK2$_Q+$} iv(9C&PHlU~ef*Qp^>4k;f1UgOkDrID{YU^KgEauC>LXhK literal 0 HcmV?d00001 diff --git a/html/unrealircd.com/active.gif b/html/unrealircd.com/active.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f16e798634a2e7d3bf28e9c7a9a99b0e26a48e1 GIT binary patch literal 139 zcmZ?wbhEHbjAY|3IJvVt_;#n6i5MSDs!gu)wDl~^fkB>%32tdK z+g3HMi{Ux_{>34St)KtCoc%Vy?(T_GLtZX +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#include +#include +#include +#endif +#include +#include "h.h" +#ifdef STRIPBADWORDS +#include "badwords.h" +#endif +#ifdef _WIN32 +#include "version.h" +#endif +#include "threads.h" +#include "modules/web/httpd.h" + +SOCKET httpdfd = -1; + +void httpd_socketthread(void *req); +void httpd_acceptthread(void *p); + +int h_u_stats(HTTPd_Request *r); +int h_u_vfs(HTTPd_Request *r); +int h_u_phtml(HTTPd_Request *r); + + +#ifndef DYNAMIC_LINKING +ModuleInfo httpd_info +#else +#define httpd_info mod_header +ModuleInfo mod_header +#endif + = { + 2, + "httpd", /* Name of module */ + "$Id$", /* Version */ + "httpd", /* Short description of module */ + NULL, /* Pointer to our dlopen() return value */ + NULL + }; + + + +void httpd_sendfile(HTTPd_Request *r, char *filename) +{ + int xfd = open(filename, O_RDONLY); + if (xfd) + { + while (read(xfd, &r->inbuf[0], 1)) + { + FDwrite(r->fd,&r->inbuf[0], 1); + } + } + close(xfd); +} + +/* + * Helper function +*/ + +void sockprintf(SOCKET fd, char *format, ...) +{ + va_list ap; + char buffer[1024]; + char *ptr; + + va_start(ap, format); + vsprintf(buffer, format, ap); + strcat(buffer, "\r\n"); + va_end(ap); + FDwrite(fd, buffer, strlen(buffer)); +} +/* The purpose of these ifdefs, are that we can "static" link the ircd if we + * want to +*/ + +/* This is called on module init, before Server Ready */ +#ifdef DYNAMIC_LINKING +DLLFUNC int mod_init(int module_load) +#else +int httpd_init(int module_load) +#endif +{ + add_HookX(HOOKTYPE_HTTPD_URL, h_u_stats, NULL); + add_HookX(HOOKTYPE_HTTPD_URL, h_u_vfs, NULL); + add_HookX(HOOKTYPE_HTTPD_URL, h_u_phtml, NULL); + +} + +/* Is first run when server is 100% ready */ +#ifdef DYNAMIC_LINKING +DLLFUNC int mod_load(int module_load) +#else +int httpd_load(int module_load) +#endif +{ + THREAD thread; + THREAD_ATTR attr; + + struct SOCKADDR_IN sin; + if ((httpdfd = socket(AFINET, SOCK_STREAM, 0)) == -1) + { + config_error("httpd: could not create socket"); + httpdfd = -1; + return -1; + } + sin.SIN_ADDR.S_ADDR = inet_addr("0.0.0.0"); + sin.SIN_PORT = htons(8091); + sin.SIN_FAMILY = AFINET; + if (bind(httpdfd, (struct SOCKADDR *)&sin, sizeof(sin))) + { + config_error("httpd: could not bind: %s", + strerror(ERRNO)); + CLOSE_SOCK(httpdfd); + httpdfd = -1; + return -1; + } + + listen(httpdfd, LISTEN_SIZE); + IRCCreateThread(thread, attr, httpd_acceptthread, NULL); + return 0; +} + + +/* Called when module is unloaded */ +#ifdef DYNAMIC_LINKING +DLLFUNC void mod_unload(void) +#else +void httpd_unload(void) +#endif +{ + del_HookX(HOOKTYPE_HTTPD_URL, h_u_stats, NULL); + del_HookX(HOOKTYPE_HTTPD_URL, h_u_vfs, NULL); + del_HookX(HOOKTYPE_HTTPD_URL, h_u_phtml, NULL); +} + +/* + * copyright (c) 2000 Todor Prokopov + * from the CGI library, under the GPL +*/ +static int urldecode(char *s) +{ + char *p = s; + + while (*s != '\0') + { + if (*s == '%') + { + s++; + if (!isxdigit(*s)) + return 0; + *p = (isalpha(*s) ? (*s & 0xdf) - 'A' + 10 : *s - '0') << 4; + s++; + if (!isxdigit(*s)) + return 0; + *p += isalpha(*s) ? (*s & 0xdf) - 'A' + 10 : *s - '0'; + } + else if (*s == '+') + *p = ' '; + else + *p = *s; + s++; + p++; + } + *p = '\0'; + return 1; +} + +int parse_urlenc(HTTPd_Request *request) +{ + unsigned int i; + unsigned int p; + int param_count; + int content_length; + char **tempheaders; + char **tempvalues; + HTTPd_Header *h; + char *buf; + + content_length = request->content_length; + buf = request->inbuf; + + if (content_length != 0) + { + param_count = 1; + for (i = 0; i < content_length; i++) + if (buf[i] == '&') + param_count++; + i = 0; + p = 0; + tempheaders = (char **)MyMallocEx(sizeof(char *) * param_count); + tempvalues = (char **)MyMallocEx(sizeof(char *) * param_count); + while (i < content_length) + { + tempheaders[p] = buf + i; + while (i < content_length && buf[i] != '=' && buf[i] != '&') + i++; + if (i >= content_length || buf[i] != '=') + { + MyFree(tempheaders); + MyFree(tempvalues); + return 0; + } + buf[i] = '\0'; + i++; + tempvalues[p] = buf + i; + while (i < content_length && buf[i] != '=' && buf[i] != '&') + i++; + if (i < content_length) + { + if (buf[i] != '&') + { + MyFree(tempheaders); + MyFree(tempvalues); + return 0; + } + buf[i] = '\0'; + i++; + } + if (!urldecode(tempheaders[p]) || !urldecode(tempvalues[p])) + { + MyFree(tempheaders); + MyFree(tempvalues); + return 0; + } + p++; + } + } + for (i = 0; i < p; i++) + { + h = (HTTPd_Header *) MyMallocEx(sizeof(HTTPd_Header)); + h->name = strdup(tempheaders[i]); + h->value = strdup(tempvalues[i]); + h->next = request->dataheaders; + request->dataheaders = h; + } + MyFree(tempheaders); + MyFree(tempvalues); + return 1; +} + +/* Normal copyright applies here */ + +char *GetField(HTTPd_Header *header, char *name) +{ + HTTPd_Header *p; + for (p = header; p; p = p->next) + if (!strcasecmp(p->name, name)) + return (p->value); + return NULL; + +} + +char *GetHeader(HTTPd_Request *request, char *name) +{ + HTTPd_Header *p; + for (p = request->headers; p; p = p->next) + if (!strcasecmp(p->name, name)) + return (p->value); + return NULL; +} + +void httpd_standard_headerX(HTTPd_Request *request, char *type, int extra) +{ + char datebuf[100]; + sockprintf(request->fd, "HTTP/1.1 200 OK"); + sockprintf(request->fd, "Server: UnrealIRCd HTTPd"); + sockprintf(request->fd, "Connection: close"); + sockprintf(request->fd, "Date: %s", (char *) rfctime(time(NULL), datebuf)); + sockprintf(request->fd, "Content-Type: %s", type); + if (extra != 1) + sockprintf(request->fd, ""); +} + +void httpd_standard_header(HTTPd_Request *request, char *type) +{ + httpd_standard_headerX(request, type, 0); +} + +void httpd_404_header(HTTPd_Request *request, char *path) +{ + char datebuf[100]; + sockprintf(request->fd, "HTTP/1.1 404 Not Found"); + sockprintf(request->fd, "Server: UnrealIRCd HTTPd"); + sockprintf(request->fd, "Connection: close"); + sockprintf(request->fd, "Date: %s", (char *) rfctime(time(NULL), datebuf)); + sockprintf(request->fd, "Content-Type: text/html"); + sockprintf(request->fd, ""); + sockprintf(request->fd, "Not Found
Could not find %s
", + path); +} + +void httpd_304_header(HTTPd_Request *request) +{ + char datebuf[100]; + sockprintf(request->fd, "HTTP/1.1 304 Not Modified"); + sockprintf(request->fd, "Server: UnrealIRCd HTTPd"); + sockprintf(request->fd, "Connection: close"); + sockprintf(request->fd, "Date: %s", (char *) rfctime(time(NULL), datebuf)); + sockprintf(request->fd, "Content-Type: text/html"); + sockprintf(request->fd, ""); +} + + +void httpd_400_header(HTTPd_Request *request, char *why) +{ + char datebuf[100]; + sockprintf(request->fd, "HTTP/1.1 400 Internal Server Error"); + sockprintf(request->fd, "Server: UnrealIRCd HTTPd"); + sockprintf(request->fd, "Connection: close"); + sockprintf(request->fd, "Date: %s", (char *) rfctime(time(NULL), datebuf)); + sockprintf(request->fd, "Content-Type: text/html"); + sockprintf(request->fd, ""); + sockprintf(request->fd, "%s
", + why); +} + +void httpd_parse_final(HTTPd_Request *request) +{ + if (request->method == 0) + { + char *cl; + + cl = GetHeader(request, "Content-Length:"); + if (!cl) + { + sockprintf(request->fd, "Missing content-length header.."); + return; + } + request->content_length = atoi(cl); + if (request->content_length <= 1023) + { + request->state = 2; + } + } + else + { + RunHookReturn(HOOKTYPE_HTTPD_URL, request, >0); + httpd_404_header(request, request->url); + return; + } +} + +void httpd_badrequest(HTTPd_Request *request, char *reason) +{ + sockprintf(request->fd, "HTTP/1.1 400 Bad Request"); + sockprintf(request->fd, "Server: UnrealIRCd HTTPd"); + sockprintf(request->fd, "Connection: close"); + sockprintf(request->fd, "Content-Type: text/plain"); + sockprintf(request->fd, ""); + sockprintf(request->fd, "%s", reason); +} + +int httpd_parse(HTTPd_Request *request) +{ + if (request->state == 0) + { + char *cmd; + + cmd = strtok(request->inbuf, " "); + if (!cmd) + { + httpd_badrequest(request, "Bad protocol start"); + return -1; + } + else + { + if (!strcmp(cmd, "GET") || !strcmp(cmd, "POST")) + { + char *url; + + url = strtok(NULL, " "); + if (!url) + { + httpd_badrequest(request, "Missing parameter"); + return -1; + } + else + { + request->url = strdup(url); + request->state = 1; + request->method = !strcmp(cmd, "GET") ? 1 : 0; + return 1; + } + + } + else + httpd_badrequest(request, cmd); + return -1; + } + return 1; + } + else if (request->state == 1) + { + char *headername; + char *headerdata; + + headername = strtok(request->inbuf, " "); + if (!headername) + { + httpd_parse_final(request); + if (request->state > 1) + { + return 1; + } + else + return -1; + } + else + { + headerdata = strtok(NULL, ""); + if (!headerdata) + { + httpd_badrequest(request, "Malformed headers"); + return -1; + } + else + { + HTTPd_Header *header; + + header = (HTTPd_Header *) MyMalloc(sizeof(HTTPd_Header)); + header->name = strdup(headername); + header->value = strdup(headerdata); + header->next = request->headers; + request->headers = header; + return 1; + } + } + } else if (request->state == 2) + { + if (parse_urlenc(request)) + { + RunHookReturn(HOOKTYPE_HTTPD_URL, request, >0) -1; + httpd_404_header(request, request->url); + return -1; + } + else + { + httpd_badrequest(request, "Bad encoding"); + } + return -1; + } +} + + + +void httpd_acceptthread(void *p) +{ + + SOCKET callerfd; + HTTPd_Request *req; + + THREAD thread; + THREAD_ATTR thread_attr; + + while (1) + { + callerfd = accept(httpdfd, NULL, NULL); + if (callerfd >= 0) + { + req = (HTTPd_Request *)MyMallocEx(sizeof(HTTPd_Request)); + req->fd = callerfd; + IRCCreateThread(thread, thread_attr, httpd_socketthread, (void *)req); + } + } +} + + + +void httpd_socketthread(void *req) +{ + HTTPd_Request *request = (HTTPd_Request *)req; + HTTPd_Header *hp, *hp2; + fd_set rfds; + struct timeval tv; + int retval, retval2; + tv.tv_sec = 10; + tv.tv_usec = 0; + FD_ZERO(&rfds); + FD_SET(request->fd, &rfds); + + while (request->pos < 1024) + { + if (retval = select(request->fd + 1, &rfds, NULL, NULL, &tv)) + { + while ((retval2 = recv(request->fd, &request->inbuf[request->pos], 1, 0)) >= 0) + { + if (request->state != 2) + { + if (request->inbuf[request->pos] == '\n') + { + request->inbuf[request->pos + 1] = '\0'; + iCstrip(request->inbuf); + if (httpd_parse(request) < 0) + { + request->pos = 1024; + break; + } + else + request->pos = 0; + } + else + { + request->pos++; + } + if (request->pos >= 1024) + { + break; + } + } + else + { + request->pos++; + if (request->pos >= 1024) + break; + if (request->pos == request->content_length) + { + request->inbuf[request->pos + 1] = '\0'; + request->pos = 1024; + httpd_parse(request); + break; + } + } + } + if (request->pos >= 1024) + break; + + if (retval2 < 0) + request->pos = 1024; + else + request->pos += retval2; + } + else + { + if (retval < 0) + { + request->pos = 1024; + } + } + } + +end: + CLOSE_SOCK(request->fd); + if (request->url) + MyFree(request->url); + + hp = request->headers; + while (hp) + { + if (hp->name) + MyFree(hp->name); + if (hp->value) + MyFree(hp->value); + hp2 = hp; + hp = hp->next; + MyFree(hp2); + } + hp = request->dataheaders; + while (hp) + { + if (hp->name) + MyFree(hp->name); + if (hp->value) + MyFree(hp->value); + hp2 = hp; + hp = hp->next; + MyFree(hp2); + } + MyFree(request); + IRCExitThread(NULL); + return; +} \ No newline at end of file diff --git a/src/modules/web/phtml.c b/src/modules/web/phtml.c new file mode 100644 index 000000000..292fe8794 --- /dev/null +++ b/src/modules/web/phtml.c @@ -0,0 +1,184 @@ +/* + UnrealIRCd internal webserver - Prototype HTML + Copyright (c) 2001, The UnrealIRCd Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * Neither the name of the The UnrealIRCd Team nor the names of its contributors may be used + to endorse or promote products derived from this software without specific prior written permission. + * The source code may not be redistributed for a fee or in closed source + programs, without expressed oral consent by the UnrealIRCd Team, however + for operating systems where binary distribution is required, if URL + is passed with the package to get the full source + * No warranty is given unless stated so by the The UnrealIRCd Team + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "config.h" +#include "struct.h" +#include "common.h" +#include "sys.h" +#include "numeric.h" +#include "msg.h" +#include "channel.h" +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#include +#include +#include +#endif +#include +#include "h.h" +#ifdef STRIPBADWORDS +#include "badwords.h" +#endif +#ifdef _WIN32 +#include "version.h" +#endif +#include "threads.h" +#include "modules/web/httpd.h" + +DLLFUNC int h_u_phtml(HTTPd_Request *r); + +#define soprintf sockprintf + +#define SECTION_OPERS 1 +#define SECTION_STATS 2 + +char *Titles[] = +{ + "", + "Operators", + "IRC Server Stats" +}; + +char *Icons[] = +{ + "", + "/icons/opers.jpg", + "/icons/stats.jpg" +}; + +char *Sections[] = +{ + "", + "IRC Operators", + "IRC Server Stats" +}; + +char *ButtonTexts[] = +{ + "", + "Operators", + "Stats" +}; + +char *ButtonURLs[] = +{ + "", + "/section/opers", + "/section/stats" +}; + +DLLFUNC int h_u_phtml(HTTPd_Request *r) +{ + int section = 0; + char buf[1024]; + char bbuf[1024]; + char *s; + FILE *f = NULL; + + f = fopen("html/html/index.phtml", "r"); + if (!f) + return 0; + if (!match("/section/opers", r->url)) + section = SECTION_OPERS; + if (!match("/section/stats", r->url)) + section = SECTION_STATS; + if (section < 1) + return 0; + + httpd_standard_header(r, "text/html"); + while (fgets(buf, 1023, f)) + { + iCstrip(buf); + strcpy(bbuf, buf); + if (*buf == '$' && (buf[1] == ' ')) + { + s = strtok(buf, " "); + if (s) + { + s = strtok(NULL, " "); + if (s) + { + if (!strcmp(s, "TITLE")) + { + sockprintf(r->fd, "%s", Titles[section]); + } + else + if (!strcmp(s, "ICON")) + { + sockprintf(r->fd, " src=\"%s\" ", + Icons[section]); + } + else + if (!strcmp(s, "SECTION")) + { + sockprintf(r->fd, "%s", + Sections[section]); + } + else + if (!strcmp(s, "DATA")) + { + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + sockprintf(r->fd, "TEST
"); + } + + } + else + sockprintf(r->fd, "%s", bbuf); + } + else + sockprintf(r->fd, "%s", bbuf); + } + else + sockprintf(r->fd, "%s", bbuf); + } + return 1; +} diff --git a/src/modules/web/u_stats.c b/src/modules/web/u_stats.c new file mode 100644 index 000000000..3b1b4b63a --- /dev/null +++ b/src/modules/web/u_stats.c @@ -0,0 +1,88 @@ +/* + UnrealIRCd internal webserver - /stats + Copyright (c) 2001, The UnrealIRCd Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * Neither the name of the The UnrealIRCd Team nor the names of its contributors may be used + to endorse or promote products derived from this software without specific prior written permission. + * The source code may not be redistributed for a fee or in closed source + programs, without expressed oral consent by the UnrealIRCd Team, however + for operating systems where binary distribution is required, if URL + is passed with the package to get the full source + * No warranty is given unless stated so by the The UnrealIRCd Team + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "config.h" +#include "struct.h" +#include "common.h" +#include "sys.h" +#include "numeric.h" +#include "msg.h" +#include "channel.h" +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#include +#include +#include +#endif +#include +#include "h.h" +#ifdef STRIPBADWORDS +#include "badwords.h" +#endif +#ifdef _WIN32 +#include "version.h" +#endif +#include "threads.h" +#include "modules/web/httpd.h" + +extern ircstats IRCstats; + +int h_u_stats(HTTPd_Request *r); + +#define soprintf sockprintf +DLLFUNC int h_u_stats(HTTPd_Request *r) +{ + HTTPd_Header *p; + if (!match("/stats", r->url)) + { + httpd_standard_header(r, "text/html"); + soprintf(r->fd, "Current user stats on %s", me.name); + soprintf(r->fd, "Clients: %li Invisible: %li Servers: %li
", + IRCstats.clients, IRCstats.invisible, IRCstats.servers); + soprintf(r->fd, "Unknown: %li My clients: %li My Servers: %li
", + IRCstats.unknown, IRCstats.me_clients, IRCstats.me_servers); + soprintf(r->fd, "My Peak: %li Global Peak: %li
", + IRCstats.me_max, IRCstats.global_max); + for (p = r->headers; p; p = p->next) + { + soprintf(r->fd, "%s = %s
", + p->name, p->value); + } + return 1; + } + return 0; +} diff --git a/src/modules/web/vfs.c b/src/modules/web/vfs.c new file mode 100644 index 000000000..5fdef657e --- /dev/null +++ b/src/modules/web/vfs.c @@ -0,0 +1,129 @@ +/* + UnrealIRCd internal webserver - Virtual File System + Copyright (c) 2001, The UnrealIRCd Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions + and the following disclaimer in the documentation and/or other materials provided with the + distribution. + * Neither the name of the The UnrealIRCd Team nor the names of its contributors may be used + to endorse or promote products derived from this software without specific prior written permission. + * The source code may not be redistributed for a fee or in closed source + programs, without expressed oral consent by the UnrealIRCd Team, however + for operating systems where binary distribution is required, if URL + is passed with the package to get the full source + * No warranty is given unless stated so by the The UnrealIRCd Team + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "config.h" +#include "struct.h" +#include "common.h" +#include "sys.h" +#include "numeric.h" +#include "msg.h" +#include "channel.h" +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#include +#include +#include +#endif +#include +#include "h.h" +#ifdef STRIPBADWORDS +#include "badwords.h" +#endif +#ifdef _WIN32 +#include "version.h" +#endif +#include "threads.h" +#include "modules/web/httpd.h" + +int h_u_vfs(HTTPd_Request *r); + +typedef struct _vfs_table VFStable; + +struct _vfs_table +{ + char *filename; + char *realfile; + char *ct; +}; + +VFStable vfsTable[] = +{ + {"/sections/active.gif", "html/sections/active.gif", "image/gif"}, + {"/sections/inactive.gif", "html/sections/inactive.gif", "image/gif"}, + {"/html/main.html", "html/html/main.html", "text/html"}, + {"/icons/conffiles.jpg", "html/icons/conffiles.jpg", "image/jpeg"}, + {"/icons/modules.jpg", "html/icons/modules.jpg", "image/jpeg"}, + {"/icons/opers.jpg", "html/icons/opers.jpg", "image/jpeg"}, + {"/icons/settings.jpg", "html/icons/settings.jpg", "image/jpeg"}, + {"/icons/stats.jpg", "html/icons/stats.jpg", "image/jpeg"}, + {"/icons/users.jpg", "html/icons/users.jpg", "image/jpeg"}, + {"/back/background.jpg", "html/back/background.jpg", "image/jpeg"}, + {"/unrealircd.com/active.gif", "html/unrealircd.com/active.gif", "image/jpeg"}, + {"/unrealircd.com/inactive.gif", "html/unrealircd.com/inactive.gif", "image/jpeg"}, + {"/", "html/index.html", "text/html"}, + {NULL, NULL, NULL} +}; +#define soprintf sockprintf + +DLLFUNC int h_u_vfs(HTTPd_Request *r) +{ + VFStable *p = &vfsTable[0]; + struct stat statf; + char *ims; + time_t tmt; + char datebuf[100]; + ims = GetHeader(r, "if-modified-since"); + while (p->filename) + { + if (!match(p->filename, r->url)) + { + stat(p->realfile, &statf); + if (ims) + { + if (tmt = rfc2time(ims) < 0) + { + httpd_400_header(r, "Bad date"); + return 1; + } + if (statf.st_mtime < tmt) + { + httpd_304_header(r); + return 1; + } + } + httpd_standard_headerX(r, p->ct, 1); + soprintf(r->fd, "Last-Modified: %s", + rfctime(statf.st_mtime, r->inbuf)); + soprintf(r->fd, ""); + + httpd_sendfile(r, p->realfile); + return 1; + } + p++; + } + return 0; +}