Fixed compilation for windows and hide task executor impl details
This commit is contained in:
parent
444dea13c5
commit
f4aaec6481
@ -1,5 +1,4 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <misc/base64.h>
|
|
||||||
#include "misc/endianness.h"
|
#include "misc/endianness.h"
|
||||||
#include <misc/digest.h>
|
#include <misc/digest.h>
|
||||||
#define FIXEDINT_H_INCLUDED
|
#define FIXEDINT_H_INCLUDED
|
||||||
@ -68,7 +67,7 @@ LicensePublicKey license::teamspeak::Anonymous::root_key = {
|
|||||||
};
|
};
|
||||||
size_t license::teamspeak::Anonymous::root_index = 1;
|
size_t license::teamspeak::Anonymous::root_index = 1;
|
||||||
|
|
||||||
shared_ptr<LicenseChain> license::teamspeak::Anonymous::chain = []() -> shared_ptr<LicenseChain> {
|
std::shared_ptr<LicenseChain> default_anonymous_chain() {
|
||||||
string error;
|
string error;
|
||||||
auto str = istringstream(string((const char*) default_chain, sizeof(default_chain)));
|
auto str = istringstream(string((const char*) default_chain, sizeof(default_chain)));
|
||||||
auto chain = LicenseChain::parse(str, error);
|
auto chain = LicenseChain::parse(str, error);
|
||||||
@ -78,7 +77,9 @@ shared_ptr<LicenseChain> license::teamspeak::Anonymous::chain = []() -> shared_p
|
|||||||
}
|
}
|
||||||
|
|
||||||
return chain;
|
return chain;
|
||||||
}();
|
}
|
||||||
|
|
||||||
|
shared_ptr<LicenseChain> license::teamspeak::Anonymous::chain{default_anonymous_chain()};
|
||||||
|
|
||||||
#define IOERROR(message) \
|
#define IOERROR(message) \
|
||||||
do {\
|
do {\
|
||||||
@ -326,9 +327,9 @@ inline string importHash(const std::string& hash) {
|
|||||||
memset(buffer, 0, 64);
|
memset(buffer, 0, 64);
|
||||||
|
|
||||||
memcpy(buffer, (void*) hash.data(), 32);
|
memcpy(buffer, (void*) hash.data(), 32);
|
||||||
buffer[0] &= 0xF8;
|
buffer[0] &= (uint8_t) 0xF8;
|
||||||
buffer[31] &= 0x3F;
|
buffer[31] &= (uint8_t) 0x3F;
|
||||||
buffer[31] |= 0x40;
|
buffer[31] |= (uint8_t) 0x40;
|
||||||
sc_reduce(buffer);
|
sc_reduce(buffer);
|
||||||
return string((char*) buffer, 32);
|
return string((char*) buffer, 32);
|
||||||
}
|
}
|
||||||
|
@ -1005,12 +1005,12 @@ namespace ts {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class F>
|
template<class F>
|
||||||
inline std::result_of_t<F(PropertyManager &)> operator->*(F &&f) {
|
inline std::invoke_result<F(PropertyManager &)> operator->*(F &&f) {
|
||||||
return std::forward<F>(f)(*handle);
|
return std::forward<F>(f)(*handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class F>
|
template<class F>
|
||||||
inline std::result_of_t<F(PropertyManager const &)> operator->*(F &&f) const {
|
inline std::invoke_result<F(PropertyManager const &)> operator->*(F &&f) const {
|
||||||
return std::forward<F>(f)(*handle);
|
return std::forward<F>(f)(*handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ std::string base64::decode(const char* input, size_t size) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string base64::encode(const char* input, const unsigned long inputSize) {
|
std::string base64::encode(const char* input, size_t inputSize) {
|
||||||
auto outlen = static_cast<unsigned long>(inputSize + (inputSize / 3.0) + 16);
|
auto outlen = static_cast<unsigned long>(inputSize + (inputSize / 3.0) + 16);
|
||||||
auto outbuf = new unsigned char[outlen]; //Reserve output memory
|
auto outbuf = new unsigned char[outlen]; //Reserve output memory
|
||||||
if(base64_encode((unsigned char*) input, inputSize, outbuf, &outlen) != CRYPT_OK){
|
if(base64_encode((unsigned char*) input, inputSize, outbuf, &outlen) != CRYPT_OK){
|
||||||
|
@ -10,14 +10,14 @@ namespace base64 {
|
|||||||
* @param inputSize The size of the input to decode
|
* @param inputSize The size of the input to decode
|
||||||
* @return A Base64-encoded version of the encoded string
|
* @return A Base64-encoded version of the encoded string
|
||||||
*/
|
*/
|
||||||
extern std::string encode(const char* input, const unsigned long inputSize);
|
extern std::string encode(const char* input, size_t inputSize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes a given string in Base64
|
* Encodes a given string in Base64
|
||||||
* @param input The input string to Base64-encode
|
* @param input The input string to Base64-encode
|
||||||
* @return A Base64-encoded version of the encoded string
|
* @return A Base64-encoded version of the encoded string
|
||||||
*/
|
*/
|
||||||
inline std::string encode(const std::string& input) { return encode(input.data(), (unsigned long) input.size()); }
|
inline std::string encode(const std::string& input) { return encode(input.data(), input.size()); }
|
||||||
inline std::string encode(const std::string_view& input) { return encode(input.data(), input.size()); }
|
inline std::string encode(const std::string_view& input) { return encode(input.data(), input.size()); }
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,14 +4,75 @@
|
|||||||
|
|
||||||
#include "./task_executor.h"
|
#include "./task_executor.h"
|
||||||
#include "./threads.h"
|
#include "./threads.h"
|
||||||
|
#include <thread>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <future>
|
#include <optional>
|
||||||
|
#include <condition_variable>
|
||||||
|
|
||||||
using std::chrono::system_clock;
|
using std::chrono::system_clock;
|
||||||
using namespace ts;
|
using namespace ts;
|
||||||
|
|
||||||
|
struct task_executor::task {
|
||||||
|
task_id id{0};
|
||||||
|
std::string name{};
|
||||||
|
std::function<void()> callback{};
|
||||||
|
|
||||||
|
/* will be set to true if the task has been canceled but is executing right now */
|
||||||
|
bool canceled{false};
|
||||||
|
std::optional<std::promise<void>> finish_callback{};
|
||||||
|
|
||||||
|
task* next{nullptr};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct task_executor::task_recurring {
|
||||||
|
task_id id{0};
|
||||||
|
std::string name{};
|
||||||
|
|
||||||
|
bool shutdown{false};
|
||||||
|
std::optional<std::promise<void>> finish_callback{};
|
||||||
|
|
||||||
|
std::chrono::nanoseconds interval{};
|
||||||
|
std::chrono::system_clock::time_point last_invoked{};
|
||||||
|
std::chrono::system_clock::time_point scheduled_invoke{};
|
||||||
|
|
||||||
|
std::function<void(const std::chrono::system_clock::time_point& /* last executed */)> callback{};
|
||||||
|
|
||||||
|
task_recurring* next{nullptr};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct task_executor::task_context {
|
||||||
|
std::mutex mutex{};
|
||||||
|
std::condition_variable notify{};
|
||||||
|
|
||||||
|
bool shutdown{false};
|
||||||
|
task_id id_index{1};
|
||||||
|
|
||||||
|
size_t task_count{};
|
||||||
|
task* task_head{nullptr};
|
||||||
|
task** task_tail{&this->task_head};
|
||||||
|
|
||||||
|
size_t task_recurring_count{};
|
||||||
|
task_recurring* task_recurring_head{nullptr};
|
||||||
|
|
||||||
|
task_exception_handler exception_handler{task_executor::abort_exception_handler};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct task_executor::executor_context {
|
||||||
|
task_executor* handle{nullptr};
|
||||||
|
std::thread thread_handle{};
|
||||||
|
|
||||||
|
std::shared_ptr<struct task_context> task_context{};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Must be accessed while holding the task_context.mutex and shall never be changed except for the executor.
|
||||||
|
* Lifetime will be granted while holding the lock.
|
||||||
|
*/
|
||||||
|
task* executing_task{nullptr};
|
||||||
|
task_recurring* executing_recurring_task{nullptr};
|
||||||
|
};
|
||||||
|
|
||||||
task_executor::task_executor(size_t num_threads, const std::string &thread_prefix) {
|
task_executor::task_executor(size_t num_threads, const std::string &thread_prefix) {
|
||||||
this->task_context = std::make_shared<struct task_context>();
|
this->task_context = std::make_shared<struct task_context>();
|
||||||
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <thread>
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <condition_variable>
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
@ -54,64 +52,10 @@ namespace ts {
|
|||||||
std::chrono::nanoseconds /* interval */,
|
std::chrono::nanoseconds /* interval */,
|
||||||
std::function<void(const std::chrono::system_clock::time_point& /* last scheduled */)> /* callback */);
|
std::function<void(const std::chrono::system_clock::time_point& /* last scheduled */)> /* callback */);
|
||||||
private:
|
private:
|
||||||
struct task {
|
struct task;
|
||||||
task_id id{0};
|
struct task_recurring;
|
||||||
std::string name{};
|
struct task_context;
|
||||||
std::function<void()> callback{};
|
struct executor_context;
|
||||||
|
|
||||||
/* will be set to true if the task has been canceled but is executing right now */
|
|
||||||
bool canceled{false};
|
|
||||||
std::optional<std::promise<void>> finish_callback{};
|
|
||||||
|
|
||||||
task* next{nullptr};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct task_recurring {
|
|
||||||
task_id id{0};
|
|
||||||
std::string name{};
|
|
||||||
|
|
||||||
bool shutdown{false};
|
|
||||||
std::optional<std::promise<void>> finish_callback{};
|
|
||||||
|
|
||||||
std::chrono::nanoseconds interval{};
|
|
||||||
std::chrono::system_clock::time_point last_invoked{};
|
|
||||||
std::chrono::system_clock::time_point scheduled_invoke{};
|
|
||||||
|
|
||||||
std::function<void(const std::chrono::system_clock::time_point& /* last executed */)> callback{};
|
|
||||||
|
|
||||||
task_recurring* next{nullptr};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct task_context {
|
|
||||||
std::mutex mutex{};
|
|
||||||
std::condition_variable notify{};
|
|
||||||
|
|
||||||
bool shutdown{false};
|
|
||||||
task_id id_index{1};
|
|
||||||
|
|
||||||
size_t task_count{};
|
|
||||||
task* task_head{nullptr};
|
|
||||||
task** task_tail{&this->task_head};
|
|
||||||
|
|
||||||
size_t task_recurring_count{};
|
|
||||||
task_recurring* task_recurring_head{nullptr};
|
|
||||||
|
|
||||||
task_exception_handler exception_handler{task_executor::abort_exception_handler};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct executor_context {
|
|
||||||
task_executor* handle;
|
|
||||||
std::thread thread_handle{};
|
|
||||||
|
|
||||||
std::shared_ptr<struct task_context> task_context{};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Must be accessed while holding the task_context.mutex and shall never be changed except for the executor.
|
|
||||||
* Lifetime will be granted while holding the lock.
|
|
||||||
*/
|
|
||||||
task* executing_task{nullptr};
|
|
||||||
task_recurring* executing_recurring_task{nullptr};
|
|
||||||
};
|
|
||||||
|
|
||||||
enum struct task_cancel_result {
|
enum struct task_cancel_result {
|
||||||
not_found,
|
not_found,
|
||||||
|
@ -198,13 +198,13 @@ bool CryptHandler::generate_key_nonce(
|
|||||||
|
|
||||||
le2be32(generation, buffer, 2);
|
le2be32(generation, buffer, 2);
|
||||||
memcpy(&buffer[6], this->iv_struct, this->iv_struct_length);
|
memcpy(&buffer[6], this->iv_struct, this->iv_struct_length);
|
||||||
digest::sha256(buffer, buffer_length, key_cache.key_nonce);
|
digest::sha256(buffer, buffer_length, key_cache.key_nonce.value);
|
||||||
|
|
||||||
key_cache.generation = generation;
|
key_cache.generation = generation;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(key.data(), key_cache.key, 16);
|
memcpy(key.data(), key_cache.key_nonce.key, 16);
|
||||||
memcpy(nonce.data(), key_cache.nonce, 16);
|
memcpy(nonce.data(), key_cache.key_nonce.nonce, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Xor the key
|
//Xor the key
|
||||||
|
@ -53,13 +53,13 @@ namespace ts::connection {
|
|||||||
|
|
||||||
struct KeyCache {
|
struct KeyCache {
|
||||||
uint16_t generation = 0xFFEF;
|
uint16_t generation = 0xFFEF;
|
||||||
union {
|
union _key_nonce {
|
||||||
struct {
|
struct {
|
||||||
uint8_t key[16];
|
uint8_t key[16];
|
||||||
uint8_t nonce[16];
|
uint8_t nonce[16];
|
||||||
};
|
};
|
||||||
uint8_t key_nonce[32];
|
uint8_t value[32];
|
||||||
};
|
} key_nonce;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool encryption_initialized_{false};
|
bool encryption_initialized_{false};
|
||||||
@ -72,8 +72,8 @@ namespace ts::connection {
|
|||||||
uint8_t current_mac[8]{};
|
uint8_t current_mac[8]{};
|
||||||
|
|
||||||
std::mutex cache_key_lock{};
|
std::mutex cache_key_lock{};
|
||||||
std::array<KeyCache, protocol::PACKET_MAX> cache_key_client{};
|
std::array<KeyCache, /* protocol::PACKET_MAX */ 0x08> cache_key_client{};
|
||||||
std::array<KeyCache, protocol::PACKET_MAX> cache_key_server{};
|
std::array<KeyCache, /* protocol::PACKET_MAX */ 0x08> cache_key_server{};
|
||||||
|
|
||||||
static_assert(sizeof(current_mac) == sizeof(default_mac), "invalid mac");
|
static_assert(sizeof(current_mac) == sizeof(default_mac), "invalid mac");
|
||||||
static_assert(sizeof(iv_struct) == 64, "invalid iv struct");
|
static_assert(sizeof(iv_struct) == 64, "invalid iv struct");
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <list>
|
#include <list>
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <optional>
|
||||||
#include <pipes/buffer.h>
|
#include <pipes/buffer.h>
|
||||||
#include "../Variable.h"
|
#include "../Variable.h"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user