#include <config.h>
#endif
+#define _GNU_SOURCE
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int message_type;
int response_code;
char *login_url;
+ char *abort_login_url;
char *logoff_url;
char *access_procedure;
char *access_location;
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;
char *formdata;
};
-static void execute_login(struct wispr_session *wispr);
+static gboolean execute_login(gpointer user_data);
static struct {
const char *str;
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);
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);
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);
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)
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;
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;
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),
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;
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;