Skip to content

Commit 78a75d8

Browse files
binary1248eXpl0it3r
authored andcommitted
Added support for TCP transport layer security and HTTPS.
1 parent 9aead04 commit 78a75d8

10 files changed

Lines changed: 1525 additions & 32 deletions

File tree

.github/workflows/ci.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ jobs:
125125
CLANG_VERSION=$(clang++ --version | sed -n 's/.*version \([0-9]\+\)\..*/\1/p')
126126
echo "CLANG_VERSION=$CLANG_VERSION" >> $GITHUB_ENV
127127
sudo apt-get update
128-
sudo apt-get install xorg-dev libharfbuzz-dev libxrandr-dev libxcursor-dev libxi-dev libudev-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev xvfb fluxbox ccache gcovr ${{ matrix.platform.name == 'Linux Clang' && 'llvm-$CLANG_VERSION' || '' }}
128+
sudo apt-get install xorg-dev libharfbuzz-dev libxrandr-dev libxcursor-dev libxi-dev libudev-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev libmbedtls-dev xvfb fluxbox ccache gcovr ${{ matrix.platform.name == 'Linux Clang' && 'llvm-$CLANG_VERSION' || '' }}
129129
130130
- name: Install Android Components
131131
if: matrix.platform.name == 'Android'
@@ -143,7 +143,7 @@ jobs:
143143
144144
- name: Install macOS System Deps
145145
if: contains(matrix.config.name, 'System Deps')
146-
run: brew install flac libvorbis || true
146+
run: brew install flac libvorbis mbedtls || true
147147

148148
# In addition to installing a known working version of CCache, this action also takes care of saving and restoring the cache for us
149149
# Additionally it outputs information at the end of each job that helps us to verify if the cache is working properly
@@ -313,7 +313,7 @@ jobs:
313313
if: runner.os == 'Linux'
314314
run: |
315315
sudo apt-get update
316-
sudo apt-get install libharfbuzz-dev libfreetype-dev libxrandr-dev libxcursor-dev libxi-dev libudev-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev
316+
sudo apt-get install libharfbuzz-dev libfreetype-dev libxrandr-dev libxcursor-dev libxi-dev libudev-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev libmbedtls-dev
317317
318318
- name: Install macOS Dependencies
319319
if: runner.os == 'macOS'
@@ -354,7 +354,7 @@ jobs:
354354
if: runner.os == 'Linux'
355355
run: |
356356
sudo apt-get update
357-
sudo apt-get install xorg-dev libharfbuzz-dev libxrandr-dev libxcursor-dev libxi-dev libudev-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev xvfb fluxbox
357+
sudo apt-get install xorg-dev libharfbuzz-dev libxrandr-dev libxcursor-dev libxi-dev libudev-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev libmbedtls-dev xvfb fluxbox
358358
359359
- name: Configure
360360
run: cmake --preset dev -GNinja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DSFML_BUILD_EXAMPLES=OFF -DSFML_ENABLE_SANITIZERS=ON ${{matrix.platform.flags}}

