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@0:3e7d6f496a67, 2011-04-17 (annotated)
- Committer:
- sivan_toledo
- Date:
- Sun Apr 17 21:30:10 2011 +0000
- Revision:
- 0:3e7d6f496a67
- Child:
- 1:b05231650f32
Who changed what in which revision?
User | Revision | Line number | New 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 | } |