X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ffreenet%2Fintroductionpuzzleinserter.cpp;h=cac38792d6c68701048bef1bcc96a0373be5f59f;hb=05ef25de71be91442b4cbd22dc7cc45629c5d5bb;hp=a38108415dc8dcdd680983754b4d8d628f1d1a22;hpb=6836fbb5db8464f56e682989996b2210b14231d0;p=fms.git diff --git a/src/freenet/introductionpuzzleinserter.cpp b/src/freenet/introductionpuzzleinserter.cpp index a381084..cac3879 100644 --- a/src/freenet/introductionpuzzleinserter.cpp +++ b/src/freenet/introductionpuzzleinserter.cpp @@ -3,9 +3,16 @@ #include "../../include/stringfunctions.h" #include "../../include/option.h" #include "../../include/freenet/captcha/simplecaptcha.h" -#include "../../include/uuidgenerator.h" +#ifdef ALTERNATE_CAPTCHA +#include "../../include/freenet/captcha/alternatecaptcha1.h" +#include "../../include/freenet/captcha/alternatecaptcha2.h" +#endif #include "../../include/base64.h" +#include +#include +#include + #ifdef XMEM #include #endif @@ -30,9 +37,13 @@ void IntroductionPuzzleInserter::CheckForNeededInsert() while(!rs.AtEnd()) { - std::string localidentityidstr; - DateTime now; - now.SetToGMTime(); + int localidentityid=0; + std::string localidentityidstr=""; + Poco::DateTime now; + float minutesbetweeninserts=0; + minutesbetweeninserts=1440.0/(float)m_maxpuzzleinserts; + Poco::DateTime lastinsert=now; + lastinsert-=Poco::Timespan(0,0,minutesbetweeninserts,0,0); if(rs.GetField(0)) { @@ -40,12 +51,21 @@ void IntroductionPuzzleInserter::CheckForNeededInsert() } // if this identity has any non-solved puzzles for today, we don't need to insert a new puzzle - SQLite3DB::Recordset rs2=m_db->Query("SELECT UUID FROM tblIntroductionPuzzleInserts WHERE Day='"+now.Format("%Y-%m-%d")+"' AND FoundSolution='false' AND LocalIdentityID="+localidentityidstr+";"); + SQLite3DB::Recordset rs2=m_db->Query("SELECT UUID FROM tblIntroductionPuzzleInserts WHERE Day='"+Poco::DateTimeFormatter::format(now,"%Y-%m-%d")+"' AND FoundSolution='false' AND LocalIdentityID="+localidentityidstr+";"); // identity doesn't have any non-solved puzzles for today - start a new insert if(rs2.Empty()==true) { - StartInsert(rs.GetInt(0)); + // make sure we are on the next day or the appropriate amount of time has elapsed since the last insert + if(m_lastinserted.find(rs.GetInt(0))==m_lastinserted.end() || m_lastinserted[rs.GetInt(0)]<=lastinsert || m_lastinserted[rs.GetInt(0)].day()!=now.day()) + { + StartInsert(rs.GetInt(0)); + m_lastinserted[rs.GetInt(0)]=now; + } + else + { + m_log->trace("IntroductionPuzzleInserter::CheckForNeededInsert waiting to insert puzzle for "+localidentityidstr); + } } rs.Next(); @@ -55,13 +75,26 @@ void IntroductionPuzzleInserter::CheckForNeededInsert() void IntroductionPuzzleInserter::GenerateCaptcha(std::string &encodeddata, std::string &solution) { - SimpleCaptcha captcha; + ICaptcha *cap=0; +#ifdef ALTERNATE_CAPTCHA + if(rand()%2==0) + { + cap=new AlternateCaptcha1(); + } + else + { + cap=new AlternateCaptcha2(); + } + m_log->trace("IntroductionPuzzleInserter::GenerateCaptcha using alternate captcha generator"); +#else + cap=new SimpleCaptcha(); +#endif std::vector puzzle; std::vector puzzlesolution; - captcha.Generate(); - captcha.GetPuzzle(puzzle); - captcha.GetSolution(puzzlesolution); + cap->Generate(); + cap->GetPuzzle(puzzle); + cap->GetSolution(puzzlesolution); encodeddata.clear(); solution.clear(); @@ -69,6 +102,8 @@ void IntroductionPuzzleInserter::GenerateCaptcha(std::string &encodeddata, std:: Base64::Encode(puzzle,encodeddata); solution.insert(solution.begin(),puzzlesolution.begin(),puzzlesolution.end()); + delete cap; + } const bool IntroductionPuzzleInserter::HandlePutFailed(FCPMessage &message) @@ -91,7 +126,7 @@ const bool IntroductionPuzzleInserter::HandlePutFailed(FCPMessage &message) RemoveFromInsertList(localidentityid); - m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"IntroductionPuzzleInserter::HandlePutFailed failed to insert puzzle "+idparts[3]); + m_log->debug("IntroductionPuzzleInserter::HandlePutFailed failed to insert puzzle "+idparts[3]); } return true; @@ -99,13 +134,12 @@ const bool IntroductionPuzzleInserter::HandlePutFailed(FCPMessage &message) const bool IntroductionPuzzleInserter::HandlePutSuccessful(FCPMessage &message) { - DateTime now; + Poco::DateTime now; SQLite3DB::Statement st; std::vector idparts; long localidentityid; long insertindex; - now.SetToGMTime(); StringFunctions::Split(message["Identifier"],"|",idparts); // non USK @@ -122,14 +156,14 @@ const bool IntroductionPuzzleInserter::HandlePutSuccessful(FCPMessage &message) st.Finalize(); st=m_db->Prepare("UPDATE tblLocalIdentity SET LastInsertedPuzzle=? WHERE LocalIdentityID=?;"); - st.Bind(0,now.Format("%Y-%m-%d %H:%M:%S")); + st.Bind(0,Poco::DateTimeFormatter::format(now,"%Y-%m-%d %H:%M:%S")); st.Bind(1,localidentityid); st.Step(); st.Finalize(); RemoveFromInsertList(localidentityid); - m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"IntroductionPuzzleInserter::HandlePutSuccessful inserted puzzle "+idparts[3]); + m_log->debug("IntroductionPuzzleInserter::HandlePutSuccessful inserted puzzle "+idparts[3]); } return true; @@ -138,15 +172,17 @@ const bool IntroductionPuzzleInserter::HandlePutSuccessful(FCPMessage &message) void IntroductionPuzzleInserter::Initialize() { m_fcpuniquename="IntroductionPuzzleInserter"; + m_maxpuzzleinserts=50; } const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid) { - DateTime now; + Poco::DateTime now; std::string idstring; long index=0; std::string indexstr; - UUIDGenerator uuid; + Poco::UUIDGenerator uuidgen; + Poco::UUID uuid; std::string messagebase; IntroductionPuzzleXML xml; std::string encodedpuzzle; @@ -159,8 +195,7 @@ const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid) std::string keypart=""; StringFunctions::Convert(localidentityid,idstring); - now.SetToGMTime(); - SQLite3DB::Recordset rs=m_db->Query("SELECT MAX(InsertIndex) FROM tblIntroductionPuzzleInserts WHERE Day='"+now.Format("%Y-%m-%d")+"' AND LocalIdentityID="+idstring+";"); + SQLite3DB::Recordset rs=m_db->Query("SELECT MAX(InsertIndex) FROM tblIntroductionPuzzleInserts WHERE Day='"+Poco::DateTimeFormatter::format(now,"%Y-%m-%d")+"' AND LocalIdentityID="+idstring+";"); if(rs.Empty() || rs.GetField(0)==NULL) { @@ -172,58 +207,76 @@ const bool IntroductionPuzzleInserter::StartInsert(const long &localidentityid) } StringFunctions::Convert(index,indexstr); - SQLite3DB::Recordset rs2=m_db->Query("SELECT PrivateKey,PublicKey FROM tblLocalIdentity WHERE LocalIdentityID="+idstring+";"); - if(rs2.Empty()==false && rs2.GetField(0)!=NULL) + if(index=50) + SQLite3DB::Recordset rs2=m_db->Query("SELECT PrivateKey,PublicKey FROM tblLocalIdentity WHERE LocalIdentityID="+idstring+";"); + if(rs2.Empty()==false && rs2.GetField(0)!=NULL) { - // remove - and ~ - keypart=StringFunctions::Replace(StringFunctions::Replace(publickey.substr(4,43),"-",""),"~",""); + privatekey=rs2.GetField(0); + if(rs2.GetField(1)) + { + publickey=rs2.GetField(1); + } + if(publickey.size()>=50) + { + // remove - and ~ + keypart=StringFunctions::Replace(StringFunctions::Replace(publickey.substr(4,43),"-",""),"~",""); + } } - } - - Option::Instance()->Get("MessageBase",messagebase); - - GenerateCaptcha(encodedpuzzle,solutionstring); - - xml.SetType("captcha"); - xml.SetUUID(uuid.Generate()+"@"+keypart); - xml.SetPuzzleData(encodedpuzzle); - xml.SetMimeType("image/bmp"); - xmldata=xml.GetXML(); - StringFunctions::Convert(xmldata.size(),xmldatasizestr); + Option::Instance()->Get("MessageBase",messagebase); - message.SetName("ClientPut"); - message["URI"]=privatekey+messagebase+"|"+now.Format("%Y-%m-%d")+"|IntroductionPuzzle|"+indexstr+".xml"; - message["Identifier"]=m_fcpuniquename+"|"+idstring+"|"+indexstr+"|"+xml.GetUUID()+"|"+message["URI"]; - message["UploadFrom"]="direct"; - message["DataLength"]=xmldatasizestr; - m_fcp->SendMessage(message); - m_fcp->SendRaw(xmldata.c_str(),xmldata.size()); + GenerateCaptcha(encodedpuzzle,solutionstring); - // insert to USK - message.Reset(); - message.SetName("ClientPutComplexDir"); - message["URI"]="USK"+privatekey.substr(3)+messagebase+"|"+now.Format("%Y.%m.%d")+"|IntroductionPuzzle/0/"; - message["Identifier"]=m_fcpuniquename+"USK|"+message["URI"]; - message["DefaultName"]="IntroductionPuzzle.xml"; - message["Files.0.Name"]="IntroductionPuzzle.xml"; - message["Files.0.UplaodFrom"]="direct"; - message["Files.0.DataLength"]=xmldatasizestr; - m_fcp->SendMessage(message); - m_fcp->SendRaw(xmldata.c_str(),xmldata.size()); - - m_db->Execute("INSERT INTO tblIntroductionPuzzleInserts(UUID,Type,MimeType,LocalIdentityID,PuzzleData,PuzzleSolution) VALUES('"+xml.GetUUID()+"','captcha','image/bmp',"+idstring+",'"+encodedpuzzle+"','"+solutionstring+"');"); - - m_inserting.push_back(localidentityid); + try + { + uuid=uuidgen.createRandom(); + } + catch(...) + { + m_log->fatal("IntroductionPuzzleInserter::StartInsert could not create UUID"); + } - m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"IntroductionPuzzleInserter::StartInsert started insert for id "+idstring); + xml.SetType("captcha"); + std::string uuidstr=uuid.toString(); + StringFunctions::UpperCase(uuidstr,uuidstr); + xml.SetUUID(uuidstr+"@"+keypart); + xml.SetPuzzleData(encodedpuzzle); + xml.SetMimeType("image/bmp"); + + xmldata=xml.GetXML(); + StringFunctions::Convert(xmldata.size(),xmldatasizestr); + + message.SetName("ClientPut"); + message["URI"]=privatekey+messagebase+"|"+Poco::DateTimeFormatter::format(now,"%Y-%m-%d")+"|IntroductionPuzzle|"+indexstr+".xml"; + message["Identifier"]=m_fcpuniquename+"|"+idstring+"|"+indexstr+"|"+xml.GetUUID()+"|"+message["URI"]; + message["UploadFrom"]="direct"; + message["DataLength"]=xmldatasizestr; + m_fcp->SendMessage(message); + m_fcp->SendRaw(xmldata.c_str(),xmldata.size()); + + // insert to USK + message.Reset(); + message.SetName("ClientPutComplexDir"); + message["URI"]="USK"+privatekey.substr(3)+messagebase+"|"+Poco::DateTimeFormatter::format(now,"%Y.%m.%d")+"|IntroductionPuzzle/0/"; + message["Identifier"]=m_fcpuniquename+"USK|"+message["URI"]; + message["DefaultName"]="IntroductionPuzzle.xml"; + message["Files.0.Name"]="IntroductionPuzzle.xml"; + message["Files.0.UplaodFrom"]="direct"; + message["Files.0.DataLength"]=xmldatasizestr; + m_fcp->SendMessage(message); + m_fcp->SendRaw(xmldata.c_str(),xmldata.size()); + + m_db->Execute("INSERT INTO tblIntroductionPuzzleInserts(UUID,Type,MimeType,LocalIdentityID,PuzzleData,PuzzleSolution) VALUES('"+xml.GetUUID()+"','captcha','image/bmp',"+idstring+",'"+encodedpuzzle+"','"+solutionstring+"');"); + + m_inserting.push_back(localidentityid); + + m_log->debug("IntroductionPuzzleInserter::StartInsert started insert for id "+idstring); + } + else + { + m_log->warning("IntroductionPuzzleInserter::StartInsert already inserted max puzzles for "+idstring); + } return true;