diff --git a/src/mod/applications/mod_http_cache/aws.c b/src/mod/applications/mod_http_cache/aws.c index 4d446d5857..58c4b4d917 100644 --- a/src/mod/applications/mod_http_cache/aws.c +++ b/src/mod/applications/mod_http_cache/aws.c @@ -105,6 +105,39 @@ char *aws_s3_signature(char *signature, int signature_length, const char *string return signature; } +/** + * Reverse string substring search + */ +static char *my_strrstr(const char *haystack, const char *needle) +{ + char *s; + size_t needle_len; + size_t haystack_len; + + if (zstr(haystack)) { + return NULL; + } + + if (zstr(needle)) { + return (char *)haystack; + } + + needle_len = strlen(needle); + haystack_len = strlen(haystack); + if (needle_len > haystack_len) { + return NULL; + } + + s = (char *)(haystack + haystack_len - needle_len); + do { + if (!strncmp(s, needle, needle_len)) { + return s; + } + } while (s-- != haystack); + + return NULL; +} + /** * Parse bucket and object from URL * @param url to parse. This value is modified. @@ -113,7 +146,7 @@ char *aws_s3_signature(char *signature, int signature_length, const char *string */ void aws_s3_parse_url(char *url, char **bucket, char **object) { - char *bucket_start; + char *bucket_start = NULL; char *bucket_end; char *object_start; @@ -124,15 +157,18 @@ void aws_s3_parse_url(char *url, char **bucket, char **object) return; } - /* expect: http(s)://bucket.s3.amazonaws.com/object */ - bucket_start = strstr(url, "://"); - if (!bucket_start) { + /* expect: http(s)://bucket.foo-bar.s3.amazonaws.com/object */ + if (!strncasecmp(url, "https://", 8)) { + bucket_start = url + 8; + } else if (!strncasecmp(url, "http://", 7)) { + bucket_start = url + 7; + } + if (zstr(bucket_start)) { /* invalid URL */ return; } - bucket_start += 3; - - bucket_end = strchr(bucket_start, '.'); + + bucket_end = my_strrstr(bucket_start, ".s3"); if (!bucket_end) { /* invalid URL */ return; diff --git a/src/mod/applications/mod_http_cache/mod_http_cache.c b/src/mod/applications/mod_http_cache/mod_http_cache.c index 3505c99a9b..f1ec2b69ed 100644 --- a/src/mod/applications/mod_http_cache/mod_http_cache.c +++ b/src/mod/applications/mod_http_cache/mod_http_cache.c @@ -1395,17 +1395,19 @@ static switch_status_t do_config(url_cache_t *cache) http_profile_t *profile_obj; switch_xml_t domains; switch_xml_t s3 = switch_xml_child(profile, "aws-s3"); - const char *access_key_id = NULL; - const char *secret_access_key = NULL; + char *access_key_id = NULL; + char *secret_access_key = NULL; if (s3) { switch_xml_t id = switch_xml_child(s3, "access-key-id"); switch_xml_t secret = switch_xml_child(s3, "secret-access-key"); if (id && secret) { - access_key_id = switch_xml_txt(id); - secret_access_key = switch_xml_txt(secret); - if (!access_key_id || !secret_access_key) { + access_key_id = switch_strip_whitespace(switch_xml_txt(id)); + secret_access_key = switch_strip_whitespace(switch_xml_txt(secret)); + if (zstr(access_key_id) || zstr(secret_access_key)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Missing aws s3 credentials for profile \"%s\"\n", name); + switch_safe_free(access_key_id); access_key_id = NULL; + switch_safe_free(secret_access_key); secret_access_key = NULL; } } else { @@ -1414,6 +1416,8 @@ static switch_status_t do_config(url_cache_t *cache) } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Adding profile \"%s\" to cache\n", name); profile_obj = url_cache_http_profile_add(cache, name, access_key_id, secret_access_key); + switch_safe_free(access_key_id); + switch_safe_free(secret_access_key); domains = switch_xml_child(profile, "domains"); if (domains) { diff --git a/src/mod/applications/mod_http_cache/test_aws/main.c b/src/mod/applications/mod_http_cache/test_aws/main.c index c29f1364ec..f661c5954f 100644 --- a/src/mod/applications/mod_http_cache/test_aws/main.c +++ b/src/mod/applications/mod_http_cache/test_aws/main.c @@ -111,6 +111,10 @@ static void test_parse_url(void) aws_s3_parse_url(strdup("https://my-bucket-with-dash.s3-us-west-2.amazonaws.com/greeting/file/1002/Lumino.mp3"), &bucket, &object); ASSERT_STRING_EQUALS("my-bucket-with-dash", bucket); ASSERT_STRING_EQUALS("greeting/file/1002/Lumino.mp3", object); + + aws_s3_parse_url(strdup("http://quotes.s3.foo.bar.s3.amazonaws.com/greeting/file/1002/Lumino.mp3"), &bucket, &object); + ASSERT_STRING_EQUALS("quotes.s3.foo.bar", bucket); + ASSERT_STRING_EQUALS("greeting/file/1002/Lumino.mp3", object); } /**