diff options
Diffstat (limited to 'src/kyclogic/taler-exchange-kyc-tester.c')
-rw-r--r-- | src/kyclogic/taler-exchange-kyc-tester.c | 389 |
1 files changed, 283 insertions, 106 deletions
diff --git a/src/kyclogic/taler-exchange-kyc-tester.c b/src/kyclogic/taler-exchange-kyc-tester.c index a389b0812..c2efafd72 100644 --- a/src/kyclogic/taler-exchange-kyc-tester.c +++ b/src/kyclogic/taler-exchange-kyc-tester.c @@ -27,7 +27,8 @@ #include <limits.h> #include "taler_mhd_lib.h" #include "taler_json_lib.h" -#include "taler_crypto_lib.h" +#include "taler_templating_lib.h" +#include "taler_util.h" #include "taler_kyclogic_lib.h" #include "taler_kyclogic_plugin.h" #include <gnunet/gnunet_mhd_compat.h> @@ -61,6 +62,11 @@ struct TEKT_RequestContext struct MHD_Connection *connection; /** + * HTTP response to return (or NULL). + */ + struct MHD_Response *response; + + /** * @e rh-specific cleanup routine. Function called * upon completion of the request that should * clean up @a rh_ctx. Can be NULL. @@ -74,6 +80,18 @@ struct TEKT_RequestContext * Can be NULL. */ void *rh_ctx; + + /** + * Uploaded JSON body, if any. + */ + json_t *root; + + /** + * HTTP status to return upon resume if @e response + * is non-NULL. + */ + unsigned int http_status; + }; @@ -234,6 +252,12 @@ static char *cmd_provider_user_id; static char *cmd_provider_legitimization_id; /** + * Name of the configuration section with the + * configuration data of the selected provider. + */ +static const char *provider_section_name; + +/** * Row ID to use, override with '-r' */ static unsigned int kyc_row_id = 42; @@ -254,9 +278,14 @@ static int run_webservice; static int global_ret; /** + * -r command-line flag. + */ +static char *requirements; + +/** * -i command-line flag. */ -static char *initiate_section; +static char *ut_s = "individual"; /** * Handle for ongoing initiation operation. @@ -327,10 +356,10 @@ struct KycWebhookContext struct MHD_Response *response; /** - * Logic the request is for. Name of the configuration + * Name of the configuration * section defining the KYC logic. */ - char *logic; + const char *section_name; /** * HTTP response code to return. @@ -372,7 +401,6 @@ kwh_resume (struct KycWebhookContext *kwh) kwh_tail, kwh); MHD_resume_connection (kwh->rc->connection); - TALER_MHD_daemon_trigger (); } @@ -401,30 +429,61 @@ kyc_webhook_cleanup (void) * will be done by the plugin. * * @param cls closure - * @param legi_row legitimization request the webhook was about + * @param process_row legitimization process request the webhook was about * @param account_id account the webhook was about + * @param provider_section configuration section of the logic * @param provider_user_id set to user ID at the provider, or NULL if not supported or unknown * @param provider_legitimization_id set to legitimization process ID at the provider, or NULL if not supported or unknown * @param status KYC status * @param expiration until when is the KYC check valid + * @param attributes user attributes returned by the provider * @param http_status HTTP status code of @a response * @param[in] response to return to the HTTP client */ static void webhook_finished_cb ( void *cls, - uint64_t legi_row, + uint64_t process_row, const struct TALER_PaytoHashP *account_id, + const char *provider_section, const char *provider_user_id, const char *provider_legitimization_id, enum TALER_KYCLOGIC_KycStatus status, struct GNUNET_TIME_Absolute expiration, + const json_t *attributes, unsigned int http_status, struct MHD_Response *response) { struct KycWebhookContext *kwh = cls; + (void) expiration; + (void) provider_section; kwh->wh = NULL; + if ( (NULL != account_id) && + (0 != GNUNET_memcmp (account_id, + &cmd_line_h_payto)) ) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Received webhook for unexpected account\n"); + } + if ( (NULL != provider_user_id) && + (NULL != cmd_provider_user_id) && + (0 != strcmp (provider_user_id, + cmd_provider_user_id)) ) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Received webhook for unexpected provider user ID (%s)\n", + provider_user_id); + } + if ( (NULL != provider_legitimization_id) && + (NULL != cmd_provider_legitimization_id) && + (0 != strcmp (provider_legitimization_id, + cmd_provider_legitimization_id)) ) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Received webhook for unexpected provider legitimization ID (%s)\n", + provider_legitimization_id); + } switch (status) { case TALER_KYCLOGIC_STATUS_SUCCESS: @@ -433,19 +492,26 @@ webhook_finished_cb ( "KYC successful for user `%s' (legi: %s)\n", provider_user_id, provider_legitimization_id); + GNUNET_break (NULL != attributes); + fprintf (stderr, + "Extracted attributes:\n"); + json_dumpf (attributes, + stderr, + JSON_INDENT (2)); break; default: GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "KYC status of %s/%s (Row #%llu) is %d\n", + "KYC status of %s/%s (process #%llu) is %d\n", provider_user_id, provider_legitimization_id, - (unsigned long long) legi_row, + (unsigned long long) process_row, status); break; } kwh->response = response; kwh->response_code = http_status; kwh_resume (kwh); + TALER_MHD_daemon_trigger (); } @@ -469,7 +535,6 @@ clean_kwh (struct TEKT_RequestContext *rc) MHD_destroy_response (kwh->response); kwh->response = NULL; } - GNUNET_free (kwh->logic); GNUNET_free (kwh); } @@ -482,6 +547,7 @@ clean_kwh (struct TEKT_RequestContext *rc) * @param provider_section * @param provider_legitimization_id legi to look up * @param[out] h_payto where to write the result + * @param[out] legi_row where to write the row ID for the legitimization ID * @return database transaction status */ static enum GNUNET_DB_QueryStatus @@ -489,13 +555,16 @@ kyc_provider_account_lookup ( void *cls, const char *provider_section, const char *provider_legitimization_id, - struct TALER_PaytoHashP *h_payto) + struct TALER_PaytoHashP *h_payto, + uint64_t *legi_row) { + (void) cls; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Simulated account lookup using `%s/%s'\n", provider_section, provider_legitimization_id); *h_payto = cmd_line_h_payto; + *legi_row = kyc_row_id; return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; } @@ -506,7 +575,7 @@ kyc_provider_account_lookup ( * @param rc request to handle * @param method HTTP request method used by the client * @param root uploaded JSON body (can be NULL) - * @param args one argument with the payment_target_uuid + * @param args one argument with the legitimization_uuid * @return MHD result code */ static MHD_RESULT @@ -521,24 +590,27 @@ handler_kyc_webhook_generic ( if (NULL == kwh) { /* first time */ kwh = GNUNET_new (struct KycWebhookContext); - kwh->logic = GNUNET_strdup (args[0]); kwh->rc = rc; rc->rh_ctx = kwh; rc->rh_cleaner = &clean_kwh; - if (GNUNET_OK != - TALER_KYCLOGIC_kyc_get_logic (kwh->logic, - &kwh->plugin, - &kwh->pd)) + if ( (NULL == args[0]) || + (GNUNET_OK != + TALER_KYCLOGIC_lookup_logic (args[0], + &kwh->plugin, + &kwh->pd, + &kwh->section_name)) ) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "KYC logic `%s' unknown (check KYC provider configuration)\n", - kwh->logic); + args[0]); return TALER_MHD_reply_with_error (rc->connection, MHD_HTTP_NOT_FOUND, TALER_EC_EXCHANGE_KYC_GENERIC_LOGIC_UNKNOWN, - "$LOGIC"); + args[0]); } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Calling KYC provider specific webhook\n"); kwh->wh = kwh->plugin->webhook (kwh->plugin->cls, kwh->pd, &kyc_provider_account_lookup, @@ -567,6 +639,8 @@ handler_kyc_webhook_generic ( if (NULL != kwh->response) { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Returning queued reply for KWH\n"); /* handle _failed_ resumed cases */ return MHD_queue_response (rc->connection, kwh->response_code, @@ -575,7 +649,7 @@ handler_kyc_webhook_generic ( /* We resumed, but got no response? This should not happen. */ - GNUNET_break (0); + GNUNET_assert (0); return TALER_MHD_reply_with_error (rc->connection, MHD_HTTP_INTERNAL_SERVER_ERROR, TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE, @@ -587,7 +661,7 @@ handler_kyc_webhook_generic ( * Handle a GET "/kyc-webhook" request. * * @param rc request to handle - * @param args one argument with the payment_target_uuid + * @param args one argument with the legitimization_uuid * @return MHD result code */ static MHD_RESULT @@ -595,6 +669,8 @@ handler_kyc_webhook_get ( struct TEKT_RequestContext *rc, const char *const args[]) { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Webhook GET triggered\n"); return handler_kyc_webhook_generic (rc, MHD_HTTP_METHOD_GET, NULL, @@ -607,7 +683,7 @@ handler_kyc_webhook_get ( * * @param rc request to handle * @param root uploaded JSON body (can be NULL) - * @param args one argument with the payment_target_uuid + * @param args one argument with the legitimization_uuid * @return MHD result code */ static MHD_RESULT @@ -616,6 +692,8 @@ handler_kyc_webhook_post ( const json_t *root, const char *const args[]) { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Webhook POST triggered\n"); return handler_kyc_webhook_generic (rc, MHD_HTTP_METHOD_POST, root, @@ -634,6 +712,7 @@ handler_kyc_webhook_post ( * @param provider_user_id set to user ID at the provider, or NULL if not supported or unknown * @param provider_legitimization_id set to legitimization process ID at the provider, or NULL if not supported or unknown * @param expiration until when is the KYC check valid + * @param attributes attributes about the user * @param http_status HTTP status code of @a response * @param[in] response to return to the HTTP client */ @@ -644,17 +723,39 @@ proof_cb ( const char *provider_user_id, const char *provider_legitimization_id, struct GNUNET_TIME_Absolute expiration, + const json_t *attributes, unsigned int http_status, struct MHD_Response *response) { struct ProofRequestState *rs = cls; - MHD_resume_connection (rs->rc->connection); - // FIXME: kick MHD event loop! - // FIXME: actually queue response... + (void) expiration; + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + "KYC legitimization %s completed with status %d (%u) for %s\n", + provider_legitimization_id, + status, + http_status, + provider_user_id); + if (TALER_KYCLOGIC_STATUS_SUCCESS == status) + { + GNUNET_break (NULL != attributes); + fprintf (stderr, + "Extracted attributes:\n"); + json_dumpf (attributes, + stderr, + JSON_INDENT (2)); + } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Returning response %p with status %u\n", + response, + http_status); + rs->rc->response = response; + rs->rc->http_status = http_status; GNUNET_CONTAINER_DLL_remove (rs_head, rs_tail, rs); + MHD_resume_connection (rs->rc->connection); + TALER_MHD_daemon_trigger (); GNUNET_free (rs); } @@ -665,31 +766,44 @@ proof_cb ( * * @param rc request context * @param args remaining URL arguments; - * args[0] is the 'h_payto', - * args[1] should be the logic plugin name + * args[0] should be the logic plugin name */ static MHD_RESULT handler_kyc_proof_get ( struct TEKT_RequestContext *rc, - const char *const args[]) + const char *const args[1]) { struct TALER_PaytoHashP h_payto; struct TALER_KYCLOGIC_ProviderDetails *pd; struct TALER_KYCLOGIC_Plugin *logic; struct ProofRequestState *rs; + const char *section_name; + const char *h_paytos; - if ( (NULL == args[0]) || - (NULL == args[1]) ) + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "GET /kyc-proof triggered\n"); + if (NULL == args[0]) { GNUNET_break_op (0); return TALER_MHD_reply_with_error (rc->connection, MHD_HTTP_NOT_FOUND, TALER_EC_GENERIC_ENDPOINT_UNKNOWN, - "'/$H_PAYTO/$LOGIC' required after '/kyc-proof'"); + "'/kyc-proof/$PROVIDER_SECTION?state=$H_PAYTO' required"); + } + h_paytos = MHD_lookup_connection_value (rc->connection, + MHD_GET_ARGUMENT_KIND, + "state"); + if (NULL == h_paytos) + { + GNUNET_break_op (0); + return TALER_MHD_reply_with_error (rc->connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_GENERIC_PARAMETER_MISSING, + "h_payto"); } if (GNUNET_OK != - GNUNET_STRINGS_string_to_data (args[0], - strlen (args[0]), + GNUNET_STRINGS_string_to_data (h_paytos, + strlen (h_paytos), &h_payto, sizeof (h_payto))) { @@ -711,17 +825,18 @@ handler_kyc_proof_get ( } if (GNUNET_OK != - TALER_KYCLOGIC_kyc_get_logic (args[1], - &logic, - &pd)) + TALER_KYCLOGIC_lookup_logic (args[0], + &logic, + &pd, + §ion_name)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not initiate KYC with provider `%s' (configuration error?)\n", - initiate_section); + args[0]); return TALER_MHD_reply_with_error (rc->connection, MHD_HTTP_NOT_FOUND, TALER_EC_EXCHANGE_KYC_GENERIC_LOGIC_UNKNOWN, - args[1]); + args[0]); } rs = GNUNET_new (struct ProofRequestState); rs->rc = rc; @@ -732,9 +847,9 @@ handler_kyc_proof_get ( rs); rs->ph = logic->proof (logic->cls, pd, - &args[2], rc->connection, &h_payto, + kyc_row_id, cmd_provider_user_id, cmd_provider_legitimization_id, &proof_cb, @@ -796,6 +911,8 @@ handle_mhd_completion_callback (void *cls, TALER_MHD_parse_post_cleanup_callback (rc->opaque_post_parsing_context); /* Sanity-check that we didn't leave any transactions hanging */ + if (NULL != rc->root) + json_decref (rc->root); GNUNET_free (rc); *con_cls = NULL; } @@ -821,7 +938,6 @@ proceed_with_handler (struct TEKT_RequestContext *rc, const struct TEKT_RequestHandler *rh = rc->rh; const char *args[rh->nargs + 2]; size_t ulen = strlen (url) + 1; - json_t *root = NULL; MHD_RESULT ret; /* We do check for "ulen" here, because we'll later stack-allocate a buffer @@ -842,8 +958,9 @@ proceed_with_handler (struct TEKT_RequestContext *rc, /* All POST endpoints come with a body in JSON format. So we parse the JSON here. */ - if (0 == strcasecmp (rh->method, - MHD_HTTP_METHOD_POST)) + if ( (NULL == rc->root) && + (0 == strcasecmp (rh->method, + MHD_HTTP_METHOD_POST)) ) { enum GNUNET_GenericReturnValue res; @@ -851,16 +968,17 @@ proceed_with_handler (struct TEKT_RequestContext *rc, &rc->opaque_post_parsing_context, upload_data, upload_data_size, - &root); + &rc->root); if (GNUNET_SYSERR == res) { - GNUNET_assert (NULL == root); + GNUNET_assert (NULL == rc->root); + GNUNET_break (0); return MHD_NO; /* bad upload, could not even generate error */ } if ( (GNUNET_NO == res) || - (NULL == root) ) + (NULL == rc->root) ) { - GNUNET_assert (NULL == root); + GNUNET_assert (NULL == rc->root); return MHD_YES; /* so far incomplete upload or parser error */ } } @@ -872,9 +990,9 @@ proceed_with_handler (struct TEKT_RequestContext *rc, /* Parse command-line arguments */ /* make a copy of 'url' because 'strtok_r()' will modify */ - memcpy (d, - url, - ulen); + GNUNET_memcpy (d, + url, + ulen); i = 0; args[i++] = strtok_r (d, "/", &sp); while ( (NULL != args[i - 1]) && @@ -897,7 +1015,6 @@ proceed_with_handler (struct TEKT_RequestContext *rc, rh->url, url); GNUNET_break_op (0); - json_decref (root); return TALER_MHD_reply_with_error (rc->connection, MHD_HTTP_NOT_FOUND, TALER_EC_EXCHANGE_GENERIC_WRONG_NUMBER_OF_SEGMENTS, @@ -907,20 +1024,35 @@ proceed_with_handler (struct TEKT_RequestContext *rc, /* Above logic ensures that 'root' is exactly non-NULL for POST operations, so we test for 'root' to decide which handler to invoke. */ - if (NULL != root) + if (NULL != rc->root) ret = rh->handler.post (rc, - root, + rc->root, args); else /* We also only have "POST" or "GET" in the API for at this point (OPTIONS/HEAD are taken care of earlier) */ ret = rh->handler.get (rc, args); } - json_decref (root); return ret; } +static void +rh_cleaner_cb (struct TEKT_RequestContext *rc) +{ + if (NULL != rc->response) + { + MHD_destroy_response (rc->response); + rc->response = NULL; + } + if (NULL != rc->root) + { + json_decref (rc->root); + rc->root = NULL; + } +} + + /** * Handle incoming HTTP request. * @@ -950,8 +1082,7 @@ handle_mhd_request (void *cls, .url = "kyc-proof", .method = MHD_HTTP_METHOD_GET, .handler.get = &handler_kyc_proof_get, - .nargs = 128, - .nargs_is_upper_bound = true + .nargs = 1 }, { .url = "kyc-webhook", @@ -984,6 +1115,13 @@ handle_mhd_request (void *cls, rc = *con_cls = GNUNET_new (struct TEKT_RequestContext); rc->url = url; rc->connection = connection; + rc->rh_cleaner = &rh_cleaner_cb; + } + if (NULL != rc->response) + { + return MHD_queue_response (rc->connection, + rc->http_status, + rc->response); } GNUNET_log (GNUNET_ERROR_TYPE_INFO, @@ -993,7 +1131,6 @@ handle_mhd_request (void *cls, /* on repeated requests, check our cache first */ if (NULL != rc->rh) { - MHD_RESULT ret; const char *start; if ('\0' == url[0]) @@ -1002,11 +1139,10 @@ handle_mhd_request (void *cls, start = strchr (url + 1, '/'); if (NULL == start) start = ""; - ret = proceed_with_handler (rc, - start, - upload_data, - upload_data_size); - return ret; + return proceed_with_handler (rc, + start, + upload_data, + upload_data_size); } if (0 == strcasecmp (method, MHD_HTTP_METHOD_HEAD)) @@ -1044,25 +1180,25 @@ handle_mhd_request (void *cls, continue; found = true; /* The URL is a match! What we now do depends on the method. */ - if (0 == strcasecmp (method, MHD_HTTP_METHOD_OPTIONS)) + if (0 == strcasecmp (method, + MHD_HTTP_METHOD_OPTIONS)) { return TALER_MHD_reply_cors_preflight (connection); } GNUNET_assert (NULL != rh->method); - if (0 == strcasecmp (method, + if (0 != strcasecmp (method, rh->method)) { - MHD_RESULT ret; - - /* cache to avoid the loop next time */ - rc->rh = rh; - /* run handler */ - ret = proceed_with_handler (rc, - url + tok_size + 1, - upload_data, - upload_data_size); - return ret; + found = true; + continue; } + /* cache to avoid the loop next time */ + rc->rh = rh; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Handler found for %s '%s'\n", + method, + url); + return MHD_YES; } if (found) @@ -1126,15 +1262,10 @@ handle_mhd_request (void *cls, } /* No handler matches, generate not found */ - { - MHD_RESULT ret; - - ret = TALER_MHD_reply_with_error (connection, - MHD_HTTP_NOT_FOUND, - TALER_EC_GENERIC_ENDPOINT_UNKNOWN, - url); - return ret; - } + return TALER_MHD_reply_with_error (connection, + MHD_HTTP_NOT_FOUND, + TALER_EC_GENERIC_ENDPOINT_UNKNOWN, + url); } @@ -1212,6 +1343,7 @@ do_shutdown (void *cls) GNUNET_CURL_gnunet_rc_destroy (exchange_curl_rc); exchange_curl_rc = NULL; } + TALER_TEMPLATING_done (); } @@ -1235,6 +1367,7 @@ initiate_cb ( const char *provider_legitimization_id, const char *error_msg_hint) { + (void) cls; ih = NULL; if (TALER_EC_NONE != ec) { @@ -1246,17 +1379,38 @@ initiate_cb ( GNUNET_SCHEDULER_shutdown (); return; } - fprintf (stdout, - "Visit `%s' to begin KYC process (-u: '%s', -l: '%s')\n", - redirect_url, - provider_user_id, - provider_legitimization_id); + { + char *s; + + s = GNUNET_STRINGS_data_to_string_alloc (&cmd_line_h_payto, + sizeof (cmd_line_h_payto)); + if (NULL != provider_user_id) + { + fprintf (stdout, + "Visit `%s' to begin KYC process.\nAlso use: taler-exchange-kyc-tester -w -u '%s' -U '%s' -p %s\n", + redirect_url, + provider_user_id, + provider_legitimization_id, + s); + } + else + { + fprintf (stdout, + "Visit `%s' to begin KYC process.\nAlso use: taler-exchange-kyc-tester -w -U '%s' -p %s\n", + redirect_url, + provider_legitimization_id, + s); + } + GNUNET_free (s); + } GNUNET_free (cmd_provider_user_id); GNUNET_free (cmd_provider_legitimization_id); if (NULL != provider_user_id) cmd_provider_user_id = GNUNET_strdup (provider_user_id); if (NULL != provider_legitimization_id) cmd_provider_legitimization_id = GNUNET_strdup (provider_legitimization_id); + if (! run_webservice) + GNUNET_SCHEDULER_shutdown (); } @@ -1280,6 +1434,13 @@ run (void *cls, (void) cls; (void) args; (void ) cfgfile; + if (GNUNET_OK != + TALER_TEMPLATING_init ("exchange")) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Could not load templates. Installation broken.\n"); + return; + } if (print_h_payto) { char *s; @@ -1293,6 +1454,8 @@ run (void *cls, } TALER_MHD_setup (TALER_MHD_GO_NONE); TEKT_cfg = config; + GNUNET_SCHEDULER_add_shutdown (&do_shutdown, + NULL); if (GNUNET_OK != TALER_KYCLOGIC_kyc_init (config)) { @@ -1300,8 +1463,6 @@ run (void *cls, GNUNET_SCHEDULER_shutdown (); return; } - GNUNET_SCHEDULER_add_shutdown (&do_shutdown, - NULL); if (GNUNET_OK != exchange_serve_process_config ()) { @@ -1310,18 +1471,31 @@ run (void *cls, return; } global_ret = EXIT_SUCCESS; - if (NULL != initiate_section) + if (NULL != requirements) { struct TALER_KYCLOGIC_ProviderDetails *pd; + enum TALER_KYCLOGIC_KycUserType ut; if (GNUNET_OK != - TALER_KYCLOGIC_kyc_get_logic (initiate_section, - &ih_logic, - &pd)) + TALER_KYCLOGIC_kyc_user_type_from_string (ut_s, + &ut)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Invalid user type specified ('-i')\n"); + global_ret = EXIT_INVALIDARGUMENT; + GNUNET_SCHEDULER_shutdown (); + return; + } + if (GNUNET_OK != + TALER_KYCLOGIC_requirements_to_logic (requirements, + ut, + &ih_logic, + &pd, + &provider_section_name)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Could not initiate KYC with provider `%s' (configuration error?)\n", - initiate_section); + "Could not initiate KYC for requirements `%s' (configuration error?)\n", + requirements); global_ret = EXIT_NOTCONFIGURED; GNUNET_SCHEDULER_shutdown (); return; @@ -1356,6 +1530,9 @@ run (void *cls, GNUNET_SCHEDULER_shutdown (); return; } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Starting daemon on port %u\n", + (unsigned int) serve_port); mhd = MHD_start_daemon (MHD_USE_SUSPEND_RESUME | MHD_USE_PIPE_FOR_SHUTDOWN | MHD_USE_DEBUG | MHD_USE_DUAL_STACK @@ -1415,17 +1592,17 @@ main (int argc, "run the integrated HTTP service", &run_webservice), GNUNET_GETOPT_option_string ( - 'i', - "initiate", - "SECTION_NAME", - "initiate KYC check using provider configured in SECTION_NAME of the configuration", - &initiate_section), + 'R', + "requirements", + "CHECKS", + "initiate KYC check for the given list of (space-separated) checks", + &requirements), GNUNET_GETOPT_option_string ( 'i', - "initiate", - "SECTION_NAME", - "initiate KYC check using provider configured in SECTION_NAME of the configuration", - &initiate_section), + "identify", + "USERTYPE", + "self-identify as USERTYPE 'business' or 'individual' (defaults to 'individual')", + &requirements), GNUNET_GETOPT_option_string ( 'u', "user", @@ -1433,7 +1610,7 @@ main (int argc, "use the given provider user ID (overridden if -i is also used)", &cmd_provider_user_id), GNUNET_GETOPT_option_string ( - 'l', + 'U', "legitimization", "ID", "use the given provider legitimization ID (overridden if -i is also used)", @@ -1441,7 +1618,7 @@ main (int argc, GNUNET_GETOPT_option_base32_fixed_size ( 'p', "payto-hash", - "URI", + "HASH", "base32 encoding of the hash of a payto://-URI to use for the account (otherwise a random value will be used)", &cmd_line_h_payto, sizeof (cmd_line_h_payto)), |