#include "mod_ptt.h" #include #include #define KUSERINFO "$userinfo$" #define KUSERID "$userid$" #define KUSERNAME "$username$" #define KUSERMONEY "$usermoney$" #define KTIMEYEAR "$timeyear$" #define KTIMEMONTH "$timemonth$" #define KTIMEMDAY "$timemday$" #define KTIMEWEEK "$timeweek$" #define KSERVERTIME "$servertime$" #define KTIMEHOUR "$hour$" #define KTIMEMINUTE "$minute$" #define KTIMESECOND "$second$" #define KMSGONLOAD "$MSGonLoad$" #define KFCSONLOAD "$FCSonLoad$" #define KHTMLTITLE "$HTMLtitle$" #define KSCROLLTITLE "$SCROLLtitle$" #define KBGCOLOR "$BGCOLOR$" #define KBGSOUND "$BGSOUND$" #define KINCHTML "$file:" char * ap_parseline(request_rec *r, const char *str, char *str_substiute[]) { int i, off=0; char *strbuf, *po; pool *p = r->pool; strbuf = pstrdup(p, str); if(str_substiute == NULL) return strbuf; for(i=0; str_substiute[i]!=NULL; i+=2) { off = 0; while(po = strstr(strbuf + off, str_substiute[i])) { *po = 0; strbuf = pstrcat(p, strbuf, str_substiute[i+1] !=NULL ? str_substiute[i+1] : "", po+strlen(str_substiute[i]), NULL); off += str_substiute[i+1] ? strlen(str_substiute[i+1]) : 0; } } return strbuf; } char * ap_standard_parseline(request_rec *r, char *str) { time_t now = time(NULL); pool *p = r->pool; char *str_substiute[]= // 關鍵字的代換表 { KUSERID, "ptt", KUSERNAME, "name", /* KTIMEYEAR, whatyear(p,&now), KTIMEMONTH,whatmonth(p,&now), KTIMEMDAY, whatday(p,&now), KTIMEWEEK, whatweek(p,&now), KSERVERTIME, whattime(p,&now), KTIMEHOUR, whathour(p,&now), KTIMEMINUTE, whatminute(p,&now), KTIMESECOND, whatsecond(p,&now), */ KUSERINFO, NULL, KUSERMONEY, "100", NULL,NULL }; return ap_parseline(r, str, str_substiute); } int ap_showfile(request_rec *r, char *filename, char *table[], char *t2[], FILE *fo) { pool *p = r->pool; FILE *fp = pfopen(p, filename, "r"); char *str, *incfile, buf[512]; if (!fp) { #if DEBUG rputs(filename, r); #endif return -1; } while (fgets(buf, 512, fp)) { str = ap_standard_parseline(r, ap_parseline(r, ap_parseline(r, buf, table), t2)); if ((incfile = strstr(str, KINCHTML)) != NULL) { incfile += strlen(KINCHTML); incfile = strtok(incfile, "$"); #if 0 if (*incfile != '/') incfile = ap_pstrcat(p, TEMPLATEDIR "/", incfile, NULL); #endif ap_showfile(r, incfile, table, t2, fo); } else if(fo) fputs(str, fo); else rputs(str, r); } pfclose(p, fp); return 0; } char * add_href(pool *p, char *l) { char *href[] = {"http://", "ftp://", "gopher://", "file://", "telnet://", "mailto:", NULL}, *end, url[PATHLEN], *tl, *po; int i, urllen, off; tl = pstrdup(p, l); for(i=0; href[i]!=NULL; i++) { off = 0; //Ptt: while 應該用 while 但 while 有bug if((po = strstr(tl + off, href[i]))) { for(end = po; (*end>='&' && *end<='z')||*end=='~' ; end++); urllen = end - po; if(urllen > PATHLEN) { off += PATHLEN; continue; } strncpy(url, po, urllen); *po= 0; url[urllen] = 0; tl = psprintf(p, "%s%s%s", tl, url, "new", url, end); off += 2 * urllen + 15; } } return tl; } /* format: char *name, void *ptr, size_t length char *name, int *ptr, -1 char *name, char **ptr, 0 */ int GetQueryDatas(request_rec *r, int **table) { int rc, i, match=0, dlen, maxlen; char *name, *value, *str; pool *p = r->pool; for(i=1; table[i]!=NULL; i+=3) { if((int) table[i+1]) *table[i]=0; else (char *) (*table[i]) = pstrdup(p, ""); } do { if((rc = unescape(r, &name, &value))<0) break; for(i=0; table[i]; i+=3) { if(!strcmp((char *)table[i], name)) break; #if 0 /* SiE990313 test: 抓 未定義的變數 */ if(!strcmp((char *)table[i], "$SPARE$")) { (char *) (*table[i + 1]) = pstrdup(p, name); continue; } #endif } if(table[i] && table[i+1]) { if((maxlen = (int) table[i+2]) > 0) { if(!*value) continue; dlen = strlen((char *)table[i+1]); str = ap_escape_html(p, value); if(maxlen > dlen) strexam( strncat((char *)table[i+1],str,maxlen-dlen) ); } else if((int) table[i+2] == 0) // for file upload { // str = ap_escape_html(p, value); //if(value) (*table[i+1]) = (int) value; // else (*table[i+1]) = (int) pstrdup(p,""); } else { if(!*value) continue; *(table[i+1]) += atoi(value); } match++; } } while(rc>0); return match; } int ap_url_redirect(request_rec *r, char *url) { r->status = REDIRECT; ap_table_setn(r->headers_out, "Location", pstrdup(r->pool, url)); return MOVED; //return REDIRECT, MOVED 或 HTTP_SEE_OTHER 都可 } char * pint2str(pool* p, int c) { return ap_psprintf(p,"%d",c); } char* preplace(request_rec *r, char* src, char* sig, char* rep) { char *ptr; int siglen=strlen(sig), off=0; while((ptr = strstr(src+off,sig))) { *ptr = 0; src = pstrcat(r->pool, src, rep, NULL); off = strlen(src); src = pstrcat(r->pool, src, ptr+siglen, NULL); } return src; } int hex2dig(char *str) { int base,ret=0,i,len=strlen(str); for(i=0; i='a' && str[i]<='f') base = str[i]-'a'+10; else if(str[i]>='A' && str[i]<='F') base = str[i]-'A'+10; else if(str[i]>='0' && str[i]<='9') base = str[i]-'0'; else return -1; ret += base*pow(16,len-i-1); } return ret; } char * pstrncpy(pool* p, char tmp[], int n) { char *ptr; ptr=pstrdup(p,tmp); *(ptr+n)=0; return psprintf(p,"%s",ptr); } char * GetPathToken(request_rec *r, int count) { char *str, *token, *sepr = "/\\?&"; int i; str = pstrdup(r->pool, r->path_info + 1); token = strtok(str, sepr); for( i = 1 ; i < count; i++) { token = strtok(NULL, sepr); if(!token) return "-1"; /* Heat:count超過也要考慮 */ } return token; } /* 個人信件夾檔保管方式: mail/@/rec/FF/F/UUDDTT mail/@/dat/FF/F/UUDDTT */