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:
Sun Apr 17 21:30:10 2011 +0000
Revision:
0:3e7d6f496a67
Child:
1:b05231650f32

        

Who changed what in which revision?

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