int weibo_oauth_api_call(struct unim_login_info *login_info, struct unim_api_call_info *api_call_info) { char *req_param, *reply; int rc = -1; int argc = 0; char **argv = NULL; int i; argc = oauth_split_url_parameters(api_call_info->uri, &argv); if (login_info->request_added_argc) { for (i = 0; i < login_info->request_added_argc; i++) { oauth_add_param_to_array(&argc, &argv, login_info->request_added_argv[i]); } } req_param = oauth_serialize_url_parameters(argc, argv); printf("req_param: %s\n", req_param); reply = oauth_http_get(api_call_info->uri, req_param); if (reply) { printf("HTTP-reply:\n\t%s\n", reply); api_call_info->result = reply; rc = 0; } if (req_param) free(req_param); return rc; }
int weibo_statuses_update(struct unim_login_info *login_info, struct unim_api_call_info *api_call_info) { char *req_param, *reply; int rc = -1; int argc = 0; char **argv = NULL; int i; argc = oauth_split_url_parameters(api_call_info->uri, &argv); if (login_info->request_added_argc) { for (i = 0; i < login_info->request_added_argc; i++) { oauth_add_param_to_array(&argc, &argv, login_info->request_added_argv[i]); } } req_param = oauth_serialize_url_parameters(argc, argv); reply = oauth_http_post(api_call_info->uri, req_param); if (reply) { /* TODO: check replay! */ api_call_info->result = reply; rc = 0; } if (req_param) free(req_param); return rc; }
int weibo_oauth_access(struct unim_login_info *login_info) { char *req_param, *reply; int rc = -1; int argc = 0; char **argv = NULL; char *postargs = NULL; int i; argc = oauth_split_url_parameters(login_info->access_token_uri, &argv); if (login_info->request_added_argc) { for (i = 0; i < login_info->request_added_argc; i++) { oauth_add_param_to_array(&argc, &argv, login_info->request_added_argv[i]); } } req_param = oauth_serialize_url_parameters(argc, argv); printf("req_param: %s\n", req_param); reply = oauth_http_post(login_info->access_token_uri, req_param); if (reply) { JsonParser *jparser; GError *err; gboolean rb; printf("HTTP-reply:\n\t%s\n", reply); jparser = json_parser_new(); rb = json_parser_load_from_data(jparser, reply, strlen(reply), &err); if (!rb) { printf("json parse failed! err: %s\n", err->message); g_object_unref(jparser); goto error_out; } JsonReader *jreader = json_reader_new(json_parser_get_root(jparser)); rb = json_reader_read_member(jreader, "access_token"); if (rb) { login_info->access_token_key = strdup(json_reader_get_string_value(jreader)); rc = 0; } g_object_unref(jreader); } error_out: if (req_param) free(req_param); if (reply) free(reply); if (postargs) free(postargs); return rc; }
int unim_oauth_request(struct unim_login_info *login_info) { char *req_url, *reply; int rc = -1; int argc = 0; char **argv = NULL; int i; argc = oauth_split_url_parameters(login_info->request_token_uri, &argv); if (login_info->request_added_argc) { for (i = 0; i < login_info->request_added_argc; i++) { oauth_add_param_to_array(&argc, &argv, login_info->request_added_argv[i]); } } req_url = oauth_sign_array2(&argc, &argv, NULL, OA_HMAC, NULL, login_info->consumer_key, login_info->consumer_secret, NULL, NULL); reply = oauth_http_get(req_url, NULL); if (reply) { char **rv = NULL; printf("HTTP-reply:\n\t%s\n", reply); rc = oauth_split_url_parameters(reply, &rv); qsort(rv, rc, sizeof(char *), oauth_cmpstringp); if (rc >= 2) { for (i = 0; i < rc; i++) { if (!strncmp(rv[i], "oauth_token=", 12)) { login_info->res_token_key = strdup(&(rv[i][12])); } else if (!strncmp(rv[i], "oauth_token_secret=", 19)) { login_info->res_token_secret = strdup(&(rv[i][19])); } } rc = 0; } if (rv) free(rv); } if (req_url) free(req_url); if (reply) free(reply); if (argc) oauth_free_array(&argc, &argv); return rc; }
static void knh_setArgs(CTX ctx, Args_t *args, kMap *m) { kDictMap *dmap = knh_toDictMap(ctx, m, 0); ksfp_t *lsfp = ctx->esp; knitr_t mitrbuf = K_NITR_INIT, *mitr = &mitrbuf; klr_setesp(ctx, lsfp+1); char buf[256] = {0}; while(m->spi->next(ctx, m->mapptr, mitr, lsfp)) { const char *key = S_totext(lsfp[0].s); Object *o = knh_DictMap_getNULL(ctx, dmap, S_tobytes(lsfp[0].s)); switch (O_cid(o)) { case CLASS_Int: knh_snprintf(buf, sizeof(buf), "%s=" KINT_FMT, key, N_toint(o)); break; case CLASS_Float: knh_snprintf(buf, sizeof(buf), "%s=" KFLOAT_FMT, key, N_tofloat(o)); break; case CLASS_Boolean: knh_snprintf(buf, sizeof(buf), "%s=%s", key, N_tobool(o) ? "true" : "false"); break; case CLASS_String: knh_snprintf(buf, sizeof(buf), "%s=%s", key, S_totext((kString *)o)); break; default: TODO(); break; } DBG_P("m[%s] = {class:%s, struct:%s, o:%s}", S_totext(lsfp[0].s), CLASS__(O_cid(o)), STRUCT__(O_bcid(o)), O__(o)); if (knh_strlen(buf) > 0) { DBG_P("param: \"%s\"", buf); oauth_add_param_to_array(&args->argc, &args->argv, buf); } buf[0] = '\0'; klr_setesp(ctx, lsfp+1); } }
int plurk_api( key_pair* request ,key_pair* permanent ,const char* api_uri ,const char* invoke_method ,int arg_count, ... ) { char* request_uri = s_concate(&(plurk_url), &(plurk_uri_request)); char* api_url = s_concate( &(plurk_url) ,&(api_uri)); int argc = 0; int i = 0; char** argv = NULL; char* req_hdr = NULL; char* req_url = NULL; char* http_hdr = NULL; char* reply = NULL; char* postarg = NULL; argc = oauth_split_url_parameters(api_url, &argv); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, before add parameters to array\n"); for (i=0;i<argc; i++) printf("%d:%s\n",i,argv[i]); #endif int arg_index; char* arg_from_valist; va_list vaarg; va_start(vaarg, arg_count); for (arg_index = 0; arg_index < arg_count; arg_index++) { arg_from_valist = va_arg(vaarg, char*); oauth_add_param_to_array(&argc, &argv, arg_from_valist); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, arg_from_valist: %s\n", arg_from_valist); printf("SAMUEL_DEBUG, argc:%d\n", argc); #endif } va_end(vaarg); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, before add parameters to array\n"); for (i=0;i<argc; i++) printf("%d:%s\n",i,argv[i]); #endif oauth_sign_array2_process(&argc, &argv, NULL, //< postargs (unused) OA_HMAC, "POST", //< HTTP method (defaults to "GET") request->key, request->secret,//NULL, NULL); permanent->key, permanent->secret); req_hdr = oauth_serialize_url_sep(argc, 1, argv, ", ", 100); req_url = oauth_serialize_url_sep(argc, 0, argv, "&", 1); oauth_free_array(&argc, &argv); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, req_hdr: %s\n", req_hdr); printf("SAMUEL_DEBUG, req_url: %s\n", req_url); #endif http_hdr = malloc(strlen(req_hdr) + 200); memset(http_hdr,0,100); sprintf(http_hdr, "Authorization: OAuth realm=\"\", %s", req_hdr); #if SAMUEL_DEBUG printf("request URL=%s\n", req_url); printf("request header=%s\n\n", http_hdr); #endif reply = oauth_http_post2(req_url, &postarg, http_hdr); if(!reply){ printf("SAMUEL_DEBUG, HTTP request for an oauth request-token failed.\n"); } else printf("SAMUEL_DEBUG, reply: %s\n", reply); if (reply) free(reply); if (req_hdr) free(req_hdr); if (req_url) free(req_url); if (http_hdr) free(http_hdr); if (postarg) free(postarg); if (api_url) free(api_url); return 0; }
/** * @brief Use API key, response key-pair and verification code * to retrive the permanent key-pair * * @param req_key API key * @param req_secret API secret key * @param res_key the address of the response key * @param res_secret the address of the response secret key * @param verifier verification code * * @return error on 1 */ inline static int get_access_token(char* req_key, char* req_secret, char** res_key, char** res_secret, char* verifier){ int fail = 0; char *request_token_uri = s_concate(&(plurk_url), &(plurk_uri_access)); char *postarg = NULL; char *req_url; char *reply; int verifier_len = strlen(verifier); char *verifier_perm = malloc(sizeof(char)*(15 + verifier_len + 1)); memset(verifier_perm, 0, 15 + verifier_len + 1); verifier_perm = memcpy(verifier_perm, "oauth_verifier=", 15); verifier_perm = strncat(verifier_perm, verifier, verifier_len); //req_url = oauth_sign_url2(request_token_uri, // const char *url // &postarg, // char **postarg // OA_HMAC, // OAuthMethod method // "POST", // const char *http_method // req_key, // const char *key // req_secret, // const char *secret // res_t_key, // const char *t_key // res_t_secret // char *t_secret // ); // transfer oauth_sign_url2() in steps // example edited from: // http://liboauth.sourceforge.net/tests_2oauthtest2_8c-example.html#a0 int argc=0; int i; char **argv=NULL; char *req_hdr = NULL; char *http_hdr= NULL; argc = oauth_split_url_parameters(request_token_uri, &argv); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, before add parameters to array\n"); for (i=0;i<argc; i++) printf("%d:%s\n",i,argv[i]); #endif // the most important step here!! add parameter oauth_add_param_to_array(&argc, &argv, verifier_perm); #if SAMUEL_DEBUG printf("====\nSAMUEL_DEBUG, after add parameters to array\n"); for (i=0;i<argc; i++) printf("%d:%s\n",i,argv[i]); #endif //do something important here?? oauth_sign_array2_process(&argc, &argv, NULL, //< postargs (unused) OA_HMAC, "POST", //< HTTP method (defaults to "GET") req_key, req_secret,//NULL, NULL); *res_key, *res_secret); req_hdr = oauth_serialize_url_sep(argc, 1, argv, ", ", 6); req_url = oauth_serialize_url_sep(argc, 0, argv, "&", 1); oauth_free_array(&argc, &argv); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, req_hdr: %s\n",req_hdr); printf("SAMUEL_DEBUG, req_url: %s\n",req_url); #endif http_hdr = malloc(strlen(req_hdr) + 100); memset(http_hdr,0,100); sprintf(http_hdr, "Authorization: OAuth realm=\"\", %s", req_hdr); #if SAMUEL_DEBUG printf("request URL=%s\n", req_url); printf("request header=%s\n\n", http_hdr); #endif // POST HTTPMethod reply = oauth_http_post2(req_url,&postarg,http_hdr); // GET HTTPMethod //reply = oauth_http_get2(req_url,postarg,http_hdr); if(!reply){ printf("SAMUEL_DEBUG, HTTP request for an oauth request-token failed.\n"); return (fail = 1); } else fail = get_keysecret(reply, res_key, res_secret); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, res_key: '%s'\t res_secret: '%s'\n", *res_key, *res_secret); printf("Samuel_DEBUG, final %x\n",res_key); printf("SAMUEL_DEBUG, postarg: %s\n",postarg); #endif if(http_hdr) free(http_hdr); if(req_hdr) free(req_hdr); if(verifier_perm) free(verifier_perm); if(reply) free(reply); if(req_url) free(req_url); if(postarg) free(postarg); if(request_token_uri) free(request_token_uri); return fail; }
static int ckl_transport_run(ckl_transport_t *t, ckl_conf_t *conf, ckl_msg_t* m) { long httprc = -1; CURLcode res; char *url = strdup(conf->endpoint); if (t->append_url) { free(url); url = strappend(conf->endpoint, t->append_url); } if (conf->oauth_key && conf->oauth_secret) { int i; int argc; char **argv = NULL; char *url2; struct curl_httppost *tmp; argc = oauth_split_post_paramters(url, &argv, 0); for (tmp = t->formpost; tmp != NULL; tmp = tmp->next) { char *p = NULL; if (asprintf(&p, "%s=%s", tmp->name, tmp->contents) < 0) { fprintf(stderr, "Broken asprintf: %s = %s\n", tmp->name, tmp->contents); return -1; } oauth_add_param_to_array(&argc, &argv, p); free(p); } url2 = oauth_sign_array2(&argc, &argv, NULL, OA_HMAC, "POST", conf->oauth_key, conf->oauth_secret, "", ""); //fprintf(stderr, "url = %s\n", url2); free(url2); curl_formfree(t->formpost); t->formpost = NULL; t->lastptr = NULL; for (i = 1; i < argc; i++) { char *s = strdup(argv[i]); char *p = strchr(s, '='); if (p == NULL) { fprintf(stderr, "Broken argv: %s = %s\n", tmp->name, tmp->contents); return -1; } *p = '\0'; p++; //fprintf(stderr, "argv[%d]: %s = %s\n", i, s, p); curl_formadd(&t->formpost, &t->lastptr, CURLFORM_COPYNAME, s, CURLFORM_COPYCONTENTS, p, CURLFORM_END); } oauth_free_array(&argc, &argv); } if (m && m->script_log != NULL) { curl_formadd(&t->formpost, &t->lastptr, CURLFORM_COPYNAME, "scriptlog", CURLFORM_FILE, m->script_log, CURLFORM_FILENAME, "script.log", CURLFORM_CONTENTTYPE, "text/plain", CURLFORM_END); } curl_easy_setopt(t->curl, CURLOPT_HTTPPOST, t->formpost); curl_easy_setopt(t->curl, CURLOPT_URL, url); res = curl_easy_perform(t->curl); if (res != 0) { fprintf(stderr, "Failed talking to endpoint %s: (%d) %s\n\n", conf->endpoint, res, curl_easy_strerror(res)); return -1; } curl_easy_getinfo(t->curl, CURLINFO_RESPONSE_CODE, &httprc); if (httprc >299 || httprc <= 199) { fprintf(stderr, "Endpoint %s returned HTTP %d\n", conf->endpoint, (int)httprc); if (httprc == 403) { fprintf(stderr, "Are you sure your secret is correct?\n"); } return -1; } free(url); return 0; }