void DpsFilenceCheckLeaks(FILE *f) { if ( allocationList == NULL ) { /* FE_Abort("DpsFilenceCheckLeaks() called before first DpsOpen..().");*/ return; } lock(); { register Slot * slot = allocationList; register size_t count = slotCount; for ( ; count > 0; count-- ) { if ( slot->mode == ALLOCATED ) { fprintf(f ? f : stderr, "Unclosed FD.0x%x:%s at %s:%d\n", slot->fd, DPS_NULL2EMPTY(slot->path), slot->filename, slot->fileline); } slot++; } } release(); return; }
__C_LINK int __DPSCALL dps_wc_mb_8bit(DPS_CONV *conv, DPS_CHARSET *cs, const dpsunicode_t *wc, unsigned char *s, unsigned char *e) { DPS_UNI_IDX *idx; conv->icodes = conv->ocodes = 1; if ((conv->flags & DPS_RECODE_JSON_TO) && ((*wc > 0 && *wc < 0x20) || *wc == 0x22 || *wc == 0x5C)) { return DPS_CHARSET_ILUNI; } for(idx=cs->tab_from_uni; idx->tab ; idx++){ if(idx->from <= *wc && idx->to >= *wc){ s[0]=idx->tab[*wc - idx->from]; if ((conv->flags & DPS_RECODE_HTML_TO) && (strchr(DPS_NULL2EMPTY(conv->CharsToEscape), (int)s[0]) != NULL)) return DPS_CHARSET_ILUNI; if ((conv->flags & DPS_RECODE_URL_TO) && (s[0] == '!')) return DPS_CHARSET_ILUNI; if ((conv->flags & DPS_RECODE_JSON_TO) && (s[0] == '\\')) return DPS_CHARSET_ILUNI; return (!s[0] && *wc) ? DPS_CHARSET_ILUNI : 1; } } return DPS_CHARSET_ILUNI; }
int dps_wc_mb_tscii(DPS_CONV *conv, DPS_CHARSET *cs, const dpsunicode_t *wc, unsigned char *s, unsigned char *e) { conv->icodes = 1; conv->ocodes = 1; if (*wc < 0x7F) { s[0] = *wc; if ((conv->flags & DPS_RECODE_HTML_TO) && (strchr(DPS_NULL2EMPTY(conv->CharsToEscape), (int)s[0]) != NULL)) return DPS_CHARSET_ILUNI; if ((conv->flags & DPS_RECODE_URL_TO) && (s[0] == '!')) return DPS_CHARSET_ILUNI; return conv->ocodes; } switch(*wc) { case 0x00a0: s[0] = 0xA0; break; case 0x00a9: s[0] = 0xA9; break; case 0x0b83: s[0] = 0xB7; break; case 0x0b85: s[0] = 0xAB; break; case 0x0b86: s[0] = 0xAC; break; case 0x0b87: s[0] = 0xad; break; case 0x0b88: s[0] = 0xae; break; case 0x0b89: s[0] = 0xaf; break; case 0x0b8a: s[0] = 0xb0; break; case 0x0b8e: s[0] = 0xb1; break; case 0x0b8f: s[0] = 0xb2; break; case 0x0b90: s[0] = 0xb3; break; case 0x0b92: s[0] = 0xb4; break; case 0x0b93: s[0] = 0xb5; break; case 0x0b94: s[0] = 0xb6; break; case 0xb95: switch(wc[1]) { case 0x0b82: s[0] = 0xec; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xdc; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xcc; conv->icodes = 2; break; default: s[0] = 0xb8; } break; case 0xb99: switch(wc[1]) { case 0x0b82: s[0] = 0xed; conv->icodes = 2; break; case 0x0bc2: s[0] = 0x9b; conv->icodes = 2; break; case 0x0bc1: s[0] = 0x99; conv->icodes = 2; break; default: s[0] = 0xb9; } break; case 0xb9a: switch(wc[1]) { case 0x0b82: s[0] = 0xee; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xcd; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xdd; conv->icodes = 2; break; default: s[0] = 0xba; } break; case 0xb9c: switch(wc[1]) { case 0x0b82: s[0] = 0x88; conv->icodes = 2; break; default: s[0] = 0x83; } break; case 0xb9e: switch(wc[1]) { case 0x0b82: s[0] = 0xef; conv->icodes = 2; break; case 0x0bc1: s[0] = 0x9a; conv->icodes = 2; break; case 0x0bc2: s[0] = 0x9c; conv->icodes = 2; break; default: s[0] = 0xbb; } break; case 0xb9f: switch(wc[1]) { case 0x0b82: s[0] = 0xf0; conv->icodes = 2; break; case 0x0bbf: s[0] = 0xca; conv->icodes = 2; break; case 0x0bc0: s[0] = 0xcb; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xce; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xde; conv->icodes = 2; break; default: s[0] = 0xbc; } break; case 0xba1: switch(wc[1]) { case 0x0b82: s[0] = 0xf2; conv->icodes = 2; break; default: return DPS_CHARSET_ILUNI; /*s[0] = '?';*/ } break; case 0xba3: switch(wc[1]) { case 0x0b82: s[0] = 0xf1; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xcf; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xdf; conv->icodes = 2; break; default: s[0] = 0xbd; } break; case 0xba4: switch(wc[1]) { case 0x0bc1: s[0] = 0xd0; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xe0; conv->icodes = 2; break; default: s[0] = 0xbe; } break; case 0xba8: switch(wc[1]) { case 0x0b82: s[0] = 0xf3; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xd1; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xe1; conv->icodes = 2; break; default: s[0] = 0xbf; } break; case 0xba9: switch(wc[1]) { case 0x0b82: s[0] = 0xfd; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xdb; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xeb; conv->icodes = 2; break; default: s[0] = 0xc9; } break; case 0xbaa: switch(wc[1]) { case 0x0b82: s[0] = 0xf4; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xd2; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xe2; conv->icodes = 2; break; default: s[0] = 0xc0; } break; case 0xbae: switch(wc[1]) { case 0x0b82: s[0] = 0xf5; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xd3; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xe3; conv->icodes = 2; break; default: s[0] = 0xc1; } break; case 0xbaf: switch(wc[1]) { case 0x0b82: s[0] = 0xf6; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xd4; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xe4; conv->icodes = 2; break; default: s[0] = 0xc2; } break; case 0xbb0: switch(wc[1]) { case 0x0b82: s[0] = 0xf7; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xd5; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xe5; conv->icodes = 2; break; default: s[0] = 0xc3; } break; case 0xbb1: switch(wc[1]) { case 0x0b82: s[0] = 0xfc; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xda; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xea; conv->icodes = 2; break; default: s[0] = 0xc8; } break; case 0xbb2: switch(wc[1]) { case 0x0b82: s[0] = 0xf8; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xd6; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xe6; conv->icodes = 2; break; default: s[0] = 0xc4; } break; case 0xbb3: switch(wc[1]) { case 0x0b82: s[0] = 0xfb; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xd9; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xe9; conv->icodes = 2; break; default: s[0] = 0xc7; } break; case 0xbb4: switch(wc[1]) { case 0x0b82: s[0] = 0xfa; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xd8; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xe8; conv->icodes = 2; break; default: s[0] = 0xc6; } break; case 0xbb5: switch(wc[1]) { case 0x0b82: s[0] = 0xf9; conv->icodes = 2; break; case 0x0bc1: s[0] = 0xd7; conv->icodes = 2; break; case 0x0bc2: s[0] = 0xe7; conv->icodes = 2; break; default: s[0] = 0xc5; } break; case 0xbb7: switch(wc[1]) { case 0x0b82: s[0] = 0x89; conv->icodes = 2; break; default: s[0] = 0x84; } break; case 0xbb8: switch(wc[1]) { case 0x0b82: s[0] = 0x8a; conv->icodes = 2; break; default: s[0] = 0x85; } break; case 0xbb9: switch(wc[1]) { case 0x0b82: s[0] = 0x8b; conv->icodes = 2; break; default: s[0] = 0x86; } break; case 0x0bbe: s[0] = 0xa1; break; case 0x0bbf: s[0] = 0xa2; break; case 0x0bc0: s[0] = 0xa3; break; case 0x0bc1: s[0] = 0xa4; break; case 0x0bc2: s[0] = 0xa5; break; case 0x0bc6: s[0] = 0xa6; break; case 0x0bc7: s[0] = 0xa7; break; case 0x0bc8: s[0] = 0xa8; break; case 0x0bcc: s[0] = 0xaa; break; case 0x0be6: s[0] = 0x80; break; case 0xbe7: switch(wc[1]) { case 0x0bb7: if (wc[2] == 0x0b82) { conv->icodes = 3; s[0] = 0x8c; } else { conv->icodes = 2; s[0] = 0x87; } break; default: s[0] = 0x81; } break; case 0x0be8: s[0] = 0x8d; break; case 0x0be9: s[0] = 0x8e; break; case 0x0bea: s[0] = 0x8f; break; case 0x0beb: s[0] = 0x90; break; case 0x0bec: s[0] = 0x95; break; case 0x0bed: s[0] = 0x96; break; case 0x0bee: s[0] = 0x97; break; case 0x0bef: s[0] = 0x98; break; case 0x0bf0: s[0] = 0x9d; break; case 0x0bf1: s[0] = 0x9e; break; case 0x0bf2: s[0] = 0x9f; break; case 0x2018: s[0] = 0x91; break; case 0x2019: s[0] = 0x92; break; case 0x201c: s[0] = 0x93; break; case 0x201d: s[0] = 0x94; break; default: return DPS_CHARSET_ILUNI; /*s[0] = '?';*/ } return conv->ocodes; }
void RelLink(DPS_AGENT *Indexer, DPS_URL *curURL, DPS_URL *newURL, char **str, int ReverseAliasFlag) { const char *schema = newURL->schema ? newURL->schema : curURL->schema; const char *hostname = newURL->hostname ? newURL->hostname : curURL->hostname; const char *auth = newURL->auth ? newURL->auth : curURL->auth; const char *path = (newURL->path && newURL->path[0]) ? newURL->path : curURL->path; const char *fname = ((newURL->filename && newURL->filename[0]) || (newURL->path && newURL->path[0])) ? newURL->filename : curURL->filename; const char *query_string = newURL->query_string; char *pathfile = (char*)DpsMalloc(dps_strlen(DPS_NULL2EMPTY(path)) + dps_strlen(DPS_NULL2EMPTY(fname)) + dps_strlen(DPS_NULL2EMPTY(query_string)) + 5); int cascade; DPS_MATCH *Alias; char *alias = NULL; size_t aliassize, nparts = 10; DPS_MATCH_PART Parts[10]; if (newURL->hostinfo == NULL) newURL->charset_id = curURL->charset_id; if (pathfile == NULL) return; /* sprintf(pathfile, "/%s%s%s", DPS_NULL2EMPTY(path), DPS_NULL2EMPTY(fname), DPS_NULL2EMPTY(query_string));*/ pathfile[0] = '/'; dps_strcpy(pathfile + 1, DPS_NULL2EMPTY(path)); dps_strcat(pathfile, DPS_NULL2EMPTY(fname)); dps_strcat(pathfile, DPS_NULL2EMPTY(query_string)); DpsURLNormalizePath(pathfile); if (!strcasecmp(DPS_NULL2EMPTY(schema), "mailto") || !strcasecmp(DPS_NULL2EMPTY(schema), "javascript") || !strcasecmp(DPS_NULL2EMPTY(schema), "feed") ) { *str = (char*)DpsMalloc(dps_strlen(DPS_NULL2EMPTY(schema)) + dps_strlen(DPS_NULL2EMPTY(newURL->specific)) + 4); if (*str == NULL) return; /* sprintf(*str, "%s:%s", DPS_NULL2EMPTY(schema), DPS_NULL2EMPTY(newURL->specific));*/ dps_strcpy(*str, DPS_NULL2EMPTY(schema)); dps_strcat(*str, ":"); dps_strcat(*str, DPS_NULL2EMPTY(newURL->specific)); } else if(/*!strcasecmp(DPS_NULL2EMPTY(schema), "file") ||*/ !strcasecmp(DPS_NULL2EMPTY(schema), "htdb")) { *str = (char*)DpsMalloc(dps_strlen(DPS_NULL2EMPTY(schema)) + dps_strlen(pathfile) + 4); if (*str == NULL) return; /* sprintf(*str, "%s:%s", DPS_NULL2EMPTY(schema), pathfile);*/ dps_strcpy(*str, DPS_NULL2EMPTY(schema)); dps_strcat(*str, ":"); dps_strcat(*str, pathfile); }else{ *str = (char*)DpsMalloc(dps_strlen(DPS_NULL2EMPTY(schema)) + dps_strlen(pathfile) + dps_strlen(DPS_NULL2EMPTY(hostname)) + dps_strlen(DPS_NULL2EMPTY(auth)) + 8); if (*str == NULL) return; /* sprintf(*str, "%s://%s%s", DPS_NULL2EMPTY(schema), DPS_NULL2EMPTY(hostinfo), pathfile);*/ dps_strcpy(*str, DPS_NULL2EMPTY(schema)); dps_strcat(*str, "://"); if (auth) { dps_strcat(*str, auth); dps_strcat(*str,"@"); } dps_strcat(*str, DPS_NULL2EMPTY(hostname)); dps_strcat(*str, pathfile); } if(!strncmp(*str, "ftp://", 6) && (strstr(*str, ";type="))) *(strstr(*str, ";type")) = '\0'; DPS_FREE(pathfile); if (ReverseAliasFlag) { const char *alias_prog = DpsVarListFindStr(&Indexer->Vars, "ReverseAliasProg", NULL); if (alias_prog) { int result; aliassize = 256 + 2 * dps_strlen(*str); alias = (char*)DpsRealloc(alias, aliassize); if (alias == NULL) { DpsLog(Indexer, DPS_LOG_ERROR, "No memory (%d bytes). %s line %d", aliassize, __FILE__, __LINE__); goto ret; } alias[0] = '\0'; result = DpsAliasProg(Indexer, alias_prog, *str, alias, aliassize - 1); DpsLog(Indexer, DPS_LOG_EXTRA, "ReverseAliasProg result: '%s'", alias); if(result != DPS_OK) goto ret; DPS_FREE(*str); *str = (char*)DpsStrdup(alias); } for(cascade = 0; ((Alias=DpsMatchListFind(&Indexer->Conf->ReverseAliases,*str,nparts,Parts))) && (cascade < 1024); cascade++) { aliassize = dps_strlen(Alias->arg) + dps_strlen(Alias->pattern) + dps_strlen(*str) + 128; alias = (char*)DpsRealloc(alias, aliassize); if (alias == NULL) { DpsLog(Indexer, DPS_LOG_ERROR, "No memory (%d bytes). %s line %d", aliassize, __FILE__, __LINE__); goto ret; } DpsMatchApply(alias,aliassize,*str,Alias->arg,Alias,nparts,Parts); if(alias[0]){ DpsLog(Indexer,DPS_LOG_DEBUG,"ReverseAlias%d: pattern:%s, arg:%s -> '%s'", cascade, Alias->pattern, Alias->arg, alias); DPS_FREE(*str); *str = (char*)DpsStrdup(alias); } else break; if (Alias->last) break; } } ret: DPS_FREE(alias); }
int dps_wc_mb_gujarati(DPS_CONV *conv, DPS_CHARSET *cs, const dpsunicode_t *wc, unsigned char *s, unsigned char *e) { conv->icodes = 1; conv->ocodes = 1; if (*wc < 0x7F) { s[0] = *wc; if ((conv->flags & DPS_RECODE_HTML_TO) && (strchr(DPS_NULL2EMPTY(conv->CharsToEscape), (int)s[0]) != NULL)) return DPS_CHARSET_ILUNI; if ((conv->flags & DPS_RECODE_URL_TO) && (s[0] == '!')) return DPS_CHARSET_ILUNI; return conv->ocodes; } if (*wc == 0x00A9) { s[0] = 0x88; return conv->ocodes; } if (*wc == 0x00AE) { s[0] = 0x89; return conv->ocodes; } if (*wc == 0x00D7) { s[0] = 0x80; return conv->ocodes; } if (*wc == 0x0964) { s[0] = 0xEA; return conv->ocodes; } if (*wc == 0x0965) { s[0] = 0x90; return conv->ocodes; } if (*wc >= 0x0A81 && *wc <= 0xA83) { s[0] = 0xA1 + (*wc - 0x0A81); return conv->ocodes; } if (*wc >= 0x0A85 && *wc <= 0xA8B) { s[0] = 0xA4 + (*wc - 0x0A85); return conv->ocodes; } if (*wc == 0x0A8D) { s[0] = 0xAE; return conv->ocodes; } if (*wc >= 0x0A8F && *wc <= 0xA91) { s[0] = tab_0A8F[*wc - 0x0A8F]; return conv->ocodes; } if (*wc >= 0x0A93 && *wc <= 0xAA8) { s[0] = tab_0A93[*wc - 0x0A93]; return conv->ocodes; } if (*wc >= 0x0AAA && *wc <= 0xAAF) { s[0] = 0xC8 + (*wc - 0x0AAA); return conv->ocodes; } if (*wc == 0x0AB0) { s[0] = 0xCF; return conv->ocodes; } if (*wc >= 0x0AB2 && *wc <= 0xAB3) { s[0] = 0xD1 + (*wc - 0x0AB2); return conv->ocodes; } if (*wc >= 0x0AB5 && *wc <= 0xAB9) { s[0] = 0xD4 + (*wc - 0x0AB5); return conv->ocodes; } if (*wc == 0x0ABC) { s[0] = 0xE9; return conv->ocodes; } if (*wc >= 0x0ABE && *wc <= 0xAC3) { s[0] = 0xDA + (*wc - 0x0ABE); return conv->ocodes; } if (*wc == 0x0AC4) { if(s + 2 > e) return DPS_CHARSET_TOOSMALL; s[0] = 0xAA; s[1] = 0xE9; return conv->ocodes = 2; } if (*wc == 0x0AC5) { s[0] = 0xE3; return conv->ocodes; } if (*wc >= 0x0AC7 && *wc <= 0xAC9) { s[0] = tab_0AC7[*wc - 0x0AC7]; return conv->ocodes; } if (*wc >= 0x0ACB && *wc <= 0xACC) { s[0] = 0xE5 + (*wc - 0x0ACB); return conv->ocodes; } if (*wc == 0x0ACD) { if (wc[1] == 0x200C) { if(s + 2 > e) return DPS_CHARSET_TOOSMALL; conv->icodes = 2; s[0] = 0xE8; s[1] = 0xE8; return conv->ocodes = 2; } if (wc[1] == 0x200D) { if(s + 2 > e) return DPS_CHARSET_TOOSMALL; conv->icodes = 2; s[0] = 0xE8; s[1] = 0xE9; return conv->ocodes = 2; } s[0] = 0xE8; return conv->ocodes; } if (*wc == 0x0AD0) { if(s + 2 > e) return DPS_CHARSET_TOOSMALL; s[0] = 0xA1; s[1] = 0xE9; return conv->ocodes = 2; } if (*wc == 0x0AE0) { if(s + 2 > e) return DPS_CHARSET_TOOSMALL; s[0] = 0xAA; s[1] = 0xE9; return conv->ocodes = 2; } if (*wc >= 0x0AE6 && *wc <= 0xAEF) { s[0] = 0xF1 + (*wc - 0x0AE6); return conv->ocodes; } if (*wc == 0x200E) { s[0] = 0xD9; return conv->ocodes; } if (*wc == 0x2013) { s[0] = 0x82; return conv->ocodes; } if (*wc == 0x2014) { s[0] = 0x83; return conv->ocodes; } if (*wc == 0x2018) { s[0] = 0x84; return conv->ocodes; } if (*wc == 0x2019) { s[0] = 0x85; return conv->ocodes; } if (*wc == 0x2022) { s[0] = 0x87; return conv->ocodes; } if (*wc == 0x2026) { s[0] = 0x86; return conv->ocodes; } if (*wc == 0x2122) { s[0] = 0x8A; return conv->ocodes; } if (*wc == 0x2212) { s[0] = 0x81; } else { s[0] = '?'; return DPS_CHARSET_ILUNI; } return conv->ocodes; }
int DpsCookiesAdd(DPS_AGENT *Indexer, const char *domain, const char * path, const char *name, const char *value, const char secure, dps_uint4 expires, const char from_config, int insert_flag) { #ifdef HAVE_SQL char buf[3*PATH_MAX]; char path_esc[2*PATH_MAX+1]; DPS_COOKIES *Cookies = &Indexer->Cookies; DPS_COOKIE *Coo; DPS_DB *db; dpshash32_t url_id = DpsStrHash32(domain); size_t i; #ifdef WITH_PARANOIA void *paran = DpsViolationEnter(paran); #endif if (Indexer->flags & DPS_FLAG_UNOCON) { if (Indexer->Conf->dbl.nitems == 0) return DPS_OK; DPS_GETLOCK(Indexer, DPS_LOCK_DB); db = Indexer->Conf->dbl.db[url_id % Indexer->Conf->dbl.nitems]; } else { if (Indexer->dbl.nitems == 0) return DPS_OK; db = Indexer->dbl.db[url_id % Indexer->dbl.nitems]; } (void)DpsDBEscStr(db, path_esc, DPS_NULL2EMPTY(path), dps_min(PATH_MAX,dps_strlen(DPS_NULL2EMPTY(path)))); for (i = 0; i < Cookies->ncookies; i++) { Coo = &Cookies->Cookie[i]; if (!strcasecmp(Coo->domain, domain) && !strcasecmp(Coo->path, DPS_NULL2EMPTY(path)) && !strcasecmp(Coo->name, name) && (Coo->secure == secure)/* && (Coo->from_config == from_config)*/ ) { DPS_FREE(Coo->value); Coo->value = DpsStrdup(value); /* Coo->expires = expires;*/ if (insert_flag) { dps_snprintf(buf, sizeof(buf), "UPDATE cookies SET value='%s',expires=%d WHERE domain='%s' AND path='%s' AND name='%s' AND secure='%c'", value, expires, domain, path_esc, name, secure); DpsSQLAsyncQuery(db, NULL, buf); } if (Indexer->flags & DPS_FLAG_UNOCON) DPS_RELEASELOCK(Indexer, DPS_LOCK_DB); #ifdef WITH_PARANOIA DpsViolationExit(Indexer->handle, paran); #endif return DPS_OK; } } Cookies->Cookie = (DPS_COOKIE*)DpsRealloc(Cookies->Cookie, (Cookies->ncookies + 1) * sizeof(DPS_COOKIE)); if(Cookies->Cookie == NULL) { Cookies->ncookies = 0; if (Indexer->flags & DPS_FLAG_UNOCON) DPS_RELEASELOCK(Indexer, DPS_LOCK_DB); #ifdef WITH_PARANOIA DpsViolationExit(Indexer->handle, paran); #endif return DPS_ERROR; } Coo = &Cookies->Cookie[Cookies->ncookies]; /* Coo->expires = expires;*/ Coo->secure = secure; Coo->from_config = from_config; Coo->domain = DpsStrdup(domain); Coo->path = DpsStrdup(path); Coo->name = DpsStrdup(name); Coo->value = DpsStrdup(value); if (insert_flag) { if (Indexer->Flags.CheckInsertSQL) { dps_snprintf(buf, sizeof(buf), "DELETE FROM cookies WHERE domain='%s' AND path='%s' AND name='%s' AND secure='%c'", domain, path_esc, name, secure); DpsSQLAsyncQuery(db, NULL, buf); } dps_snprintf(buf, sizeof(buf), "INSERT INTO cookies(expires,secure,domain,path,name,value)VALUES(%d,'%c','%s','%s','%s','%s')", expires, secure, domain, path_esc, name, value); DpsSQLAsyncQuery(db, NULL, buf); } Cookies->ncookies++; if (Indexer->flags & DPS_FLAG_UNOCON) DPS_RELEASELOCK(Indexer, DPS_LOCK_DB); #ifdef WITH_PARANOIA DpsViolationExit(Indexer->handle, paran); #endif #endif /*HAVE_SQL*/ return DPS_OK; }
void DpsCookiesFind(DPS_AGENT *Indexer, DPS_SERVER *Server, DPS_DOCUMENT *Doc, const char *hostinfo) { #ifdef HAVE_SQL DPS_DSTR cookie; DPS_COOKIES *Cookies = &Indexer->Cookies; DPS_COOKIE *Coo; size_t i, blen = dps_strlen(hostinfo), slen; int have_no_cookies = DpsVarListFindInt(&Doc->Sections, "have_no_cookies", 1); #ifdef WITH_PARANOIA void *paran = DpsViolationEnter(paran); #endif TRACE_IN(Indexer, "DpsCookiesFind"); DpsDSTRInit(&cookie, 1024); for(i = 0; i < Cookies->ncookies; i++) { Coo = &Cookies->Cookie[i]; slen = dps_strlen(Coo->domain); if (slen > blen) continue; if (Coo->secure == 'y' && strcasecmp(Doc->CurURL.schema, "https")) continue; if (strncasecmp(Coo->path, Doc->CurURL.path, dps_strlen(Coo->path))) continue; if (strcasecmp(Coo->domain, hostinfo + (blen - slen))) continue; if (Coo->from_config != 1) have_no_cookies = 0; if (Coo->name[0] == '\0' && Coo->value[0] == '\0') continue; if (cookie.data_size) DpsDSTRAppend(&cookie, "; ", 2); DpsDSTRAppendStr(&cookie, Coo->name); DpsDSTRAppend(&cookie, "=", 1); DpsDSTRAppendStr(&cookie, Coo->value); } if (have_no_cookies) { char buf[2*PATH_MAX]; dpshash32_t url_id; DPS_DB *db; DPS_SQLRES Res; size_t rows; int rc; if (Server != NULL) { char *PingData = DpsVarListFindStr(&Server->Vars, "AuthPing", NULL); if (PingData != NULL) { char *AuthPing = DpsStrdup(DpsTrim(PingData, " \t\r\n")); int method = DPS_METHOD_GET; dps_base64_decode(AuthPing, PingData, dps_strlen(PingData)); if (!strncasecmp(AuthPing, "GET", 3)) { method = DPS_METHOD_GET; PingData = DpsTrim(AuthPing + 3, " \t\r\n"); } else if (!strncasecmp(AuthPing, "POST", 4)) { method = DPS_METHOD_POST; PingData = DpsTrim(AuthPing + 4, " \t\r\n"); } else { DpsLog(Indexer, DPS_LOG_ERROR, "AuthPing should be GET or POST: %s", AuthPing); PingData = NULL; } if (PingData != NULL) { size_t size = dps_strlen(PingData); { char PingURL[size + 2]; char PingBody[size]; DPS_DOCUMENT *rDoc; int result; rDoc = DpsDocInit(NULL); DpsSpiderParamInit(&rDoc->Spider); DpsVarList2Doc(rDoc, Server); rDoc->Buf.max_size = (size_t)DpsVarListFindInt(&Indexer->Vars, "MaxDocSize", DPS_MAXDOCSIZE); rDoc->Buf.allocated_size = DPS_NET_BUF_SIZE; if ((rDoc->Buf.buf = (char*)DpsMalloc(rDoc->Buf.allocated_size + 1)) == NULL) { DpsDocFree(rDoc); TRACE_OUT(Indexer); return; } rDoc->Buf.buf[0]='\0'; rDoc->subdoc = Indexer->Flags.SubDocLevel + 1; #if 1 dps_snprintf(buf, sizeof(buf), "%s://%s/", DPS_NULL2EMPTY(Doc->CurURL.schema), DPS_NULL2EMPTY(Doc->CurURL.hostinfo)); DpsVarListReplaceStr(&rDoc->Sections, "URL", buf); DpsURLParse(&rDoc->CurURL, buf); DpsLog(Indexer, DPS_LOG_INFO, "HOME: %s", buf); rDoc->method = DPS_METHOD_HEAD; /* DpsVarListFree(&rDoc->RequestHeaders);*/ if (Doc != NULL) { DpsVarListReplaceLst(&rDoc->RequestHeaders, &Doc->RequestHeaders, NULL, "*"); } DpsVarListReplaceStr(&rDoc->Sections, "have_no_cookies", "0"); DpsDocAddDocExtraHeaders(Indexer, Server, rDoc); DpsDocAddConfExtraHeaders(Indexer->Conf, rDoc); DpsVarListReplaceLst(&rDoc->Sections, &Server->Vars, NULL, "*"); DpsDocAddServExtraHeaders(Server, rDoc); DpsVarListLog(Indexer, &rDoc->RequestHeaders, DPS_LOG_DEBUG, "HOME.Request"); if (Doc == NULL || Indexer->Flags.cmd == DPS_IND_FILTER) { DpsDocLookupConn(Indexer, rDoc); } else { DPS_FREE(rDoc->connp.connp); rDoc->connp = Doc->connp; } result = DpsGetURL(Indexer, rDoc, NULL); /* Just get headers from the home as we need only Cookies from it */ DpsDocProcessResponseHeaders(Indexer, rDoc); DpsVarListLog(Indexer, &rDoc->Sections, DPS_LOG_DEBUG, "HOME.Response"); #endif sscanf(PingData, "%s %s", PingURL, PingBody); if (rDoc->method == DPS_METHOD_GET) { dps_strcat(PingURL, "?"); dps_strcat(PingURL, PingBody); } else { DpsVarListReplaceStr(&rDoc->Sections, "body", PingBody); } DpsVarListReplaceStr(&rDoc->Sections, "URL", PingURL); DpsURLParse(&rDoc->CurURL, PingURL); DpsLog(Indexer, DPS_LOG_INFO, "AUTH.PING: %s", PingURL); rDoc->method = method; DpsVarListFree(&rDoc->RequestHeaders); DpsVarListReplaceStr(&rDoc->Sections, "have_no_cookies", "0"); DpsDocAddDocExtraHeaders(Indexer, Server, rDoc); DpsDocAddConfExtraHeaders(Indexer->Conf, rDoc); DpsVarListReplaceLst(&rDoc->Sections, &Server->Vars, NULL, "*"); DpsDocAddServExtraHeaders(Server, rDoc); if (method == DPS_METHOD_POST) { dps_snprintf(buf, sizeof(buf), "application/x-www-form-urlencoded; charset=%s", DpsVarListFindStr(&Indexer->Conf->Vars, "LocalCharset", "iso-8859-1")); DpsVarListReplaceStr(&rDoc->RequestHeaders, "Content-Type", buf); dps_snprintf(buf, sizeof(buf), "%d", dps_strlen(PingBody)); DpsVarListReplaceStr(&rDoc->RequestHeaders, "Content-Length", buf); } DpsVarListLog(Indexer, &rDoc->RequestHeaders, DPS_LOG_DEBUG, "AUTHPING.Request"); #if 0 if (Doc == NULL || Indexer->Flags.cmd == DPS_IND_FILTER) { DpsDocLookupConn(Indexer, rDoc); } else { DPS_FREE(rDoc->connp.connp); rDoc->connp = Doc->connp; } #endif result = DpsGetURL(Indexer, rDoc, NULL); /* Just get it as we need only Cookies from the headers */ DpsDocProcessResponseHeaders(Indexer, rDoc); DpsVarListDel(&rDoc->Sections, "body"); DpsVarListLog(Indexer, &rDoc->Sections, DPS_LOG_DEBUG, "AUTHPING.Response"); if (Doc != NULL) bzero(&rDoc->connp, sizeof(rDoc->connp)); DpsDocFree(rDoc); } } DpsFree(AuthPing); } } while(hostinfo != NULL) { url_id = DpsStrHash32(hostinfo); DpsSQLResInit(&Res); dps_snprintf(buf, sizeof(buf), "SELECT name,value,path,secure FROM cookies WHERE domain='%s'", hostinfo); if (Indexer->flags & DPS_FLAG_UNOCON) { DPS_GETLOCK(Indexer, DPS_LOCK_DB); db = Indexer->Conf->dbl.db[url_id % Indexer->Conf->dbl.nitems]; } else { db = Indexer->dbl.db[url_id % Indexer->dbl.nitems]; } if(DPS_OK == (rc = DpsSQLQuery(db, &Res, buf))) { rows = DpsSQLNumRows(&Res); for(i = 0; i < rows; i++) { DpsCookiesAdd(Indexer, hostinfo, DpsSQLValue(&Res, i, 2), DpsSQLValue(&Res, i, 0), DpsSQLValue(&Res, i, 1), *DpsSQLValue(&Res, i, 3), 0, 0, 0); if (*DpsSQLValue(&Res, i, 3) == 'y' && strcasecmp(Doc->CurURL.schema, "https")) continue; if (strncasecmp(DpsSQLValue(&Res, i, 2), Doc->CurURL.path, dps_strlen(DpsSQLValue(&Res, i, 2)))) continue; if (cookie.data_size) DpsDSTRAppend(&cookie, "; ", 2); DpsDSTRAppendStr(&cookie, DpsSQLValue(&Res, i, 0)); DpsDSTRAppend(&cookie, "=", 1); DpsDSTRAppendStr(&cookie, DpsSQLValue(&Res, i, 1)); } if (rows == 0) { DpsCookiesAdd(Indexer, hostinfo, "/", "", "", 'n', 0, 0, 0); } } DpsSQLFree(&Res); if (Indexer->flags & DPS_FLAG_UNOCON) { DPS_RELEASELOCK(Indexer, DPS_LOCK_DB); } hostinfo = strchr(hostinfo, '.'); if (hostinfo != NULL) hostinfo++; } } if (cookie.data_size) { DpsVarListReplaceStr(&Doc->RequestHeaders, "Cookie", cookie.data); } DpsDSTRFree(&cookie); #endif TRACE_OUT(Indexer); return; }