e873dad5d9273e77c66d4c11ef31746a2cb3a240
[fms.git] / src / freenet / unkeyedidcreator.cpp
1 #include "../../include/freenet/unkeyedidcreator.h"\r
2 #include "../../include/stringfunctions.h"\r
3 \r
4 #include <Poco/Timestamp.h>\r
5 \r
6 #include <sstream>\r
7 \r
8 #ifdef XMEM\r
9         #include <xmem.h>\r
10 #endif\r
11 \r
12 UnkeyedIDCreator::UnkeyedIDCreator()\r
13 {\r
14         Initialize();\r
15 }\r
16 \r
17 UnkeyedIDCreator::UnkeyedIDCreator(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
18 {\r
19         Initialize();\r
20 }\r
21 \r
22 void UnkeyedIDCreator::FCPConnected()\r
23 {\r
24         m_waiting=false;\r
25 }\r
26 \r
27 void UnkeyedIDCreator::FCPDisconnected()\r
28 {\r
29         m_waiting=false;\r
30 }\r
31 \r
32 void UnkeyedIDCreator::CheckForUnkeyedID()\r
33 {\r
34         SQLite3DB::Recordset rs=m_db->Query("SELECT LocalIdentityID FROM tblLocalIdentity WHERE PublicKey IS NULL OR PrivateKey IS NULL OR PublicKey='' OR PrivateKey='';");\r
35 \r
36         if(rs.Empty()==false)\r
37         {\r
38                 std::string idstring;\r
39                 StringFunctions::Convert(rs.GetInt(0),idstring);\r
40 \r
41                 std::ostringstream idstr;\r
42                 long id=rs.GetInt(0);\r
43                 idstr << id;\r
44 \r
45                 FCPv2::Message message;\r
46                 message.SetName("GenerateSSK");\r
47                 message["Identifier"]="UnkeyedIDRequest|"+idstr.str();\r
48                 m_fcp->Send(message);\r
49 \r
50                 m_waiting=true;\r
51 \r
52         }\r
53 \r
54         // set last checked time to now\r
55         m_lastchecked=Poco::Timestamp();\r
56 \r
57 }\r
58 \r
59 const bool UnkeyedIDCreator::HandleMessage(FCPv2::Message &message)\r
60 {\r
61         if(message["Identifier"].find("UnkeyedIDRequest")==0)\r
62         {\r
63 \r
64                 if(message.GetName()=="SSKKeypair")\r
65                 {\r
66 \r
67                         long id;\r
68                         std::vector<std::string> idparts;\r
69                         StringFunctions::Split(message["Identifier"],"|",idparts);\r
70 \r
71                         if(idparts.size()>1)\r
72                         {\r
73                                 if(StringFunctions::Convert(idparts[1],id)==false)\r
74                                 {\r
75                                         id=0;\r
76                                 }\r
77                                 SaveKeys(id,message["RequestURI"],message["InsertURI"]);\r
78                         }\r
79 \r
80                         m_log->information("UnkeyedIDCreator::HandleMessage received keypair");\r
81 \r
82                         m_waiting=false;\r
83 \r
84                         return true;\r
85                 }\r
86 \r
87         }\r
88 \r
89         return false;\r
90 }\r
91 \r
92 void UnkeyedIDCreator::Initialize()\r
93 {\r
94         m_waiting=false;\r
95         m_lastchecked=Poco::Timestamp();\r
96 }\r
97 \r
98 void UnkeyedIDCreator::Process()\r
99 {\r
100         Poco::DateTime now;\r
101 \r
102         // only perform check every minute (1/1440 of 1 day)\r
103         if(m_waiting==false && m_lastchecked<(now-Poco::Timespan(0,0,1,0,0)))\r
104         {\r
105                 CheckForUnkeyedID();\r
106         }\r
107 }\r
108 \r
109 void UnkeyedIDCreator::RegisterWithThread(FreenetMasterThread *thread)\r
110 {\r
111         thread->RegisterFCPConnected(this);\r
112         thread->RegisterFCPMessageHandler(this);\r
113         thread->RegisterPeriodicProcessor(this);\r
114 }\r
115 \r
116 void UnkeyedIDCreator::SaveKeys(const long localidentityid, const std::string &publickey, const std::string &privatekey)\r
117 {\r
118         SQLite3DB::Statement st=m_db->Prepare("UPDATE tblLocalIdentity SET PublicKey=?, PrivateKey=? WHERE LocalIdentityID=?;");\r
119         st.Bind(0,publickey);\r
120         st.Bind(1,privatekey);\r
121         st.Bind(2,localidentityid);\r
122         st.Step();\r
123 }\r