X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tools%2Fwispr.c;h=88f09c1377381c746475cddf0768f4b8a1e7470e;hb=d3f6815dd1935d44d96ee3847b9f0a41e8b87908;hp=5e7a72035525c003db7b150973271db206f4a1ee;hpb=035d6119b86a6c353ee0d17427ab2b3094a6573a;p=framework%2Fconnectivity%2Fconnman.git diff --git a/tools/wispr.c b/tools/wispr.c index 5e7a720..88f09c1 100644 --- a/tools/wispr.c +++ b/tools/wispr.c @@ -23,6 +23,7 @@ #include #endif +#define _GNU_SOURCE #include #include #include @@ -103,6 +104,7 @@ struct wispr_msg { int message_type; int response_code; char *login_url; + char *abort_login_url; char *logoff_url; char *access_procedure; char *access_location; @@ -120,6 +122,9 @@ static inline void wispr_msg_init(struct wispr_msg *msg) g_free(msg->login_url); msg->login_url = NULL; + g_free(msg->abort_login_url); + msg->abort_login_url = NULL; + g_free(msg->logoff_url); msg->logoff_url = NULL; @@ -144,7 +149,7 @@ struct wispr_session { char *formdata; }; -static void execute_login(struct wispr_session *wispr); +static gboolean execute_login(gpointer user_data); static struct { const char *str; @@ -219,9 +224,11 @@ static void text_handler(GMarkupParseContext *context, case WISPR_ELEMENT_ACCESS_PROCEDURE: g_free(msg->access_procedure); msg->access_procedure = g_strdup(text); + break; case WISPR_ELEMENT_ACCESS_LOCATION: g_free(msg->access_location); msg->access_location = g_strdup(text); + break; case WISPR_ELEMENT_LOCATION_NAME: g_free(msg->location_name); msg->location_name = g_strdup(text); @@ -231,6 +238,8 @@ static void text_handler(GMarkupParseContext *context, msg->login_url = g_strdup(text); break; case WISPR_ELEMENT_ABORT_LOGIN_URL: + g_free(msg->abort_login_url); + msg->abort_login_url = g_strdup(text); break; case WISPR_ELEMENT_MESSAGE_TYPE: msg->message_type = atoi(text); @@ -299,10 +308,14 @@ struct user_input_data { static void user_callback(struct user_input_data *data) { char *value; - int len; - if (data->hidden == TRUE) + if (data->hidden == TRUE) { + ssize_t len; + len = write(data->fd, "\n", 1); + if (len < 0) + return; + } tcsetattr(data->fd, TCSADRAIN, &data->saved_termios); @@ -350,7 +363,7 @@ static gboolean user_input(const char *label, gboolean hidden, struct termios new_termios; GIOChannel *channel; guint watch; - int len; + ssize_t len; data = g_try_new0(struct user_input_data, 1); if (data == NULL) @@ -361,7 +374,7 @@ static gboolean user_input(const char *label, gboolean hidden, data->user_data = user_data; data->hidden = hidden; - data->fd = open("/dev/tty", O_RDWR | O_NOCTTY); + data->fd = open("/dev/tty", O_RDWR | O_NOCTTY | O_CLOEXEC); if (data->fd < 0) goto error; @@ -390,7 +403,12 @@ static gboolean user_input(const char *label, gboolean hidden, goto error; len = write(data->fd, label, strlen(label)); + if (len < 0) + goto error; + len = write(data->fd, ": ", 2); + if (len < 0) + goto error; return TRUE; @@ -434,14 +452,25 @@ static gboolean wispr_input(const guint8 **data, gsize *length, gpointer user_data) { struct wispr_session *wispr = user_data; + GString *buf; + gsize count; + + buf = g_string_sized_new(100); + + g_string_append(buf, "button=Login&UserName="); + g_string_append_uri_escaped(buf, wispr->username, NULL, FALSE); + g_string_append(buf, "&Password="); + g_string_append_uri_escaped(buf, wispr->password, NULL, FALSE); + g_string_append(buf, "&FNAME=0&OriginatingServer="); + g_string_append_uri_escaped(buf, wispr->originurl, NULL, FALSE); + + count = buf->len; g_free(wispr->formdata); - wispr->formdata = g_strdup_printf("button=Login&UserName=%s&" - "Password=%s&FNAME=0&OriginatingServer=%s", - wispr->username, wispr->password, wispr->originurl); + wispr->formdata = g_string_free(buf, FALSE); *data = (guint8 *) wispr->formdata; - *length = strlen(wispr->formdata); + *length = count; return FALSE; } @@ -472,8 +501,24 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data) g_print("elapse: %f seconds\n", elapsed); - if (wispr->msg.message_type < 0) - goto done; + if (wispr->msg.message_type < 0) { + const char *redirect; + + if (status != 302) + goto done; + + if (g_web_result_get_header(result, "Location", + &redirect) == FALSE) + goto done; + + printf("Redirect URL: %s\n", redirect); + printf("\n"); + + wispr->request = g_web_request_get(wispr->web, redirect, + wispr_result, wispr); + + return FALSE; + } printf("Message type: %s (%d)\n", message_type_to_string(wispr->msg.message_type), @@ -489,11 +534,16 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data) printf("Location name: %s\n", wispr->msg.location_name); if (wispr->msg.login_url != NULL) printf("Login URL: %s\n", wispr->msg.login_url); + if (wispr->msg.abort_login_url != NULL) + printf("Abort login URL: %s\n", wispr->msg.abort_login_url); if (wispr->msg.logoff_url != NULL) printf("Logoff URL: %s\n", wispr->msg.logoff_url); printf("\n"); - if (status == 302 && wispr->msg.message_type == 100) { + if (status != 200 && status != 302 && status != 404) + goto done; + + if (wispr->msg.message_type == 100) { if (wispr->username == NULL) { user_input("Username", FALSE, username_callback, wispr); return FALSE; @@ -504,27 +554,49 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data) return FALSE; } - execute_login(wispr); + g_idle_add(execute_login, wispr); return FALSE; - } else if (status == 200 && wispr->msg.message_type == 120) { + } else if (wispr->msg.message_type == 120 || + wispr->msg.message_type == 140) { int code = wispr->msg.response_code; printf("Login process: %s\n", code == 50 ? "SUCCESS" : "FAILURE"); } + if (status == 302) { + const char *redirect; + + if (g_web_result_get_header(result, "Location", + &redirect) == FALSE) + goto done; + + printf("\n"); + printf("Redirect URL: %s\n", redirect); + printf("\n"); + + wispr->request = g_web_request_get(wispr->web, redirect, + wispr_result, wispr); + + return FALSE; + } + done: g_main_loop_quit(main_loop); return FALSE; } -static void execute_login(struct wispr_session *wispr) +static gboolean execute_login(gpointer user_data) { + struct wispr_session *wispr = user_data; + wispr->request = g_web_request_post(wispr->web, wispr->msg.login_url, "application/x-www-form-urlencoded", wispr_input, wispr_result, wispr); wispr_msg_init(&wispr->msg); + + return FALSE; } static gboolean option_debug = FALSE;