示例#1
0
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;
}
示例#2
0
__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;
}
示例#3
0
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;
}
示例#4
0
 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;
}
示例#6
0
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;
}
示例#7
0
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;
}