/** * soup_form_request_new_from_hash: * @method: the HTTP method, either "GET" or "POST" * @uri: the URI to send the form data to * @form_data_set: (element-type utf8 utf8): the data to send to @uri * * Creates a new %SoupMessage and sets it up to send @form_data_set to * @uri via @method, as with soup_form_request_new(). * * Return value: (transfer full): the new %SoupMessage **/ SoupMessage * soup_form_request_new_from_hash (const char *method, const char *uri, GHashTable *form_data_set) { return soup_form_request_for_data ( method, uri, soup_form_encode_hash (form_data_set)); }
/** * soup_uri_set_query_from_form: * @uri: a #SoupURI * @form: (element-type utf8 utf8): a #GHashTable containing HTML form * information * * Sets @uri's query to the result of encoding @form according to the * HTML form rules. See soup_form_encode_hash() for more information. **/ void soup_uri_set_query_from_form (SoupURI *uri, GHashTable *form) { g_return_if_fail (uri != NULL); g_free (uri->query); uri->query = soup_form_encode_hash (form); }
int main(int argc, char *argv[]) { GError *error = NULL; gchar *server = NULL; gchar *form_data; gchar *form_seconds; SoupURI *watchdog_uri = NULL; guint ret = 0; guint64 seconds; gchar *prefix = NULL; gchar *server_recipe_key = NULL; gchar *server_recipe = NULL; GHashTable *data_table = g_hash_table_new (NULL, NULL); GOptionEntry entries[] = { {"server", 's', 0, G_OPTION_ARG_STRING, &server, "Server to connect to", "URL" }, { NULL } }; GOptionContext *context = g_option_context_new("<time>"); g_option_context_set_summary(context, "Adjust watchdog on lab controller. if you don't specify the\n" "the server url you must have RECIPEID defined.\n" "If HARNESS_PREFIX is defined then the value of that must be\n" "prefixed to RECIPEID"); g_option_context_add_main_entries(context, entries, NULL); gboolean parse_succeeded = g_option_context_parse(context, &argc, &argv, &error); if (argc < 2 || !parse_succeeded) { g_set_error (&error, RESTRAINT_ERROR, RESTRAINT_PARSE_ERROR_BAD_SYNTAX, "Wrong arguments"); cmd_usage(context); goto cleanup; } seconds = parse_time_string (argv[1], &error); if (error) { cmd_usage(context); goto cleanup; } prefix = getenv("HARNESS_PREFIX") ? getenv("HARNESS_PREFIX") : ""; server_recipe_key = g_strdup_printf ("%sRECIPE_URL", prefix); server_recipe = getenv(server_recipe_key); g_free(server_recipe_key); if (!server && server_recipe) { server = g_strdup_printf ("%s/watchdog", server_recipe); } if (!server) { cmd_usage(context); goto cleanup; } watchdog_uri = soup_uri_new (server); if (!watchdog_uri) { g_set_error (&error, RESTRAINT_ERROR, RESTRAINT_PARSE_ERROR_BAD_SYNTAX, "Malformed server url: %s", server); goto cleanup; } session = soup_session_new_with_options("timeout", 3600, NULL); SoupMessage *server_msg = soup_message_new_from_uri ("POST", watchdog_uri); form_seconds = g_strdup_printf ("%" PRIu64, seconds); g_hash_table_insert (data_table, "seconds", form_seconds); form_data = soup_form_encode_hash (data_table); g_free (form_seconds); soup_message_set_request (server_msg, "application/x-www-form-urlencoded", SOUP_MEMORY_TAKE, form_data, strlen (form_data)); ret = soup_session_send_message (session, server_msg); if (SOUP_STATUS_IS_SUCCESSFUL (ret)) { } else { g_warning ("Failed to adjust watchdog, status: %d Message: %s\n", ret, server_msg->reason_phrase); } g_object_unref(server_msg); soup_session_abort(session); g_object_unref(session); cleanup: g_hash_table_destroy(data_table); g_option_context_free(context); if (server != NULL) { g_free(server); } if (watchdog_uri != NULL) { soup_uri_free (watchdog_uri); } if (error) { int retcode = error->code; g_printerr("%s [%s, %d]\n", error->message, g_quark_to_string(error->domain), error->code); g_clear_error(&error); return retcode; } else { return EXIT_SUCCESS; } }
/** * soup_uri_set_query_from_form: * @uri: a #SoupURI * @form: (element-type utf8 utf8): a #GHashTable containing HTML form * information * * Sets @uri's query to the result of encoding @form according to the * HTML form rules. See soup_form_encode_hash() for more information. **/ void soup_uri_set_query_from_form (SoupURI *uri, GHashTable *form) { g_free (uri->query); uri->query = soup_form_encode_hash (form); }
int main(int argc, char *argv[]) { AppData *app_data = g_slice_new0 (AppData); app_data->filename = g_strdup("resultoutputfile.log"); app_data->outputfile = g_strdup(getenv("OUTPUTFILE")); app_data->disable_plugin = g_ptr_array_new_with_free_func (g_free); GError *error = NULL; gchar *server = NULL; SoupURI *result_uri = NULL; guint ret = 0; SoupMessage *server_msg; SoupRequest *request; gchar *result_msg = NULL; gchar *prefix = NULL; gchar *server_recipe_key = NULL; gchar *server_recipe = NULL; gchar *task_id = NULL; gchar *task_id_key = NULL; gboolean no_plugins = FALSE; gchar *form_data; GHashTable *data_table = g_hash_table_new (NULL, NULL); GOptionEntry entries[] = { {"server", 's', 0, G_OPTION_ARG_STRING, &server, "Server to connect to", "URL" }, { "message", 't', 0, G_OPTION_ARG_STRING, &result_msg, "Short 100 characters or less message", "TEXT" }, { "outputfile", 'o', 0, G_OPTION_ARG_CALLBACK, callback_outputfile, "Log to upload with result, $OUTPUTFILE is used by default", "FILE" }, { "disable-plugin", 'p', 0, G_OPTION_ARG_CALLBACK, callback_disable_plugin, "don't run plugin on server side", "PLUGIN" }, { "no-plugins", 0, 0, G_OPTION_ARG_NONE, &no_plugins, "don't run any plugins on server side", NULL }, { NULL } }; GOptionGroup *option_group = g_option_group_new ("main", "Application Options", "Various application related options", app_data, NULL); GOptionContext *context = g_option_context_new("TASK_PATH RESULT SCORE"); g_option_context_set_summary(context, "Report results to lab controller. if you don't specify the\n" "the server url you must have RECIPEID and TASKID defined.\n" "If HARNESS_PREFIX is defined then the value of that must be\n" "prefixed to RECIPEID and TASKID"); g_option_group_add_entries(option_group, entries); g_option_context_set_main_group (context, option_group); gboolean parse_succeeded = g_option_context_parse(context, &argc, &argv, &error); if (!parse_succeeded) { goto cleanup; } prefix = getenv("HARNESS_PREFIX") ? getenv("HARNESS_PREFIX") : ""; server_recipe_key = g_strdup_printf ("%sRECIPE_URL", prefix); server_recipe = getenv(server_recipe_key); task_id_key = g_strdup_printf ("%sTASKID", prefix); task_id = getenv(task_id_key); g_free(task_id_key); g_free(server_recipe_key); if (!server && server_recipe && task_id) { server = g_strdup_printf ("%s/tasks/%s/results/", server_recipe, task_id); } if (argc < 3 || !server) { cmd_usage(context); goto cleanup; } result_uri = soup_uri_new (server); if (result_uri == NULL) { g_set_error (&error, RESTRAINT_ERROR, RESTRAINT_PARSE_ERROR_BAD_SYNTAX, "Malformed server url: %s", server); goto cleanup; } session = soup_session_new_with_options("timeout", 3600, NULL); g_hash_table_insert (data_table, "path", argv[1]); g_hash_table_insert (data_table, "result", argv[2]); // if AVC_ERROR=+no_avc_check then disable the selinux check plugin // This is for legacy rhts tests.. please use --disable-plugin gchar *avc_error = getenv("AVC_ERROR"); if (g_strcmp0 (avc_error, "+no_avc_check") == 0) { g_ptr_array_add (app_data->disable_plugin, g_strdup ("10_avc_check")); } if (app_data->disable_plugin->pdata) { g_hash_table_insert (data_table, "disable_plugin", g_strjoinv (" ", (gchar **)app_data->disable_plugin->pdata)); } if (no_plugins) g_hash_table_insert (data_table, "no_plugins", &no_plugins); if (argc > 3) g_hash_table_insert (data_table, "score", argv[3]); if (result_msg) g_hash_table_insert (data_table, "message", result_msg); request = (SoupRequest *)soup_session_request_http_uri (session, "POST", result_uri, &error); server_msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (request)); g_object_unref(request); form_data = soup_form_encode_hash (data_table); soup_message_set_request (server_msg, "application/x-www-form-urlencoded", SOUP_MEMORY_TAKE, form_data, strlen (form_data)); g_print ("** %s %s Score:%s\n", argv[1], argv[2], argv[3]); ret = soup_session_send_message (session, server_msg); if (SOUP_STATUS_IS_SUCCESSFUL (ret)) { gchar *location = g_strdup_printf ("%s/logs/", soup_message_headers_get_one (server_msg->response_headers, "Location")); soup_uri_free (result_uri); result_uri = soup_uri_new (location); g_free (location); if (app_data->outputfile != NULL && g_file_test (app_data->outputfile, G_FILE_TEST_EXISTS)) { g_print ("Uploading %s ", app_data->filename); if (upload_file (session, app_data->outputfile, app_data->filename, result_uri, &error)) { g_print ("done\n"); } else { g_print ("failed\n"); } } } else { g_warning ("Failed to submit result, status: %d Message: %s\n", ret, server_msg->reason_phrase); } g_object_unref(server_msg); soup_session_abort(session); g_object_unref(session); cleanup: if (server != NULL) { g_free(server); } if (result_msg != NULL) { g_free(result_msg); } g_option_context_free(context); g_hash_table_destroy(data_table); if (result_uri != NULL) { soup_uri_free (result_uri); } restraint_free_appdata(app_data); if (error) { int retcode = error->code; g_printerr("%s [%s, %d]\n", error->message, g_quark_to_string(error->domain), error->code); g_clear_error(&error); return retcode; } else { return EXIT_SUCCESS; } }
static void _do_token_query(GSignondOauthPlugin *self, GSignondSessionData *session_data, GHashTable* params, GError** error) { gboolean force_request_body_auth; if (gsignond_dictionary_get_boolean(session_data, "ForceClientAuthViaRequestBody", &force_request_body_auth) && force_request_body_auth) { const gchar* client_id = gsignond_dictionary_get_string(session_data, "ClientId"); const gchar* client_secret = gsignond_dictionary_get_string(session_data, "ClientSecret"); if (client_id != NULL && client_secret != NULL) { g_hash_table_insert(params, "client_id", (gchar*)client_id); g_hash_table_insert(params, "client_secret", (gchar*)client_secret); } } const gchar* host = gsignond_dictionary_get_string(session_data, "TokenHost"); if (host == NULL) { *error = g_error_new(GSIGNOND_ERROR, GSIGNOND_ERROR_MISSING_DATA, "TokenHost not set"); return; } gsignond_oauth_plugin_check_host(host, gsignond_session_data_get_allowed_realms (session_data), error); if (*error != NULL) return; const gchar* token_path = gsignond_dictionary_get_string(session_data, "TokenPath"); if (token_path == NULL) { *error = g_error_new(GSIGNOND_ERROR, GSIGNOND_ERROR_MISSING_DATA, "TokenPath not set"); return; } const gchar* token_query_str = gsignond_dictionary_get_string(session_data, "TokenQuery"); SoupURI* open_url = soup_uri_new(NULL); soup_uri_set_scheme(open_url, SOUP_URI_SCHEME_HTTPS); soup_uri_set_host(open_url, host); soup_uri_set_path(open_url, token_path); guint port; if (gsignond_dictionary_get_uint32(session_data, "TokenPort", &port) != FALSE) soup_uri_set_port(open_url, port); if (token_query_str != NULL) { soup_uri_set_query(open_url, token_query_str); } SoupMessage *msg = soup_message_new_from_uri ("POST", open_url); soup_uri_free(open_url); gchar* formdata = soup_form_encode_hash(params); soup_message_set_request (msg, "application/x-www-form-urlencoded", SOUP_MEMORY_TAKE, formdata, strlen (formdata)); soup_session_queue_message (self->soup_session, msg, _http_token_callback, self); }
gboolean upload_results(AppData *app_data) { GError *error = NULL; SoupURI *result_uri = NULL; guint ret = 0; SoupSession *session; SoupMessage *server_msg; SoupRequest *request; gchar *form_data; GHashTable *data_table = g_hash_table_new (NULL, NULL); result_uri = soup_uri_new (app_data->server); if (result_uri == NULL) { g_set_error (&error, RESTRAINT_ERROR, RESTRAINT_PARSE_ERROR_BAD_SYNTAX, "Malformed server url: %s", app_data->server); goto cleanup; } session = soup_session_new_with_options("timeout", 3600, NULL); g_hash_table_insert (data_table, "path", app_data->test_name); g_hash_table_insert (data_table, "result", app_data->test_result); // if AVC_ERROR=+no_avc_check then disable the selinux check plugin // This is for legacy rhts tests.. please use --disable-plugin gchar *avc_error = getenv("AVC_ERROR"); if (g_strcmp0 (avc_error, "+no_avc_check") == 0) { g_ptr_array_add (app_data->disable_plugin, g_strdup ("10_avc_check")); } if (app_data->disable_plugin->pdata) { g_ptr_array_add (app_data->disable_plugin, NULL); g_hash_table_insert (data_table, "disable_plugin", g_strjoinv (" ", (gchar **)app_data->disable_plugin->pdata)); } if (app_data->no_plugins) g_hash_table_insert (data_table, "no_plugins", &app_data->no_plugins); if (app_data->score) g_hash_table_insert (data_table, "score", app_data->score); if (app_data->result_msg) g_hash_table_insert (data_table, "message", app_data->result_msg); request = (SoupRequest *)soup_session_request_http_uri (session, "POST", result_uri, &error); server_msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (request)); g_object_unref(request); form_data = soup_form_encode_hash (data_table); soup_message_set_request (server_msg, "application/x-www-form-urlencoded", SOUP_MEMORY_TAKE, form_data, strlen (form_data)); g_print ("** %s %s Score:%s\n", app_data->test_name, app_data->test_result, app_data->score != NULL ? app_data->score : "N/A"); ret = soup_session_send_message (session, server_msg); if (SOUP_STATUS_IS_SUCCESSFUL (ret)) { gchar *location = g_strdup_printf ("%s/logs/", soup_message_headers_get_one (server_msg->response_headers, "Location")); soup_uri_free (result_uri); result_uri = soup_uri_new (location); g_free (location); if (app_data->outputfile != NULL && g_file_test (app_data->outputfile, G_FILE_TEST_EXISTS)) { g_print ("Uploading %s ", app_data->filename); if (upload_file (session, app_data->outputfile, app_data->filename, result_uri, &error)) { g_print ("done\n"); } else { g_print ("failed\n"); } } } else { g_warning ("Failed to submit result, status: %d Message: %s\n", ret, server_msg->reason_phrase); } g_object_unref(server_msg); soup_session_abort(session); g_object_unref(session); cleanup: g_hash_table_destroy(data_table); if (result_uri != NULL) { soup_uri_free (result_uri); } if (error) { g_printerr("%s [%s, %d]\n", error->message, g_quark_to_string(error->domain), error->code); g_clear_error(&error); return FALSE; } else { return TRUE; } }