Shlomi Ruder / HoneyPot

Fork of HoneyPot by Shlomi Ruder

Committer:
proxytype
Date:
Fri Sep 01 23:36:19 2017 +0000
Revision:
2:f52734664057

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
proxytype 2:f52734664057 1 #include <time.h>
proxytype 2:f52734664057 2 #include "mbed.h"
proxytype 2:f52734664057 3 #include "HoneypotServer.h"
proxytype 2:f52734664057 4 //#define DEBUG
proxytype 2:f52734664057 5 #include "hl_debug.h"
proxytype 2:f52734664057 6
proxytype 2:f52734664057 7 /* Constructor */
proxytype 2:f52734664057 8 /* initialize all members and set the standard error handler. */
proxytype 2:f52734664057 9 HoneypotServer::HoneypotServer()
proxytype 2:f52734664057 10 : m_pEthernet(NULL)
proxytype 2:f52734664057 11 {
proxytype 2:f52734664057 12 }
proxytype 2:f52734664057 13
proxytype 2:f52734664057 14 HoneypotServer::~HoneypotServer()
proxytype 2:f52734664057 15 {
proxytype 2:f52734664057 16 if (m_pEthernet == NULL) {
proxytype 2:f52734664057 17 INFO("Deleting EthernetInterface Object.\n");
proxytype 2:f52734664057 18 delete m_pEthernet;
proxytype 2:f52734664057 19 }
proxytype 2:f52734664057 20 }
proxytype 2:f52734664057 21
proxytype 2:f52734664057 22
proxytype 2:f52734664057 23 bool HoneypotServer::start(int * ports, int count, char * master_addr , EthernetInterface* pEthernet)
proxytype 2:f52734664057 24 {
proxytype 2:f52734664057 25 portsCount = 0;
proxytype 2:f52734664057 26 // If no ethernet interface is provided, instantiate own on the heap. This has to be deleted later in the destructor.
proxytype 2:f52734664057 27 // If a valid pointer to an thernet interface is proveded, we can simply use it.
proxytype 2:f52734664057 28 if (pEthernet == NULL) {
proxytype 2:f52734664057 29 ERR("Socket is not opened!!\r\n");
proxytype 2:f52734664057 30 return false;
proxytype 2:f52734664057 31
proxytype 2:f52734664057 32 } else {
proxytype 2:f52734664057 33 // In the case that the ethernet interface is provided, it is assumed that a connection has already been created.
proxytype 2:f52734664057 34 INFO("Using connection IP %s", pEthernet->getIPAddress());
proxytype 2:f52734664057 35 }
proxytype 2:f52734664057 36
proxytype 2:f52734664057 37 if(count < 1 && count > MAX_SOCKETS) {
proxytype 2:f52734664057 38 ERR("Sockets Limited %d \r\n", MAX_SOCKETS);
proxytype 2:f52734664057 39 return false;
proxytype 2:f52734664057 40 }
proxytype 2:f52734664057 41
proxytype 2:f52734664057 42
proxytype 2:f52734664057 43 SetTime();
proxytype 2:f52734664057 44
proxytype 2:f52734664057 45
proxytype 2:f52734664057 46 portsCount = count;
proxytype 2:f52734664057 47 portsTriggers = ports;
proxytype 2:f52734664057 48 masterIP = master_addr;
proxytype 2:f52734664057 49
proxytype 2:f52734664057 50 for(int i = 0; i < portsCount; i++) {
proxytype 2:f52734664057 51 if(!Binding(m_Svr[i], ports[i])) {
proxytype 2:f52734664057 52 ERR("Unable Binding Port: %i \r\n", ports[i]);
proxytype 2:f52734664057 53 } else {
proxytype 2:f52734664057 54 INFO("Binding Complete: %i \r\n", ports[i]);
proxytype 2:f52734664057 55 }
proxytype 2:f52734664057 56 }
proxytype 2:f52734664057 57
proxytype 2:f52734664057 58 return true;
proxytype 2:f52734664057 59 }
proxytype 2:f52734664057 60
proxytype 2:f52734664057 61 bool HoneypotServer::Binding(TCPSocketServer& svr, int port)
proxytype 2:f52734664057 62 {
proxytype 2:f52734664057 63 if (svr.bind(port) < 0) {
proxytype 2:f52734664057 64 return false;
proxytype 2:f52734664057 65 }
proxytype 2:f52734664057 66
proxytype 2:f52734664057 67 if (svr.listen(1) < 0) {
proxytype 2:f52734664057 68 return false;
proxytype 2:f52734664057 69 };
proxytype 2:f52734664057 70
proxytype 2:f52734664057 71 // set into non blocking operation
proxytype 2:f52734664057 72 svr.set_blocking(false, 200);
proxytype 2:f52734664057 73
proxytype 2:f52734664057 74 return true;
proxytype 2:f52734664057 75 }
proxytype 2:f52734664057 76
proxytype 2:f52734664057 77 int HoneypotServer::poll(bool blocking)
proxytype 2:f52734664057 78 {
proxytype 2:f52734664057 79 for(int i = 0; i < portsCount; i++) {
proxytype 2:f52734664057 80 TCPSocketConnection connection;
proxytype 2:f52734664057 81
proxytype 2:f52734664057 82 int port = m_Svr[i].getPort();
proxytype 2:f52734664057 83 int code = m_Svr[i].accept(connection);
proxytype 2:f52734664057 84
proxytype 2:f52734664057 85 int isMaster = 0;
proxytype 2:f52734664057 86 if(strcmp(connection.get_address(), masterIP) == 0) {
proxytype 2:f52734664057 87 isMaster = 1;
proxytype 2:f52734664057 88 }
proxytype 2:f52734664057 89
proxytype 2:f52734664057 90 char data [MAX_LOG_SIZE];
proxytype 2:f52734664057 91 char file [MAX_LOG_FILE];
proxytype 2:f52734664057 92
proxytype 2:f52734664057 93 time_t seconds = time(NULL);
proxytype 2:f52734664057 94
proxytype 2:f52734664057 95 if(code == WIZnet_Chip::SOCK_CLOSED || code == WIZnet_Chip::SOCK_CLOSE_WAIT) {
proxytype 2:f52734664057 96
proxytype 2:f52734664057 97 sprintf (data, "Client (IP=%s) is reset \r\nPort: %i \r\nDate: %s \r\n\r\n", connection.get_address(), port, ctime(&seconds));
proxytype 2:f52734664057 98 WriteLog(data, file);
proxytype 2:f52734664057 99
proxytype 2:f52734664057 100 Binding(m_Svr[i], port);
proxytype 2:f52734664057 101
proxytype 2:f52734664057 102 } else {
proxytype 2:f52734664057 103 if(code == WIZnet_Chip::SOCK_ESTABLISHED) {
proxytype 2:f52734664057 104
proxytype 2:f52734664057 105 sprintf (data, "Client (IP=%s) is connected\r\nPort: %i\r\nDate: %s \r\n\r\n", connection.get_address(), port, ctime(&seconds));
proxytype 2:f52734664057 106 WriteLog(data, file);
proxytype 2:f52734664057 107
proxytype 2:f52734664057 108 if(isMaster == 0) {
proxytype 2:f52734664057 109 hits[i] = hits[i] + 1;
proxytype 2:f52734664057 110 }
proxytype 2:f52734664057 111 ProcessPoll(connection, port, isMaster);
proxytype 2:f52734664057 112
proxytype 2:f52734664057 113 }
proxytype 2:f52734664057 114
proxytype 2:f52734664057 115 }
proxytype 2:f52734664057 116 }
proxytype 2:f52734664057 117
proxytype 2:f52734664057 118 return 0;
proxytype 2:f52734664057 119 }
proxytype 2:f52734664057 120
proxytype 2:f52734664057 121 int HoneypotServer::ProcessPoll(TCPSocketConnection CInt, int port, int isMaster)
proxytype 2:f52734664057 122 {
proxytype 2:f52734664057 123
proxytype 2:f52734664057 124
proxytype 2:f52734664057 125 //handle http requests
proxytype 2:f52734664057 126 if(port == HTTP_PORT) {
proxytype 2:f52734664057 127 HTTPConnection con(CInt);
proxytype 2:f52734664057 128
proxytype 2:f52734664057 129 int c = con.poll();
proxytype 2:f52734664057 130 if (c == 0) {
proxytype 2:f52734664057 131 // Handle the request
proxytype 2:f52734664057 132 INFO("Handling request !\r\n");
proxytype 2:f52734664057 133 HandleRequest(con.m_Msg, CInt, isMaster);
proxytype 2:f52734664057 134 }
proxytype 2:f52734664057 135
proxytype 2:f52734664057 136 } else {
proxytype 2:f52734664057 137 //unprocessing requests
proxytype 2:f52734664057 138 CInt.close();
proxytype 2:f52734664057 139 }
proxytype 2:f52734664057 140
proxytype 2:f52734664057 141 INFO("Leaving polling thread\r\n");
proxytype 2:f52734664057 142 return 0;
proxytype 2:f52734664057 143
proxytype 2:f52734664057 144 }
proxytype 2:f52734664057 145
proxytype 2:f52734664057 146 void HoneypotServer::HandleRequest(HTTPConnection::HTTPMessage& msg, TCPSocketConnection& tcp, int isMaster)
proxytype 2:f52734664057 147 {
proxytype 2:f52734664057 148 std::string localPath;
proxytype 2:f52734664057 149 std::map<std::string, HTTPRequestHandler*(*)(const char*, const char*, HTTPConnection::HTTPMessage&, TCPSocketConnection&, int, int*, int, int*), handlersComp>::const_iterator it;
proxytype 2:f52734664057 150
proxytype 2:f52734664057 151 // Iterate through registered handlers and check if the handler's path is a subset of the requested uri.
proxytype 2:f52734664057 152 for (it = m_lpHandlers.begin() ; it != m_lpHandlers.end() ; it++) {
proxytype 2:f52734664057 153 // check if this entries' path is fully contained at the beginning of the requested path
proxytype 2:f52734664057 154 std::string curpth = it->first;
proxytype 2:f52734664057 155
proxytype 2:f52734664057 156 if (msg.uri.find(curpth) == 0) {
proxytype 2:f52734664057 157 // firts matching handler found, we just take it and we'll be happy
proxytype 2:f52734664057 158 localPath = msg.uri.substr(curpth.length());
proxytype 2:f52734664057 159 break;
proxytype 2:f52734664057 160 }
proxytype 2:f52734664057 161 }
proxytype 2:f52734664057 162
proxytype 2:f52734664057 163 if (it == m_lpHandlers.end()) {
proxytype 2:f52734664057 164 // There is no such handler, so return invalid
proxytype 2:f52734664057 165
proxytype 2:f52734664057 166 INFO("Webrequest left unhandled.\r\n");
proxytype 2:f52734664057 167 } else {
proxytype 2:f52734664057 168 // Valid handler was found
proxytype 2:f52734664057 169 INFO("Routing webrequest !\r\n");
proxytype 2:f52734664057 170 // Instantiate the handler object (handling will be done from withing the object's constructor
proxytype 2:f52734664057 171
proxytype 2:f52734664057 172 HTTPRequestHandler *phdl = (*it->second)(it->first.c_str(), localPath.c_str(), msg, tcp, isMaster, portsTriggers, portsCount, hits);
proxytype 2:f52734664057 173 // now we can delete the object, because handling is completed.
proxytype 2:f52734664057 174 if (phdl != NULL)
proxytype 2:f52734664057 175 delete phdl;
proxytype 2:f52734664057 176 }
proxytype 2:f52734664057 177 }
proxytype 2:f52734664057 178
proxytype 2:f52734664057 179 int HoneypotServer::SetTime()
proxytype 2:f52734664057 180 {
proxytype 2:f52734664057 181 NTPClient ntp;
proxytype 2:f52734664057 182
proxytype 2:f52734664057 183 if (ntp.setTime("0.pool.ntp.org") == 0) {
proxytype 2:f52734664057 184 return 0;
proxytype 2:f52734664057 185 }
proxytype 2:f52734664057 186 printf("Error\r\n");
proxytype 2:f52734664057 187
proxytype 2:f52734664057 188 return -1;
proxytype 2:f52734664057 189 }
proxytype 2:f52734664057 190
proxytype 2:f52734664057 191 int HoneypotServer::WriteLog(char * data, char * fileName)
proxytype 2:f52734664057 192 {
proxytype 2:f52734664057 193 std::string path = "/local/";
proxytype 2:f52734664057 194 path.append(fileName);
proxytype 2:f52734664057 195
proxytype 2:f52734664057 196 FILE * pFile;
proxytype 2:f52734664057 197 pFile = fopen(path.c_str(),"a");
proxytype 2:f52734664057 198 if (pFile!=NULL) {
proxytype 2:f52734664057 199 fputs (data, pFile);
proxytype 2:f52734664057 200 fclose (pFile);
proxytype 2:f52734664057 201 }
proxytype 2:f52734664057 202
proxytype 2:f52734664057 203 return 0;
proxytype 2:f52734664057 204 }
proxytype 2:f52734664057 205