/** * $Id: fp_rfc.cpp,v 1.8 2002/10/21 08:38:29 plasmahh Exp $ * $Revision: 1.8 $ * $Author: plasmahh $ * $Date: 2002/10/21 08:38:29 $ */ #include "fp_rfc.h" fp_rfc::fp_rfc( const fp_rfc& ofp ) : fp(ofp.version,FP_Rfc),maxidx(ofp.maxidx) { run = new unsigned long[3*(maxidx+1)]; // 3 entries per possible return code end = new unsigned long[maxidx+1]; for (unsigned long i=0; i < 3*(maxidx+1); i++) { run[i] = ofp.run[i]; } for (unsigned long i=0; i < maxidx+1; i++) { end[i] = ofp.end[i]; } } fp_rfc::fp_rfc( const mstring& ver ) : fp(ver,FP_Rfc), maxidx(15), current(0) { run = new unsigned long[3*(maxidx+1)]; // 3 entries per possible return code end = new unsigned long[maxidx+1]; // 1 entry per return code memset((char *)end,0,sizeof(unsigned long)*(maxidx+1)); // does this work ?? memset((char *)run,0,sizeof(unsigned long)*(3*(maxidx+1)) ); } ostream& operator << ( ostream &o, fp_rfc& v) { unsigned int ix; o << "VERSION=" << v.version << endl; o << "FP_RFC="; for (ix=0; ix < v.maxidx; ix++) o << v.end[ix] << "," ; o << v.end[ix]; // for loop with all elements in end to be displayed o << endl; return o; } void fp_rfc::add( unsigned long fp) { if (current > maxidx) return; end[current] = fp; current++; } unsigned long fp_rfc::gen_error( fp_rfc& v) { signed long dif; error = 0; for (unsigned int idx=0;idx < maxidx; idx++) { if ( end[idx] ==0 || v.end[idx] == 0) continue; dif = end[idx] - v.end[idx]; if ( dif > 0 ) error += dif; else error -= dif; } return error; } void fp_rfc::add ( const mstring& ret) { int code; code = strtoul(ret,NULL,10); switch (code) { // to be added : case 0: break; case 214: addnew(0,ret.checksum_sum()); break; case 220: addnew(1,ret.checksum_sum()); break; case 221: addnew(2,ret.checksum_sum()); break; case 250: addnew(3,ret.checksum_sum()); break; case 252: addnew(4,ret.checksum_sum()); break; case 334: addnew(5,ret.checksum_sum()); break; case 454: addnew(6,ret.checksum_sum()); break; case 500: addnew(7,ret.checksum_sum()); break; case 501: addnew(8,ret.checksum_sum()); break; case 502: addnew(9,ret.checksum_sum()); break; case 503: addnew(10,ret.checksum_sum()); break; case 504: addnew(11,ret.checksum_sum()); break; case 535: addnew(12,ret.checksum_sum()); break; case 550: addnew(13,ret.checksum_sum()); break; case 553: addnew(14,ret.checksum_sum()); break; case 554: addnew(15,ret.checksum_sum()); break; case 421: addnew(16,ret.checksum_sum()); break; case 459: addnew(17,ret.checksum_sum()); break; case 505: addnew(18,ret.checksum_sum()); break; case 458: addnew(19,ret.checksum_sum()); break; default: cout << "Fingerprinting found an unknown return code " << code << ". Please inform the author.\nNote: This is a non-critical errror, fingerprinting will still be valid unless other errors occur" << endl; } } void fp_rfc::addnew( unsigned int ix, unsigned long cs) { // this is a bit hardwired, but at least... we don't need more generic here at the moment I guess unsigned int idx; if ( ix > maxidx ) return; for (idx=0; idx < 3;idx++) { if ( ! run[idx+(ix*3)]) { run[idx+(ix*3)] = cs; break; } else { if ( run[idx+(ix*3)] == cs) break; } }// of for // ok, update the final fingerprint... end[ix] = run[ix*3] + run[ix*3 + 1] + run[ix*3 + 2]; } /** *$Log: fp_rfc.cpp,v $ *Revision 1.8 2002/10/21 08:38:29 plasmahh *begin cleanup and structure changes for smtpmap 0.8-stable * *Revision 1.7 2002/06/11 22:00:44 plasmahh *unfortunately had to change fingerprints * *Revision 1.6 2002/06/11 21:39:31 plasmahh *improved reconnection behaviour * *Revision 1.5 2002/06/11 18:23:52 plasmahh *reverified fingerprints * *Revision 1.4 2002/06/10 22:10:35 plasmahh *first partly working fingerprinting, moving to BETA state * *Revision 1.3 2002/06/09 21:22:39 plasmahh *lots of changes *some slight fingerprint changes, also in constructor *scanner changes and fixes in constructor *read fixes *test programs fixes, no more segfaults *new TODO * *Revision 1.2 2002/05/27 06:26:16 plasmahh *Implemented, tested and fixed fingerprinting. Test Programs generate good fingerprints, only need to put all in a program and generateerror values * *Revision 1.1 2002/05/23 22:37:55 plasmahh *fixed small things in scanner *split fps into .cpp files, because of linker errors in operators * */