Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions .github/workflows/cmake-multi-platform.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: CMake on multiple platforms

on:
push:
branches: [ "master" ]
pull_request:
types: [ "opened", "reopened", "synchronize", "ready_for_review" ]

jobs:
build:
runs-on: ${{ matrix.os }}

strategy:
fail-fast: false # ensure we don't stop after 1 failure to always have a complete picture of what is failing

# Set up a matrix to run the following configurations:
# - ubuntu Debug/Release clang/gcc
# - windows Debug/Release cl
# - macos Debug/Release clang
matrix:
os: [ubuntu-latest, macos-latest] # , windows-latest
build_type: [Release, Debug]
c_compiler: [gcc, clang, cl]
include:
# - os: windows-latest
# c_compiler: cl
# cpp_compiler: cl
- os: ubuntu-latest
c_compiler: gcc
cpp_compiler: g++
- os: ubuntu-latest
c_compiler: clang
cpp_compiler: clang++
- os: macos-latest
c_compiler: clang
cpp_compiler: clang++
exclude:
- os: windows-latest
c_compiler: gcc
- os: windows-latest
c_compiler: clang
- os: ubuntu-latest
c_compiler: cl
- os: macos-latest
c_compiler: cl
- os: macos-latest
c_compiler: gcc

steps:
- uses: actions/checkout@v3

- name: Set reusable strings
# Turn repeated input strings (such as the build output directory) into step outputs. These step outputs can be used throughout the workflow file.
id: strings
shell: bash
run: |
echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT"

- name: Cache VCPKG (Windows)
if: runner.os == 'Windows'
uses: actions/cache@v3
with:
path: ${{ env.VCPKG_ROOT }}
key: ${{ runner.os }}-${{ matrix.build_type }}-${{ hashFiles('vcpkg.json') }}

- name: Install OpenSSL (Windows)
if: runner.os == 'Windows'
shell: powershell
run: |
echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append
echo "CMAKE_TOOLCHAIN_FILE=${env:VCPKG_INSTALLATION_ROOT}\scripts\buildsystems\vcpkg.cmake" | Out-File -FilePath $env:GITHUB_ENV -Append
vcpkg install

- name: Configure CMake
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
run: >
cmake -B ${{ steps.strings.outputs.build-output-dir }}
-DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }}
-DCMAKE_C_COMPILER=${{ matrix.c_compiler }}
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
-S ${{ github.workspace }}

- name: Build
# Build your program with the given configuration. Note that --config is needed because the default Windows generator is a multi-config generator (Visual Studio generator).
run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }}

# - name: Test
# working-directory: ${{ steps.strings.outputs.build-output-dir }}
# # Execute tests defined by the CMake configuration. Note that --build-config is needed because the default Windows generator is a multi-config generator (Visual Studio generator).
# # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
# run: ctest --build-config ${{ matrix.build_type }}
125 changes: 125 additions & 0 deletions .github/workflows/code_scanning.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
name: "Code Scanning"

on:
push:
branches: [ "master" ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ "master" ]
schedule:
- cron: '20 3 * * 0'

jobs:
codeql:
name: CodeQL
# Runner size impacts CodeQL analysis time. To learn more, please see:
# - https://gh.io/recommended-hardware-resources-for-running-codeql
# - https://gh.io/supported-runners-and-hardware-resources
# - https://gh.io/using-larger-runners
# Consider using larger runners for possible analysis time improvements.
runs-on: ubuntu-latest
timeout-minutes: 360
permissions:
actions: read
contents: read
security-events: write

steps:
- name: Checkout repository
uses: actions/checkout@v3

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: 'c-cpp'
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.

# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality


# Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2

# ℹ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun

# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.

# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:c-cpp"

flawfinder:
name: Flawfinder
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: flawfinder_scan
uses: david-a-wheeler/flawfinder@8e4a779ad59dbfaee5da586aa9210853b701959c
with:
arguments: '--sarif ./'
output: 'flawfinder_results.sarif'

- name: Upload analysis results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: ${{github.workspace}}/flawfinder_results.sarif

# microsoft-analyze:
# permissions:
# contents: read # for actions/checkout to fetch code
# security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
# actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status
# name: Microsoft Analyze
# runs-on: windows-latest

# steps:
# - name: Checkout repository
# uses: actions/checkout@v3

# - name: Configure CMake
# run: cmake -B ./build

# # Build is not required unless generated source files are used
# # - name: Build CMake
# # run: cmake --build ./build

# - name: Initialize MSVC Code Analysis
# uses: microsoft/msvc-code-analysis-action@04825f6d9e00f87422d6bf04e1a38b1f3ed60d99
# # Provide a unique ID to access the sarif output path
# id: run-analysis
# with:
# cmakeBuildDirectory: ${{ env.build }}
# # Ruleset file that will determine what checks will be run
# ruleset: NativeRecommendedRules.ruleset

