Compiles, works, no memory leaks and errors, looks good to me. Push it, please!

 

 

On Friday 17 of August 2012 12:36:46 Michal Toman wrote:

> ---

> src/lib/json.c | 42 ++++++++++++++++++++++++++

> src/lib/ureport.h | 4 ++

> src/plugins/ureport.c | 78

> +++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 109

> insertions(+), 15 deletions(-)

>

> diff --git a/src/lib/json.c b/src/lib/json.c

> index 2cda77d..a413751 100644

> --- a/src/lib/json.c

> +++ b/src/lib/json.c

> @@ -251,6 +251,22 @@ char *new_json_ureport(problem_data_t *pd)

> return j;

> }

>

> +char *new_json_attachment(const char *bthash, const char *type, const char

> *data) +{

> + struct json_object *attachment = json_object_new_object();

> + if (!attachment)

> + die_out_of_memory();

> +

> + ureport_add_str(attachment, "bthash", bthash);

> + ureport_add_str(attachment, "type", type);

> + ureport_add_str(attachment, "data", data);

> +

> + char *result = xstrdup(json_object_to_json_string(attachment));

> + json_object_put(attachment);

> +

> + return result;

> +}

> +

> struct post_state *post_ureport(problem_data_t *pd, struct

> ureport_server_config *config) {

> int flags = POST_WANT_BODY | POST_WANT_ERROR_MSG;

> @@ -275,3 +291,29 @@ struct post_state *post_ureport(problem_data_t *pd,

> struct ureport_server_config

>

> return post_state;

> }

> +

> +struct post_state *ureport_attach_rhbz(const char *bthash, int rhbz_bug_id,

> + struct ureport_server_config

> *config) +{

> + int flags = POST_WANT_BODY | POST_WANT_ERROR_MSG;

> +

> + if (config->ur_ssl_verify)

> + flags |= POST_WANT_SSL_VERIFY;

> +

> + struct post_state *post_state = new_post_state(flags);

> +

> + static const char *headers[] = {

> + "Accept: application/json",

> + "Connection: close",

> + NULL,

> + };

> +

> + char *str_bug_id = xasprintf("%d", rhbz_bug_id);

> + char *json_attachment = new_json_attachment(bthash, "RHBZ",

> str_bug_id); + post_string_as_form_data(post_state, config->ur_url,

> "application/json", + headers,

> json_attachment);

> + free(str_bug_id);

> + free(json_attachment);

> +

> + return post_state;

> +}

> diff --git a/src/lib/ureport.h b/src/lib/ureport.h

> index 4e1bfcc..f851806 100644

> --- a/src/lib/ureport.h

> +++ b/src/lib/ureport.h

> @@ -39,6 +39,10 @@ struct abrt_post_state;

> #define post_ureport libreport_post_ureport

> struct post_state *post_ureport(problem_data_t *pd, struct

> ureport_server_config *config);

>

> +#define ureport_attach_rhbz libreport_ureport_attach_rhbz

> +struct post_state *ureport_attach_rhbz(const char *bthash, int rhbz_bug_id,

> + struct ureport_server_config

> *config); +

> #ifdef __cplusplus

> }

> #endif

> diff --git a/src/plugins/ureport.c b/src/plugins/ureport.c

> index bd7a3bb..99ce60a 100644

> --- a/src/plugins/ureport.c

> +++ b/src/plugins/ureport.c

> @@ -22,6 +22,9 @@

> #include "ureport.h"

> #include "libreport_curl.h"

>

> +#define REPORT_URL "https://retrace.fedoraproject.org/faf/reports/new/"

> +#define ATTACH_URL "https://retrace.fedoraproject.org/faf/reports/attach/"

> +

