/*********************************************************** **函数名 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; }
/*! * \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¶m=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; }
char *oauth_sign_hmac_sha1 (const char *m, const char *k) { return(oauth_sign_hmac_sha1_raw (m, strlen(m), k, strlen(k))); }
std::string oauth_sign_hmac_sha1(const char *m, const char *k) { return oauth_sign_hmac_sha1_raw(m, strlen(m), k, strlen(k)); }