diff --git a/src/Makefile b/src/Makefile index 8d50b85..6b44754 100644 --- a/src/Makefile +++ b/src/Makefile @@ -28,7 +28,7 @@ endif CC=gcc #CC=clang -CFLAGS=-c -Wall -Werror -Wextra -Wconversion $(ADDITIONALFLAGS) +CFLAGS=-c -Wall -Werror -Wextra -Wconversion -Wpedantic $(ADDITIONALFLAGS) #CFLAGS=-c -Wall -Werror -Wextra -Wconversion -D_FILE_OFFSET_BITS=64 $(ADDITIONALFLAGS) LIBS=-lc $(shell pkg-config --libs liborcania) $(shell pkg-config --libs libyder) $(shell pkg-config --libs libulfius) $(shell pkg-config --libs libhoel) $(shell pkg-config --libs jansson) $(shell pkg-config --libs gnutls) $(shell pkg-config --libs libconfig) $(shell pkg-config --libs nettle) $(shell pkg-config --libs hogweed) $(shell pkg-config --libs nettle) $(shell pkg-config --libs shout) -lpthread -lavcodec -lavutil -lswresample -lavformat -lswscale -lz $(INITIAL_LIBS) OBJECTS=$(OAUTH2_OBJECTS) taliesin.o webservice.o static_compressed_inmemory_website_callback.o http_compression_callback.o misc.o libav-transcode-filter.o config.o file_list.o filesystem.o data_source.o media.o playlist.o stream.o stream_jukebox.o stream_webradio.o search.o diff --git a/src/http_compression_callback.c b/src/http_compression_callback.c index 8f695a5..d764d61 100644 --- a/src/http_compression_callback.c +++ b/src/http_compression_callback.c @@ -2,9 +2,9 @@ * * Response body compression callback function for Ulfius Framework * - * Copyright 2020-2022 Nicolas Mora + * Copyright 2020-2023 Nicolas Mora * - * Version 20221024 + * Version 20231201 * * Compress the response body using `deflate` or `gzip` depending on the request header `Accept-Encoding` and the callback configuration. * The rest of the response, status, headers, cookies won't change. @@ -68,10 +68,10 @@ int callback_http_compression (const struct _u_request * request, struct _u_resp char ** accept_list = NULL; int ret = U_CALLBACK_IGNORE, compress_mode = U_COMPRESS_NONE, res; z_stream defstream; - char * data_zip = NULL; + unsigned char * data_zip = NULL; size_t data_zip_len = 0; - if (response->binary_body_length && u_map_has_key_case(request->map_header, U_ACCEPT_HEADER)) { + if (response->binary_body_length && u_map_count_keys_case(request->map_header, U_ACCEPT_HEADER) == 1) { if (split_string(u_map_get_case(request->map_header, U_ACCEPT_HEADER), ",", &accept_list)) { if ((config == NULL || config->allow_gzip) && string_array_has_trimmed_value((const char **)accept_list, U_ACCEPT_GZIP)) { compress_mode = U_COMPRESS_GZIP; @@ -125,7 +125,7 @@ int callback_http_compression (const struct _u_request * request, struct _u_resp } while (U_CALLBACK_IGNORE == ret && defstream.avail_out == 0); if (ret == U_CALLBACK_IGNORE) { - ulfius_set_binary_body_response(response, (unsigned int)response->status, (const char *)data_zip, defstream.total_out); + ulfius_set_binary_body_response(response, (unsigned int)response->status, (const unsigned char *)data_zip, defstream.total_out); u_map_put(response->map_header, U_CONTENT_HEADER, compress_mode==U_COMPRESS_GZIP?U_ACCEPT_GZIP:U_ACCEPT_DEFLATE); } deflateEnd(&defstream); diff --git a/src/http_compression_callback.h b/src/http_compression_callback.h index 1d3b46e..4ff1598 100644 --- a/src/http_compression_callback.h +++ b/src/http_compression_callback.h @@ -2,9 +2,9 @@ * * Response body compression callback function for Ulfius Framework * - * Copyright 2020-2022 Nicolas Mora + * Copyright 2020-2023 Nicolas Mora * - * Version 20221024 + * Version 20231201 * * Compress the response body using `deflate` or `gzip` depending on the request header `Accept-Encoding` and the callback configuration. * The rest of the response, status, headers, cookies won't change. diff --git a/src/iddawc_resource.c b/src/iddawc_resource.c index faa1827..86821e0 100644 --- a/src/iddawc_resource.c +++ b/src/iddawc_resource.c @@ -2,9 +2,9 @@ * * Iddawc OIDC Access Token token check * - * Copyright 2021-2022 Nicolas Mora + * Copyright 2020-2023 Nicolas Mora * - * Version 20221024 + * Version 20231201 * * The MIT License (MIT) * @@ -52,7 +52,7 @@ static const char * get_ip_source(const struct _u_request * request) { } return ip_source; -}; +} static const char * get_auth_header_token(const char * auth_header, int * is_header_dpop) { if (0 == o_strncmp(HEADER_PREFIX_BEARER, auth_header, HEADER_PREFIX_BEARER_LEN)) { @@ -119,11 +119,12 @@ int callback_check_jwt_profile_access_token (const struct _u_request * request, int res = U_CALLBACK_UNAUTHORIZED, res_validity, is_header_dpop = 0; const char * token_value = NULL, * dpop = u_map_get_case(request->map_header, HEADER_DPOP); char * response_value = NULL, * htu; + int count_dpop = u_map_count_keys_case(request->map_header, HEADER_DPOP); if (config != NULL) { switch (config->method) { case I_METHOD_HEADER: - if (u_map_get_case(request->map_header, HEADER_AUTHORIZATION) != NULL) { + if (u_map_count_keys_case(request->map_header, HEADER_AUTHORIZATION) == 1) { token_value = get_auth_header_token(u_map_get_case(request->map_header, HEADER_AUTHORIZATION), &is_header_dpop); } break; @@ -150,9 +151,9 @@ int callback_check_jwt_profile_access_token (const struct _u_request * request, u_map_put(response->map_header, HEADER_RESPONSE, response_value); o_free(response_value); } else { - if (is_header_dpop && json_object_get(json_object_get(j_access_token, "cnf"), "jkt") != NULL && dpop != NULL) { + if (is_header_dpop && json_object_get(json_object_get(j_access_token, "cnf"), "jkt") != NULL && dpop != NULL && count_dpop == 1) { htu = msprintf("%s%s", config->resource_url_root, request->url_path+1); - if (i_verify_dpop_proof(u_map_get(request->map_header, I_HEADER_DPOP), request->http_verb, htu, config->dpop_max_iat, json_string_value(json_object_get(json_object_get(j_access_token, "cnf"), "jkt")), token_value) == I_OK) { + if (i_verify_dpop_proof(u_map_get_case(request->map_header, I_HEADER_DPOP), request->http_verb, htu, config->dpop_max_iat, json_string_value(json_object_get(json_object_get(j_access_token, "cnf"), "jkt")), token_value) == I_OK) { res = U_CALLBACK_CONTINUE; if (ulfius_set_response_shared_data(response, json_deep_copy(j_access_token), (void (*)(void *))&json_decref) != U_OK) { res = U_CALLBACK_ERROR; diff --git a/src/iddawc_resource.h b/src/iddawc_resource.h index 20233ee..f9a15c3 100644 --- a/src/iddawc_resource.h +++ b/src/iddawc_resource.h @@ -2,9 +2,9 @@ * * Iddawc OIDC Access Token token check * - * Copyright 2021-2022 Nicolas Mora + * Copyright 2020-2023 Nicolas Mora * - * Version 20221024 + * Version 20231201 * * The MIT License (MIT) * diff --git a/src/misc.c b/src/misc.c index 47649b8..d6ca16f 100644 --- a/src/misc.c +++ b/src/misc.c @@ -120,7 +120,7 @@ char * get_ip_source(const struct _u_request * request) { } return o_strdup(ip_source); -}; +} /** * Check if the result json object has a "result" element that is equal to value diff --git a/src/static_compressed_inmemory_website_callback.c b/src/static_compressed_inmemory_website_callback.c index 6262fb0..ecfee0f 100644 --- a/src/static_compressed_inmemory_website_callback.c +++ b/src/static_compressed_inmemory_website_callback.c @@ -4,7 +4,7 @@ * * Copyright 2020-2022 Nicolas Mora * - * Version 20221024 + * Version 20231201 * * The MIT License (MIT) * @@ -303,7 +303,8 @@ int callback_static_compressed_inmemory_website (const struct _u_request * reque unsigned char * file_content, * file_content_orig = NULL; size_t length, read_length, offset, data_zip_len = 0; FILE * f; - char * file_requested, * file_path, * url_dup_save, * data_zip = NULL, * real_path = NULL; + char * file_requested, * file_path, * url_dup_save, * real_path = NULL; + unsigned char * data_zip = NULL; const char * content_type; /* @@ -343,7 +344,7 @@ int callback_static_compressed_inmemory_website (const struct _u_request * reque if (compress_mode != U_COMPRESS_NONE) { if (compress_mode == U_COMPRESS_GZIP && config->allow_cache_compressed && u_map_has_key(&config->gzip_files, file_requested)) { - ulfius_set_binary_body_response(response, 200, u_map_get(&config->gzip_files, file_requested), (size_t)u_map_get_length(&config->gzip_files, file_requested)); + ulfius_set_binary_body_response(response, 200, (const unsigned char *)u_map_get(&config->gzip_files, file_requested), (size_t)u_map_get_length(&config->gzip_files, file_requested)); u_map_put(response->map_header, U_CONTENT_HEADER, U_ACCEPT_GZIP); content_type = u_map_get_case(&config->mime_types, get_filename_ext(file_requested)); @@ -353,7 +354,7 @@ int callback_static_compressed_inmemory_website (const struct _u_request * reque u_map_put(response->map_header, "Content-Type", content_type); u_map_copy_into(response->map_header, &config->map_header); } else if (compress_mode == U_COMPRESS_DEFL && config->allow_cache_compressed && u_map_has_key(&config->deflate_files, file_requested)) { - ulfius_set_binary_body_response(response, 200, u_map_get(&config->deflate_files, file_requested), (size_t)u_map_get_length(&config->deflate_files, file_requested)); + ulfius_set_binary_body_response(response, 200, (const unsigned char *)u_map_get(&config->deflate_files, file_requested), (size_t)u_map_get_length(&config->deflate_files, file_requested)); u_map_put(response->map_header, U_CONTENT_HEADER, U_ACCEPT_DEFLATE); content_type = u_map_get_case(&config->mime_types, get_filename_ext(file_requested)); @@ -437,15 +438,15 @@ int callback_static_compressed_inmemory_website (const struct _u_request * reque if (ret == U_CALLBACK_CONTINUE) { if (compress_mode == U_COMPRESS_GZIP) { if (config->allow_cache_compressed) { - u_map_put_binary(&config->gzip_files, file_requested, data_zip, 0, defstream.total_out); - ulfius_set_binary_body_response(response, 200, u_map_get(&config->gzip_files, file_requested), (size_t)u_map_get_length(&config->gzip_files, file_requested)); + u_map_put_binary(&config->gzip_files, file_requested, (const char *)data_zip, 0, defstream.total_out); + ulfius_set_binary_body_response(response, 200, (const unsigned char *)u_map_get(&config->gzip_files, file_requested), (size_t)u_map_get_length(&config->gzip_files, file_requested)); } else { ulfius_set_binary_body_response(response, 200, data_zip, defstream.total_out); } } else { if (config->allow_cache_compressed) { - u_map_put_binary(&config->deflate_files, file_requested, data_zip, 0, defstream.total_out); - ulfius_set_binary_body_response(response, 200, u_map_get(&config->deflate_files, file_requested), (size_t)u_map_get_length(&config->deflate_files, file_requested)); + u_map_put_binary(&config->deflate_files, file_requested, (const char *)data_zip, 0, defstream.total_out); + ulfius_set_binary_body_response(response, 200, (const unsigned char *)u_map_get(&config->deflate_files, file_requested), (size_t)u_map_get_length(&config->deflate_files, file_requested)); } else { ulfius_set_binary_body_response(response, 200, data_zip, defstream.total_out); } diff --git a/src/static_compressed_inmemory_website_callback.h b/src/static_compressed_inmemory_website_callback.h index 84afb06..12b29fa 100644 --- a/src/static_compressed_inmemory_website_callback.h +++ b/src/static_compressed_inmemory_website_callback.h @@ -4,7 +4,7 @@ * * Copyright 2020-2022 Nicolas Mora * - * Version 20221024 + * Version 20231201 * * The MIT License (MIT) * diff --git a/src/webservice.c b/src/webservice.c index 59b472f..20c1ef5 100644 --- a/src/webservice.c +++ b/src/webservice.c @@ -125,7 +125,7 @@ int callback_taliesin_server_configuration (const struct _u_request * request, s "icecast_remote_address", ((struct config_elements *)user_data)->icecast_remote_address )); return U_CALLBACK_COMPLETE; -}; +} /** * Authentication endpoint, user scope, redirect to glelwyd authentication callback or build a fake valid user depending on the configuration @@ -606,7 +606,7 @@ int callback_taliesin_media_get_path (const struct _u_request * request, struct cover_b64_len = o_strlen(cover_b64); cover_decoded = o_malloc(cover_b64_len); if (o_base64_decode((const unsigned char *)cover_b64, cover_b64_len, cover_decoded, &cover_decoded_len)) { - ulfius_set_binary_body_response(response, 200, (const char *)cover_decoded, cover_decoded_len); + ulfius_set_binary_body_response(response, 200, cover_decoded, cover_decoded_len); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_taliesin_media_cover_get - Error decoding cover"); response->status = 500; @@ -1976,7 +1976,7 @@ int callback_taliesin_stream_cover (const struct _u_request * request, struct _u cover_b64_len = o_strlen(cover_b64); cover_decoded = o_malloc(cover_b64_len); if (o_base64_decode((const unsigned char *)cover_b64, cover_b64_len, cover_decoded, &cover_decoded_len)) { - ulfius_set_binary_body_response(response, 200, (const char *)cover_decoded, cover_decoded_len); + ulfius_set_binary_body_response(response, 200, cover_decoded, cover_decoded_len); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_taliesin_stream_cover - Error decoding cover"); response->status = 500; @@ -2004,7 +2004,7 @@ int callback_taliesin_stream_cover (const struct _u_request * request, struct _u cover_b64_len = o_strlen(cover_b64); cover_decoded = o_malloc(cover_b64_len); if (o_base64_decode((const unsigned char *)cover_b64, cover_b64_len, cover_decoded, &cover_decoded_len)) { - ulfius_set_binary_body_response(response, 200, (const char *)cover_decoded, cover_decoded_len); + ulfius_set_binary_body_response(response, 200, cover_decoded, cover_decoded_len); } else { y_log_message(Y_LOG_LEVEL_ERROR, "callback_taliesin_stream_cover - Error decoding cover"); response->status = 500;