> /*

> * Loads uReport configuration from various sources.

> *

> @@ -95,58 +98,103 @@ static bool ureport_server_parse_json(json_object

> *json, struct ureport_server_r return false;

> }

>

> +static bool check_response_statuscode(post_state_t *post_state,

> + const char *url)

> +{

> + if (post_state->http_resp_code != 202)

> + {

> + char *errmsg = post_state->curl_error_msg;

> + if (errmsg && *errmsg)

> + error_msg("%s '%s'", errmsg, url);

> + else

> + error_msg("Unexpected HTTP status code: %d",

> + post_state->http_resp_code);

> +

> + return false;

> + }

> +

> + return true;

> +}

> +

> int main(int argc, char **argv)

> {

> abrt_init(argv);

>

> struct ureport_server_config config = {

> - .ur_url = "https://retrace.fedoraproject.org/faf/reports/new/",

> + .ur_url = NULL,

> .ur_ssl_verify = true,

> };

>

> bool insecure = !config.ur_ssl_verify;

> const char *dump_dir_path = ".";

> + const char *ureport_hash = NULL;

> + int rhbz_bug = -1;

> struct options program_options[] = {

> OPT__VERBOSE(&g_verbose),

> OPT__DUMP_DIR(&dump_dir_path),

> OPT_STRING('u', "url", &config.ur_url, "URL", _("Specify url")),

> OPT_BOOL('k', "insecure", &insecure,

> _("Allow insecure connection to ureport

> server")), + OPT_STRING('a', "attach", &ureport_hash, "BTHASH",

> + _("bthash of uReport to attach")),

> + OPT_INTEGER('b', "bug-id", &rhbz_bug,

> + _("Attach RHBZ bug (requires -a)")),

> OPT_END(),

> };

>

> const char *program_usage_string = _(

> - "& [-v] [-u URL] [-k] -d DIR\n"

> + "& [-v] [-u URL] [-k] [-a bthash -b bug-id] [-d DIR]\n"

> "\n"

> - "Upload micro report"

> + "Upload micro report or add an attachment to a micro report"

> );

>

> parse_opts(argc, argv, program_options, program_usage_string);

> - struct dump_dir *dd = dd_opendir(dump_dir_path, DD_OPEN_READONLY);

> - if (!dd)

> - xfunc_die();

>

> config.ur_ssl_verify = !insecure;

> load_ureport_server_config(&config);

> + post_state_t *post_state = NULL;

> +

> + /* we either need both -b & -a or none of them */

> + if (ureport_hash && rhbz_bug > 0)

> + {

> + if (!config.ur_url)

> + config.ur_url = ATTACH_URL;

> +

> + post_state = ureport_attach_rhbz(ureport_hash, rhbz_bug, &config);

> + if (!check_response_statuscode(post_state, config.ur_url))

> + {

> + free_post_state(post_state);

> + return 1;

> + }

> +

> + free_post_state(post_state);

> + return 0;

> + }

> + else if (ureport_hash && rhbz_bug <= 0)

> + error_msg_and_die(_("You need to specify bug ID to attach."));

> + else if (!ureport_hash && rhbz_bug > 0)

> + error_msg_and_die(_("You need to specify bthash of the uReport to

> attach.")); +

> + /* -b nor -a were specified - upload uReport from dump_dir */

> + if (!config.ur_url)

> + config.ur_url = REPORT_URL;

> +

> + struct dump_dir *dd = dd_opendir(dump_dir_path, DD_OPEN_READONLY);

> + if (!dd)

> + xfunc_die();

>

> problem_data_t *pd = create_problem_data_from_dump_dir(dd);

> dd_close(dd);

> if (!pd)

> xfunc_die(); /* create_problem_data_for_reporting already emitted

> error msg */

>

> - post_state_t *post_state = NULL;

> post_state = post_ureport(pd, &config);

> problem_data_free(pd);

>

> - if (post_state->http_resp_code != 200)

> + if (!check_response_statuscode(post_state, config.ur_url))

> {

> - char *errmsg = post_state->curl_error_msg;

> - if (errmsg && *errmsg)

> - {

> - error_msg("%s '%s'", errmsg, config.ur_url);

> - free_post_state(post_state);

> - return 1;

> - }

> + free_post_state(post_state);

> + return 1;

> }

>

> int ret = 1; /* return 1 by default */