Skip to content

Commit

Permalink
version 0.1
Browse files Browse the repository at this point in the history
  • Loading branch information
miximtor committed Apr 5, 2019
1 parent e36d18c commit 8ff1794
Show file tree
Hide file tree
Showing 17 changed files with 446 additions and 233 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "third_party/boost"]
path = third_party/boost
url = https://github.com/microcai/boost.git
12 changes: 10 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,20 @@ set(CMAKE_CXX_STANDARD 17)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_STATIC_RUNTIME ON)

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O3 -Wall")

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/modules)

find_package(Boost 1.69 COMPONENTS system coroutine)
if (NOT Boost_FOUND)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/third_party/boost)
endif()
find_package(Botan2 2.8.0 REQUIRED)

find_package(Boost REQUIRED)
add_definitions(-DBOOST_ASIO_NO_DEPRECATED)
add_definitions(-DBOOST_COROUTINES_NO_DEPRECATION_WARNING)
add_definitions(-DGLOG_NO_ABBREVIATED_SEVERITIES)

add_subdirectory(${PROJECT_SOURCE_DIR}/src)
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
# msocks
For scientific internet surfing

Dependencies:

```
Boost > 1.69
CryptoPP
glog
```

122 changes: 122 additions & 0 deletions modules/FindBotan2.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# Copyright (c) 2018 Ribose Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

#.rst:
# FindBotan2
# -----------
#
# Find the botan-2 library.
#
# IMPORTED Targets
# ^^^^^^^^^^^^^^^^
#
# This module defines :prop_tgt:`IMPORTED` targets:
#
# ``Botan2::Botan2``
# The botan-2 library, if found.
#
# Result variables
# ^^^^^^^^^^^^^^^^
#
# This module defines the following variables:
#
# ::
#
# BOTAN2_FOUND - true if the headers and library were found
# BOTAN2_INCLUDE_DIRS - where to find headers
# BOTAN2_LIBRARIES - list of libraries to link
# BOTAN2_VERSION - library version that was found, if any

# use pkg-config to get the directories and then use these values
# in the find_path() and find_library() calls
find_package(PkgConfig QUIET)
pkg_check_modules(PC_BOTAN2 QUIET botan-2)

# find the headers
find_path(BOTAN2_INCLUDE_DIR
NAMES botan/version.h
HINTS
${PC_BOTAN2_INCLUDEDIR}
${PC_BOTAN2_INCLUDE_DIRS}
PATH_SUFFIXES botan-2
)

# find the library
find_library(BOTAN2_LIBRARY
NAMES botan-2 libbotan-2
HINTS
${PC_BOTAN2_LIBDIR}
${PC_BOTAN2_LIBRARY_DIRS}
)

# determine the version
if(PC_BOTAN2_VERSION)
set(BOTAN2_VERSION ${PC_BOTAN2_VERSION})
elseif(BOTAN2_INCLUDE_DIR AND EXISTS "${BOTAN2_INCLUDE_DIR}/botan/build.h")
file(STRINGS "${BOTAN2_INCLUDE_DIR}/botan/build.h" botan2_version_str
REGEX "^#define[\t ]+(BOTAN_VERSION_[A-Z]+)[\t ]+[0-9]+")

string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MAJOR[\t ]+([0-9]+).*"
"\\1" _botan2_version_major "${botan2_version_str}")
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MINOR[\t ]+([0-9]+).*"
"\\1" _botan2_version_minor "${botan2_version_str}")
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_PATCH[\t ]+([0-9]+).*"
"\\1" _botan2_version_patch "${botan2_version_str}")
set(BOTAN2_VERSION "${_botan2_version_major}.${_botan2_version_minor}.${_botan2_version_patch}"
CACHE INTERNAL "The version of Botan which was detected")
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Botan2
REQUIRED_VARS BOTAN2_LIBRARY BOTAN2_INCLUDE_DIR
VERSION_VAR BOTAN2_VERSION
)

if (BOTAN2_FOUND)
set(BOTAN2_INCLUDE_DIRS ${BOTAN2_INCLUDE_DIR} ${PC_BOTAN2_INCLUDE_DIRS})
set(BOTAN2_LIBRARIES ${BOTAN2_LIBRARY})
endif()

if (BOTAN2_FOUND AND NOT TARGET Botan2::Botan2)
# create the new library target
add_library(Botan2::Botan2 UNKNOWN IMPORTED)
# set the required include dirs for the target
if (BOTAN2_INCLUDE_DIRS)
set_target_properties(Botan2::Botan2
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${BOTAN2_INCLUDE_DIRS}"
)
endif()
# set the required libraries for the target
if (EXISTS "${BOTAN2_LIBRARY}")
set_target_properties(Botan2::Botan2
PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION "${BOTAN2_LIBRARY}"
)
endif()
endif()

mark_as_advanced(BOTAN2_INCLUDE_DIR BOTAN2_LIBRARY)

