Student project by David Berlin and Boris Dogadov made for the Embedded Systems Workshop course given in Tel-Aviv University on 2010 by Sivan Toledo. Visit the project website for more details: http://davidberlin.co.il/sadna/ .

Dependencies:   EthernetNetIf NTPClient_NetServices mbed HTTPServer HTTPClient CyaSSL

Committer:
sivan_toledo
Date:
Mon Apr 25 12:31:46 2011 +0000
Revision:
1:b05231650f32
Parent:
0:3e7d6f496a67

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sivan_toledo 0:3e7d6f496a67 1 #include "HttpHandlerSetup.h"
sivan_toledo 0:3e7d6f496a67 2
sivan_toledo 0:3e7d6f496a67 3 bool ReadSettings(char* username, char* password)
sivan_toledo 0:3e7d6f496a67 4 {
sivan_toledo 0:3e7d6f496a67 5 //printf("ReadSettings start\r\n");
sivan_toledo 0:3e7d6f496a67 6 FILE* settingsFile = fopen("/usb/DBSet.txt", "r");
sivan_toledo 0:3e7d6f496a67 7 if (settingsFile)
sivan_toledo 0:3e7d6f496a67 8 {
sivan_toledo 1:b05231650f32 9 printf("before fseek %d\n\r", settingsFile);
sivan_toledo 0:3e7d6f496a67 10 fseek(settingsFile, 9L, SEEK_SET);
sivan_toledo 0:3e7d6f496a67 11 fgets(username, 32, settingsFile);
sivan_toledo 0:3e7d6f496a67 12 fseek(settingsFile, 9L, SEEK_CUR);
sivan_toledo 0:3e7d6f496a67 13 fgets(password, 32, settingsFile);
sivan_toledo 0:3e7d6f496a67 14
sivan_toledo 0:3e7d6f496a67 15
sivan_toledo 0:3e7d6f496a67 16 int len = strlen(username); username[len - 2] = 0; // remove /r/n
sivan_toledo 0:3e7d6f496a67 17 //printf("ReadSettings %s, %s, %d, %d, %s\r\n", username, password, len, ftell(settingsFile), data);
sivan_toledo 1:b05231650f32 18 //printf("ReadSettings OK %s, %s\r\n", username, password);
sivan_toledo 0:3e7d6f496a67 19 fclose(settingsFile);
sivan_toledo 0:3e7d6f496a67 20 }
sivan_toledo 0:3e7d6f496a67 21
sivan_toledo 0:3e7d6f496a67 22 return settingsFile != 0;
sivan_toledo 0:3e7d6f496a67 23 }
sivan_toledo 0:3e7d6f496a67 24
sivan_toledo 0:3e7d6f496a67 25 HttpHandlerSetup::HttpHandlerSetup(const char* rootPath, const char* path, TCPSocket* pTCPSocket) :
sivan_toledo 0:3e7d6f496a67 26 HTTPRequestHandler(rootPath, path, pTCPSocket)
sivan_toledo 0:3e7d6f496a67 27 {
sivan_toledo 0:3e7d6f496a67 28 //printf("HttpHandlerSetup()");
sivan_toledo 0:3e7d6f496a67 29 }
sivan_toledo 0:3e7d6f496a67 30
sivan_toledo 0:3e7d6f496a67 31 HttpHandlerSetup::~HttpHandlerSetup()
sivan_toledo 0:3e7d6f496a67 32 {
sivan_toledo 0:3e7d6f496a67 33 }
sivan_toledo 0:3e7d6f496a67 34
sivan_toledo 0:3e7d6f496a67 35 void HttpHandlerSetup::doGetPageWelcome()
sivan_toledo 0:3e7d6f496a67 36 {
sivan_toledo 0:3e7d6f496a67 37 //printf("doGetPageWelcome()-start\r\n");
sivan_toledo 0:3e7d6f496a67 38 const char* resp =
sivan_toledo 0:3e7d6f496a67 39 "<html><body>"
sivan_toledo 0:3e7d6f496a67 40 "<p><span style=\"color: #a9a9a9\"><span style=\"font-size: 12px\">DropBox Sync Setup</span></span></p><p>"
sivan_toledo 0:3e7d6f496a67 41 "<p><a href=\"/Setup\">Setup</a></p>"
sivan_toledo 0:3e7d6f496a67 42 "<p><a href=\"/UsbBrowser/root/\">DiskOnKey browser</a></p>"
sivan_toledo 0:3e7d6f496a67 43 "</form><p>&nbsp;</p>"
sivan_toledo 0:3e7d6f496a67 44 "<p><strong><span style=\"color: #000080\">BDDB Ltd.</span></strong></p>"
sivan_toledo 0:3e7d6f496a67 45 "</body>"
sivan_toledo 0:3e7d6f496a67 46 "</html>";
sivan_toledo 0:3e7d6f496a67 47
sivan_toledo 0:3e7d6f496a67 48 int len = strlen(resp);
sivan_toledo 0:3e7d6f496a67 49 setContentLen(len);
sivan_toledo 0:3e7d6f496a67 50 respHeaders()["Connection"] = "close";
sivan_toledo 0:3e7d6f496a67 51 writeData(resp, len);
sivan_toledo 0:3e7d6f496a67 52 }
sivan_toledo 0:3e7d6f496a67 53
sivan_toledo 0:3e7d6f496a67 54 void HttpHandlerSetup::UpdateSettingsFile()
sivan_toledo 1:b05231650f32 55 {
sivan_toledo 0:3e7d6f496a67 56 if (m_WasDataRead)
sivan_toledo 0:3e7d6f496a67 57 {
sivan_toledo 0:3e7d6f496a67 58 return;
sivan_toledo 0:3e7d6f496a67 59 }
sivan_toledo 1:b05231650f32 60
sivan_toledo 0:3e7d6f496a67 61 char buffer[256];
sivan_toledo 0:3e7d6f496a67 62 int dataLength = dataLen();
sivan_toledo 0:3e7d6f496a67 63 int readBytes = readData(buffer, 45 + dataLength);
sivan_toledo 0:3e7d6f496a67 64
sivan_toledo 0:3e7d6f496a67 65 if (readBytes > 0)
sivan_toledo 0:3e7d6f496a67 66 {
sivan_toledo 1:b05231650f32 67 //printf("UpdateSettingsFile %s \r\n", buffer);
sivan_toledo 1:b05231650f32 68 int offset = readBytes > dataLength ? 45 : 0; // Inconsistent data reading
sivan_toledo 0:3e7d6f496a67 69 char* c1 = strchr(buffer, '&');
sivan_toledo 0:3e7d6f496a67 70 char* c2 = strchr(buffer + offset, '=') + 1;
sivan_toledo 0:3e7d6f496a67 71 char* c3 = strchr(c1, '=') + 1;
sivan_toledo 0:3e7d6f496a67 72 int lenU = c1 - c2;
sivan_toledo 0:3e7d6f496a67 73 int lenP = readBytes - (c3 - buffer);
sivan_toledo 0:3e7d6f496a67 74
sivan_toledo 0:3e7d6f496a67 75 char* c2_fixed = strstr(c2, "%40");
sivan_toledo 0:3e7d6f496a67 76 if (c2_fixed) // case @ is replaced by %40
sivan_toledo 0:3e7d6f496a67 77 {
sivan_toledo 0:3e7d6f496a67 78 c2_fixed[0] = '@';
sivan_toledo 0:3e7d6f496a67 79 memcpy(c2_fixed + 1, c2_fixed + 3, lenU - (c2_fixed - c2) - 3);
sivan_toledo 0:3e7d6f496a67 80 lenU -= 2;
sivan_toledo 0:3e7d6f496a67 81 printf(c2);
sivan_toledo 0:3e7d6f496a67 82 }
sivan_toledo 0:3e7d6f496a67 83
sivan_toledo 0:3e7d6f496a67 84 FILE* settingsFile = fopen("/usb/DBSet.txt", "w");
sivan_toledo 0:3e7d6f496a67 85 if (settingsFile)
sivan_toledo 0:3e7d6f496a67 86 {
sivan_toledo 0:3e7d6f496a67 87 fwrite("USERNAME=", 1, 9, settingsFile);
sivan_toledo 0:3e7d6f496a67 88 fwrite(c2, 1, lenU, settingsFile);
sivan_toledo 0:3e7d6f496a67 89 fwrite("\r\nPASSWORD=", 1, 11, settingsFile);
sivan_toledo 0:3e7d6f496a67 90 fwrite(c3, 1, lenP, settingsFile);
sivan_toledo 0:3e7d6f496a67 91 fclose(settingsFile);
sivan_toledo 0:3e7d6f496a67 92
sivan_toledo 0:3e7d6f496a67 93 //printf("Updated %s, %s\r\n", c2, c3);
sivan_toledo 0:3e7d6f496a67 94 }
sivan_toledo 0:3e7d6f496a67 95 m_WasDataRead = true;
sivan_toledo 0:3e7d6f496a67 96 }
sivan_toledo 0:3e7d6f496a67 97
sivan_toledo 0:3e7d6f496a67 98 //printf("readBytes %d\r\n", readBytes);
sivan_toledo 0:3e7d6f496a67 99 }
sivan_toledo 0:3e7d6f496a67 100
sivan_toledo 0:3e7d6f496a67 101 void HttpHandlerSetup::doGet()
sivan_toledo 0:3e7d6f496a67 102 {
sivan_toledo 0:3e7d6f496a67 103 //printf("Setup path %s\r\n", path());
sivan_toledo 0:3e7d6f496a67 104 if (path().size() <= 1)
sivan_toledo 0:3e7d6f496a67 105 {
sivan_toledo 0:3e7d6f496a67 106 doGetPageWelcome();
sivan_toledo 0:3e7d6f496a67 107 return;
sivan_toledo 0:3e7d6f496a67 108 }
sivan_toledo 0:3e7d6f496a67 109
sivan_toledo 0:3e7d6f496a67 110 //printf("doGet()-start %s, %s\r\n", Username, Password);
sivan_toledo 0:3e7d6f496a67 111 const char* resp1 =
sivan_toledo 0:3e7d6f496a67 112 "<html><body>"
sivan_toledo 0:3e7d6f496a67 113 "<p><span style=\"color: #a9a9a9\"><span style=\"font-size: 12px\">DropBox Sync Setup</span></span></p><p>"
sivan_toledo 0:3e7d6f496a67 114 "<form method=\"post\" action=\"\">"
sivan_toledo 0:3e7d6f496a67 115 "Username: <input type=\"text\" name=\"Username\" value=\"";
sivan_toledo 0:3e7d6f496a67 116 const char* resp2 = "\" /><br />Password: <input type=\"text\" name=\"Password\" value=\"";
sivan_toledo 0:3e7d6f496a67 117 const char* resp3 =
sivan_toledo 0:3e7d6f496a67 118 "\" /><br /><input type=\"submit\" value=\"Submit\" />"
sivan_toledo 0:3e7d6f496a67 119 "</form><p>&nbsp;</p>"
sivan_toledo 0:3e7d6f496a67 120 "<p><strong><span style=\"color: #000080\">BDDB Ltd</span></strong></p>"
sivan_toledo 0:3e7d6f496a67 121 "</body>"
sivan_toledo 0:3e7d6f496a67 122 "</html>";
sivan_toledo 0:3e7d6f496a67 123
sivan_toledo 0:3e7d6f496a67 124 char username[32]="invalid", password[32]="error";
sivan_toledo 0:3e7d6f496a67 125 ReadSettings(username, password);
sivan_toledo 0:3e7d6f496a67 126
sivan_toledo 0:3e7d6f496a67 127 int l1 = strlen(resp1), l2 = strlen(resp2), l3 = strlen(resp3);
sivan_toledo 0:3e7d6f496a67 128 int p = strlen(password), u = strlen(username);
sivan_toledo 0:3e7d6f496a67 129
sivan_toledo 0:3e7d6f496a67 130 respHeaders()["Connection"] = "close";
sivan_toledo 0:3e7d6f496a67 131
sivan_toledo 0:3e7d6f496a67 132 setContentLen(l1 + l2 + l3 + p + u);
sivan_toledo 0:3e7d6f496a67 133 int t1 = writeData(resp1, l1);
sivan_toledo 0:3e7d6f496a67 134 int t2 = writeData(username, u);
sivan_toledo 0:3e7d6f496a67 135 int t3 = writeData(resp2, l2);
sivan_toledo 0:3e7d6f496a67 136 int t4 = writeData(password,p);
sivan_toledo 0:3e7d6f496a67 137 int t5 = writeData(resp3, l3);
sivan_toledo 0:3e7d6f496a67 138
sivan_toledo 0:3e7d6f496a67 139 m_WasDataRead = false;
sivan_toledo 0:3e7d6f496a67 140 printf("doGet()-end\r\n");
sivan_toledo 0:3e7d6f496a67 141 }
sivan_toledo 0:3e7d6f496a67 142
sivan_toledo 0:3e7d6f496a67 143 void HttpHandlerSetup::doPost()
sivan_toledo 0:3e7d6f496a67 144 {/*
sivan_toledo 0:3e7d6f496a67 145 map<string,string>::iterator it = reqHeaders().begin();
sivan_toledo 0:3e7d6f496a67 146 printf("printing %s\n\r", path());
sivan_toledo 0:3e7d6f496a67 147 while (it != reqHeaders().end())
sivan_toledo 0:3e7d6f496a67 148 {
sivan_toledo 0:3e7d6f496a67 149 printf("%s --- %s\r\n", it->first, it->second);
sivan_toledo 0:3e7d6f496a67 150 it++;
sivan_toledo 0:3e7d6f496a67 151 }
sivan_toledo 0:3e7d6f496a67 152 */
sivan_toledo 0:3e7d6f496a67 153 printf("doPost()-start\r\n");
sivan_toledo 0:3e7d6f496a67 154 UpdateSettingsFile();
sivan_toledo 0:3e7d6f496a67 155
sivan_toledo 0:3e7d6f496a67 156 const char* resp =
sivan_toledo 0:3e7d6f496a67 157 "<html><body>"
sivan_toledo 0:3e7d6f496a67 158 "<p><span style=\"color: #0080FF\"><span style=\"font-size: 14px\">Password changed</span></span></p><p>"
sivan_toledo 0:3e7d6f496a67 159 "<FORM><INPUT TYPE=\"button\" VALUE=\"Back\" onClick=\"history.go(-1);return true;\"></FORM>"
sivan_toledo 0:3e7d6f496a67 160 "</form><p>&nbsp;</p>"
sivan_toledo 0:3e7d6f496a67 161 "<p><strong><span style=\"color: #000080\">BDDB Ltd.</span></strong></p>"
sivan_toledo 0:3e7d6f496a67 162 "</body>"
sivan_toledo 0:3e7d6f496a67 163 "</html>";
sivan_toledo 0:3e7d6f496a67 164 const int length = strlen(resp);
sivan_toledo 0:3e7d6f496a67 165 setContentLen(length);
sivan_toledo 0:3e7d6f496a67 166 respHeaders()["Connection"] = "keep-alive";
sivan_toledo 0:3e7d6f496a67 167 writeData(resp, length);
sivan_toledo 0:3e7d6f496a67 168
sivan_toledo 0:3e7d6f496a67 169 printf("doPost()-end\r\n");
sivan_toledo 0:3e7d6f496a67 170 }
sivan_toledo 0:3e7d6f496a67 171
sivan_toledo 0:3e7d6f496a67 172 void HttpHandlerSetup::doHead()
sivan_toledo 0:3e7d6f496a67 173 {
sivan_toledo 0:3e7d6f496a67 174 printf("onHead\r\n");
sivan_toledo 0:3e7d6f496a67 175 }
sivan_toledo 0:3e7d6f496a67 176
sivan_toledo 0:3e7d6f496a67 177 void HttpHandlerSetup::onReadable() //Data has been read
sivan_toledo 0:3e7d6f496a67 178 {
sivan_toledo 0:3e7d6f496a67 179 printf("onReadable\r\n");
sivan_toledo 0:3e7d6f496a67 180 UpdateSettingsFile();
sivan_toledo 1:b05231650f32 181 close();
sivan_toledo 0:3e7d6f496a67 182 }
sivan_toledo 0:3e7d6f496a67 183
sivan_toledo 0:3e7d6f496a67 184 void HttpHandlerSetup::onWriteable() //Data has been written & buf is free
sivan_toledo 0:3e7d6f496a67 185 {
sivan_toledo 0:3e7d6f496a67 186 // printf("onWriteable() password: %s, username:%s \r\n", Password, Username);
sivan_toledo 0:3e7d6f496a67 187 printf("onWriteable\r\n");
sivan_toledo 1:b05231650f32 188 close(); //Data written, we can close the connection
sivan_toledo 0:3e7d6f496a67 189 }
sivan_toledo 0:3e7d6f496a67 190
sivan_toledo 0:3e7d6f496a67 191 void HttpHandlerSetup::onClose() //Connection is closing
sivan_toledo 0:3e7d6f496a67 192 {
sivan_toledo 0:3e7d6f496a67 193 printf("onClose\r\n");
sivan_toledo 0:3e7d6f496a67 194 //Nothing to do
sivan_toledo 0:3e7d6f496a67 195 }