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 1:b05231650f32 1 #include "Dropbox.h"
sivan_toledo 1:b05231650f32 2 #include "HTTPClient.h"
sivan_toledo 1:b05231650f32 3 #include "HTTPFileSender.h"
sivan_toledo 1:b05231650f32 4 #include "base64.h"
sivan_toledo 1:b05231650f32 5 #include "url.h"
sivan_toledo 1:b05231650f32 6 #include "ctc_hmac.h"
sivan_toledo 1:b05231650f32 7 #include "NTPClient.h"
sivan_toledo 1:b05231650f32 8 #include "HTTPData.h"
sivan_toledo 1:b05231650f32 9
sivan_toledo 1:b05231650f32 10 // NET
sivan_toledo 1:b05231650f32 11 NTPClient ntpClient;
sivan_toledo 1:b05231650f32 12 HTTPResult result;
sivan_toledo 1:b05231650f32 13
sivan_toledo 1:b05231650f32 14 // Dropbox
sivan_toledo 1:b05231650f32 15 string consumer_token = "p4t8cn8b3ddci2d";
sivan_toledo 1:b05231650f32 16 string consumer_token_secret = "wtib99x350qo5l6";
sivan_toledo 1:b05231650f32 17 char token[16] = {0};
sivan_toledo 1:b05231650f32 18 char token_secret[16] = {0};
sivan_toledo 1:b05231650f32 19 volatile bool completed = false;
sivan_toledo 1:b05231650f32 20 int v = 6000;
sivan_toledo 1:b05231650f32 21 char buffer[1024] = {0};
sivan_toledo 1:b05231650f32 22
sivan_toledo 1:b05231650f32 23 Timer timer;
sivan_toledo 1:b05231650f32 24
sivan_toledo 1:b05231650f32 25 extern DigitalOut led1;
sivan_toledo 1:b05231650f32 26 extern DigitalOut led3;
sivan_toledo 1:b05231650f32 27 extern void USBLoop();
sivan_toledo 1:b05231650f32 28
sivan_toledo 1:b05231650f32 29 void request_callback(HTTPResult r)
sivan_toledo 1:b05231650f32 30 {
sivan_toledo 1:b05231650f32 31 result = r;
sivan_toledo 1:b05231650f32 32 completed = true;
sivan_toledo 1:b05231650f32 33 }
sivan_toledo 1:b05231650f32 34
sivan_toledo 1:b05231650f32 35 bool dropbox_getToken(char* username, char* password)
sivan_toledo 1:b05231650f32 36 {
sivan_toledo 1:b05231650f32 37 HTTPText data;
sivan_toledo 1:b05231650f32 38 HTTPClient client;
sivan_toledo 1:b05231650f32 39
sivan_toledo 1:b05231650f32 40 /* Request Token */
sivan_toledo 1:b05231650f32 41 printf("Requesting token\r\n");
sivan_toledo 1:b05231650f32 42
sivan_toledo 1:b05231650f32 43 char request[128] = {0};
sivan_toledo 1:b05231650f32 44 sprintf(request,
sivan_toledo 1:b05231650f32 45 "http://api.getdropbox.com/0/token?oauth_consumer_key=p4t8cn8b3ddci2d&email=%s&password=%s",
sivan_toledo 1:b05231650f32 46 username,
sivan_toledo 1:b05231650f32 47 password);
sivan_toledo 1:b05231650f32 48
sivan_toledo 1:b05231650f32 49 printf(request);
sivan_toledo 1:b05231650f32 50 HTTPResult result = client.get(request, &data);
sivan_toledo 1:b05231650f32 51
sivan_toledo 1:b05231650f32 52 if (result != HTTP_OK)
sivan_toledo 1:b05231650f32 53 {
sivan_toledo 1:b05231650f32 54 printf("R: %d", result);
sivan_toledo 1:b05231650f32 55 return false;
sivan_toledo 1:b05231650f32 56 }
sivan_toledo 1:b05231650f32 57
sivan_toledo 1:b05231650f32 58 const char *dataContent = data.gets();
sivan_toledo 1:b05231650f32 59
sivan_toledo 1:b05231650f32 60 memcpy(token, dataContent + 11, 15);
sivan_toledo 1:b05231650f32 61 memcpy(token_secret, dataContent + 40, 15);
sivan_toledo 1:b05231650f32 62
sivan_toledo 1:b05231650f32 63 printf("Got token %s %s %s\r\n", dataContent, token, token_secret);
sivan_toledo 1:b05231650f32 64
sivan_toledo 1:b05231650f32 65 return true;
sivan_toledo 1:b05231650f32 66 }
sivan_toledo 1:b05231650f32 67
sivan_toledo 1:b05231650f32 68 bool dropbox_syncTime()
sivan_toledo 1:b05231650f32 69 {
sivan_toledo 1:b05231650f32 70 /* Get Time */
sivan_toledo 1:b05231650f32 71 printf("Synchronizing time\r\n");
sivan_toledo 1:b05231650f32 72 Host server(IpAddr(), 123, "0.pool.ntp.org");
sivan_toledo 1:b05231650f32 73 NTPResult result = ntpClient.setTime(server);
sivan_toledo 1:b05231650f32 74
sivan_toledo 1:b05231650f32 75 //srand(time(NULL));
sivan_toledo 1:b05231650f32 76
sivan_toledo 1:b05231650f32 77 return (result == NTP_OK);
sivan_toledo 1:b05231650f32 78 }
sivan_toledo 1:b05231650f32 79
sivan_toledo 1:b05231650f32 80 bool dropbox_upload(string srcFile, string dstFile)
sivan_toledo 1:b05231650f32 81 {
sivan_toledo 1:b05231650f32 82 HTTPClient client;
sivan_toledo 1:b05231650f32 83 string dst = dstFile;
sivan_toledo 1:b05231650f32 84
sivan_toledo 1:b05231650f32 85 time_t currentTime = time(NULL);
sivan_toledo 1:b05231650f32 86
sivan_toledo 1:b05231650f32 87 v++; //= (rand() % 9999999) + 1000;
sivan_toledo 1:b05231650f32 88
sivan_toledo 1:b05231650f32 89 //printf("T: %d NONCE: %d\r\n", currentTime, v);
sivan_toledo 1:b05231650f32 90
sivan_toledo 1:b05231650f32 91 memset(buffer, 0x00, 1024);
sivan_toledo 1:b05231650f32 92 sprintf(buffer,
sivan_toledo 1:b05231650f32 93 "POST&http%%3A%%2F%%2Fapi-content.dropbox.com%%2F0%%2Ffiles%%2Fdropbox%%2F&file%%3D%s%%26oauth_consumer_key%%3D%s%%26oauth_nonce%%3D%d%%26oauth_signature_method%%3DHMAC-SHA1%%26oauth_timestamp%%3D%d%%26oauth_token%%3D%s",
sivan_toledo 1:b05231650f32 94 dst.c_str(),
sivan_toledo 1:b05231650f32 95 consumer_token.c_str(),
sivan_toledo 1:b05231650f32 96 v,
sivan_toledo 1:b05231650f32 97 currentTime,
sivan_toledo 1:b05231650f32 98 token);
sivan_toledo 1:b05231650f32 99
sivan_toledo 1:b05231650f32 100 //printf("Sig: %s %d\n\r", buffer, strlen(buffer));
sivan_toledo 1:b05231650f32 101
sivan_toledo 1:b05231650f32 102 string key = consumer_token_secret + "&" + token_secret;
sivan_toledo 1:b05231650f32 103
sivan_toledo 1:b05231650f32 104 //printf("Key: %s %d\n\r", key.c_str(), key.size());
sivan_toledo 1:b05231650f32 105
sivan_toledo 1:b05231650f32 106 byte hash[SHA_DIGEST_SIZE];
sivan_toledo 1:b05231650f32 107 Hmac hmac;
sivan_toledo 1:b05231650f32 108 HmacSetKey(&hmac, SHA, (const byte*)key.c_str(), key.size());
sivan_toledo 1:b05231650f32 109 HmacUpdate(&hmac, (const byte*)buffer, strlen(buffer));
sivan_toledo 1:b05231650f32 110 HmacFinal(&hmac, hash);
sivan_toledo 1:b05231650f32 111
sivan_toledo 1:b05231650f32 112 char sig[128] = {0};
sivan_toledo 1:b05231650f32 113 base64enc((char*)hash, SHA_DIGEST_SIZE, sig);
sivan_toledo 1:b05231650f32 114
sivan_toledo 1:b05231650f32 115 char *encodedSig = url_encode(sig);
sivan_toledo 1:b05231650f32 116
sivan_toledo 1:b05231650f32 117 memset(buffer, 0x00, 1024);
sivan_toledo 1:b05231650f32 118 sprintf(buffer,
sivan_toledo 1:b05231650f32 119 "http://api-content.dropbox.com/0/files/dropbox/?file=%s&oauth_consumer_key=%s&oauth_nonce=%d&oauth_timestamp=%d&oauth_token=%s&oauth_signature_method=HMAC-SHA1&oauth_signature=%s",
sivan_toledo 1:b05231650f32 120 dst.c_str(),
sivan_toledo 1:b05231650f32 121 consumer_token.c_str(),
sivan_toledo 1:b05231650f32 122 v,
sivan_toledo 1:b05231650f32 123 currentTime,
sivan_toledo 1:b05231650f32 124 token,
sivan_toledo 1:b05231650f32 125 encodedSig);
sivan_toledo 1:b05231650f32 126
sivan_toledo 1:b05231650f32 127 //printf("Req: %s %d\n\r", buffer, strlen(buffer));
sivan_toledo 1:b05231650f32 128
sivan_toledo 1:b05231650f32 129 HTTPFileSender httpFile(srcFile.c_str(), dst.c_str());
sivan_toledo 1:b05231650f32 130
sivan_toledo 1:b05231650f32 131 HTTPText res;
sivan_toledo 1:b05231650f32 132
sivan_toledo 1:b05231650f32 133 //client.setTimeout(5000);
sivan_toledo 1:b05231650f32 134
sivan_toledo 1:b05231650f32 135 completed = false;
sivan_toledo 1:b05231650f32 136 HTTPResult postResult = client.post(buffer, httpFile, &res, request_callback);
sivan_toledo 1:b05231650f32 137
sivan_toledo 1:b05231650f32 138 timer.start();
sivan_toledo 1:b05231650f32 139
sivan_toledo 1:b05231650f32 140 while (!completed)
sivan_toledo 1:b05231650f32 141 {
sivan_toledo 1:b05231650f32 142 led1 = (timer.read_ms() % 250) >= 125;
sivan_toledo 1:b05231650f32 143 USBLoop();
sivan_toledo 1:b05231650f32 144 Net::poll();
sivan_toledo 1:b05231650f32 145 }
sivan_toledo 1:b05231650f32 146
sivan_toledo 1:b05231650f32 147 timer.stop();
sivan_toledo 1:b05231650f32 148 timer.reset();
sivan_toledo 1:b05231650f32 149
sivan_toledo 1:b05231650f32 150 led1 = 1;
sivan_toledo 1:b05231650f32 151
sivan_toledo 1:b05231650f32 152 printf("Res: %s %d %d\n\r", res.gets(), postResult, result);
sivan_toledo 1:b05231650f32 153
sivan_toledo 1:b05231650f32 154 free(encodedSig);
sivan_toledo 1:b05231650f32 155
sivan_toledo 1:b05231650f32 156 return (result == HTTP_OK);
sivan_toledo 1:b05231650f32 157 }
sivan_toledo 1:b05231650f32 158
sivan_toledo 1:b05231650f32 159 bool send_email(char* email)
sivan_toledo 1:b05231650f32 160 {
sivan_toledo 1:b05231650f32 161 HTTPText txt;
sivan_toledo 1:b05231650f32 162 HTTPClient client;
sivan_toledo 1:b05231650f32 163 //char request[128] = "http://www.davidberlin.co.il/mail.php?pass=borisdavid&email=";
sivan_toledo 1:b05231650f32 164 //strcpy(request + 60, email);
sivan_toledo 1:b05231650f32 165 char request[128] = "http://holev.com/hello.txt";
sivan_toledo 1:b05231650f32 166
sivan_toledo 1:b05231650f32 167 //printf(request);
sivan_toledo 1:b05231650f32 168
sivan_toledo 1:b05231650f32 169 completed = false;
sivan_toledo 1:b05231650f32 170 HTTPResult result2 = client.get(request, &txt, request_callback);
sivan_toledo 1:b05231650f32 171
sivan_toledo 1:b05231650f32 172 while (!completed)
sivan_toledo 1:b05231650f32 173 {
sivan_toledo 1:b05231650f32 174 Net::poll();
sivan_toledo 1:b05231650f32 175 }
sivan_toledo 1:b05231650f32 176 led1 = 1;
sivan_toledo 1:b05231650f32 177
sivan_toledo 1:b05231650f32 178 printf("Result %d:\"%s\"\r\n", result, txt.gets());
sivan_toledo 1:b05231650f32 179
sivan_toledo 1:b05231650f32 180 return result == HTTP_OK;
sivan_toledo 0:3e7d6f496a67 181 }