/***********************************************************
**函数名 makeSig
**输入:   
**          method 请求方法 "get" or "post"
            url_path   openapi名称
            params    请求参数
            secret      密钥
**输出:  
**              
**返回:  签名
**描述: 生成签名
**            
**************************************************************/ 
string CSnsSigCheck::makeSig(string& method, string& url_path, map<string, string>& params, string& secret) 
{
    string source;

    transform(method.begin(),method.end(), method.begin(),::toupper);
    source.append(method);
    source.append("&");
    source.append(url_encode(url_path));
    source.append("&");
    source.append(url_encode(join_params(params)));

    char* p_sig = oauth_sign_hmac_sha1_raw(
        source.c_str(),
        source.size(), 
        secret.c_str(),
        secret.size());

        if (p_sig == NULL)
        {
            return "";
        }

        string sig = p_sig;;

        delete [] p_sig;
        p_sig = NULL;

        return sig;
}
Exemple #2
0
/*!
 * \brief   Perform an OAuth GET or POST request for a Dropbox client.
 * \param        cli        authenticated dropbox client
 * \param        url        request base url
 * \param        data       where the request answer is readed (e.g. FILE*)
 * \param        readFct    called function to read data content (e.g. fwrite)
 * \param[out]   answer     server answer (must be freed by caller)
 * \param        timeout    request timeout limit (0 is infinite)
 * \return  error code (DRBERR_XXX or http error returned by the Dropbox server)
 */
int drbOAuthPostFile(drbClient* cli, const char *url, void* data,
                     ssize_t (*readFct)(void *, size_t , size_t , void *),
                     char** answer, int timeout)
{
    
    int err;
    
    memStream fileData; memStreamInit(&fileData);
    if (memStreamLoad(&fileData, data, (void*)readFct)) {
        
        // Build request url
        char *reqUrl = NULL;
        char* key = oauth_catenc(2, cli->c.secret, cli->t.secret);
        char* sign = oauth_sign_hmac_sha1_raw(fileData.data, fileData.size, key, strlen(key));
        asprintf(&reqUrl,"%s&xoauth_body_signature=%s&param=val"
                 "&xoauth_body_signature_method=HMAC_SHA1", url, sign);
        free(key), free(sign);
        
        CURL *curl;
        if(reqUrl && (curl = curl_easy_init())) {
            memStream answerData; memStreamInit(&answerData);
            
            char* header;
            asprintf(&header, "Content-Type: application/octet-stream\r\n "
                     "Content-Length: %lu\r\n"
                     "accept-ranges: bytes", fileData.size);
            
            struct curl_slist *slist = curl_slist_append(NULL, header);
            curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
            curl_easy_setopt(curl, CURLOPT_READDATA, &fileData);
            curl_easy_setopt(curl, CURLOPT_READFUNCTION, memStreamRead);
            curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, fileData.size);
            
            err = drbOAuthCurlPerform(cli, curl, reqUrl, DRB_HTTP_POST2,
                                      &answerData, answer ? memStreamWrite:NULL,
                                      NULL, timeout);
            
            free(header);
            curl_slist_free_all(slist);
            curl_easy_cleanup(curl);
            free(fileData.data);
            
            if (answer)
                *answer = answerData.data;
        } else
            err = DRBERR_MALLOC;
        
        free(reqUrl);
    } else
        err = DRBERR_MALLOC;
    
    return err;
}
Exemple #3
0
char *oauth_sign_hmac_sha1 (const char *m, const char *k) {
  return(oauth_sign_hmac_sha1_raw (m, strlen(m), k, strlen(k)));
}
Exemple #4
0
std::string oauth_sign_hmac_sha1(const char *m, const char *k)
{
    return oauth_sign_hmac_sha1_raw(m, strlen(m), k, strlen(k));
}