From e5ae035d853d3e3d076e80be70aadfaba6487f1a Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Wed, 28 Aug 2024 13:27:43 +0300 Subject: [PATCH] [mod_sms_flowroute] Remove from tree --- build/modules.conf.in | 1 - .../vanilla/autoload_configs/modules.conf.xml | 1 - .../autoload_configs/sms_flowroute.conf.xml | 13 - configure.ac | 1 - debian/bootstrap.sh | 1 - freeswitch.spec | 1 - .../mod_sms_flowroute/Makefile.am | 17 - .../applications/mod_sms_flowroute/TODO.txt | 30 - .../mod_sms_flowroute/mod_sms_flowroute.c | 669 ------------------ .../mod_sms_flowroute/mod_sms_flowroute.h | 93 --- 10 files changed, 827 deletions(-) delete mode 100644 conf/vanilla/autoload_configs/sms_flowroute.conf.xml delete mode 100644 src/mod/applications/mod_sms_flowroute/Makefile.am delete mode 100644 src/mod/applications/mod_sms_flowroute/TODO.txt delete mode 100644 src/mod/applications/mod_sms_flowroute/mod_sms_flowroute.c delete mode 100644 src/mod/applications/mod_sms_flowroute/mod_sms_flowroute.h diff --git a/build/modules.conf.in b/build/modules.conf.in index b1dfdc7bf0..9a4c419f64 100755 --- a/build/modules.conf.in +++ b/build/modules.conf.in @@ -40,7 +40,6 @@ applications/mod_httapi #applications/mod_rss applications/mod_signalwire applications/mod_sms -#applications/mod_sms_flowroute #applications/mod_snapshot #applications/mod_snom #applications/mod_sonar diff --git a/conf/vanilla/autoload_configs/modules.conf.xml b/conf/vanilla/autoload_configs/modules.conf.xml index 3002a22f0a..2bc4376215 100755 --- a/conf/vanilla/autoload_configs/modules.conf.xml +++ b/conf/vanilla/autoload_configs/modules.conf.xml @@ -72,7 +72,6 @@ - diff --git a/conf/vanilla/autoload_configs/sms_flowroute.conf.xml b/conf/vanilla/autoload_configs/sms_flowroute.conf.xml deleted file mode 100644 index 43d1c3eb06..0000000000 --- a/conf/vanilla/autoload_configs/sms_flowroute.conf.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/configure.ac b/configure.ac index f22076fa84..8866ba7a1b 100755 --- a/configure.ac +++ b/configure.ac @@ -2136,7 +2136,6 @@ AC_CONFIG_FILES([Makefile src/mod/applications/mod_skel/Makefile src/mod/applications/mod_signalwire/Makefile src/mod/applications/mod_sms/Makefile - src/mod/applications/mod_sms_flowroute/Makefile src/mod/applications/mod_snapshot/Makefile src/mod/applications/mod_snom/Makefile src/mod/applications/mod_sonar/Makefile diff --git a/debian/bootstrap.sh b/debian/bootstrap.sh index 1744077f43..4a87f02570 100755 --- a/debian/bootstrap.sh +++ b/debian/bootstrap.sh @@ -33,7 +33,6 @@ supported_debian_distros="wheezy jessie stretch buster bullseye bookworm sid" supported_ubuntu_distros="trusty utopic xenial" supported_distros="$supported_debian_distros $supported_ubuntu_distros" avoid_mods=( - applications/mod_sms_flowroute applications/mod_limit applications/mod_mongo applications/mod_mp4 diff --git a/freeswitch.spec b/freeswitch.spec index d949208ad6..aa897fd9a9 100755 --- a/freeswitch.spec +++ b/freeswitch.spec @@ -1856,7 +1856,6 @@ fi %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/signalwire.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/skinny.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/smpp.conf.xml -%config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/sms_flowroute.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/sndfile.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/sofia.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{sysconfdir}/autoload_configs/spandsp.conf.xml diff --git a/src/mod/applications/mod_sms_flowroute/Makefile.am b/src/mod/applications/mod_sms_flowroute/Makefile.am deleted file mode 100644 index ed5eb0f506..0000000000 --- a/src/mod/applications/mod_sms_flowroute/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -include $(top_srcdir)/build/modmake.rulesam -MODNAME=mod_sms_flowroute - -if HAVE_H2O - -mod_LTLIBRARIES = mod_sms_flowroute.la -mod_sms_flowroute_la_SOURCES = mod_sms_flowroute.c -mod_sms_flowroute_la_CFLAGS = $(AM_CFLAGS) $(H2O_CFLAGS) $(BROTLIENC_CFLAGS) $(BROTLIDEC_CFLAGS) -mod_sms_flowroute_la_LIBADD = $(switch_builddir)/libfreeswitch.la -mod_sms_flowroute_la_LDFLAGS = -avoid-version -module -no-undefined -shared $(H2O_LIBS) $(BROTLIENC_LIBS) $(BROTLIDEC_LIBS) $(SWITCH_AM_LDFLAGS) - -else -install: error -all: error -error: - $(error You must install libh2o and libh2o-dev to build this module) -endif diff --git a/src/mod/applications/mod_sms_flowroute/TODO.txt b/src/mod/applications/mod_sms_flowroute/TODO.txt deleted file mode 100644 index 123737e10e..0000000000 --- a/src/mod/applications/mod_sms_flowroute/TODO.txt +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -For inbound, these are known leaks on per module load(not per message). These will likely require additions to libh2o to add a destroy function. - -================================================================= -==4164==ERROR: LeakSanitizer: detected memory leaks - -Direct leak of 1104 byte(s) in 26 object(s) allocated from: - #0 0x4c1e28 in __interceptor_malloc (/usr/local/freeswitch_sms_flowroute/bin/freeswitch+0x4c1e28) - #1 0x7f868d71acbd in wcsdup /build/glibc-h_iKOs/glibc-2.19/wcsmbs/wcsdup.c:30 - -Direct leak of 184 byte(s) in 1 object(s) allocated from: - #0 0x4c1e28 in __interceptor_malloc (/usr/local/freeswitch_sms_flowroute/bin/freeswitch+0x4c1e28) - #1 0x7f867cdcbaee in h2o_mem_alloc /usr/src/h2o/include/h2o/memory.h:298 - #2 0x7f867cdcbaee in create_socket /usr/src/h2o/lib/common/socket/evloop.c.h:361 - -Indirect leak of 184 byte(s) in 1 object(s) allocated from: - #0 0x4c1e28 in __interceptor_malloc (/usr/local/freeswitch_sms_flowroute/bin/freeswitch+0x4c1e28) - #1 0x7f867cdcbaee in h2o_mem_alloc /usr/src/h2o/include/h2o/memory.h:298 - #2 0x7f867cdcbaee in create_socket /usr/src/h2o/lib/common/socket/evloop.c.h:361 - -Indirect leak of 88 byte(s) in 1 object(s) allocated from: - #0 0x4c1e28 in __interceptor_malloc (/usr/local/freeswitch_sms_flowroute/bin/freeswitch+0x4c1e28) - #1 0x7f867cdc9e12 in h2o_mem_alloc /usr/src/h2o/include/h2o/memory.h:298 - #2 0x7f867cdc9e12 in h2o_multithread_create_queue /usr/src/h2o/lib/common/multithread.c:106 - -SUMMARY: AddressSanitizer: 1560 byte(s) leaked in 29 allocation(s). diff --git a/src/mod/applications/mod_sms_flowroute/mod_sms_flowroute.c b/src/mod/applications/mod_sms_flowroute/mod_sms_flowroute.c deleted file mode 100644 index 3c4f7c69cf..0000000000 --- a/src/mod/applications/mod_sms_flowroute/mod_sms_flowroute.c +++ /dev/null @@ -1,669 +0,0 @@ -/* -* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application -* Copyright (C) 2005-2015, Anthony Minessale II -* -* Version: MPL 1.1 -* -* The contents of this file are subject to the Mozilla Public License Version -* 1.1 (the "License"); you may not use this file except in compliance with -* the License. You may obtain a copy of the License at -* http://www.mozilla.org/MPL/ -* -* Software distributed under the License is distributed on an "AS IS" basis, -* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -* for the specific language governing rights and limitations under the -* License. -* -* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application -* -* The Initial Developer of the Original Code is -* Anthony Minessale II -* Portions created by the Initial Developer are Copyright (C) -* the Initial Developer. All Rights Reserved. -* -* Contributor(s): -* -* William King -* -* mod_sms_flowroute.c SMS support for Flowroute SMS -* -*/ - -#include "mod_sms_flowroute.h" - -SWITCH_MODULE_LOAD_FUNCTION(mod_sms_flowroute_load); -SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_sms_flowroute_shutdown); -SWITCH_MODULE_DEFINITION(mod_sms_flowroute, mod_sms_flowroute_load, mod_sms_flowroute_shutdown, NULL); - -static mod_sms_flowroute_globals_t mod_sms_flowroute_globals; - -static void on_accept(h2o_socket_t *listener, const char *error) -{ - mod_sms_flowroute_profile_t *profile = listener->data; - h2o_socket_t *sock = NULL; - - if ( error != NULL ){ - return; - } - - if ((sock = h2o_evloop_socket_accept(listener)) == NULL) { - return; - } - - h2o_accept(profile->h2o_accept_context, sock); -} - -static void mod_sms_flowroute_profile_event_thread_on_timeout(h2o_timeout_entry_t *entry) -{ - /* required to have this callback, to enable any per interval checks or cleanup. */ -} - -static void *SWITCH_THREAD_FUNC mod_sms_flowroute_profile_event_thread(switch_thread_t *thread, void *obj) -{ - mod_sms_flowroute_profile_t *profile = obj; - struct sockaddr_in addr; - int fd, reuseaddr_flag = 1, err = 0; - h2o_socket_t *sock; - h2o_timeout_t timeout = {0}; - h2o_timeout_entry_t timeout_entry = {0}; - - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = INADDR_ANY; - addr.sin_port = htons(profile->port); - - err = (fd = socket(AF_INET, SOCK_STREAM, 0)); - if (err == -1 ) { - fprintf(stderr, "unable to open socket [%d]\n", err); - return 0; - } - - err = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr_flag, sizeof(reuseaddr_flag)); - if (err != 0) { - fprintf(stderr, "Unable to set socket options [%d]\n", err); - return 0; - } - - err = bind(fd, (struct sockaddr *)&addr, sizeof(addr)); - if (err != 0 ) { - fprintf(stderr, "Unable to bind to socket [%d]\n", err); - perror("bind"); - return 0; - } - - err = listen(fd, SOMAXCONN); - if ( err != 0) { - fprintf(stderr, "Unable to listen on socket [%d]\n", err); - return 0; - } - - sock = h2o_evloop_socket_create(profile->h2o_context.loop, fd, H2O_SOCKET_FLAG_DONT_READ); - sock->data = (void *) profile; - h2o_socket_read_start(sock, on_accept); - - while ( profile->running ) { - // switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile[%s] event thread loop\n", profile->name); - h2o_timeout_init(profile->h2o_context.loop, &timeout, 1000); /* 1 second loop */ - timeout_entry.cb = mod_sms_flowroute_profile_event_thread_on_timeout; - h2o_timeout_link(profile->h2o_context.loop, &timeout, &timeout_entry); - - h2o_evloop_run(profile->h2o_context.loop); - - h2o_timeout_unlink(&timeout_entry); - h2o_timeout_dispose(profile->h2o_context.loop, &timeout); - } - h2o_socket_close(sock); - return 0; -} - -switch_status_t mod_sms_flowroute_profile_destroy(mod_sms_flowroute_profile_t **old_profile) -{ - mod_sms_flowroute_profile_t *profile = NULL; - switch_status_t status; - - if ( !old_profile || !*old_profile ) { - return SWITCH_STATUS_SUCCESS; - } - - profile = *old_profile; - - switch_core_hash_delete(mod_sms_flowroute_globals.profile_hash, profile->name); - - profile->running = 0; - - if (profile->profile_thread) { - switch_thread_join(&status, profile->profile_thread); - } - - switch_safe_free(profile->h2o_accept_context); - switch_safe_free(profile->h2o_context.loop); - h2o_context_dispose(&(profile->h2o_context)); - h2o_config_dispose(&(profile->h2o_globalconf)); - - switch_core_destroy_memory_pool(&(profile->pool)); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile[%s] destroyed\n", profile->name); - - *old_profile = NULL; - return SWITCH_STATUS_SUCCESS; -} - -static int mod_sms_flowroute_profile_request_handler(h2o_handler_t *handler, h2o_req_t *request) -{ - static h2o_generator_t generator = {NULL, NULL}; - h2o_iovec_t body = h2o_strdup(&request->pool, "ACCEPTED\n", SIZE_MAX); - char *content = strndup(request->entity.base, request->entity.len); - cJSON *parsed = NULL; - switch_event_t *evt = NULL; - - /* If there were a better way to cJSON_Parse, but with a str and len, this could remove a strndup */ - parsed = cJSON_Parse(content); - - if ( !parsed ) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Invalid request received[%.*s]", (int) request->entity.len, request->entity.base); - goto done; - } - - switch_event_create(&evt, SWITCH_EVENT_MESSAGE); - switch_event_add_header_string(evt, SWITCH_STACK_BOTTOM, "to", cJSON_GetObjectCstr(parsed, "to")); - switch_event_add_header_string(evt, SWITCH_STACK_BOTTOM, "body", cJSON_GetObjectCstr(parsed, "body")); - switch_event_add_header_string(evt, SWITCH_STACK_BOTTOM, "from", cJSON_GetObjectCstr(parsed, "from")); - switch_event_add_header_string(evt, SWITCH_STACK_BOTTOM, "record_id", cJSON_GetObjectCstr(parsed, "id")); - switch_event_add_header_string(evt, SWITCH_STACK_BOTTOM, "context", "default"); - switch_event_add_header_string(evt, SWITCH_STACK_BOTTOM, "proto", "sms_flowroute"); - - switch_core_chat_send("GLOBAL_SMS", evt); - switch_event_destroy(&evt); - - request->res.status = 200; - request->res.reason = "OK"; - h2o_add_header(&request->pool, &request->res.headers, H2O_TOKEN_CONTENT_TYPE, H2O_STRLIT("text/plain; charset=utf-8")); - h2o_start_response(request, &generator); - h2o_send(request, &body, 1, 1); - - done: - - cJSON_Delete(parsed); - switch_safe_free(content); - return 0; -} - -switch_status_t mod_sms_flowroute_profile_create(mod_sms_flowroute_profile_t **new_profile, char *name, int debug, int port, - char *access_key, char *secret_key, char *host) -{ - mod_sms_flowroute_profile_t *profile = NULL; - switch_memory_pool_t *pool = NULL; - switch_threadattr_t *thd_attr; - char auth[256] = {0}; - unsigned int auth_size = 0; - - switch_core_new_memory_pool(&pool); - - profile = switch_core_alloc(pool, sizeof(mod_sms_flowroute_profile_t)); - - profile->pool = pool; - profile->debug = debug; - profile->running = 1; - profile->name = name ? switch_core_strdup(profile->pool, name) : "default"; - profile->access_key = access_key ? switch_core_strdup(profile->pool, access_key) : "access_key"; - profile->secret_key = secret_key ? switch_core_strdup(profile->pool, secret_key) : "secret_key"; - profile->host = host ? switch_core_strdup(profile->pool, host) : "https://api.flowroute.com/v2/messages"; - profile->port = port ? port : 8000; - - auth_size = snprintf(auth, 256, "%s:%s", profile->access_key, profile->secret_key); - switch_b64_encode((unsigned char *)auth, auth_size, profile->auth_b64, 512); - profile->auth_b64_size = strlen((const char *)profile->auth_b64); - - if ( h2o_url_parse(profile->host, SIZE_MAX, &profile->url_parsed) != 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile[%s] error processing url[%s]\n", profile->name, profile->host); - goto err; - } - - h2o_config_init(&(profile->h2o_globalconf)); - profile->h2o_hostconf = h2o_config_register_host(&(profile->h2o_globalconf), h2o_iovec_init(H2O_STRLIT("mod_sms_flowroute")), 2048); - - /* Register h2o handlers here */ - profile->h2o_pathconf = h2o_config_register_path(profile->h2o_hostconf, "/", 0); - profile->h2o_handler = h2o_create_handler(profile->h2o_pathconf, sizeof(h2o_handler_t)); - profile->h2o_handler->on_req = mod_sms_flowroute_profile_request_handler; - - h2o_context_init(&(profile->h2o_context), h2o_evloop_create(), &(profile->h2o_globalconf)); - - profile->queue = h2o_multithread_create_queue(profile->h2o_context.loop); - - profile->h2o_accept_context = calloc(1, sizeof(h2o_accept_ctx_t)); - profile->h2o_accept_context->ctx = &(profile->h2o_context); - profile->h2o_accept_context->hosts = profile->h2o_globalconf.hosts; - - switch_threadattr_create(&thd_attr, pool); - switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); - switch_thread_create(&(profile->profile_thread), thd_attr, mod_sms_flowroute_profile_event_thread, (void *) profile, pool); - - switch_core_hash_insert(mod_sms_flowroute_globals.profile_hash, name, (void *) profile); - *new_profile = profile; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile[%s] created\n", profile->name); - - return SWITCH_STATUS_SUCCESS; - - err: - return SWITCH_STATUS_GENERR; -} - - -static int on_body(h2o_http1client_t *client, const char *errstr) -{ - h2o_http1client_ctx_t *ctx = client->ctx; - mod_sms_flowroute_message_t *msg = H2O_STRUCT_FROM_MEMBER(mod_sms_flowroute_message_t, ctx, ctx); - - if (errstr != NULL && errstr != h2o_http1client_error_is_eos) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SMS Send error on_body[%s]\n", errstr); - goto err; - } - - fwrite(client->sock->input->bytes, 1, client->sock->input->size, stdout); - h2o_buffer_consume(&client->sock->input, client->sock->input->size); - - if (errstr == h2o_http1client_error_is_eos) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "SMS Send EOS\n"); - } - - msg->status = 0; - switch_mutex_unlock(msg->mutex); - return 0; - - err: - msg->status = 3; - switch_mutex_unlock(msg->mutex); - return -1; -} - -static h2o_http1client_body_cb on_head(h2o_http1client_t *client, const char *errstr, int minor_version, int status, h2o_iovec_t msg_iovec, - h2o_http1client_header_t *headers, size_t num_headers) -{ - size_t i; - switch_log_level_t loglevel = SWITCH_LOG_DEBUG; - h2o_http1client_ctx_t *ctx = client->ctx; - mod_sms_flowroute_message_t *msg = H2O_STRUCT_FROM_MEMBER(mod_sms_flowroute_message_t, ctx, ctx); - - if (errstr != NULL && errstr != h2o_http1client_error_is_eos) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SMS Send error on_head[%s]\n", errstr); - goto err; - } - - if ( status != 200 ) { - loglevel = SWITCH_LOG_ERROR; - } - - switch_log_printf(SWITCH_CHANNEL_LOG, loglevel, "HTTP/1.%d %d %.*s\n", minor_version, status, (int)msg_iovec.len, msg_iovec.base); - for (i = 0; i != num_headers; ++i) { - switch_log_printf(SWITCH_CHANNEL_LOG, loglevel, "%.*s: %.*s\n", - (int)headers[i].name_len, headers[i].name, (int)headers[i].value_len, headers[i].value); - } - - if (errstr == h2o_http1client_error_is_eos) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SMS Send error on_head no body received[%s]\n", errstr); - goto err; - } - - return on_body; - - err: - msg->status = 2; - switch_mutex_unlock(msg->mutex); - return NULL; -} - -static h2o_http1client_head_cb on_connect(h2o_http1client_t *client, const char *errstr, h2o_iovec_t **reqbufs, size_t *reqbufcnt, - int *method_is_head) -{ - h2o_http1client_ctx_t *ctx = client->ctx; - mod_sms_flowroute_message_t *msg = H2O_STRUCT_FROM_MEMBER(mod_sms_flowroute_message_t, ctx, ctx); - - if (errstr != NULL) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SMS Send error on_connect[%s]\n", errstr); - goto err; - } - - *reqbufs = (h2o_iovec_t *)client->data; - *reqbufcnt = 1; - *method_is_head = 0; - - return on_head; - - err: - msg->status = 1; - switch_mutex_unlock(msg->mutex); - return NULL; -} - -switch_status_t mod_sms_flowroute_profile_send_message(mod_sms_flowroute_profile_t *profile, switch_event_t *event) -{ - mod_sms_flowroute_message_t *msg = NULL; - char *to = NULL, *from = NULL, *text = NULL; - switch_status_t status = SWITCH_STATUS_GENERR; - int wait_loops = 10; /* 10 seconds */ - cJSON *body = NULL; - - msg = calloc(1, sizeof(mod_sms_flowroute_message_t)); - msg->req.base = calloc(1, 2048); - msg->ctx.getaddr_receiver = &msg->getaddr_receiver; - msg->ctx.io_timeout = &msg->io_timeout; - msg->ctx.loop = profile->h2o_context.loop; - msg->profile = profile; - msg->status = -1; - h2o_timeout_init(msg->ctx.loop, &msg->io_timeout, 5000); /* 5 seconds */ - h2o_multithread_register_receiver(profile->queue, msg->ctx.getaddr_receiver, h2o_hostinfo_getaddr_receiver); - - msg->ctx.ssl_ctx = SSL_CTX_new(TLSv1_2_client_method()); - SSL_CTX_load_verify_locations(msg->ctx.ssl_ctx, NULL, "/etc/ssl/certs/"); - SSL_CTX_set_verify(msg->ctx.ssl_ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); - - switch_mutex_init(&msg->mutex, SWITCH_MUTEX_UNNESTED, profile->pool); - switch_mutex_lock(msg->mutex); - - body = cJSON_CreateObject(); - - to = switch_event_get_header(event, "to"); - if ( !to ) { - to = switch_event_get_header(event, "destination_addr"); - } - - from = switch_event_get_header(event, "from"); - if ( !from ) { - from = switch_event_get_header(event, "source_addr"); - } - - cJSON_AddItemToObject(body, "to", cJSON_CreateString(to)); - cJSON_AddItemToObject(body, "from", cJSON_CreateString(from)); - cJSON_AddItemToObject(body, "body", cJSON_CreateString((const char *) switch_event_get_body(event))); - - text = cJSON_Print(body); - cJSON_Delete(body); - - msg->req.len = snprintf(msg->req.base, 2048, "POST %.*s HTTP/1.1\r\n" - "Authorization: Basic %.*s\r\n" - "Host: %.*s\r\n" - "Accept: */*\r\n" - "Content-Type: application/json\r\n" - "Content-Length: %d\r\n" - "\r\n%s", - (int) profile->url_parsed.path.len, profile->url_parsed.path.base, - profile->auth_b64_size, profile->auth_b64, - (int) profile->url_parsed.authority.len, profile->url_parsed.authority.base, - (int)strlen(text), text); - - if ( profile->debug ) { - char *msg_txt = NULL; - switch_event_serialize(event, &msg_txt, SWITCH_FALSE); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile[%s] sending message from event\n%s\n", profile->name, msg_txt); - switch_safe_free(msg_txt); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile[%s] sending message json:\n%s\n", profile->name, text); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "REQUEST\n\n%.*s\n\n", (int) msg->req.len, msg->req.base); - } - - h2o_http1client_connect(NULL, &msg->req, &(msg->ctx), profile->url_parsed.host, h2o_url_get_port(&profile->url_parsed), 1, on_connect); - - do { - switch_yield(1000000); - wait_loops--; - status = switch_mutex_trylock(msg->mutex); - } while ( wait_loops > 0 && status != SWITCH_STATUS_SUCCESS); - - if ( status != SWITCH_STATUS_SUCCESS ) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Profile[%s] send_message thread timed out on send\n", profile->name); - goto err; - } - - if ( msg->status > 0 ) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Profile[%s] send_message resulted in failure status %d\n", profile->name, msg->status); - goto err; - } - - h2o_timeout_dispose(msg->ctx.loop, msg->ctx.io_timeout); - switch_mutex_destroy(msg->mutex); - switch_safe_free(msg->req.base); - switch_safe_free(msg); - return SWITCH_STATUS_SUCCESS; - - err: - if ( msg && msg->mutex ) { - switch_mutex_destroy(msg->mutex); - } - h2o_timeout_dispose(msg->ctx.loop, msg->ctx.io_timeout); - switch_safe_free(msg->req.base); - switch_safe_free(msg); - return SWITCH_STATUS_GENERR; -} - -switch_status_t mod_sms_flowroute_interface_chat_send(switch_event_t *event) -{ - mod_sms_flowroute_profile_t *profile = NULL; - char *profile_name = switch_event_get_header(event, "sms_flowroute_profile"); - - if (zstr(profile_name)) { - profile_name = "default"; - } - - profile = switch_core_hash_find(mod_sms_flowroute_globals.profile_hash, profile_name); - - if (!profile) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "NO SUCH SMS_FLOWROUTE PROFILE[%s].", profile_name); - return SWITCH_STATUS_GENERR; - } - - mod_sms_flowroute_profile_send_message(profile, event); - - return SWITCH_STATUS_SUCCESS; -} - -/* static switch_status_t name (switch_event_t *message, const char *data) */ -SWITCH_STANDARD_CHAT_APP(mod_sms_flowroute_chat_send_function) -{ - mod_sms_flowroute_profile_t *profile = NULL; - - profile = switch_core_hash_find(mod_sms_flowroute_globals.profile_hash, data); - - if ( !profile ) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "NO SUCH SMS_FLOWROUTE PROFILE[%s].", data); - return SWITCH_STATUS_GENERR; - } - - mod_sms_flowroute_profile_send_message(profile, message); - return SWITCH_STATUS_SUCCESS; -} - -/* static void name (switch_core_session_t *session, const char *data) */ -SWITCH_STANDARD_APP(mod_sms_flowroute_app_send_function) -{ - switch_event_header_t *chan_var = NULL; - switch_channel_t *channel = switch_core_session_get_channel(session); - switch_event_t *message = NULL; - - if (switch_event_create(&message, SWITCH_EVENT_MESSAGE) != SWITCH_STATUS_SUCCESS) { - return; - } - - /* Copy over recognized channel vars. Then call the chat send function */ - /* Cycle through all of the channel headers, and ones with 'sms_flowroute_' prefix copy over without the prefix */ - for ( chan_var = switch_channel_variable_first(channel); chan_var; chan_var = chan_var->next) { - if ( !strncmp(chan_var->name, "sms_flowroute_", 14) ) { - switch_event_add_header_string(message, SWITCH_STACK_BOTTOM, chan_var->name + 14, chan_var->value); - } - } - - /* Unlock the channel variables */ - switch_channel_variable_last(channel); - mod_sms_flowroute_chat_send_function(message, data); - return; -} - -/* static switch_status_t name (_In_opt_z_ const char *cmd, _In_opt_ switch_core_session_t *session, _In_ switch_stream_handle_t *stream) */ -SWITCH_STANDARD_API(mod_sms_flowroute_debug_api) -{ - mod_sms_flowroute_globals.debug = switch_true(cmd); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "debug is %s\n", (mod_sms_flowroute_globals.debug ? "on" : "off") ); - return SWITCH_STATUS_SUCCESS; -} - -/* static switch_status_t name (_In_opt_z_ const char *cmd, _In_opt_ switch_core_session_t *session, _In_ switch_stream_handle_t *stream) */ -SWITCH_STANDARD_API(mod_sms_flowroute_send_api) -{ - mod_sms_flowroute_profile_t *profile = NULL; - switch_status_t status = SWITCH_STATUS_SUCCESS; - switch_event_t *message = NULL; - char *argv[1024] = { 0 }; - int argc = 0; - char *cmd_dup = strdup(cmd); - - if (!(argc = switch_separate_string(cmd_dup, '|', argv, (sizeof(argv) / sizeof(argv[0])))) || argc != 4 ) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid format. Must be | separated like: profile|destination|source|message\n"); - switch_goto_status(SWITCH_STATUS_GENERR, done); - } - - profile = switch_core_hash_find(mod_sms_flowroute_globals.profile_hash, argv[0]); - - if ( !profile ) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "NO SUCH SMS_FLOWROUTE PROFILE[%s].", argv[0]); - switch_goto_status(SWITCH_STATUS_GENERR, done); - } - - if (switch_event_create(&message, SWITCH_EVENT_MESSAGE) != SWITCH_STATUS_SUCCESS) { - switch_goto_status(SWITCH_STATUS_GENERR, done); - } - - switch_event_add_header_string(message, SWITCH_STACK_BOTTOM, "destination_addr", argv[1]); - switch_event_add_header_string(message, SWITCH_STACK_BOTTOM, "source_addr", argv[2]); - switch_event_set_body(message, argv[3]); - - if (mod_sms_flowroute_profile_send_message(profile, message) != SWITCH_STATUS_SUCCESS) { - switch_goto_status(SWITCH_STATUS_GENERR, done); - } - - done: - switch_safe_free(cmd_dup); - return status; - -} - -switch_status_t mod_sms_flowroute_do_config() -{ - char *conf = "sms_flowroute.conf"; - switch_xml_t xml, cfg, profiles, profile, params, param; - - if (!(xml = switch_xml_open_cfg(conf, &cfg, NULL))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", conf); - goto err; - } - - if ( (profiles = switch_xml_child(cfg, "profiles")) != NULL) { - for (profile = switch_xml_child(profiles, "profile"); profile; profile = profile->next) { - mod_sms_flowroute_profile_t *new_profile = NULL; - int debug = 0, port = 0; - char *access_key = NULL, *secret_key = NULL, *host = NULL; - char *name = (char *)switch_xml_attr_soft(profile, "name"); - - // Load params - if ( (params = switch_xml_child(profile, "params")) != NULL) { - for (param = switch_xml_child(params, "param"); param; param = param->next) { - char *var = (char *) switch_xml_attr_soft(param, "name"); - - if ( ! strncmp(var, "debug", 5) ) { - debug = atoi(switch_xml_attr_soft(param, "value")); - } else if ( ! strncmp(var, "port", 4) ) { - port = atoi(switch_xml_attr_soft(param, "value")); - } else if ( ! strncmp(var, "access-key", 10) ) { - access_key = (char *) switch_xml_attr_soft(param, "value"); - } else if ( ! strncmp(var, "secret-key", 10) ) { - secret_key = (char *) switch_xml_attr_soft(param, "value"); - } else if ( ! strncmp(var, "host", 4) ) { - host = (char *) switch_xml_attr_soft(param, "value"); - } - } - } - - if ( mod_sms_flowroute_profile_create(&new_profile, name, debug, port, access_key, secret_key, host) == SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Created profile[%s]\n", name); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to create profile[%s]\n", name); - } - } - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Profiles config is missing\n"); - goto err; - } - - switch_xml_free(xml); - return SWITCH_STATUS_SUCCESS; - - err: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Configuration failed\n"); - if(xml){ - switch_xml_free(xml); - } - return SWITCH_STATUS_GENERR; -} - -/* switch_status_t name (switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool) */ -SWITCH_MODULE_LOAD_FUNCTION(mod_sms_flowroute_load) -{ - switch_api_interface_t *mod_sms_flowroute_api_interface; - switch_chat_interface_t *mod_sms_flowroute_chat_interface; - switch_chat_application_interface_t *mod_sms_flowroute_chat_app_interface; - switch_application_interface_t *mod_sms_flowroute_app_interface; - - /* connect my internal structure to the blank pointer passed to me */ - *module_interface = switch_loadable_module_create_module_interface(pool, modname); - - memset(&mod_sms_flowroute_globals, 0, sizeof(mod_sms_flowroute_globals_t)); - mod_sms_flowroute_globals.pool = pool; - mod_sms_flowroute_globals.debug = 0; - switch_core_hash_init(&(mod_sms_flowroute_globals.profile_hash)); - - if ( mod_sms_flowroute_do_config() != SWITCH_STATUS_SUCCESS ) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to load due to bad configs\n"); - return SWITCH_STATUS_TERM; - } - - /* SSL_load_error_strings(); - SSL_library_init(); - OpenSSL_add_all_algorithms();*/ - - - SWITCH_ADD_CHAT(mod_sms_flowroute_chat_interface, "sms_flowroute", mod_sms_flowroute_interface_chat_send); - SWITCH_ADD_API(mod_sms_flowroute_api_interface, "sms_flowroute_send", "mod_sms_flowroute send", mod_sms_flowroute_send_api, NULL); - SWITCH_ADD_API(mod_sms_flowroute_api_interface, "sms_flowroute_debug", "mod_sms_flowroute toggle debug", mod_sms_flowroute_debug_api, NULL); - SWITCH_ADD_CHAT_APP(mod_sms_flowroute_chat_app_interface, "sms_flowroute_send", "send message to profile", "send message to profile", - mod_sms_flowroute_chat_send_function, "", SCAF_NONE); - SWITCH_ADD_APP(mod_sms_flowroute_app_interface, "sms_flowroute_send", NULL, NULL, mod_sms_flowroute_app_send_function, - "sms_flowroute_send", SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC); - - /* indicate that the module should continue to be loaded */ - return SWITCH_STATUS_SUCCESS; -} - -SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_sms_flowroute_shutdown) -{ - switch_hash_index_t *hi; - mod_sms_flowroute_profile_t *profile = NULL; - - while ((hi = switch_core_hash_first(mod_sms_flowroute_globals.profile_hash))) { - switch_core_hash_this(hi, NULL, NULL, (void **)&profile); - mod_sms_flowroute_profile_destroy(&profile); - switch_safe_free(hi); - } - - switch_core_hash_destroy(&(mod_sms_flowroute_globals.profile_hash)); - - return SWITCH_STATUS_SUCCESS; -} - -/* For Emacs: - * Local Variables: - * mode:c - * indent-tabs-mode:t - * tab-width:4 - * c-basic-offset:4 - * End: - * For VIM: - * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet: - */ diff --git a/src/mod/applications/mod_sms_flowroute/mod_sms_flowroute.h b/src/mod/applications/mod_sms_flowroute/mod_sms_flowroute.h deleted file mode 100644 index 47651299dc..0000000000 --- a/src/mod/applications/mod_sms_flowroute/mod_sms_flowroute.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application -* Copyright (C) 2005-2012, Anthony Minessale II -* -* Version: MPL 1.1 -* -* The contents of this file are subject to the Mozilla Public License Version -* 1.1 (the "License"); you may not use this file except in compliance with -* the License. You may obtain a copy of the License at -* http://www.mozilla.org/MPL/ -* -* Software distributed under the License is distributed on an "AS IS" basis, -* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -* for the specific language governing rights and limitations under the -* License. -* -* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application -* -* The Initial Developer of the Original Code is -* Anthony Minessale II -* Portions created by the Initial Developer are Copyright (C) -* the Initial Developer. All Rights Reserved. -* -* Based on mod_skel by -* Anthony Minessale II -* -* Contributor(s): -* -* William King -* -* mod_sms_flowroute.c SMS support for Flowroute SMS -* -*/ - -#ifndef MOD_SMS_FLOWROUTE_H -#define MOD_SMS_FLOWROUTE_H - -#define H2O_USE_LIBUV 0 -#define H2O_USE_BROTLI 1 - -#include -#include "h2o.h" -#include "h2o/http1client.h" - -typedef struct { - char *name; - int port; - int debug; - int running; - char *host; - - char *access_key; - char *secret_key; - - unsigned char auth_b64[512]; - int auth_b64_size; - - h2o_url_t url_parsed; - h2o_socketpool_t *sockpool; - - h2o_globalconf_t h2o_globalconf; - h2o_hostconf_t *h2o_hostconf; - h2o_pathconf_t *h2o_pathconf; - h2o_handler_t *h2o_handler; - h2o_context_t h2o_context; - h2o_accept_ctx_t *h2o_accept_context; - h2o_multithread_queue_t *queue; - - switch_thread_t *profile_thread; - switch_memory_pool_t *pool; -} mod_sms_flowroute_profile_t; - -typedef struct { - h2o_http1client_ctx_t ctx; - mod_sms_flowroute_profile_t *profile; - switch_mutex_t *mutex; - h2o_iovec_t req; - int status; - h2o_multithread_receiver_t getaddr_receiver; - h2o_timeout_t io_timeout; -} mod_sms_flowroute_message_t; - -typedef struct mod_sms_flowroute_globals_s { - switch_memory_pool_t *pool; - switch_hash_t *profile_hash; - int debug; -} mod_sms_flowroute_globals_t; - -extern mod_sms_flowroute_globals_t mod_sms_flowroute_globals; - - -#endif /* MOD_SMS_FLOWROUTE_H */ -