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