# # Upload SARIF file to GitHub Code Scanning Alerts
# - name: Upload SARIF to GitHub
# uses: github/codeql-action/upload-sarif@v2
# with:
# sarif_file: ${{ steps.run-analysis.outputs.sarif }}

# # Upload SARIF file as an Artifact to download and view
# # - name: Upload SARIF as an Artifact
# # uses: actions/upload-artifact@v3
# # with:
# # name: sarif-file
# # path: ${{ steps.run-analysis.outputs.sarif }}
12 changes: 8 additions & 4 deletions source/IPv4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
** Author Francois Michaut
**
** Started on Sun Feb 13 18:52:28 2022 Francois Michaut
** Last update Thu Jul 20 23:08:49 2023 Francois Michaut
** Last update Sat Dec 2 16:17:43 2023 Francois Michaut
**
** IPv4.cpp : Implementation of IPv4 class
*/
Expand All @@ -14,13 +14,17 @@

#include <stdexcept>

#include <arpa/inet.h>
#ifdef OS_WINDOWS
#include <ws2tcpip.h>
#else
#include <arpa/inet.h>
#endif

namespace CppSockets {
IPv4::IPv4(std::uint32_t addr) :
addr(htonl(addr))
{
struct in_addr tmp {this->addr};
struct in_addr tmp {.s_addr = this->addr};

str = inet_ntoa(tmp);
}
Expand All @@ -30,7 +34,7 @@ namespace CppSockets {
{
struct in_addr in;

if (inet_aton(addr, &in) == 0)
if (inet_pton(AF_INET, addr, &in) != 1)
throw std::runtime_error("Invalid IPv4 address");
this->addr = in.s_addr;
}
Expand Down
18 changes: 10 additions & 8 deletions source/Socket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
** Author Francois Michaut
**
** Started on Sat Jan 15 01:27:40 2022 Francois Michaut
** Last update Thu Nov 23 23:13:35 2023 Francois Michaut
** Last update Sat Dec 2 17:11:28 2023 Francois Michaut
**
** Socket.cpp : Protable C++ socket class implementation
*/
Expand All @@ -15,10 +15,14 @@

#ifdef OS_WINDOWS
#include <ws2tcpip.h>
#include <io.h>
#else
#include <fcntl.h>
#include <netinet/in.h>
// To match windows's constants
#include <arpa/inet.h>
#include <unistd.h>

// To match windows's constants
static constexpr int INVALID_SOCKET = -1;
static constexpr int SOCKET_ERROR = -1;
#endif
Expand All @@ -31,8 +35,6 @@ static constexpr int BUFF_SIZE = 4096;
#include <sstream>
#include <stdexcept>

#include <arpa/inet.h>
#include <unistd.h>

// TODO add exceptions on error retunrs
// TODO throw custom exceptions on invalid status (eg: socket already connected)
Expand All @@ -43,7 +45,7 @@ namespace CppSockets {
socklen_t len = sizeof(int);

Socket::getsockopt(sockfd, SOL_SOCKET, SO_TYPE, &m_type, &len);
#ifndef OS_APPLE
#if !defined (OS_APPLE) && !defined (OS_WINDOWS)
Socket::getsockopt(sockfd, SOL_SOCKET, SO_DOMAIN, &m_domain, &len);
Socket::getsockopt(sockfd, SOL_SOCKET, SO_PROTOCOL, &m_protocol, &len);
#endif
Expand Down Expand Up @@ -82,7 +84,7 @@ namespace CppSockets {
void Socket::close() {
if (m_sockfd != INVALID_SOCKET) {
#ifdef OS_WINDOWS
closesocket(raw_socket);
closesocket(m_sockfd);
#else
::close(m_sockfd);
#endif
Expand Down Expand Up @@ -193,12 +195,12 @@ namespace CppSockets {
return this->bind(endpoint.getAddr().getAddress(), endpoint.getPort());
}

int Socket::bind(std::uint32_t s_addr, uint16_t port) {
int Socket::bind(std::uint32_t source_addr, uint16_t port) {
struct sockaddr_in addr = {};
int ret = 0;

addr.sin_family = m_domain;
addr.sin_addr.s_addr = s_addr;
addr.sin_addr.s_addr = source_addr;
addr.sin_port = htons(port);
ret = ::bind(m_sockfd, (struct sockaddr *)&addr, sizeof(addr));
if (ret < 0) {
Expand Down
3 changes: 2 additions & 1 deletion source/TlsSocket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
** Author Francois Michaut
**
** Started on Wed Sep 14 21:04:42 2022 Francois Michaut
** Last update Tue Nov 14 21:15:11 2023 Francois Michaut
** Last update Sat Dec 2 11:33:00 2023 Francois Michaut
**
** SecureSocket.cpp : TLS socket wrapper implementation
*/
Expand All @@ -19,6 +19,7 @@
#include <openssl/err.h>
#include <openssl/ssl.h>

#include <array>
#include <sstream>
#include <stdexcept>

Expand Down
6 changes: 6 additions & 0 deletions vcpkg.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
"dependencies": [
"openssl"
]
}