cmake/Modules/FindMbedTLS.cmake

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
#***************************************************************************
2+
# _ _ ____ _
3+
# Project ___| | | | _ \| |
4+
# / __| | | | |_) | |
5+
# | (__| |_| | _ <| |___
6+
# \___|\___/|_| \_\_____|
7+
#
8+
# Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9+
#
10+
# This software is licensed as described in the file COPYING, which
11+
# you should have received as part of this distribution. The terms
12+
# are also available at https://curl.se/docs/copyright.html.
13+
#
14+
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
15+
# copies of the Software, and permit persons to whom the Software is
16+
# furnished to do so, under the terms of the COPYING file.
17+
#
18+
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19+
# KIND, either express or implied.
20+
#
21+
# SPDX-License-Identifier: curl
22+
#
23+
###########################################################################
24+
# Find the mbedTLS library
25+
#
26+
# Input variables:
27+
#
28+
# - `MBEDTLS_INCLUDE_DIR`: The mbedTLS include directory.
29+
# - `MBEDTLS_LIBRARY`: Path to `mbedtls` library.
30+
# - `MBEDX509_LIBRARY`: Path to `mbedx509` library.
31+
# - `MBEDCRYPTO_LIBRARY`: Path to `mbedcrypto` library.
32+
#
33+
# Result variables:
34+
#
35+
# - `MBEDTLS_FOUND`: System has mbedTLS.
36+
# - `MBEDTLS_INCLUDE_DIRS`: The mbedTLS include directories.
37+
# - `MBEDTLS_LIBRARIES`: The mbedTLS library names.
38+
# - `MBEDTLS_LIBRARY_DIRS`: The mbedTLS library directories.
39+
# - `MBEDTLS_PC_REQUIRES`: The mbedTLS pkg-config packages.
40+
# - `MBEDTLS_CFLAGS`: Required compiler flags.
41+
# - `MBEDTLS_VERSION`: Version of mbedTLS.
42+
43+
if(DEFINED MBEDTLS_INCLUDE_DIRS AND NOT DEFINED MBEDTLS_INCLUDE_DIR)
44+
message(WARNING "MBEDTLS_INCLUDE_DIRS is deprecated, use MBEDTLS_INCLUDE_DIR instead.")
45+
set(MBEDTLS_INCLUDE_DIR "${MBEDTLS_INCLUDE_DIRS}")
46+
unset(MBEDTLS_INCLUDE_DIRS)
47+
endif()
48+
49+
set(MBEDTLS_PC_REQUIRES "mbedtls" "mbedx509" "mbedcrypto")
50+
51+
if(CURL_USE_PKGCONFIG AND
52+
NOT DEFINED MBEDTLS_INCLUDE_DIR AND
53+
NOT DEFINED MBEDTLS_LIBRARY AND
54+
NOT DEFINED MBEDX509_LIBRARY AND
55+
NOT DEFINED MBEDCRYPTO_LIBRARY)
56+
find_package(PkgConfig QUIET)
57+
pkg_check_modules(MBEDTLS ${MBEDTLS_PC_REQUIRES})
58+
endif()
59+
60+
if(MBEDTLS_FOUND)
61+
set(MbedTLS_FOUND TRUE)
62+
set(MBEDTLS_VERSION "${MBEDTLS_mbedtls_VERSION}")
63+
string(REPLACE ";" " " MBEDTLS_CFLAGS "${MBEDTLS_CFLAGS}")
64+
message(STATUS "Found MbedTLS (via pkg-config): ${MBEDTLS_INCLUDE_DIRS} (found version \"${MBEDTLS_VERSION}\")")
65+
else()
66+
set(MBEDTLS_PC_REQUIRES "") # Depend on pkg-config only when found via pkg-config
67+
68+
find_path(MBEDTLS_INCLUDE_DIR NAMES "mbedtls/ssl.h")
69+
find_library(MBEDTLS_LIBRARY NAMES "mbedtls" "libmbedtls")
70+
find_library(MBEDX509_LIBRARY NAMES "mbedx509" "libmbedx509")
71+
find_library(MBEDCRYPTO_LIBRARY NAMES "mbedcrypto" "libmbedcrypto")
72+
73+
unset(MBEDTLS_VERSION CACHE)
74+
if(MBEDTLS_INCLUDE_DIR)
75+
if(EXISTS "${MBEDTLS_INCLUDE_DIR}/mbedtls/build_info.h") # 3.x
76+
set(_version_header "${MBEDTLS_INCLUDE_DIR}/mbedtls/build_info.h")
77+
elseif(EXISTS "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h") # 2.x
78+
set(_version_header "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h")
79+
else()
80+
unset(_version_header)
81+
endif()
82+
if(_version_header)
83+
set(_version_regex "#[\t ]*define[\t ]+MBEDTLS_VERSION_STRING[\t ]+\"([0-9.]+)\"")
84+
file(STRINGS "${_version_header}" _version_str REGEX "${_version_regex}")
85+
string(REGEX REPLACE "${_version_regex}" "\\1" _version_str "${_version_str}")
86+
set(MBEDTLS_VERSION "${_version_str}")
87+
unset(_version_regex)
88+
unset(_version_str)
89+
unset(_version_header)
90+
endif()
91+
endif()
92+
93+
include(FindPackageHandleStandardArgs)
94+
find_package_handle_standard_args(MbedTLS
95+
REQUIRED_VARS
96+
MBEDTLS_INCLUDE_DIR
97+
MBEDTLS_LIBRARY
98+
MBEDX509_LIBRARY
99+
MBEDCRYPTO_LIBRARY
100+
VERSION_VAR
101+
MBEDTLS_VERSION
102+
)
103+
104+
if(MBEDTLS_FOUND)
105+
set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR})
106+
set(MBEDTLS_LIBRARIES ${MBEDTLS_LIBRARY} ${MBEDX509_LIBRARY} ${MBEDCRYPTO_LIBRARY})
107+
108+
if(NOT TARGET mbedtls)
109+
add_library(mbedtls IMPORTED UNKNOWN)
110+
set_target_properties(mbedtls PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MBEDTLS_INCLUDE_DIR}")
111+
if(MBEDTLS_LIBRARY MATCHES "/([^/]+)\\.framework$")
112+
set_target_properties(mbedtls PROPERTIES IMPORTED_LOCATION ${MBEDTLS_LIBRARY}/${CMAKE_MATCH_1})
113+
else()
114+
set_target_properties(mbedtls PROPERTIES IMPORTED_LOCATION ${MBEDTLS_LIBRARY})
115+
endif()
116+
endif()
117+
118+
if(NOT TARGET mbedx509)
119+
add_library(mbedx509 IMPORTED UNKNOWN)
120+
set_target_properties(mbedx509 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MBEDTLS_INCLUDE_DIR}")
121+
if(MBEDX509_LIBRARY MATCHES "/([^/]+)\\.framework$")
122+
set_target_properties(mbedx509 PROPERTIES IMPORTED_LOCATION ${MBEDX509_LIBRARY}/${CMAKE_MATCH_1})
123+
else()
124+
set_target_properties(mbedx509 PROPERTIES IMPORTED_LOCATION ${MBEDX509_LIBRARY})
125+
endif()
126+
endif()
127+
128+
if(NOT TARGET mbedcrypto)
129+
add_library(mbedcrypto IMPORTED UNKNOWN)
130+
set_target_properties(mbedcrypto PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MBEDTLS_INCLUDE_DIR}")
131+
if(MBEDCRYPTO_LIBRARY MATCHES "/([^/]+)\\.framework$")
132+
set_target_properties(mbedcrypto PROPERTIES IMPORTED_LOCATION ${MBEDCRYPTO_LIBRARY}/${CMAKE_MATCH_1})
133+
else()
134+
set_target_properties(mbedcrypto PROPERTIES IMPORTED_LOCATION ${MBEDCRYPTO_LIBRARY})
135+
endif()
136+
endif()
137+
endif()
138+
139+
mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY)
140+
endif()