10 changes: 8 additions & 2 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,21 @@ set(CONFIG_FILE

set(UTILITY_FILE
utility/socks_constants.hpp
utility/dup.hpp
)

include_directories(${PROJECT_SOURCE_DIR}/src/)
include_directories(${BOTAN2_INCLUDE_DIRS})

add_executable(${PROJECT_NAME}
main.cpp
${SESSION_FILE}
${UTILITY_FILE}
${ENDPOINT_FILE}
${CONFIG_FILE}
main.cpp
)
target_link_libraries(${PROJECT_NAME} glog boost_system-mt.dll cryptopp.dll boost_coroutine-mt.dll ws2_32 wsock32)
IF(WIN32)
target_link_libraries(${PROJECT_NAME} glog ${BOTAN2_LIBRARIES} boost_system-mt boost_coroutine-mt ws2_32 wsock32 )
ELSE(WIN32)
target_link_libraries(${PROJECT_NAME} glog ${BOTAN2_LIBRARIES} boost_system boost_coroutine pthread)
ENDIF(WIN32)
43 changes: 27 additions & 16 deletions src/endpoint/client.cpp
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
#include "client.hpp"
#include <boost/asio/spawn.hpp>
#include <usings.hpp>

#include <session/client_session.hpp>
#include <glog/logging.h>
#include <usings.hpp>

namespace msocks
{

client::client(
const ip::tcp::endpoint &listen,
const ip::tcp::endpoint &remote_,
const SecByteBlock &key_) :
const std::vector<uint8_t> &key_) :
strand(context),
acceptor(context, listen),
remote(remote_),
key(key_)
Expand All @@ -19,23 +20,33 @@ client::client(

void client::start()
{

acceptor.async_accept(
[this](auto ec, auto socket)
spawn(strand, [this](yield_context yield)
{
do_accept(yield);
});
context.run();
}

void client::do_accept(yield_context yield)
{
try
{
while ( true )
{
if ( ec ) return;
ip::tcp::socket local(context);
acceptor.async_accept(local, yield);
auto session = std::make_shared<client_session>(
std::move(socket),
strand,
std::move(local),
remote,
key);
spawn(
context,
[session](yield_context yield)
{
session->start(yield);
});
});
context.run();
session->go();
}
}
catch ( system_error &e )
{
LOG(ERROR) << "on client accept: " << e.what();
}
}

}
Expand Down
15 changes: 10 additions & 5 deletions src/endpoint/client.hpp
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
#pragma once

#include <boost/asio/ip/tcp.hpp>
#include <cryptopp/secblock.h>
#include <usings.hpp>

#include <boost/asio/strand.hpp>
#include <boost/asio/spawn.hpp>
namespace msocks
{

class client
class client : public noncopyable
{
public:
client(const ip::tcp::endpoint &listen,const ip::tcp::endpoint &remote_,const SecByteBlock & key_);
client(
const ip::tcp::endpoint &listen,
const ip::tcp::endpoint &remote_,
const std::vector<uint8_t> & key_);
void start();
private:
void do_accept(yield_context yield);
io_context context;
io_context::strand strand;
ip::tcp::acceptor acceptor;
const ip::tcp::endpoint &remote;
const SecByteBlock &key;
const std::vector<uint8_t> &key;
};

}
Expand Down
37 changes: 24 additions & 13 deletions src/endpoint/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,43 @@

#include <boost/asio/spawn.hpp>
#include <session/server_session.hpp>
#include <glog/logging.h>

#include <usings.hpp>

namespace msocks
{

server::server(const ip::tcp::endpoint &listen, const SecByteBlock &key_) :
server::server(
const ip::tcp::endpoint &listen,
const std::vector<uint8_t> &key_) :
strand(context),
acceptor(context, listen),
key(key_)
{
}

void server::start()
{
acceptor.async_accept(
[this](auto ec, auto socket)
{
if ( ec ) return;
auto session = std::make_shared<server_session>(std::move(socket), key);
spawn(
context,
[session](yield_context yield)
{
session->start(yield);
});
});
spawn(strand, [this](yield_context yield)
{
do_accept(yield);
});
context.run();
}

void server::do_accept(yield_context yield)
{
while ( true )
{
ip::tcp::socket local(context);
acceptor.async_accept(local, yield);
auto session = std::make_shared<server_session>(
strand,
std::move(local),
key
);
session->go();
}
}
}
15 changes: 7 additions & 8 deletions src/endpoint/server.hpp
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
#pragma once

#include <boost/asio/ip/tcp.hpp>
#include <cryptopp/secblock.h>
#include <usings.hpp>

#include <boost/asio/strand.hpp>
#include <boost/asio/spawn.hpp>
namespace msocks
{
class server :
public noncopyable
class server : public noncopyable
{
public:
server(const ip::tcp::endpoint &listen,const SecByteBlock & key_);
server(const ip::tcp::endpoint &listen,const std::vector<uint8_t> & key_);
void start();

private:
void do_accept(yield_context yield);
io_context context;
io_context::strand strand;
ip::tcp::acceptor acceptor;
const SecByteBlock &key;
const std::vector<uint8_t> &key;
};

}


Loading

0 comments on commit 8ff1794

Please sign in to comment.