static void wispr_portal_request_portal( struct connman_wispr_portal_context *wp_context) { DBG(""); wp_context->request_id = g_web_request_get(wp_context->web, wp_context->status_url, wispr_portal_web_result, wispr_route_request, wp_context); if (wp_context->request_id == 0) wispr_portal_error(wp_context); }
static void wispr_portal_browser_reply_cb(struct connman_service *service, bool authentication_done, const char *error, void *user_data) { struct connman_wispr_portal_context *wp_context = user_data; DBG(""); if (!service || !wp_context) return; if (!authentication_done) { wispr_portal_error(wp_context); free_wispr_routes(wp_context); return; } /* Restarting the test */ __connman_service_wispr_start(service, wp_context->type); }
static bool wispr_portal_web_result(GWebResult *result, gpointer user_data) { struct connman_wispr_portal_context *wp_context = user_data; const char *redirect = NULL; const guint8 *chunk = NULL; const char *str = NULL; guint16 status; gsize length; DBG(""); if (wp_context->wispr_result != CONNMAN_WISPR_RESULT_ONLINE) { g_web_result_get_chunk(result, &chunk, &length); if (length > 0) { g_web_parser_feed_data(wp_context->wispr_parser, chunk, length); return true; } g_web_parser_end_data(wp_context->wispr_parser); if (wp_context->wispr_msg.message_type >= 0) { if (wispr_manage_message(result, wp_context)) goto done; } } status = g_web_result_get_status(result); DBG("status: %03u", status); switch (status) { case 000: __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; case 200: if (wp_context->wispr_msg.message_type >= 0) break; if (g_web_result_get_header(result, "X-ConnMan-Status", &str)) { portal_manage_status(result, wp_context); return false; } else __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->redirect_url, wp_context); break; case 302: if (!g_web_supports_tls() || !g_web_result_get_header(result, "Location", &redirect)) { __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; } DBG("Redirect URL: %s", redirect); wp_context->redirect_url = g_strdup(redirect); wp_context->request_id = g_web_request_get(wp_context->web, redirect, wispr_portal_web_result, wispr_route_request, wp_context); goto done; case 400: case 404: if (__connman_service_online_check_failed(wp_context->service, wp_context->type) == 0) { wispr_portal_error(wp_context); free_connman_wispr_portal_context(wp_context); return false; } break; case 505: __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; default: break; } free_wispr_routes(wp_context); wp_context->request_id = 0; done: wp_context->wispr_msg.message_type = -1; return false; }
static bool wispr_manage_message(GWebResult *result, struct connman_wispr_portal_context *wp_context) { DBG("Message type: %s (%d)", message_type_to_string(wp_context->wispr_msg.message_type), wp_context->wispr_msg.message_type); DBG("Response code: %s (%d)", response_code_to_string(wp_context->wispr_msg.response_code), wp_context->wispr_msg.response_code); if (wp_context->wispr_msg.access_procedure) DBG("Access procedure: %s", wp_context->wispr_msg.access_procedure); if (wp_context->wispr_msg.access_location) DBG("Access location: %s", wp_context->wispr_msg.access_location); if (wp_context->wispr_msg.location_name) DBG("Location name: %s", wp_context->wispr_msg.location_name); if (wp_context->wispr_msg.login_url) DBG("Login URL: %s", wp_context->wispr_msg.login_url); if (wp_context->wispr_msg.abort_login_url) DBG("Abort login URL: %s", wp_context->wispr_msg.abort_login_url); if (wp_context->wispr_msg.logoff_url) DBG("Logoff URL: %s", wp_context->wispr_msg.logoff_url); switch (wp_context->wispr_msg.message_type) { case 100: DBG("Login required"); wp_context->wispr_result = CONNMAN_WISPR_RESULT_LOGIN; if (__connman_agent_request_login_input(wp_context->service, wispr_portal_request_wispr_login, wp_context) != -EINPROGRESS) wispr_portal_error(wp_context); else return true; break; case 120: /* Falling down */ case 140: if (wp_context->wispr_msg.response_code == 50) { wp_context->wispr_result = CONNMAN_WISPR_RESULT_ONLINE; g_free(wp_context->wispr_username); wp_context->wispr_username = NULL; g_free(wp_context->wispr_password); wp_context->wispr_password = NULL; g_free(wp_context->wispr_formdata); wp_context->wispr_formdata = NULL; wispr_portal_request_portal(wp_context); return true; } else wispr_portal_error(wp_context); break; default: break; } return false; }
static bool wispr_portal_web_result(GWebResult *result, gpointer user_data) { struct connman_wispr_portal_context *wp_context = user_data; const char *redirect = NULL; const guint8 *chunk = NULL; const char *str = NULL; guint16 status; gsize length; bool skip_failed = false; DBG(""); if (wp_context->wispr_result != CONNMAN_WISPR_RESULT_ONLINE) { g_web_result_get_chunk(result, &chunk, &length); if (length > 0) { g_web_parser_feed_data(wp_context->wispr_parser, chunk, length); return true; } g_web_parser_end_data(wp_context->wispr_parser); // if (wp_context->wispr_msg.message_type >= 0) { // if (wispr_manage_message(result, wp_context)) // goto done; // } } status = g_web_result_get_status(result); DBG("status: %03u", status); switch (status) { case 200: // if (wp_context->wispr_msg.message_type >= 0) // break; if (g_web_result_get_header(result, "X-ConnMan-Status", &str)) { // Cancel browser requests if useragent has not returned anything connman_agent_cancel(wp_context->service); portal_manage_status(result, wp_context); return false; } else __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->redirect_url, wp_context); break; case 204: // Cancel browser requests if useragent has not returned anything connman_agent_cancel(wp_context->service); portal_manage_status(result, wp_context); return false; case 302: DBG("tls %d, Location header %d",(!g_web_supports_tls() ), (!g_web_result_get_header(result, "Location", &redirect))); if (!g_web_supports_tls() || !g_web_result_get_header(result, "Location", &redirect)) { __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; } DBG("Redirect URL: %s", redirect); DBG("Status url URL: %s", wp_context->status_url); wp_context->redirect_url = g_strdup(redirect); wp_context->request_id = g_web_request_get(wp_context->web, redirect, wispr_portal_web_result, wispr_route_request, wp_context); skip_failed = true; break; case 000: DBG("Redirect URL: %s", redirect); DBG("Status url URL: %s", wp_context->status_url); __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; case 400: case 404: break; case 505: DBG("HTTP version not supported, handling over to the browser"); DBG("Redirect URL: %s", redirect); DBG("Status url URL: %s", wp_context->status_url); __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; default: break; } if (!skip_failed && __connman_service_online_check_failed(wp_context->service, wp_context->type) == 0) { wispr_portal_error(wp_context); free_connman_wispr_portal_context(wp_context); return false; } free_wispr_routes(wp_context); wp_context->request_id = 0; wp_context->wispr_msg.message_type = -1; return false; }