include/SFML/Network/Http.hpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -398,13 +398,14 @@ class SFML_NETWORK_API Http
398398
/// of `Time::Zero` means that the client will use the system default timeout
399399
/// (which is usually pretty long).
400400
///
401-
/// \param request Request to send
402-
/// \param timeout Maximum time to wait
401+
/// \param request Request to send
402+
/// \param timeout Maximum time to wait
403+
/// \param verifyServer Verify the server if using HTTPS
403404
///
404405
/// \return Server's response
405406
///
406407
////////////////////////////////////////////////////////////
407-
[[nodiscard]] Response sendRequest(const Request& request, Time timeout = Time::Zero);
408+
[[nodiscard]] Response sendRequest(const Request& request, Time timeout = Time::Zero, bool verifyServer = true);
408409

409410
private:
410411
////////////////////////////////////////////////////////////
@@ -414,6 +415,7 @@ class SFML_NETWORK_API Http
414415
std::optional<IpAddress> m_host; //!< Web host address
415416
std::string m_hostName; //!< Web host name
416417
unsigned short m_port{}; //!< Port used for connection with host
418+
bool m_https{}; //!< Use HTTPS
417419
};
418420

419421
} // namespace sf
@@ -427,7 +429,7 @@ class SFML_NETWORK_API Http
427429
/// to communicate with a web server. You can retrieve
428430
/// web pages, send data to an interactive resource,
429431
/// download a remote file, etc. The HTTPS protocol is
430-
/// not supported.
432+
/// supported using TLS connections only.
431433
///
432434
/// The HTTP client is split into 3 classes:
433435
/// \li `sf::Http::Request`
@@ -456,11 +458,11 @@ class SFML_NETWORK_API Http
456458
/// // Create a new HTTP client
457459
/// sf::Http http;
458460
///
459-
/// // We'll work on http://www.sfml-dev.org
460-
/// http.setHost("http://www.sfml-dev.org");
461+
/// // We'll work on https://www.sfml-dev.org
462+
/// http.setHost("https://www.sfml-dev.org");
461463
///
462-
/// // Prepare a request to get the 'features.php' page
463-
/// sf::Http::Request request("features.php");
464+
/// // Prepare a request to get the '/learn/' page
465+
/// sf::Http::Request request("/learn/");
464466
///
465467
/// // Send the request
466468
/// sf::Http::Response response = http.sendRequest(request);

0 commit comments

Comments
 (0)