mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-16 00:41:41 +00:00
Merge branch 'signalwire:master' into master
This commit is contained in:
commit
ab6b1c77d6
16
configure.ac
16
configure.ac
@ -1352,7 +1352,21 @@ PKG_CHECK_MODULES([MPG123], [libmpg123 >= 1.16.0],[
|
|||||||
AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_MPG123],[false])])
|
AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_MPG123],[false])])
|
||||||
|
|
||||||
PKG_CHECK_MODULES([SHOUT], [shout >= 2.2.2],[
|
PKG_CHECK_MODULES([SHOUT], [shout >= 2.2.2],[
|
||||||
AM_CONDITIONAL([HAVE_SHOUT],[true])],[
|
AM_CONDITIONAL([HAVE_SHOUT],[true])
|
||||||
|
SHOUT_VERSION="`$PKG_CONFIG --modversion shout`"
|
||||||
|
SHOUT_MAJOR_VERSION="`echo $SHOUT_VERSION | cut -d. -f1`"
|
||||||
|
SHOUT_MINOR_VERSION="`echo $SHOUT_VERSION | cut -d. -f2`"
|
||||||
|
SHOUT_PATCH_VERSION="`echo $SHOUT_VERSION | cut -d. -f3`"
|
||||||
|
test -n "$SHOUT_PATCH_VERSION" || SHOUT_PATCH_VERSION=0
|
||||||
|
AC_MSG_NOTICE([SHOUT version: $SHOUT_VERSION])
|
||||||
|
AC_MSG_NOTICE([SHOUT major version: $SHOUT_MAJOR_VERSION])
|
||||||
|
AC_MSG_NOTICE([SHOUT minor version: $SHOUT_MINOR_VERSION])
|
||||||
|
AC_MSG_NOTICE([SHOUT patch version: $SHOUT_PATCH_VERSION])
|
||||||
|
AC_SUBST([SHOUT_VERSION])
|
||||||
|
AC_SUBST([SHOUT_MAJOR_VERSION])
|
||||||
|
AC_SUBST([SHOUT_MINOR_VERSION])
|
||||||
|
AC_SUBST([SHOUT_PATCH_VERSION])
|
||||||
|
],[
|
||||||
AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_SHOUT],[false])])
|
AC_MSG_RESULT([no]); AM_CONDITIONAL([HAVE_SHOUT],[false])])
|
||||||
|
|
||||||
mp3lame=false
|
mp3lame=false
|
||||||
|
@ -40,6 +40,9 @@ typedef int switch_CURLINFO;
|
|||||||
typedef int switch_CURLcode;
|
typedef int switch_CURLcode;
|
||||||
typedef int switch_CURLoption;
|
typedef int switch_CURLoption;
|
||||||
|
|
||||||
|
#define HAVE_SWITCH_CURL_MIME
|
||||||
|
typedef void switch_curl_mime;
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_CURL *) switch_curl_easy_init(void);
|
SWITCH_DECLARE(switch_CURL *) switch_curl_easy_init(void);
|
||||||
SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_perform(switch_CURL *handle);
|
SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_perform(switch_CURL *handle);
|
||||||
SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_getinfo(switch_CURL *curl, switch_CURLINFO info, ... );
|
SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_getinfo(switch_CURL *curl, switch_CURLINFO info, ... );
|
||||||
@ -50,7 +53,9 @@ SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_setopt(CURL *handle, switch_CUR
|
|||||||
SWITCH_DECLARE(const char *) switch_curl_easy_strerror(switch_CURLcode errornum );
|
SWITCH_DECLARE(const char *) switch_curl_easy_strerror(switch_CURLcode errornum );
|
||||||
SWITCH_DECLARE(void) switch_curl_init(void);
|
SWITCH_DECLARE(void) switch_curl_init(void);
|
||||||
SWITCH_DECLARE(void) switch_curl_destroy(void);
|
SWITCH_DECLARE(void) switch_curl_destroy(void);
|
||||||
SWITCH_DECLARE(switch_status_t) switch_curl_process_form_post_params(switch_event_t *event, switch_CURL *curl_handle, struct curl_httppost **formpostp);
|
SWITCH_DECLARE(switch_status_t) switch_curl_process_mime(switch_event_t *event, switch_CURL *curl_handle, switch_curl_mime **mimep);
|
||||||
|
SWITCH_DECLARE(void) switch_curl_mime_free(switch_curl_mime **mimep);
|
||||||
|
SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_setopt_mime(switch_CURL *curl_handle, switch_curl_mime *mime);
|
||||||
#define switch_curl_easy_setopt curl_easy_setopt
|
#define switch_curl_easy_setopt curl_easy_setopt
|
||||||
|
|
||||||
SWITCH_END_EXTERN_C
|
SWITCH_END_EXTERN_C
|
||||||
|
@ -255,7 +255,7 @@ fctstr_safe_cpy(char *dst, char const *src, size_t num)
|
|||||||
#if defined(WIN32) && _MSC_VER >= 1400
|
#if defined(WIN32) && _MSC_VER >= 1400
|
||||||
strncpy_s(dst, num, src, _TRUNCATE);
|
strncpy_s(dst, num, src, _TRUNCATE);
|
||||||
#else
|
#else
|
||||||
strncpy(dst, src, num);
|
strncpy(dst, src, num - 1);
|
||||||
#endif
|
#endif
|
||||||
dst[num-1] = '\0';
|
dst[num-1] = '\0';
|
||||||
}
|
}
|
||||||
@ -760,6 +760,7 @@ fct_nlist__init2(fct_nlist_t *list, size_t start_sz)
|
|||||||
list->itm_list = (void**)malloc(sizeof(void*)*start_sz);
|
list->itm_list = (void**)malloc(sizeof(void*)*start_sz);
|
||||||
if ( list->itm_list == NULL )
|
if ( list->itm_list == NULL )
|
||||||
{
|
{
|
||||||
|
list->used_itm_num = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -347,7 +347,7 @@ static size_t file_callback(void *ptr, size_t size, size_t nmemb, void *data)
|
|||||||
return realsize;
|
return realsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long do_lookup_url(switch_memory_pool_t *pool, switch_event_t *event, char **response, const char *query, struct curl_httppost *post,
|
static long do_lookup_url(switch_memory_pool_t *pool, switch_event_t *event, char **response, const char *query, switch_curl_mime *post,
|
||||||
switch_curl_slist_t *headers, int timeout)
|
switch_curl_slist_t *headers, int timeout)
|
||||||
{
|
{
|
||||||
switch_time_t start_time = switch_micro_time_now();
|
switch_time_t start_time = switch_micro_time_now();
|
||||||
@ -373,7 +373,7 @@ static long do_lookup_url(switch_memory_pool_t *pool, switch_event_t *event, cha
|
|||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0);
|
||||||
}
|
}
|
||||||
if (post) {
|
if (post) {
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, post);
|
switch_curl_easy_setopt_mime(curl_handle, post);
|
||||||
} else {
|
} else {
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, 1);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, 1);
|
||||||
}
|
}
|
||||||
|
@ -104,8 +104,13 @@ struct http_sendfile_data_obj {
|
|||||||
char *extrapost_elements;
|
char *extrapost_elements;
|
||||||
switch_CURL *curl_handle;
|
switch_CURL *curl_handle;
|
||||||
char *cacert;
|
char *cacert;
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
curl_mime *mime;
|
||||||
|
curl_mimepart *part;
|
||||||
|
#else
|
||||||
struct curl_httppost *formpost;
|
struct curl_httppost *formpost;
|
||||||
struct curl_httppost *lastptr;
|
struct curl_httppost *lastptr;
|
||||||
|
#endif
|
||||||
uint8_t flags; /* This is for where to send output of the curl_sendfile commands */
|
uint8_t flags; /* This is for where to send output of the curl_sendfile commands */
|
||||||
switch_stream_handle_t *stream;
|
switch_stream_handle_t *stream;
|
||||||
char *sendfile_response;
|
char *sendfile_response;
|
||||||
@ -456,8 +461,19 @@ static void http_sendfile_initialize_curl(http_sendfile_data_t *http_data)
|
|||||||
curl_easy_setopt(http_data->curl_handle, CURLOPT_WRITEFUNCTION, http_sendfile_response_callback);
|
curl_easy_setopt(http_data->curl_handle, CURLOPT_WRITEFUNCTION, http_sendfile_response_callback);
|
||||||
curl_easy_setopt(http_data->curl_handle, CURLOPT_WRITEDATA, (void *) http_data);
|
curl_easy_setopt(http_data->curl_handle, CURLOPT_WRITEDATA, (void *) http_data);
|
||||||
|
|
||||||
|
/* Initial http_data->mime */
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
http_data->mime = curl_mime_init(http_data->curl_handle);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Add the file to upload as a POST form field */
|
/* Add the file to upload as a POST form field */
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
http_data->part = curl_mime_addpart(http_data->mime);
|
||||||
|
curl_mime_name(http_data->part, http_data->filename_element_name);
|
||||||
|
curl_mime_filedata(http_data->part, http_data->filename_element);
|
||||||
|
#else
|
||||||
curl_formadd(&http_data->formpost, &http_data->lastptr, CURLFORM_COPYNAME, http_data->filename_element_name, CURLFORM_FILE, http_data->filename_element, CURLFORM_END);
|
curl_formadd(&http_data->formpost, &http_data->lastptr, CURLFORM_COPYNAME, http_data->filename_element_name, CURLFORM_FILE, http_data->filename_element, CURLFORM_END);
|
||||||
|
#endif
|
||||||
|
|
||||||
if(!zstr(http_data->extrapost_elements))
|
if(!zstr(http_data->extrapost_elements))
|
||||||
{
|
{
|
||||||
@ -476,16 +492,32 @@ static void http_sendfile_initialize_curl(http_sendfile_data_t *http_data)
|
|||||||
if(argc2 == 2) {
|
if(argc2 == 2) {
|
||||||
switch_url_decode(argv2[0]);
|
switch_url_decode(argv2[0]);
|
||||||
switch_url_decode(argv2[1]);
|
switch_url_decode(argv2[1]);
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
http_data->part = curl_mime_addpart(http_data->mime);
|
||||||
|
curl_mime_name(http_data->part, argv2[0]);
|
||||||
|
curl_mime_data(http_data->part, argv2[1], CURL_ZERO_TERMINATED);
|
||||||
|
#else
|
||||||
curl_formadd(&http_data->formpost, &http_data->lastptr, CURLFORM_COPYNAME, argv2[0], CURLFORM_COPYCONTENTS, argv2[1], CURLFORM_END);
|
curl_formadd(&http_data->formpost, &http_data->lastptr, CURLFORM_COPYNAME, argv2[0], CURLFORM_COPYCONTENTS, argv2[1], CURLFORM_END);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill in the submit field too, even if this isn't really needed */
|
/* Fill in the submit field too, even if this isn't really needed */
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
http_data->part = curl_mime_addpart(http_data->mime);
|
||||||
|
curl_mime_name(http_data->part, "submit");
|
||||||
|
curl_mime_data(http_data->part, "or_die", CURL_ZERO_TERMINATED);
|
||||||
|
#else
|
||||||
curl_formadd(&http_data->formpost, &http_data->lastptr, CURLFORM_COPYNAME, "submit", CURLFORM_COPYCONTENTS, "or_die", CURLFORM_END);
|
curl_formadd(&http_data->formpost, &http_data->lastptr, CURLFORM_COPYNAME, "submit", CURLFORM_COPYCONTENTS, "or_die", CURLFORM_END);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* what URL that receives this POST */
|
/* what URL that receives this POST */
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
curl_easy_setopt(http_data->curl_handle, CURLOPT_MIMEPOST, http_data->mime);
|
||||||
|
#else
|
||||||
curl_easy_setopt(http_data->curl_handle, CURLOPT_HTTPPOST, http_data->formpost);
|
curl_easy_setopt(http_data->curl_handle, CURLOPT_HTTPPOST, http_data->formpost);
|
||||||
|
#endif
|
||||||
|
|
||||||
// This part actually fires off the curl, captures the HTTP response code, and then frees up the handle.
|
// This part actually fires off the curl, captures the HTTP response code, and then frees up the handle.
|
||||||
curl_easy_perform(http_data->curl_handle);
|
curl_easy_perform(http_data->curl_handle);
|
||||||
@ -494,7 +526,11 @@ static void http_sendfile_initialize_curl(http_sendfile_data_t *http_data)
|
|||||||
curl_easy_cleanup(http_data->curl_handle);
|
curl_easy_cleanup(http_data->curl_handle);
|
||||||
|
|
||||||
// Clean up the form data from POST
|
// Clean up the form data from POST
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
curl_mime_free(http_data->mime);
|
||||||
|
#else
|
||||||
curl_formfree(http_data->formpost);
|
curl_formfree(http_data->formpost);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static switch_status_t http_sendfile_test_file_open(http_sendfile_data_t *http_data, switch_event_t *event)
|
static switch_status_t http_sendfile_test_file_open(http_sendfile_data_t *http_data, switch_event_t *event)
|
||||||
|
@ -1419,7 +1419,7 @@ static switch_status_t httapi_sync(client_t *client)
|
|||||||
switch_status_t status = SWITCH_STATUS_FALSE;
|
switch_status_t status = SWITCH_STATUS_FALSE;
|
||||||
int get_style_method = 0;
|
int get_style_method = 0;
|
||||||
char *method = NULL;
|
char *method = NULL;
|
||||||
struct curl_httppost *formpost=NULL;
|
switch_curl_mime *formpost = NULL;
|
||||||
switch_event_t *save_params = NULL;
|
switch_event_t *save_params = NULL;
|
||||||
const char *put_file;
|
const char *put_file;
|
||||||
FILE *fd = NULL;
|
FILE *fd = NULL;
|
||||||
@ -1476,7 +1476,7 @@ static switch_status_t httapi_sync(client_t *client)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!put_file) {
|
if (!put_file) {
|
||||||
switch_curl_process_form_post_params(client->params, curl_handle, &formpost);
|
switch_curl_process_mime(client->params, curl_handle, &formpost);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (formpost) {
|
if (formpost) {
|
||||||
@ -1588,7 +1588,7 @@ static switch_status_t httapi_sync(client_t *client)
|
|||||||
curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, put_file_read);
|
curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, put_file_read);
|
||||||
|
|
||||||
} else if (formpost) {
|
} else if (formpost) {
|
||||||
curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost);
|
switch_curl_easy_setopt_mime(curl_handle, formpost);
|
||||||
} else {
|
} else {
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_POST, !get_style_method);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_POST, !get_style_method);
|
||||||
}
|
}
|
||||||
@ -1670,9 +1670,7 @@ static switch_status_t httapi_sync(client_t *client)
|
|||||||
switch_curl_easy_cleanup(curl_handle);
|
switch_curl_easy_cleanup(curl_handle);
|
||||||
switch_curl_slist_free_all(headers);
|
switch_curl_slist_free_all(headers);
|
||||||
|
|
||||||
if (formpost) {
|
switch_curl_mime_free(&formpost);
|
||||||
curl_formfree(formpost);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client->err) {
|
if (client->err) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error encountered! [%s]\ndata: [%s]\n", client->profile->url, data);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error encountered! [%s]\ndata: [%s]\n", client->profile->url, data);
|
||||||
|
@ -279,7 +279,11 @@ switch_status_t azure_blob_finalise_put(http_profile_t *profile, const char *url
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x070c01)
|
||||||
|
switch_curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1);
|
||||||
|
#else
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
|
||||||
|
#endif
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_URL, full_url);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_URL, full_url);
|
||||||
|
@ -393,7 +393,9 @@ static switch_status_t http_put(url_cache_t *cache, http_profile_t *profile, swi
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1);
|
||||||
|
#if !defined(LIBCURL_VERSION_NUM) || (LIBCURL_VERSION_NUM < 0x070c01)
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
|
||||||
|
#endif
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_URL, full_url);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_URL, full_url);
|
||||||
|
@ -48,7 +48,7 @@ static switch_status_t switch_ilbc_fmtp_parse(const char *fmtp, switch_codec_fmt
|
|||||||
|
|
||||||
memset(codec_fmtp, '\0', sizeof(struct switch_codec_fmtp));
|
memset(codec_fmtp, '\0', sizeof(struct switch_codec_fmtp));
|
||||||
|
|
||||||
if (fmtp && (mode = strstr(fmtp, "mode=")) && (mode + 5)) {
|
if (fmtp && (mode = strstr(fmtp, "mode=")) && *(mode + 5)) {
|
||||||
codec_ms = atoi(mode + 5);
|
codec_ms = atoi(mode + 5);
|
||||||
}
|
}
|
||||||
if (!codec_ms) {
|
if (!codec_ms) {
|
||||||
|
@ -411,7 +411,7 @@ switch_status_t mariadb_finish_results_real(const char* file, const char* func,
|
|||||||
if ((status = mysql_next_result(&handle->con))) {
|
if ((status = mysql_next_result(&handle->con))) {
|
||||||
if (status > 0) {
|
if (status > 0) {
|
||||||
err_str = mariadb_handle_get_error(handle);
|
err_str = mariadb_handle_get_error(handle);
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "An error occurred trying to get next for query (%s): %s\n", handle->sql, err_str);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "An error occurred trying to get next for query (%s): %s\n", handle->sql, switch_str_nil(err_str));
|
||||||
switch_safe_free(err_str);
|
switch_safe_free(err_str);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#if OPENSSL_VERSION_NUMBER < 0x0090800 || !defined(SHA256_DIGEST_LENGTH)
|
#if OPENSSL_VERSION_NUMBER < 0x0090800 || !defined(SHA256_DIGEST_LENGTH)
|
||||||
#error Your OpenSSL is too old, need 0.9.8 or newer with SHA256
|
#error Your OpenSSL is too old, need 0.9.8 or newer with SHA256
|
||||||
#endif
|
#endif
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
#define HMAC_setup(ctx, key, len) HMAC_CTX_init(&ctx); HMAC_Init_ex(&ctx, key, len, EVP_sha256(), 0)
|
#define HMAC_setup(ctx, key, len) HMAC_CTX_init(&ctx); HMAC_Init_ex(&ctx, key, len, EVP_sha256(), 0)
|
||||||
#define HMAC_crunch(ctx, buf, len) HMAC_Update(&ctx, buf, len)
|
#define HMAC_crunch(ctx, buf, len) HMAC_Update(&ctx, buf, len)
|
||||||
@ -51,6 +52,7 @@
|
|||||||
#define HMAC_crunch(ctx, buf, len)HMAC_Update(ctx, buf, len)
|
#define HMAC_crunch(ctx, buf, len)HMAC_Update(ctx, buf, len)
|
||||||
#define HMAC_finish(ctx, dig, dlen) HMAC_Final(ctx, dig, &dlen); HMAC_CTX_free(ctx)
|
#define HMAC_finish(ctx, dig, dlen) HMAC_Final(ctx, dig, &dlen); HMAC_CTX_free(ctx)
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#define FP10
|
#define FP10
|
||||||
#define RTMP_SIG_SIZE 1536
|
#define RTMP_SIG_SIZE 1536
|
||||||
@ -155,9 +157,13 @@ static unsigned int GetDigestOffset1(uint8_t *handshake, unsigned int len)
|
|||||||
static getoff *digoff[] = {GetDigestOffset1, GetDigestOffset2};
|
static getoff *digoff[] = {GetDigestOffset1, GetDigestOffset2};
|
||||||
// static getoff *dhoff[] = {GetDHOffset1, GetDHOffset2};
|
// static getoff *dhoff[] = {GetDHOffset1, GetDHOffset2};
|
||||||
|
|
||||||
static void HMACsha256(const uint8_t *message, size_t messageLen, const uint8_t *key, size_t keylen, uint8_t *digest)
|
static void HMACsha256(const uint8_t *message, size_t messageLen, const uint8_t *key, int keylen, uint8_t *digest)
|
||||||
{
|
{
|
||||||
unsigned int digestLen;
|
unsigned int digestLen;
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
|
||||||
|
HMAC(EVP_sha256(), key, keylen, (uint8_t *)message, messageLen, digest, &digestLen);
|
||||||
|
#else
|
||||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
HMAC_CTX ctx;
|
HMAC_CTX ctx;
|
||||||
#else
|
#else
|
||||||
@ -167,11 +173,12 @@ static void HMACsha256(const uint8_t *message, size_t messageLen, const uint8_t
|
|||||||
HMAC_setup(ctx, key, (int)keylen);
|
HMAC_setup(ctx, key, (int)keylen);
|
||||||
HMAC_crunch(ctx, message, messageLen);
|
HMAC_crunch(ctx, message, messageLen);
|
||||||
HMAC_finish(ctx, digest, digestLen);
|
HMAC_finish(ctx, digest, digestLen);
|
||||||
|
#endif
|
||||||
|
|
||||||
assert(digestLen == 32);
|
assert(digestLen == 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CalculateDigest(unsigned int digestPos, uint8_t *handshakeMessage, const uint8_t *key, size_t keyLen, uint8_t *digest)
|
static void CalculateDigest(unsigned int digestPos, uint8_t *handshakeMessage, const uint8_t *key, int keyLen, uint8_t *digest)
|
||||||
{
|
{
|
||||||
const int messageLen = RTMP_SIG_SIZE - SHA256_DIGEST_LENGTH;
|
const int messageLen = RTMP_SIG_SIZE - SHA256_DIGEST_LENGTH;
|
||||||
uint8_t message[RTMP_SIG_SIZE - SHA256_DIGEST_LENGTH];
|
uint8_t message[RTMP_SIG_SIZE - SHA256_DIGEST_LENGTH];
|
||||||
@ -184,7 +191,7 @@ static void CalculateDigest(unsigned int digestPos, uint8_t *handshakeMessage, c
|
|||||||
HMACsha256(message, messageLen, key, keyLen, digest);
|
HMACsha256(message, messageLen, key, keyLen, digest);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int VerifyDigest(unsigned int digestPos, uint8_t *handshakeMessage, const uint8_t *key, size_t keyLen)
|
static int VerifyDigest(unsigned int digestPos, uint8_t *handshakeMessage, const uint8_t *key, int keyLen)
|
||||||
{
|
{
|
||||||
uint8_t calcDigest[SHA256_DIGEST_LENGTH];
|
uint8_t calcDigest[SHA256_DIGEST_LENGTH];
|
||||||
|
|
||||||
|
@ -92,14 +92,14 @@ char* skinny_codec2string(skinny_codecs skinnycodec);
|
|||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define skinny_create_message(message,msgtype,field) \
|
#define skinny_create_message(message,msgtype,field) \
|
||||||
message = calloc(1, 12 + sizeof(message->data.field)); \
|
message = calloc(1, sizeof(skinny_message_t)); \
|
||||||
message->type = msgtype; \
|
message->type = msgtype; \
|
||||||
message->length = 4 + sizeof(message->data.field)
|
message->length = 4 + sizeof(message->data.field)
|
||||||
|
|
||||||
#define skinny_create_empty_message(message,msgtype) \
|
#define skinny_create_empty_message(message,msgtype) \
|
||||||
message = calloc(1, 12); \
|
message = calloc(1, sizeof(skinny_empty_message_t)); \
|
||||||
message->type = msgtype; \
|
((skinny_empty_message_t *)message)->type = msgtype; \
|
||||||
message->length = 4
|
((skinny_empty_message_t *)message)->length = 4
|
||||||
|
|
||||||
|
|
||||||
/* KeepAliveMessage */
|
/* KeepAliveMessage */
|
||||||
@ -937,6 +937,12 @@ union skinny_data {
|
|||||||
#pragma pack(push, r1, 1)
|
#pragma pack(push, r1, 1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct PACKED skinny_empty_message {
|
||||||
|
uint32_t length;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t type;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* header is length+version
|
* header is length+version
|
||||||
* body is type+data
|
* body is type+data
|
||||||
@ -954,6 +960,7 @@ struct PACKED skinny_message {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct skinny_message skinny_message_t;
|
typedef struct skinny_message skinny_message_t;
|
||||||
|
typedef struct skinny_empty_message skinny_empty_message_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -366,7 +366,9 @@ SWITCH_STANDARD_API(kz_http_put)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, 1);
|
||||||
|
#if !defined(LIBCURL_VERSION_NUM) || (LIBCURL_VERSION_NUM < 0x070c01)
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_PUT, 1);
|
||||||
|
#endif
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers);
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_URL, url);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_URL, url);
|
||||||
|
@ -7,8 +7,8 @@ if HAVE_MP3LAME
|
|||||||
|
|
||||||
mod_LTLIBRARIES = mod_shout.la
|
mod_LTLIBRARIES = mod_shout.la
|
||||||
mod_shout_la_SOURCES = mod_shout.c
|
mod_shout_la_SOURCES = mod_shout.c
|
||||||
mod_shout_la_CFLAGS = $(AM_CFLAGS)
|
mod_shout_la_CFLAGS = $(AM_CFLAGS) -DSHOUT_VERSION=$(SHOUT_VERSION) -DSHOUT_MAJOR_VERSION=$(SHOUT_MAJOR_VERSION) -DSHOUT_MINOR_VERSION=$(SHOUT_MINOR_VERSION) -DSHOUT_PATCH_VERSION=$(SHOUT_PATCH_VERSION)
|
||||||
mod_shout_la_CPPFLAGS = $(CURL_CFLAGS) $(AM_CPPFLAGS) $(SHOUT_CFLAGS) $(MP3LAME_CFLAGS) $(MPG123_CFLAGS)
|
mod_shout_la_CPPFLAGS = $(CURL_CFLAGS) $(AM_CPPFLAGS) $(SHOUT_CFLAGS) $(MP3LAME_CFLAGS) $(MPG123_CFLAGS) -DSHOUT_VERSION=$(SHOUT_VERSION) -DSHOUT_MAJOR_VERSION=$(SHOUT_MAJOR_VERSION) -DSHOUT_MINOR_VERSION=$(SHOUT_MINOR_VERSION) -DSHOUT_PATCH_VERSION=$(SHOUT_PATCH_VERSION)
|
||||||
mod_shout_la_LIBADD = $(switch_builddir)/libfreeswitch.la
|
mod_shout_la_LIBADD = $(switch_builddir)/libfreeswitch.la
|
||||||
mod_shout_la_LDFLAGS = $(CURL_LIBS) -avoid-version -module -no-undefined -shared $(SHOUT_LIBS) $(MP3LAME_LIBS) $(MPG123_LIBS)
|
mod_shout_la_LDFLAGS = $(CURL_LIBS) -avoid-version -module -no-undefined -shared $(SHOUT_LIBS) $(MP3LAME_LIBS) $(MPG123_LIBS)
|
||||||
|
|
||||||
|
@ -51,6 +51,11 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_shout_load);
|
|||||||
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_shout_shutdown);
|
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_shout_shutdown);
|
||||||
SWITCH_MODULE_DEFINITION(mod_shout, mod_shout_load, mod_shout_shutdown, NULL);
|
SWITCH_MODULE_DEFINITION(mod_shout, mod_shout_load, mod_shout_shutdown, NULL);
|
||||||
|
|
||||||
|
#define CHECK_SHOUT_MIN_VERSION(major, minor, patch) \
|
||||||
|
(SHOUT_MAJOR_VERSION > major || \
|
||||||
|
(SHOUT_MAJOR_VERSION == major && SHOUT_MINOR_VERSION > minor) || \
|
||||||
|
(SHOUT_MAJOR_VERSION == major && SHOUT_MINOR_VERSION == minor && SHOUT_PATCH_VERSION >= patch))
|
||||||
|
|
||||||
static char *supported_formats[SWITCH_MAX_CODECS] = { 0 };
|
static char *supported_formats[SWITCH_MAX_CODECS] = { 0 };
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
@ -463,7 +468,11 @@ static size_t stream_callback(void *ptr, size_t size, size_t nmemb, void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x072000)
|
||||||
|
static int progress_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
|
||||||
|
#else
|
||||||
static int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
|
static int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
shout_context_t *context = (shout_context_t *) clientp;
|
shout_context_t *context = (shout_context_t *) clientp;
|
||||||
return context->err;
|
return context->err;
|
||||||
@ -496,8 +505,13 @@ static void *SWITCH_THREAD_FUNC read_stream_thread(switch_thread_t *thread, void
|
|||||||
switch_mutex_unlock(context->audio_mutex);
|
switch_mutex_unlock(context->audio_mutex);
|
||||||
curl_handle = switch_curl_easy_init();
|
curl_handle = switch_curl_easy_init();
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_URL, context->stream_url);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_URL, context->stream_url);
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x072000)
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_XFERINFOFUNCTION, progress_callback);
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_XFERINFODATA, (void *)context);
|
||||||
|
#else
|
||||||
curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, progress_callback);
|
curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, progress_callback);
|
||||||
curl_easy_setopt(curl_handle, CURLOPT_PROGRESSDATA, (void *)context);
|
curl_easy_setopt(curl_handle, CURLOPT_PROGRESSDATA, (void *)context);
|
||||||
|
#endif
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1);
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 10);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 10);
|
||||||
switch_curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, stream_callback);
|
switch_curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, stream_callback);
|
||||||
@ -862,12 +876,20 @@ static switch_status_t shout_file_open(switch_file_handle_t *handle, const char
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
|
||||||
|
if (shout_set_meta(context->shout, SHOUT_META_URL, "http://www.freeswitch.org") != SHOUTERR_SUCCESS) {
|
||||||
|
#else
|
||||||
if (shout_set_url(context->shout, "http://www.freeswitch.org") != SHOUTERR_SUCCESS) {
|
if (shout_set_url(context->shout, "http://www.freeswitch.org") != SHOUTERR_SUCCESS) {
|
||||||
|
#endif
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
|
||||||
|
if (shout_set_meta(context->shout, SHOUT_META_DESCRIPTION, "FreeSWITCH mod_shout Broadcasting Module") != SHOUTERR_SUCCESS) {
|
||||||
|
#else
|
||||||
if (shout_set_description(context->shout, "FreeSWITCH mod_shout Broadcasting Module") != SHOUTERR_SUCCESS) {
|
if (shout_set_description(context->shout, "FreeSWITCH mod_shout Broadcasting Module") != SHOUTERR_SUCCESS) {
|
||||||
|
#endif
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting description: %s\n", shout_get_error(context->shout));
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting description: %s\n", shout_get_error(context->shout));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -877,7 +899,11 @@ static switch_status_t shout_file_open(switch_file_handle_t *handle, const char
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
|
||||||
|
if (shout_set_content_format(context->shout, SHOUT_FORMAT_MP3, SHOUT_USAGE_AUDIO, NULL) != SHOUTERR_SUCCESS) {
|
||||||
|
#else
|
||||||
if (shout_set_format(context->shout, SHOUT_FORMAT_MP3) != SHOUTERR_SUCCESS) {
|
if (shout_set_format(context->shout, SHOUT_FORMAT_MP3) != SHOUTERR_SUCCESS) {
|
||||||
|
#endif
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting format: %s\n", shout_get_error(context->shout));
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting format: %s\n", shout_get_error(context->shout));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -1127,21 +1153,33 @@ static switch_status_t shout_file_set_string(switch_file_handle_t *handle, switc
|
|||||||
|
|
||||||
switch (col) {
|
switch (col) {
|
||||||
case SWITCH_AUDIO_COL_STR_TITLE:
|
case SWITCH_AUDIO_COL_STR_TITLE:
|
||||||
|
#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
|
||||||
|
if (shout_set_meta(context->shout, SHOUT_META_NAME, string) == SHOUTERR_SUCCESS) {
|
||||||
|
#else
|
||||||
if (shout_set_name(context->shout, string) == SHOUTERR_SUCCESS) {
|
if (shout_set_name(context->shout, string) == SHOUTERR_SUCCESS) {
|
||||||
|
#endif
|
||||||
status = SWITCH_STATUS_SUCCESS;
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SWITCH_AUDIO_COL_STR_COMMENT:
|
case SWITCH_AUDIO_COL_STR_COMMENT:
|
||||||
|
#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
|
||||||
|
if (shout_set_meta(context->shout, SHOUT_META_URL, string) == SHOUTERR_SUCCESS) {
|
||||||
|
#else
|
||||||
if (shout_set_url(context->shout, string) == SHOUTERR_SUCCESS) {
|
if (shout_set_url(context->shout, string) == SHOUTERR_SUCCESS) {
|
||||||
|
#endif
|
||||||
status = SWITCH_STATUS_SUCCESS;
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SWITCH_AUDIO_COL_STR_ARTIST:
|
case SWITCH_AUDIO_COL_STR_ARTIST:
|
||||||
|
#if (CHECK_SHOUT_MIN_VERSION(2, 4, 6))
|
||||||
|
if (shout_set_meta(context->shout, SHOUT_META_DESCRIPTION, string) == SHOUTERR_SUCCESS) {
|
||||||
|
#else
|
||||||
if (shout_set_description(context->shout, string) == SHOUTERR_SUCCESS) {
|
if (shout_set_description(context->shout, string) == SHOUTERR_SUCCESS) {
|
||||||
|
#endif
|
||||||
status = SWITCH_STATUS_SUCCESS;
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting name: %s\n", shout_get_error(context->shout));
|
||||||
|
@ -74,7 +74,16 @@
|
|||||||
#if (defined(HAVE_LIBMD5) || defined(HAVE_LIBMD) || defined(HAVE_MD5INIT))
|
#if (defined(HAVE_LIBMD5) || defined(HAVE_LIBMD) || defined(HAVE_MD5INIT))
|
||||||
#include <md5.h>
|
#include <md5.h>
|
||||||
#elif defined(HAVE_LIBCRYPTO)
|
#elif defined(HAVE_LIBCRYPTO)
|
||||||
#include <openssl/md5.h>
|
#ifndef OPENSSL_VERSION_NUMBER
|
||||||
|
#include <openssl/opensslv.h>
|
||||||
|
#endif
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x30000000
|
||||||
|
#include <openssl/md5.h>
|
||||||
|
#else
|
||||||
|
#include <openssl/evp.h>
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include <apr_md5.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
@ -1174,11 +1183,24 @@ SWITCH_DECLARE(switch_status_t) switch_md5(unsigned char digest[SWITCH_MD5_DIGES
|
|||||||
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
#elif defined(HAVE_LIBCRYPTO)
|
#elif defined(HAVE_LIBCRYPTO)
|
||||||
MD5_CTX md5_context;
|
#if OPENSSL_VERSION_NUMBER < 0x30000000
|
||||||
|
MD5_CTX md5_context;
|
||||||
|
|
||||||
MD5_Init(&md5_context);
|
MD5_Init(&md5_context);
|
||||||
MD5_Update(&md5_context, input, inputLen);
|
MD5_Update(&md5_context, input, inputLen);
|
||||||
MD5_Final(digest, &md5_context);
|
MD5_Final(digest, &md5_context);
|
||||||
|
#else
|
||||||
|
EVP_MD_CTX *md5_context;
|
||||||
|
|
||||||
|
/* MD5_Init */
|
||||||
|
md5_context = EVP_MD_CTX_new();
|
||||||
|
EVP_DigestInit_ex(md5_context, EVP_md5(), NULL);
|
||||||
|
/* MD5_Update */
|
||||||
|
EVP_DigestUpdate(md5_context, input, inputLen);
|
||||||
|
/* MD5_Final */
|
||||||
|
EVP_DigestFinal_ex(md5_context, digest, NULL);
|
||||||
|
EVP_MD_CTX_free(md5_context);
|
||||||
|
#endif
|
||||||
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
#else
|
#else
|
||||||
|
@ -287,7 +287,10 @@ SWITCH_DECLARE(int) switch_core_gen_certs(const char *prefix)
|
|||||||
|
|
||||||
//bio_err=BIO_new_fp(stderr, BIO_NOCLOSE);
|
//bio_err=BIO_new_fp(stderr, BIO_NOCLOSE);
|
||||||
|
|
||||||
mkcert(&x509, &pkey, 4096, 0, 36500);
|
if (!mkcert(&x509, &pkey, 4096, 0, 36500)) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Certificate generation failed\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
//RSA_print_fp(stdout, pkey->pkey.rsa, 0);
|
//RSA_print_fp(stdout, pkey->pkey.rsa, 0);
|
||||||
//X509_print_fp(stdout, x509);
|
//X509_print_fp(stdout, x509);
|
||||||
@ -410,7 +413,9 @@ static int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days
|
|||||||
{
|
{
|
||||||
X509 *x;
|
X509 *x;
|
||||||
EVP_PKEY *pk;
|
EVP_PKEY *pk;
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x30000000
|
||||||
RSA *rsa;
|
RSA *rsa;
|
||||||
|
#endif
|
||||||
X509_NAME *name=NULL;
|
X509_NAME *name=NULL;
|
||||||
|
|
||||||
switch_assert(pkeyp);
|
switch_assert(pkeyp);
|
||||||
@ -432,7 +437,26 @@ static int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days
|
|||||||
x = *x509p;
|
x = *x509p;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x10100000
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000
|
||||||
|
{
|
||||||
|
EVP_PKEY_CTX *ctx;
|
||||||
|
|
||||||
|
ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
|
||||||
|
/* Setup the key context */
|
||||||
|
if ((!ctx) || (EVP_PKEY_keygen_init(ctx) <= 0) || (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) <= 0)) {
|
||||||
|
abort();
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Generate key */
|
||||||
|
if (EVP_PKEY_generate(ctx, &pk) <= 0) {
|
||||||
|
abort();
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
EVP_PKEY_CTX_free(ctx);
|
||||||
|
}
|
||||||
|
#elif OPENSSL_VERSION_NUMBER >= 0x10100000
|
||||||
rsa = RSA_new();
|
rsa = RSA_new();
|
||||||
{
|
{
|
||||||
static const BN_ULONG ULONG_RSA_F4 = RSA_F4;
|
static const BN_ULONG ULONG_RSA_F4 = RSA_F4;
|
||||||
@ -449,11 +473,13 @@ static int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days
|
|||||||
rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL);
|
rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x30000000
|
||||||
if (!EVP_PKEY_assign_RSA(pk, rsa)) {
|
if (!EVP_PKEY_assign_RSA(pk, rsa)) {
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
rsa = NULL;
|
rsa = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
X509_set_version(x, 2);
|
X509_set_version(x, 2);
|
||||||
ASN1_INTEGER_set(X509_get_serialNumber(x), serial);
|
ASN1_INTEGER_set(X509_get_serialNumber(x), serial);
|
||||||
@ -476,13 +502,21 @@ static int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days
|
|||||||
*/
|
*/
|
||||||
X509_set_issuer_name(x, name);
|
X509_set_issuer_name(x, name);
|
||||||
|
|
||||||
if (!X509_sign(x, pk, EVP_sha1()))
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000
|
||||||
|
if (!X509_sign(x, pk, EVP_sha256())) {
|
||||||
|
#else
|
||||||
|
if (!X509_sign(x, pk, EVP_sha1())) {
|
||||||
|
#endif
|
||||||
goto err;
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
*x509p = x;
|
*x509p = x;
|
||||||
*pkeyp = pk;
|
*pkeyp = pk;
|
||||||
|
|
||||||
return(1);
|
return(1);
|
||||||
err:
|
err:
|
||||||
|
ERR_print_errors_fp(stdout);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1170,7 +1170,7 @@ static uint32_t parse_lifetime_mki(const char **p, const char *end)
|
|||||||
val += ((**p) - '0') * i;
|
val += ((**p) - '0') * i;
|
||||||
}
|
}
|
||||||
res |= (val & 0x000000ff); /* MKI_SIZE */
|
res |= (val & 0x000000ff); /* MKI_SIZE */
|
||||||
} else if (isdigit(*(field_begin + 1)) && (field_begin + 2) && (*(field_begin + 2) == '^') && (field_begin + 3) && isdigit(*(field_begin + 3))) {
|
} else if (isdigit(*(field_begin + 1)) && (*(field_begin + 2) == '^') && isdigit(*(field_begin + 3))) {
|
||||||
res |= (CRYPTO_KEY_MATERIAL_LIFETIME << 24);
|
res |= (CRYPTO_KEY_MATERIAL_LIFETIME << 24);
|
||||||
val = ((uint32_t) (*(field_begin + 1) - '0')) << 8;
|
val = ((uint32_t) (*(field_begin + 1) - '0')) << 8;
|
||||||
res |= val; /* LIFETIME base. */
|
res |= val; /* LIFETIME base. */
|
||||||
|
@ -58,11 +58,16 @@ SWITCH_DECLARE(void) switch_curl_destroy(void)
|
|||||||
curl_global_cleanup();
|
curl_global_cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_curl_process_form_post_params(switch_event_t *event, switch_CURL *curl_handle, struct curl_httppost **formpostp)
|
SWITCH_DECLARE(switch_status_t) switch_curl_process_mime(switch_event_t *event, switch_CURL *curl_handle, switch_curl_mime **mimep)
|
||||||
{
|
{
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
curl_mime *mime = NULL;
|
||||||
|
curl_mimepart *part = NULL;
|
||||||
|
uint8_t added = 0;
|
||||||
|
#else
|
||||||
struct curl_httppost *formpost=NULL;
|
struct curl_httppost *formpost=NULL;
|
||||||
struct curl_httppost *lastptr=NULL;
|
struct curl_httppost *lastptr=NULL;
|
||||||
|
#endif
|
||||||
switch_event_header_t *hp;
|
switch_event_header_t *hp;
|
||||||
int go = 0;
|
int go = 0;
|
||||||
|
|
||||||
@ -77,39 +82,87 @@ SWITCH_DECLARE(switch_status_t) switch_curl_process_form_post_params(switch_even
|
|||||||
return SWITCH_STATUS_FALSE;
|
return SWITCH_STATUS_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (hp = event->headers; hp; hp = hp->next) {
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
mime = curl_mime_init(curl_handle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (hp = event->headers; hp; hp = hp->next) {
|
||||||
if (!strncasecmp(hp->name, "attach_file:", 12)) {
|
if (!strncasecmp(hp->name, "attach_file:", 12)) {
|
||||||
char *pname = strdup(hp->name + 12);
|
char *pname = strdup(hp->name + 12);
|
||||||
|
|
||||||
if (pname) {
|
if (pname) {
|
||||||
char *fname = strchr(pname, ':');
|
char *fname = strchr(pname, ':');
|
||||||
|
|
||||||
if (fname) {
|
if (fname) {
|
||||||
*fname++ = '\0';
|
*fname++ = '\0';
|
||||||
|
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
part = curl_mime_addpart(mime);
|
||||||
|
curl_mime_name(part, pname);
|
||||||
|
curl_mime_filename(part, fname);
|
||||||
|
curl_mime_filedata(part, hp->value);
|
||||||
|
added++;
|
||||||
|
#else
|
||||||
curl_formadd(&formpost,
|
curl_formadd(&formpost,
|
||||||
&lastptr,
|
&lastptr,
|
||||||
CURLFORM_COPYNAME, pname,
|
CURLFORM_COPYNAME, pname,
|
||||||
CURLFORM_FILENAME, fname,
|
CURLFORM_FILENAME, fname,
|
||||||
CURLFORM_FILE, hp->value,
|
CURLFORM_FILE, hp->value,
|
||||||
CURLFORM_END);
|
CURLFORM_END);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
free(pname);
|
free(pname);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
part = curl_mime_addpart(mime);
|
||||||
|
curl_mime_name(part, hp->name);
|
||||||
|
curl_mime_data(part, hp->value, CURL_ZERO_TERMINATED);
|
||||||
|
added++;
|
||||||
|
#else
|
||||||
curl_formadd(&formpost,
|
curl_formadd(&formpost,
|
||||||
&lastptr,
|
&lastptr,
|
||||||
CURLFORM_COPYNAME, hp->name,
|
CURLFORM_COPYNAME, hp->name,
|
||||||
CURLFORM_COPYCONTENTS, hp->value,
|
CURLFORM_COPYCONTENTS, hp->value,
|
||||||
CURLFORM_END);
|
CURLFORM_END);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*formpostp = formpost;
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
if (!added) {
|
||||||
|
curl_mime_free(mime);
|
||||||
|
mime = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*mimep = mime;
|
||||||
|
#else
|
||||||
|
*mimep = formpost;
|
||||||
|
#endif
|
||||||
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
SWITCH_DECLARE(void) switch_curl_mime_free(switch_curl_mime **mimep)
|
||||||
|
{
|
||||||
|
if (mimep && *mimep) {
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
curl_mime_free(*mimep);
|
||||||
|
#else
|
||||||
|
curl_formfree(*mimep);
|
||||||
|
#endif
|
||||||
|
mimep = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SWITCH_DECLARE(switch_CURLcode) switch_curl_easy_setopt_mime(switch_CURL *curl_handle, switch_curl_mime *mime)
|
||||||
|
{
|
||||||
|
#if defined(LIBCURL_VERSION_NUM) && (LIBCURL_VERSION_NUM >= 0x073800)
|
||||||
|
return curl_easy_setopt(curl_handle, CURLOPT_MIMEPOST, mime);
|
||||||
|
#else
|
||||||
|
return curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, mime);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For Emacs:
|
/* For Emacs:
|
||||||
|
@ -3643,7 +3643,11 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, d
|
|||||||
const SSL_METHOD *ssl_method;
|
const SSL_METHOD *ssl_method;
|
||||||
SSL_CTX *ssl_ctx;
|
SSL_CTX *ssl_ctx;
|
||||||
BIO *bio;
|
BIO *bio;
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x30000000
|
||||||
|
EVP_PKEY *dh_pk;
|
||||||
|
#else
|
||||||
DH *dh;
|
DH *dh;
|
||||||
|
#endif
|
||||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||||
#ifndef OPENSSL_NO_EC
|
#ifndef OPENSSL_NO_EC
|
||||||
#if OPENSSL_VERSION_NUMBER < 0x10002000L
|
#if OPENSSL_VERSION_NUMBER < 0x10002000L
|
||||||
@ -3723,13 +3727,21 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_add_dtls(switch_rtp_t *rtp_session, d
|
|||||||
switch_assert(dtls->ssl_ctx);
|
switch_assert(dtls->ssl_ctx);
|
||||||
|
|
||||||
bio = BIO_new_file(dtls->pem, "r");
|
bio = BIO_new_file(dtls->pem, "r");
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x30000000
|
||||||
dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
|
dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
|
||||||
BIO_free(bio);
|
BIO_free(bio);
|
||||||
if (dh) {
|
if (dh) {
|
||||||
SSL_CTX_set_tmp_dh(dtls->ssl_ctx, dh);
|
SSL_CTX_set_tmp_dh(dtls->ssl_ctx, dh);
|
||||||
DH_free(dh);
|
DH_free(dh);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if((dh_pk = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL)) != NULL) {
|
||||||
|
SSL_CTX_set0_tmp_dh_pkey(dtls->ssl_ctx, dh_pk);
|
||||||
|
EVP_PKEY_free(dh_pk);
|
||||||
|
}
|
||||||
|
|
||||||
|
BIO_free(bio);
|
||||||
|
#endif
|
||||||
SSL_CTX_set_mode(dtls->ssl_ctx, SSL_MODE_AUTO_RETRY);
|
SSL_CTX_set_mode(dtls->ssl_ctx, SSL_MODE_AUTO_RETRY);
|
||||||
|
|
||||||
//SSL_CTX_set_verify(dtls->ssl_ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
|
//SSL_CTX_set_verify(dtls->ssl_ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
|
||||||
|
@ -2380,7 +2380,7 @@ SWITCH_DECLARE(int) switch_cmp_addr(switch_sockaddr_t *sa1, switch_sockaddr_t *s
|
|||||||
return (s1->sin_addr.s_addr == s2->sin_addr.s_addr && s1->sin_port == s2->sin_port);
|
return (s1->sin_addr.s_addr == s2->sin_addr.s_addr && s1->sin_port == s2->sin_port);
|
||||||
}
|
}
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
if (s16->sin6_addr.s6_addr && s26->sin6_addr.s6_addr) {
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!ip_only) {
|
if (!ip_only) {
|
||||||
@ -2434,7 +2434,7 @@ SWITCH_DECLARE(int) switch_cp_addr(switch_sockaddr_t *sa1, switch_sockaddr_t *sa
|
|||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
if (s16->sin6_addr.s6_addr && s26->sin6_addr.s6_addr) {
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
s16->sin6_port = s26->sin6_port;
|
s16->sin6_port = s26->sin6_port;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user