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
Dropbox/Dropbox.cpp@1:b05231650f32, 2011-04-25 (annotated)
- Committer:
- sivan_toledo
- Date:
- Mon Apr 25 12:31:46 2011 +0000
- Revision:
- 1:b05231650f32
- Parent:
- 0:3e7d6f496a67
Who changed what in which revision?
User | Revision | Line number | New 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 | } |