⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db.c

📁 This piece of software was written as a replacement and extension for Tripwire. Tripwire is an exce
💻 C
字号:
/* aide, Advanced Intrusion Detection Environment * * Copyright (C) 1999,2000,2001,2002 Rami Lehti, Pablo Virolainen * $Header: /cvs-root-aide/aide2/src/db.c,v 1.9 2002/05/29 08:04:27 rammer Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */ #include "../config.h"#include <stdio.h>#include <stdlib.h>#include <errno.h>#include "db.h"#include "db_file.h"#include "db_disk.h"#ifdef WITH_PSQL#include "db_sql.h"#endif#include "db_config.h"#include "report.h"#include "be.h"/*#include <gcrypt.h>*/#ifdef WITH_MHASH#include <mhash.h>#endif#include "base64.h"#include "util.h"#include "aide.h"/*for locale support*/#include "locale-aide.h"/*for locale support*/db_line* db_char2line(char** ss,int db);long readint(char* s,char* err);long readoct(char* s,char* err);time_t base64totime_t(char*);int db_init(int db){  void* rv=NULL;    error(200,"db_init %i\n",db);    switch(db) {  case DB_DISK: {    /*      Should we actually do something here?     */    return db_disk_init();  }  case DB_OLD: {    rv=be_init(1,conf->db_in_url,0);    if(rv==NULL) {      error(200,_("db_in is null\n"));            return RETFAIL;    }    conf->db_in=rv;    error(200,_("db_in is nonnull\n"));    return RETOK;  }  case DB_WRITE: {    #ifdef WITH_ZLIB    if(conf->gzip_dbout){       rv=be_init(0,conf->db_out_url,conf->gzip_dbout);       conf->db_gzout=rv;    }    else{#endif      rv=be_init(0,conf->db_out_url,0);      conf->db_out=rv;#ifdef WITH_ZLIB    }#endif        if(rv==NULL){      error(200,_("db_out is null\n"));      return RETFAIL;    }    error(200,_("db_out is nonnull %s\n"),conf->db_out_url->value);    return RETOK;  }  case DB_NEW: {    rv=be_init(1,conf->db_new_url,0);    if(rv==NULL) {      error(200,_("db_new is null\n"));            return RETFAIL;    }    conf->db_new=rv;    error(200,_("db_new is nonnull\n"));    return RETOK;  }  }  return RETFAIL;}db_line* db_readline(int db){  db_line* s=NULL;  int i=0;  url_t* db_url=NULL;  FILE** db_filep=NULL;  int* db_osize=0;  DB_FIELD** db_order=NULL;  switch (db) {  case DB_DISK: {    /*      Nothing else to be done?     */    s=db_readline_disk(db);    return s;  }    case DB_OLD: {    db_url=conf->db_in_url;    db_filep=&(conf->db_in);    db_osize=&(conf->db_in_size);    db_order=&(conf->db_in_order);    break;  }  case DB_NEW: {    db_url=conf->db_new_url;    db_filep=&(conf->db_new);    db_osize=&(conf->db_new_size);    db_order=&(conf->db_new_order);    break;  }  }  switch (db_url->type) {  case url_stdin:  case url_fd:  case url_file: {    /* Should set errno */    /* Please FIXME */    if ((*db_filep)!=NULL) {      char** ss=db_readline_file(db);      if (ss!=NULL){	s=db_char2line(ss,db);	for(i=0;i<*db_osize;i++){	  if((*db_order)[i]!=db_unknown && 	     ss[(*db_order)[i]]!=NULL){	    free(ss[(*db_order)[i]]);	    ss[(*db_order)[i]]=NULL;	  }	}	free(ss);	      }    }        break;  }#ifdef WITH_PSQL  case url_sql: {    error(255,"db_sql readline...");    s=db_readline_sql(db);        break;  }#endif  default : {    error(0,_("db_readline():Url-type backend not implemented\n"));    return NULL;  }  }    return s;  }byte* base64tobyte(char* src,int len){  if(strcmp(src,"0")!=0){    return decode_base64(src,len);  }  return NULL;}db_line* db_char2line(char** ss,int db){  int i;  db_line* line=(db_line*)malloc(sizeof(db_line)*1);  url_t* db_url=NULL;  FILE** db_filep=NULL;  int* db_osize=0;  DB_FIELD** db_order=NULL;  switch (db) {  case DB_OLD: {    db_url=conf->db_in_url;    db_filep=&(conf->db_in);    db_osize=&(conf->db_in_size);    db_order=&(conf->db_in_order);    break;  }  case DB_NEW: {    db_url=conf->db_new_url;    db_filep=&(conf->db_new);    db_osize=&(conf->db_new_size);    db_order=&(conf->db_new_order);    break;  }  }  line->md5=NULL;  line->sha1=NULL;  line->rmd160=NULL;  line->tiger=NULL;#ifdef WITH_MHASH  line->crc32=NULL;  line->crc32b=NULL;  line->haval=NULL;  line->gost=NULL;#endif#ifdef WITH_ACL  line->acl=0;#endif  line->perm=0;  line->uid=0;  line->gid=0;  line->atime=0;  line->ctime=0;  line->mtime=0;  line->inode=0;  line->nlink=0;  line->bcount=0;  line->size=0;  line->filename=NULL;  line->linkname=NULL;    line->attr=conf->attr; /* attributes from @@dbspec */  for(i=0;i<*db_osize;i++){    switch ((*db_order)[i]) {    case db_filename : {      if(ss[(*db_order)[i]]!=NULL){	decode_string(ss[(*db_order)[i]]);	line->filename=strdup(ss[(*db_order)[i]]);      } else {	error(0,"db_char2line():Error while reading database\n");	abort();      }      break;    }    case db_linkname : {      char *s = ss[(*db_order)[i]];      if(ss[(*db_order)[i]]!=NULL){	if(ss[(*db_order)[i]][0]=='0'){	  if(ss[(*db_order)[i]][1]=='\0'){	    line->linkname=NULL;	    break;	  }else if(ss[(*db_order)[i]][1]=='-'){	    line->linkname=strdup("");	    break;	  }else if(ss[(*db_order)[i]][1]=='0'){	    memmove(s,s+1,strlen(s+1)+1); 	    // Hope this removes core	    // dumping in some environments. Has something to do with	    // memory (de)allocation.	  }	}	decode_string(s);	line->linkname=strdup(s);      } else {	error(0,_("db_char2line():Error while reading database\n"));	abort();      }      break;    }    case db_mtime : {      line->mtime=base64totime_t(ss[(*db_order)[i]]);      break;    }    case db_bcount : {      line->bcount=readint(ss[(*db_order)[i]],"bcount");      break;    }    case db_atime : {      line->atime=base64totime_t(ss[(*db_order)[i]]);      break;    }    case db_ctime : {      line->ctime=base64totime_t(ss[(*db_order)[i]]);      break;    }    case db_inode : {      line->inode=readint(ss[(*db_order)[i]],"inode");      break;    }    case db_uid : {      line->uid=readint(ss[(*db_order)[i]],"uid");      break;    }    case db_gid : {      line->gid=readint(ss[(*db_order)[i]],"gid");      break;    }    case db_size : {      line->size=readint(ss[(*db_order)[i]],"size");      break;    }    case db_md5 : {      line->md5=base64tobyte(ss[(*db_order)[i]],			     strlen(ss[(*db_order)[i]]));      break;    }    case db_sha1 : {      line->sha1=base64tobyte(ss[(*db_order)[i]],			      strlen(ss[(*db_order)[i]]));      break;    }    case db_rmd160 : {      line->rmd160=base64tobyte(ss[(*db_order)[i]],				strlen(ss[(*db_order)[i]]));      break;    }    case db_tiger : {      line->tiger=base64tobyte(ss[(*db_order)[i]],			       strlen(ss[(*db_order)[i]]));      break;    }#ifdef WITH_MHASH    case db_crc32 : {      line->crc32=base64tobyte(ss[(*db_order)[i]],			       strlen(ss[(*db_order)[i]]));      break;    }    case db_gost : {      line->gost=base64tobyte(ss[(*db_order)[i]],			       strlen(ss[(*db_order)[i]]));      break;    }    case db_haval : {      line->haval=base64tobyte(ss[(*db_order)[i]],			       strlen(ss[(*db_order)[i]]));      break;    }    case db_crc32b : {      line->crc32b=base64tobyte(ss[(*db_order)[i]],			       strlen(ss[(*db_order)[i]]));      break;    }#endif#ifdef WITH_ACL    case db_acl : {      char* endp,*pos;      int entries,lc;      line->acl=NULL;            entries=strtol(ss[(*db_order)[i]],&endp,10);      if (endp==ss[(*db_order)[i]]) { 	/* Something went wrong */	break;      }      pos=endp+1; /* Warning! if acl in database is corrupted then		     this will break down. */            line->acl=malloc(sizeof(acl_type));      line->acl->entries=entries;      line->acl->acl=malloc(sizeof(aclent_t)*entries);      for (lc=0;lc<entries;lc++) {	line->acl->acl[lc].a_type=strtol(pos,&endp,10);	pos=endp+1;	line->acl->acl[lc].a_id=strtol(pos,&endp,10);	pos=endp+1;	line->acl->acl[lc].a_perm=strtol(pos,&endp,10);	pos=endp+1;      }      break;    }#endif    case db_perm : {      line->perm=readoct(ss[(*db_order)[i]],"permissions");      break;    }        case db_lnkcount : {      line->nlink=readint(ss[(*db_order)[i]],"nlink");      break;    }    case db_attr : {      line->attr=readint(ss[(*db_order)[i]],"attr");      break;    }        case db_unknown : {      /* Unknown fields are ignored. */      break;    }        default : {      error(0,_("Not implemented in db_char2line %i \n"),(*db_order)[i]);      return NULL;    }        }      }  return line;}time_t base64totime_t(char* s){    byte* b=decode_base64(s,strlen(s));  char* endp;    if (b==NULL||strcmp(s,"0")==0) {        /* Should we print error here? */    free(b);        return 0;  } else {    time_t t = strtol(b,&endp,10);        if (endp[0]!='\0') {      error(0,"Error converting base64\n");      free(b);      return 0;    }    free(b);    return t;  }    }long readint(char* s,char* err){  long i;  char* e;  i=strtol(s,&e,10);  if (e[0]!='\0') {    error(0,_("Could not read %s from database"),err);  }  return i;}long readoct(char* s,char* err){  long i;  char* e;  i=strtol(s,&e,8);  if (e[0]!='\0') {    error(0,_("Could not read %s from database. String %s \n"),err,s);  }  return i;}int db_writespec(db_config* conf){  switch (conf->db_out_url->type) {  case url_stdout:  case url_stderr:  case url_fd:  case url_file: {    if(#ifdef WITH_ZLIB       (conf->gzip_dbout && conf->db_gzout) ||#endif       (conf->db_out!=NULL)){      if(db_writespec_file(conf)==RETOK){	return RETOK;      }    }    break;  }#ifdef WITH_PSQL  case url_sql: {    if(conf->db_out!=NULL){      if(db_writespec_sql(conf)==RETOK){	return RETOK;      }    }    break;  }#endif  default:{    error(0,_("Unknown output in db out.\n"));        return RETFAIL;  }  }  return RETFAIL;}int db_writeline(db_line* line,db_config* conf){  if (line==NULL||conf==NULL) return RETOK;    switch (conf->db_out_url->type) {  case url_stdout:  case url_stderr:  case url_fd:  case url_file: {    if (#ifdef WITH_ZLIB       (conf->gzip_dbout && conf->db_gzout) ||#endif       (conf->db_out!=NULL)) {      if (db_writeline_file(line,conf)==RETOK) {	return RETOK;      }    }    return RETFAIL;    break;  }#ifdef WITH_PSQL  case url_sql: {    if (conf->db_out!=NULL) {      if (db_writeline_sql(line,conf)==RETOK) {	return RETOK;      }    }    return RETFAIL;    break;  }#endif  default : {    error(0,_("Unknown output in db out.\n"));        return RETFAIL;  }   }  return RETFAIL;}int db_close(db_config* conf){  if (conf==NULL) return RETOK;    switch (conf->db_out_url->type) {  case url_stdout:  case url_stderr:  case url_fd:  case url_file: {    if (#ifdef WITH_ZLIB       (conf->gzip_dbout && conf->db_gzout) ||#endif       (conf->db_out!=NULL)) {      if (db_close_file(conf)==RETOK) {	return RETOK;      }    }    return RETFAIL;    break;  }#ifdef WITH_PSQL  case url_sql: {    if (conf->db_out!=NULL) {      if (db_close_sql(conf->db_out)==RETOK) {	return RETOK;      } else {	return RETFAIL;      }    }    return RETOK;    break;  }#endif  default : {    error(0,_("db_close():Unknown output in db out.\n"));        return RETFAIL;  }   }  return RETFAIL;}void free_db_line(db_line* dl){  if (dl==NULL) {    return;  }  #define checked_free(x) if(x!=NULL) { free(x); x=NULL; }  checked_free(dl->md5);  checked_free(dl->sha1);  checked_free(dl->rmd160);  checked_free(dl->tiger);  checked_free(dl->filename);  checked_free(dl->linkname);    checked_free(dl->crc32);  checked_free(dl->crc32b);  checked_free(dl->gost);  checked_free(dl->haval);  /*    Possible bug.    Maybe we shouldn't free filename and linkname...   */  checked_free(dl->filename);  checked_free(dl->linkname);  }const char* aide_key_5=CONFHMACKEY_05;const char* db_key_5=DBHMACKEY_05;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -