Пример #1
0
static LwqqAsyncEvent* get_login_sig(LwqqClient* lc)
{
	char url[512];
	snprintf(url,sizeof(url),WEBQQ_LOGIN_UI_HOST"/cgi-bin/login"
			"?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903"
			"&enable_qlogin=0&s_url=http%%3A%%2F%%2Fweb2.qq.com%%2Floginproxy.html"
			);
	LwqqHttpRequest* req = lwqq_http_create_default_request(lc, url, NULL);
	lwqq_http_set_option(req, LWQQ_HTTP_TIMEOUT,5);
	lwqq_http_set_option(req, LWQQ_HTTP_TIMEOUT_INCRE,5);
	return req->do_request_async(req,lwqq__hasnot_post(),_C_(p_i,get_login_sig_back,req));
}
Пример #2
0
static void upload_offline_file_init(PurpleXfer* xfer)
{
	qq_account* ac = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account));
	LwqqClient* lc = ac->qq;

	const char* serv_id;
	if(ac->flag&QQ_USE_QQNUM){
		const char* qqnum = purple_xfer_get_remote_user(xfer);
		LwqqBuddy* b = find_buddy_by_qqnumber(ac->qq, qqnum);
		if(b == NULL) return;
		serv_id = b->uin;
	}else{
		serv_id = purple_xfer_get_remote_user(xfer);
	}

	LwqqMsgOffFile* file = lwqq_msg_fill_upload_offline_file(
			xfer->local_filename, lc->myself->uin, serv_id);
	xfer->start_time = time(NULL);
	xfer->data = file;
	int flags = 0;
	if(ac->flag&QQ_DONT_EXPECT_100_CONTINUE) flags |= DONT_EXPECTED_100_CONTINUE;
	LwqqAsyncEvent* ev = lwqq_msg_upload_offline_file(lc,file,flags);
	lwqq_async_add_event_listener(ev,_C_(2p,send_file,ev,xfer));
	LwqqHttpRequest* req = lwqq_async_event_get_conn(ev);
	lwqq_http_on_progress(req, file_trans_on_progress, xfer);
	lwqq_http_set_option(req, LWQQ_HTTP_CANCELABLE,1L);
}
Пример #3
0
static LwqqAsyncEvent* get_version(LwqqClient *lc, LwqqErrorCode *err)
{
    LwqqHttpRequest *req;

    req = lwqq_http_create_default_request(lc,WEBQQ_VERSION_URL, err);
    lwqq_http_set_option(req, LWQQ_HTTP_ALL_TIMEOUT,5L);

    /* Send request */
    lwqq_log(LOG_DEBUG, "Get webqq version from %s\n", WEBQQ_VERSION_URL);
    return  req->do_request_async(req, 0, NULL,_C_(p_i,get_version_back,req));
}
Пример #4
0
LwqqAsyncEvent* lwqq_get_version(LwqqClient *lc, LwqqErrorCode *err)
{
    LwqqHttpRequest *req;

	const char* url = WEBQQ_VERSION_URL;
    req = lwqq_http_create_default_request(lc,url , err);
    lwqq_http_set_option(req, LWQQ_HTTP_ALL_TIMEOUT,5L);

    /* Send request */
    lwqq_log(LOG_DEBUG, "Get webqq version from %s\n", WEBQQ_VERSION_URL);
    return  req->do_request_async(req, lwqq__hasnot_post(),_C_(p_i,get_version_back,req));
}
Пример #5
0
static LwqqAsyncEvent* get_verify_code(LwqqClient *lc,const char* appid)
{
    LwqqHttpRequest *req;
    char url[512];
    char chkuin[64];

    snprintf(url, sizeof(url), WEBQQ_CHECK_HOST"/check?uin=%s&appid=%s",
             lc->username, appid);
    req = lwqq_http_create_default_request(lc,url,NULL);
    req->retry = 0;
    lwqq_http_set_option(req, LWQQ_HTTP_ALL_TIMEOUT,5L);
    lwqq_verbose(3,"%s\n",url);
    
    snprintf(chkuin, sizeof(chkuin), "chkuin=%s", lc->username);
    req->set_header(req, "Cookie", chkuin);
    return req->do_request_async(req, 0, NULL,_C_(p_i,get_verify_code_back,req));
}
Пример #6
0
static void recv_file_init(PurpleXfer* xfer)
{
	qq_account* ac = purple_connection_get_protocol_data(purple_account_get_connection(xfer->account));
	LwqqClient* lc = ac->qq;
	LwqqMsgFileMessage* file = xfer->data;
	const char* filename = purple_xfer_get_local_filename(xfer);
	xfer->start_time = time(NULL);
	LwqqAsyncEvent* ev = lwqq_msg_accept_file(lc,file,filename);
	if(ev == NULL){ 
		lwqq_puts("file trans error ");
		purple_xfer_error(PURPLE_XFER_RECEIVE, ac->account, purple_xfer_get_remote_user(xfer), _("Receive file failed"));
		purple_xfer_cancel_local(xfer);
		return;
	}
	LwqqHttpRequest* req = lwqq_async_event_get_conn(ev);
	lwqq_http_on_progress(req, file_trans_on_progress, xfer);
	lwqq_http_set_option(req, LWQQ_HTTP_CANCELABLE,1L);
	lwqq_async_add_event_listener(ev,_C_(2p,recv_file_complete,xfer,ev));
}
Пример #7
0
/** 
 * WebQQ logout function
 * 
 * @param client Lwqq Client 
 * @param err Error code
 */
LWQQ_EXPORT
void lwqq_logout(LwqqClient *client, LwqqErrorCode *err)
{
	LwqqClient* lc = client;
	char url[512];
	LwqqHttpRequest *req = NULL;  
	int ret;
	json_t *json = NULL;
	char *value;
	struct timeval tv;
	long int re;

	if (!client) {
		lwqq_log(LOG_ERROR, "Invalid pointer\n");
		return ;
	}

	/* Get the milliseconds of now */
	if (gettimeofday(&tv, NULL)) {
		if (err)
			*err = LWQQ_EC_ERROR;
		return ;
	}
	re = tv.tv_usec / 1000;
	re += tv.tv_sec;

	snprintf(url, sizeof(url), "%s/channel/logout2"
			"?clientid=%s&psessionid=%s&t=%ld",
			WEBQQ_D_HOST, client->clientid, client->psessionid, re);

	/* Create a GET request */
	req = lwqq_http_create_default_request(client,url, err);
	if (!req) {
		goto done;
	}

	/* Set header needed by server */
	req->set_header(req, "Referer", WEBQQ_LOGIN_REF_URL);

	lwqq_http_set_option(req, LWQQ_HTTP_ALL_TIMEOUT,5L);
	req->retry = 0;
	ret = req->do_request(req, 0, NULL);
	if (ret) {
		lwqq_log(LOG_ERROR, "Send logout request failed\n");
		if (err)
			*err = LWQQ_EC_NETWORK_ERROR;
		goto done;
	}
	if (req->http_code != 200) {
		if (err)
			*err = LWQQ_EC_HTTP_ERROR;
		goto done;
	}

	ret = json_parse_document(&json, req->response);
	if (ret != JSON_OK) {
		if (err)
			*err = LWQQ_EC_ERROR;
		goto done;
	}

	/* Check whether logout correctly */
	value = json_parse_simple_value(json, "retcode");
	if (!value || strcmp(value, "0")) {
		if (err)
			*err = LWQQ_EC_ERROR;
		goto done;
	}
	value = json_parse_simple_value(json, "result");
	if (!value || strcmp(value, "ok")) {
		if (err)
			*err = LWQQ_EC_ERROR;
		goto done;
	}

	/* Ok, seems like all thing is ok */
	if (err)
		*err = LWQQ_EC_OK;

done:
	if (json)
		json_free_value(&json);
	lwqq_http_request_free(req);
	client->stat = LWQQ_STATUS_LOGOUT;
}
Пример #8
0
static int do_login_back(LwqqHttpRequest* req,LwqqAsyncEvent* event)
{
	char refer[1024];
	LwqqClient* lc = req->lc;
	int err = LWQQ_EC_OK;
	const char* response;
	//const char redirect_url[512];
	if (req->http_code != 200) {
		err = LWQQ_EC_HTTP_ERROR;
		goto done;
	}
	if (strstr(req->response,"aq.qq.com")!=NULL){
		err = LWQQ_EC_LOGIN_ABNORMAL;
		const char* beg = strstr(req->response,"http://aq.qq.com");
		if(beg) sscanf(beg,"%[^']",lc->error_description); // beg may be null
		goto done;
	}
	if(req->response == NULL){
		lwqq_puts("login no response\n");
		err = LWQQ_EC_NETWORK_ERROR;
		goto done;
	}

	response = req->response;
	lwqq_verbose(3,"%s\n",response);
	char *p = strstr(response, "\'");
	if (!p) {
		err = LWQQ_EC_ERROR;
		goto done;
	}
	int status,param2;
	char url[512];
	int param4;
	char msg[512];
	char user[64];
	//void url is '' which makes sscanf failed
	//%*c is for eat a blank before 'user'
	sscanf(response,"ptuiCB('%d','%d','%[^,],'%d','%[^']',%*c'%[^']');",
			&status,&param2,url,&param4,msg,user);
	url[strlen(url)-1]=0;
	switch (status) {
		case 0:
			{
				err = LWQQ_EC_OK;
				LwqqHttpRequest* req = lwqq_http_create_default_request(lc, url, NULL);
				req->set_header(req,"Referer",WEBQQ_LOGIN_LONG_REF_URL(refer));
				lwqq_http_set_option(req, LWQQ_HTTP_MAXREDIRS,1L);
				LwqqAsyncEvent* ev = req->do_request_async(req,lwqq__hasnot_post(),_C_(p_i,lwqq__process_empty,req));
				lwqq_async_add_event_chain(ev, event);
			} break;
		case 1:
			lwqq_log(LOG_WARNING, "Server busy! Please try again\n");
			lc->last_err = "Server busy! Please try again";
			err = LWQQ_EC_ERROR;
			goto done;

		case 2:
			lwqq_log(LOG_ERROR, "Out of date QQ number\n");
			lc->last_err = "Out of date QQ number";
			err = LWQQ_EC_ERROR;
			goto done;

		case 3:
			lwqq_log(LOG_ERROR, "Wrong password\n");
			err = LWQQ_EC_WRONG_PASS;
			lc->last_err = "Wrong username or password";
			goto done;

		case 4:
			lwqq_log(LOG_ERROR, "Wrong verify code\n");
			err = LWQQ_EC_WRONG_VERIFY;
			lc->last_err = "Wrong verify code";
			goto done;

		case 5:
			lwqq_log(LOG_ERROR, "Verify failed\n");
			lc->last_err = "Verify failed";
			err = LWQQ_EC_FAILD_VERIFY;
			goto done;

		case 6:
			lwqq_log(LOG_WARNING, "You may need to try login again\n");
			lc->last_err = "You may need to try login again";
			err = LWQQ_EC_ERROR;
			goto done;

		case 7:
			lwqq_log(LOG_ERROR, "Wrong input\n");
			lc->last_err = "Wrong input";
			err = LWQQ_EC_ERROR;
			goto done;

		case 8:
			lwqq_log(LOG_ERROR, "Too many logins on this IP. Please try again\n");
			lc->last_err = "Too many logins on this IP.Please try again";
			err = LWQQ_EC_ERROR;
			goto done;
		case LWQQ_EC_LOGIN_NEED_BARCODE:
			lwqq_log(LOG_ERROR, "%s\n",msg);
			lc->error_description = s_strdup(msg);
			err = LWQQ_EC_LOGIN_NEED_BARCODE;
			goto done;

		default:
			err = LWQQ_EC_ERROR;
			lc->last_err = "Unknow error";
			lwqq_log(LOG_ERROR, "Unknow error");
			goto done;
	}

done:
	lwqq_http_request_free(req);
	return err;
}