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

Committer:
sivan_toledo
Date:
2011-04-25
Revision:
1:b05231650f32
Parent:
0:3e7d6f496a67

File content as of revision 1:b05231650f32:

#include "Dropbox.h"
#include "HTTPClient.h"
#include "HTTPFileSender.h"
#include "base64.h"
#include "url.h"
#include "ctc_hmac.h"
#include "NTPClient.h"
#include "HTTPData.h"

// NET
NTPClient ntpClient;
HTTPResult result;

// Dropbox
string consumer_token = "p4t8cn8b3ddci2d";
string consumer_token_secret = "wtib99x350qo5l6";
char token[16] = {0};
char token_secret[16] = {0};
volatile bool completed = false;
int v = 6000;
char buffer[1024] = {0};

Timer timer;

extern DigitalOut led1;
extern DigitalOut led3;
extern void USBLoop();

void request_callback(HTTPResult r)
{
  result = r;
  completed = true;
}

bool dropbox_getToken(char* username, char* password)
{
    HTTPText data;
    HTTPClient client;
    
    /* Request Token */ 
    printf("Requesting token\r\n");
    
    char request[128] = {0};
    sprintf(request,
            "http://api.getdropbox.com/0/token?oauth_consumer_key=p4t8cn8b3ddci2d&email=%s&password=%s",
            username,
            password);
    
    printf(request);
    HTTPResult result = client.get(request, &data);
                                   
    if (result != HTTP_OK)
    {
        printf("R: %d", result);
        return false;
    }
    
    const char *dataContent = data.gets();    

    memcpy(token, dataContent + 11, 15); 
    memcpy(token_secret, dataContent + 40, 15); 
    
    printf("Got token %s %s %s\r\n", dataContent, token, token_secret);
    
    return true;
}

bool dropbox_syncTime()
{
    /* Get Time */
    printf("Synchronizing time\r\n");
    Host server(IpAddr(), 123, "0.pool.ntp.org");
    NTPResult result = ntpClient.setTime(server);
    
    //srand(time(NULL));
    
    return (result == NTP_OK);
}

bool dropbox_upload(string srcFile, string dstFile)
{    
    HTTPClient client;
    string dst = dstFile;
    
    time_t currentTime = time(NULL);
      
    v++; //= (rand() % 9999999) + 1000;

    //printf("T: %d NONCE: %d\r\n", currentTime, v); 
    
    memset(buffer, 0x00, 1024);
    sprintf(buffer, 
            "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",
            dst.c_str(),
            consumer_token.c_str(),
            v,
            currentTime,
            token);
   
    //printf("Sig: %s %d\n\r", buffer, strlen(buffer)); 
              
    string key = consumer_token_secret + "&" + token_secret;
    
    //printf("Key: %s %d\n\r", key.c_str(), key.size()); 
    
    byte hash[SHA_DIGEST_SIZE];
    Hmac hmac;
    HmacSetKey(&hmac, SHA, (const byte*)key.c_str(), key.size());
    HmacUpdate(&hmac, (const byte*)buffer, strlen(buffer));
    HmacFinal(&hmac, hash);

    char sig[128] = {0};
    base64enc((char*)hash, SHA_DIGEST_SIZE, sig);

    char *encodedSig = url_encode(sig);
    
    memset(buffer, 0x00, 1024);
    sprintf(buffer, 
            "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",
            dst.c_str(),
            consumer_token.c_str(),
            v,
            currentTime,
            token,
            encodedSig);
            
    //printf("Req: %s %d\n\r", buffer, strlen(buffer));

    HTTPFileSender httpFile(srcFile.c_str(), dst.c_str());

    HTTPText res;

    //client.setTimeout(5000);
    
    completed = false;
    HTTPResult postResult = client.post(buffer, httpFile, &res, request_callback);
    
    timer.start();
    
    while (!completed)
    {
        led1 = (timer.read_ms() % 250) >= 125;
        USBLoop();
        Net::poll();
    }
    
    timer.stop();
    timer.reset();
    
    led1 = 1;
    
    printf("Res: %s %d %d\n\r", res.gets(), postResult, result);
    
    free(encodedSig);
    
    return (result == HTTP_OK);
}

bool send_email(char* email)
{
    HTTPText txt;
    HTTPClient client;
    //char request[128] = "http://www.davidberlin.co.il/mail.php?pass=borisdavid&email=";    
    //strcpy(request + 60, email);
    char request[128] = "http://holev.com/hello.txt";
    
    //printf(request);
    
    completed = false;
    HTTPResult result2 = client.get(request, &txt, request_callback);
    
    while (!completed)
    {
        Net::poll();
    }
    led1 = 1;
    
    printf("Result %d:\"%s\"\r\n", result, txt.gets());
    
    return result == HTTP_OK;
}