mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2025-07-06 15:54:57 +03:00
Compare commits
25 Commits
Author | SHA1 | Date | |
---|---|---|---|
56bb573b17 | |||
e3f0837bd1 | |||
c1370987bf | |||
79d1ade09d | |||
a3f984e521 | |||
43a80702a9 | |||
682052e0dc | |||
ad139a7cbb | |||
64f1e349f8 | |||
214992c232 | |||
82b4b083b3 | |||
f18837b491 | |||
28c90b190c | |||
5f76dbcfa2 | |||
b4817fd27a | |||
89ca29f259 | |||
7a208d6114 | |||
5b910322a7 | |||
2262b8a160 | |||
2923b5500a | |||
7acd52d724 | |||
8c12e79448 | |||
dc8d705854 | |||
81c71d309a | |||
e0182ca3d9 |
39
.github/workflows/build_source_release.yml
vendored
Normal file
39
.github/workflows/build_source_release.yml
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
name: Build Source Release
|
||||
|
||||
# Trigger whenever a release is created
|
||||
on:
|
||||
release:
|
||||
types:
|
||||
- created
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: archive
|
||||
id: archive
|
||||
run: |
|
||||
VERSION=${{ github.event.release.tag_name }}
|
||||
PKGNAME="SoftEtherVPN-$VERSION"
|
||||
mkdir -p /tmp/$PKGNAME
|
||||
mv * /tmp/$PKGNAME
|
||||
mv /tmp/$PKGNAME .
|
||||
TARBALL=$PKGNAME.tar.xz
|
||||
tar cJf $TARBALL $PKGNAME
|
||||
echo "::set-output name=tarball::$TARBALL"
|
||||
|
||||
- name: upload tarball
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./${{ steps.archive.outputs.tarball }}
|
||||
asset_name: ${{ steps.archive.outputs.tarball }}
|
||||
asset_content_type: application/gzip
|
2
.github/workflows/coverity.yml
vendored
2
.github/workflows/coverity.yml
vendored
@ -22,7 +22,7 @@ jobs:
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y cmake gcc g++ libncurses5-dev libreadline-dev libssl-dev make zlib1g-dev
|
||||
sudo apt-get install -y cmake gcc g++ libncurses5-dev libreadline-dev libssl-dev make zlib1g-dev libsodium-dev
|
||||
- name: Run Coverity Scan
|
||||
env:
|
||||
COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
|
||||
|
@ -3,7 +3,14 @@ cmake_minimum_required(VERSION 3.10)
|
||||
set(BUILD_NUMBER CACHE STRING "The number of the current build.")
|
||||
|
||||
if ("${BUILD_NUMBER}" STREQUAL "")
|
||||
set(BUILD_NUMBER "0")
|
||||
set(BUILD_NUMBER "5180")
|
||||
endif()
|
||||
|
||||
if (BUILD_NUMBER LESS 5180)
|
||||
message(WARNING
|
||||
"Setting BUILD_NUMBER to a value less than 5180 will break compatibility with client binaries distributed by SoftEther Corporation. "
|
||||
"Set to a value greater than or equal to 5180 if you want such clients to work properly.\n"
|
||||
"For detailed info: https://github.com/SoftEtherVPN/SoftEtherVPN/issues/1392#issuecomment-867348281")
|
||||
endif()
|
||||
|
||||
project("SoftEther VPN"
|
||||
|
@ -257,7 +257,8 @@ void PPPThread(THREAD *thread, void *param)
|
||||
case PPP_EAP_TYPE_TLS:
|
||||
// Sending TLS Start...
|
||||
flags |= PPP_EAP_TLS_FLAG_SSLSTARTED;
|
||||
lcpEap = BuildEAPTlsRequest(p->Eap_PacketId++, 0, flags);
|
||||
p->Eap_PacketId = p->NextId++;
|
||||
lcpEap = BuildEAPTlsRequest(p->Eap_PacketId, 0, flags);
|
||||
PPPSetStatus(p, PPP_STATUS_AUTHENTICATING);
|
||||
if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcpEap))
|
||||
{
|
||||
@ -269,7 +270,8 @@ void PPPThread(THREAD *thread, void *param)
|
||||
case PPP_EAP_TYPE_IDENTITY:
|
||||
default: // We treat the unspecified protocol as the IDENTITY protocol
|
||||
p->Eap_Protocol = PPP_EAP_TYPE_IDENTITY;
|
||||
lcpEap = BuildEAPPacketEx(PPP_EAP_CODE_REQUEST, p->Eap_PacketId++, PPP_EAP_TYPE_IDENTITY, StrLen(welcomeMessage) + 1);
|
||||
p->Eap_PacketId = p->NextId++;
|
||||
lcpEap = BuildEAPPacketEx(PPP_EAP_CODE_REQUEST, p->Eap_PacketId, PPP_EAP_TYPE_IDENTITY, StrLen(welcomeMessage) + 1);
|
||||
eapPacket = lcpEap->Data;
|
||||
Copy(eapPacket->Data, welcomeMessage, StrLen(welcomeMessage));
|
||||
PPPSetStatus(p, PPP_STATUS_AUTHENTICATING);
|
||||
@ -1251,7 +1253,8 @@ bool PPPProcessEAPResponsePacket(PPP_SESSION *p, PPP_PACKET *pp, PPP_PACKET *req
|
||||
eap = req->Lcp->Data;
|
||||
if (eap->Type == PPP_EAP_TYPE_TLS)
|
||||
{
|
||||
PPP_LCP *lcp = BuildEAPTlsRequest(p->Eap_PacketId++, 0, PPP_EAP_TLS_FLAG_NONE);
|
||||
p->Eap_PacketId = p->NextId++;
|
||||
PPP_LCP *lcp = BuildEAPTlsRequest(p->Eap_PacketId, 0, PPP_EAP_TLS_FLAG_NONE);
|
||||
if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp))
|
||||
{
|
||||
PPPSetStatus(p, PPP_STATUS_FAIL);
|
||||
@ -3218,7 +3221,8 @@ bool PPPProcessEAPTlsResponse(PPP_SESSION *p, PPP_EAP *eap_packet, UINT eapTlsSi
|
||||
dataSize = sizeLeft;
|
||||
flags = PPP_EAP_TLS_FLAG_NONE; // Clearing the M flag because it is the last packet
|
||||
}
|
||||
lcp = BuildEAPTlsRequest(p->Eap_PacketId++, dataSize, flags);
|
||||
p->Eap_PacketId = p->NextId++;
|
||||
lcp = BuildEAPTlsRequest(p->Eap_PacketId, dataSize, flags);
|
||||
eap = lcp->Data;
|
||||
Copy(eap->Tls.TlsDataWithoutLength, p->Eap_TlsCtx.CachedBufferSendPntr, dataSize);
|
||||
p->Eap_TlsCtx.CachedBufferSendPntr += (UINT64)dataSize;
|
||||
@ -3252,7 +3256,8 @@ bool PPPProcessEAPTlsResponse(PPP_SESSION *p, PPP_EAP *eap_packet, UINT eapTlsSi
|
||||
/*if (!p->Eap_TlsCtx.SslPipe->IsDisconnected)
|
||||
{
|
||||
dataSize = FifoSize(p->Eap_TlsCtx.SslPipe->RawOut->RecvFifo);
|
||||
lcp = BuildEAPTlsRequest(p->Eap_PacketId++, dataSize, 0);
|
||||
p->Eap_PacketId = p->NextId++;
|
||||
lcp = BuildEAPTlsRequest(p->Eap_PacketId, dataSize, 0);
|
||||
eap = lcp->Data;
|
||||
ReadFifo(p->Eap_TlsCtx.SslPipe->RawOut->RecvFifo, &(eap->Tls.TlsDataWithoutLength), dataSize);
|
||||
if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp))
|
||||
@ -3275,7 +3280,7 @@ bool PPPProcessEAPTlsResponse(PPP_SESSION *p, PPP_EAP *eap_packet, UINT eapTlsSi
|
||||
if (ipc != NULL)
|
||||
{
|
||||
PPP_PACKET *pack;
|
||||
UINT identificator = p->Eap_PacketId - 1; // THIS IS A HACK TO SUPPORT VPN Client Pro on Android!!!
|
||||
UINT identificator = p->Eap_PacketId;
|
||||
|
||||
p->Ipc = ipc;
|
||||
PPPSetStatus(p, PPP_STATUS_AUTH_SUCCESS);
|
||||
@ -3298,7 +3303,7 @@ bool PPPProcessEAPTlsResponse(PPP_SESSION *p, PPP_EAP *eap_packet, UINT eapTlsSi
|
||||
else
|
||||
{
|
||||
PPP_PACKET *pack;
|
||||
UINT identificator = p->Eap_PacketId - 1; // THIS IS A HACK TO SUPPORT VPN Client Pro on Android!!!
|
||||
UINT identificator = p->Eap_PacketId;
|
||||
|
||||
PPPSetStatus(p, PPP_STATUS_AUTH_FAIL);
|
||||
|
||||
@ -3321,7 +3326,8 @@ bool PPPProcessEAPTlsResponse(PPP_SESSION *p, PPP_EAP *eap_packet, UINT eapTlsSi
|
||||
{
|
||||
// Some clients needs a little help it seems - namely VPN Client Pro on Android
|
||||
flags |= PPP_EAP_TLS_FLAG_SSLSTARTED;
|
||||
lcp = BuildEAPTlsRequest(p->Eap_PacketId++, 0, flags);
|
||||
p->Eap_PacketId = p->NextId++;
|
||||
lcp = BuildEAPTlsRequest(p->Eap_PacketId, 0, flags);
|
||||
PPPSetStatus(p, PPP_STATUS_AUTHENTICATING);
|
||||
if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp))
|
||||
{
|
||||
@ -3399,7 +3405,8 @@ bool PPPProcessEAPTlsResponse(PPP_SESSION *p, PPP_EAP *eap_packet, UINT eapTlsSi
|
||||
// Just acknoweldge that we buffered the fragmented data
|
||||
if (isFragmented)
|
||||
{
|
||||
PPP_LCP *lcp = BuildEAPPacketEx(PPP_EAP_CODE_REQUEST, p->Eap_PacketId++, PPP_EAP_TYPE_TLS, 0);
|
||||
p->Eap_PacketId = p->NextId++;
|
||||
PPP_LCP *lcp = BuildEAPTlsRequest(p->Eap_PacketId, 0, PPP_EAP_TLS_FLAG_NONE);
|
||||
if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp))
|
||||
{
|
||||
PPPSetStatus(p, PPP_STATUS_FAIL);
|
||||
@ -3445,7 +3452,8 @@ bool PPPProcessEAPTlsResponse(PPP_SESSION *p, PPP_EAP *eap_packet, UINT eapTlsSi
|
||||
dataSize = p->Mru1 - 8 - 1 - 1 - 4; // Calculating the maximum payload size (adjusting for including TlsLength)
|
||||
flags = PPP_EAP_TLS_FLAG_TLS_LENGTH; // L flag
|
||||
flags |= PPP_EAP_TLS_FLAG_FRAGMENTED; // M flag
|
||||
lcp = BuildEAPTlsRequest(p->Eap_PacketId++, dataSize, flags);
|
||||
p->Eap_PacketId = p->NextId++;
|
||||
lcp = BuildEAPTlsRequest(p->Eap_PacketId, dataSize, flags);
|
||||
eap = lcp->Data;
|
||||
eap->Tls.TlsDataWithLength.TlsLength = Endian32(tlsLength);
|
||||
Copy(eap->Tls.TlsDataWithLength.Data, p->Eap_TlsCtx.CachedBufferSend, dataSize);
|
||||
@ -3460,7 +3468,8 @@ bool PPPProcessEAPTlsResponse(PPP_SESSION *p, PPP_EAP *eap_packet, UINT eapTlsSi
|
||||
}
|
||||
else
|
||||
{
|
||||
lcp = BuildEAPTlsRequest(p->Eap_PacketId++, dataSize, 0);
|
||||
p->Eap_PacketId = p->NextId++;
|
||||
lcp = BuildEAPTlsRequest(p->Eap_PacketId, dataSize, 0);
|
||||
eap = lcp->Data;
|
||||
ReadFifo(p->Eap_TlsCtx.SslPipe->RawOut->RecvFifo, &(eap->Tls.TlsDataWithoutLength), dataSize);
|
||||
if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp))
|
||||
|
@ -6011,7 +6011,7 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
|
||||
|
||||
if (server->DisableJsonRpcWebApi == false)
|
||||
{
|
||||
b = ReadDump("|wwwroot\\index.html");
|
||||
b = ReadDump("|wwwroot/index.html");
|
||||
}
|
||||
|
||||
if (b != NULL)
|
||||
|
@ -64,9 +64,4 @@
|
||||
|
||||
#define GC_UI_APPID_CM L"SoftEther.SoftEther VPN Client Developer Edition"
|
||||
|
||||
//// Hamcore
|
||||
|
||||
#define HAMCORE_HEADER_DATA "HamCore"
|
||||
#define HAMCORE_HEADER_SIZE 7
|
||||
|
||||
#endif // GLOBAL_CONST_H
|
||||
|
@ -22,7 +22,13 @@ find_package(ZLIB REQUIRED)
|
||||
# Required because we include <openssl/opensslv.h> in Encrypt.h.
|
||||
target_include_directories(mayaqua PUBLIC ${OPENSSL_INCLUDE_DIR})
|
||||
|
||||
target_link_libraries(mayaqua PRIVATE OpenSSL::SSL OpenSSL::Crypto ZLIB::ZLIB)
|
||||
target_link_libraries(mayaqua
|
||||
PRIVATE
|
||||
libhamcore
|
||||
OpenSSL::SSL
|
||||
OpenSSL::Crypto
|
||||
ZLIB::ZLIB
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
set_target_properties(mayaqua
|
||||
|
@ -18,10 +18,12 @@
|
||||
#include "Unix.h"
|
||||
#include "Win32.h"
|
||||
|
||||
#include <Hamcore.h>
|
||||
|
||||
static char exe_file_name[MAX_SIZE] = "/tmp/a.out";
|
||||
static wchar_t exe_file_name_w[MAX_SIZE] = L"/tmp/a.out";
|
||||
static LIST *hamcore = NULL;
|
||||
static IO *hamcore_io = NULL;
|
||||
static HAMCORE *hamcore_io = NULL;
|
||||
|
||||
#define NUM_CRC32_TABLE 256
|
||||
static UINT crc32_table[NUM_CRC32_TABLE];
|
||||
@ -554,25 +556,6 @@ bool IsFileW(wchar_t *name)
|
||||
return true;
|
||||
}
|
||||
|
||||
// Rename to replace the file
|
||||
bool FileReplaceRenameW(wchar_t *old_name, wchar_t *new_name)
|
||||
{
|
||||
// Validate arguments
|
||||
if (old_name == NULL || new_name == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (FileCopyW(old_name, new_name) == false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
FileDeleteW(old_name);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Make the file name safe
|
||||
void ConvertSafeFileName(char *dst, UINT size, char *src)
|
||||
{
|
||||
@ -735,244 +718,135 @@ BUF *ReadHamcoreW(wchar_t *filename)
|
||||
}
|
||||
BUF *ReadHamcore(char *name)
|
||||
{
|
||||
wchar_t tmp[MAX_SIZE];
|
||||
wchar_t exe_dir[MAX_SIZE];
|
||||
BUF *b;
|
||||
char filename[MAX_PATH];
|
||||
// Validate arguments
|
||||
if (name == NULL)
|
||||
if (name == NULL || MayaquaIsMinimalMode())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (name[0] == '|')
|
||||
if (name[0] == '/')
|
||||
{
|
||||
name++;
|
||||
++name;
|
||||
}
|
||||
|
||||
if (name[0] == '/' || name[0] == '\\')
|
||||
char path[MAX_PATH];
|
||||
GetExeDir(path, sizeof(path));
|
||||
Format(path, sizeof(path), "%s/%s/%s", path, HAMCORE_DIR_NAME, name);
|
||||
|
||||
BUF *buf = ReadDump(path);
|
||||
if (buf != NULL)
|
||||
{
|
||||
name++;
|
||||
return buf;
|
||||
}
|
||||
|
||||
StrCpy(filename, sizeof(filename), name);
|
||||
|
||||
ReplaceStrEx(filename, sizeof(filename), filename, "/", "\\", true);
|
||||
|
||||
if (MayaquaIsMinimalMode())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// If the file exist in hamcore/ directory on the local disk, read it
|
||||
GetExeDirW(exe_dir, sizeof(exe_dir));
|
||||
|
||||
UniFormat(tmp, sizeof(tmp), L"%s/%S/%S", exe_dir, HAMCORE_DIR_NAME, filename);
|
||||
|
||||
b = ReadDumpW(tmp);
|
||||
if (b != NULL)
|
||||
{
|
||||
return b;
|
||||
}
|
||||
|
||||
// Search from HamCore file system if it isn't found
|
||||
LockList(hamcore);
|
||||
{
|
||||
HC t, *c;
|
||||
UINT i;
|
||||
|
||||
Zero(&t, sizeof(t));
|
||||
t.FileName = filename;
|
||||
c = Search(hamcore, &t);
|
||||
|
||||
HC t = {0};
|
||||
t.Path = name;
|
||||
HC *c = Search(hamcore, &t);
|
||||
if (c == NULL)
|
||||
{
|
||||
// File does not exist
|
||||
b = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
// File exists
|
||||
if (c->Buffer != NULL)
|
||||
const HAMCORE_FILE *file = HamcoreFind(hamcore_io, name);
|
||||
if (file)
|
||||
{
|
||||
// It is already loaded
|
||||
b = NewBuf();
|
||||
WriteBuf(b, c->Buffer, c->Size);
|
||||
SeekBuf(b, 0, 0);
|
||||
c->LastAccess = Tick64();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Read from a file is if it is not read
|
||||
if (FileSeek(hamcore_io, 0, c->Offset) == false)
|
||||
c = Malloc(sizeof(HC));
|
||||
c->Size = file->OriginalSize;
|
||||
c->Path = CopyStr(name);
|
||||
c->Buffer = Malloc(c->Size);
|
||||
|
||||
if (HamcoreRead(hamcore_io, c->Buffer, file))
|
||||
{
|
||||
// Failed to seek
|
||||
b = NULL;
|
||||
Add(hamcore, c);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Read the compressed data
|
||||
void *data = Malloc(c->SizeCompressed);
|
||||
if (FileRead(hamcore_io, data, c->SizeCompressed) == false)
|
||||
{
|
||||
// Failed to read
|
||||
Free(data);
|
||||
b = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Expand
|
||||
c->Buffer = ZeroMalloc(c->Size);
|
||||
if (Uncompress(c->Buffer, c->Size, data, c->SizeCompressed) != c->Size)
|
||||
{
|
||||
// Failed to expand
|
||||
Free(data);
|
||||
Free(c->Buffer);
|
||||
b = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Successful
|
||||
Free(data);
|
||||
b = NewBuf();
|
||||
WriteBuf(b, c->Buffer, c->Size);
|
||||
SeekBuf(b, 0, 0);
|
||||
c->LastAccess = Tick64();
|
||||
}
|
||||
}
|
||||
Free(c->Buffer);
|
||||
Free(c->Path);
|
||||
Free(c);
|
||||
|
||||
c = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Delete the expired cache
|
||||
for (i = 0;i < LIST_NUM(hamcore);i++)
|
||||
if (c != NULL)
|
||||
{
|
||||
buf = NewBuf();
|
||||
WriteBuf(buf, c->Buffer, c->Size);
|
||||
SeekBuf(buf, 0, 0);
|
||||
c->LastAccess = Tick64();
|
||||
}
|
||||
|
||||
LIST *to_delete = NewListFast(NULL);
|
||||
|
||||
for (UINT i = 0; i < LIST_NUM(hamcore); ++i)
|
||||
{
|
||||
HC *c = LIST_DATA(hamcore, i);
|
||||
|
||||
if (c->Buffer != NULL)
|
||||
if (c->LastAccess + HAMCORE_CACHE_EXPIRES <= Tick64())
|
||||
{
|
||||
if (((c->LastAccess + HAMCORE_CACHE_EXPIRES) <= Tick64()) ||
|
||||
(StartWith(c->FileName, "Li")))
|
||||
{
|
||||
Free(c->Buffer);
|
||||
c->Buffer = NULL;
|
||||
}
|
||||
Add(to_delete, c);
|
||||
}
|
||||
}
|
||||
|
||||
for (UINT i = 0; i < LIST_NUM(to_delete); ++i)
|
||||
{
|
||||
HC *c = LIST_DATA(to_delete, i);
|
||||
|
||||
Delete(hamcore, c);
|
||||
|
||||
Free(c->Buffer);
|
||||
Free(c->Path);
|
||||
Free(c);
|
||||
}
|
||||
|
||||
ReleaseList(to_delete);
|
||||
}
|
||||
UnlockList(hamcore);
|
||||
|
||||
return b;
|
||||
return buf;
|
||||
}
|
||||
|
||||
// Initialization of HamCore file system
|
||||
void InitHamcore()
|
||||
{
|
||||
wchar_t tmp[MAX_PATH];
|
||||
wchar_t tmp2[MAX_PATH];
|
||||
wchar_t exe_dir[MAX_PATH];
|
||||
UINT i, num;
|
||||
char header[HAMCORE_HEADER_SIZE];
|
||||
|
||||
hamcore = NewList(CompareHamcore);
|
||||
|
||||
if (MayaquaIsMinimalMode())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
GetExeDirW(exe_dir, sizeof(exe_dir));
|
||||
UniFormat(tmp, sizeof(tmp), L"%s/%S", exe_dir, HAMCORE_FILE_NAME);
|
||||
|
||||
UniFormat(tmp2, sizeof(tmp2), L"%s/%S", exe_dir, HAMCORE_FILE_NAME_2);
|
||||
|
||||
// If there is _hamcore.se2, overwrite it yo the hamcore.se2
|
||||
FileReplaceRenameW(tmp2, tmp);
|
||||
|
||||
// Read if there is a file hamcore.se2
|
||||
hamcore_io = FileOpenW(tmp, false);
|
||||
if (hamcore_io == NULL)
|
||||
hamcore = NewList(CompareHamcore);
|
||||
#ifdef HAMCORE_FILE_PATH
|
||||
hamcore_io = HamcoreOpen(HAMCORE_FILE_PATH);
|
||||
if (hamcore_io != NULL)
|
||||
{
|
||||
// Look in other locations if it isn't found
|
||||
#ifdef OS_WIN32
|
||||
UniFormat(tmp, sizeof(tmp), L"%S/%S", MsGetSystem32Dir(), HAMCORE_FILE_NAME);
|
||||
#else // OS_WIN32
|
||||
UniFormat(tmp, sizeof(tmp), L"/bin/%S", HAMCORE_FILE_NAME);
|
||||
#endif // OS_WIN32
|
||||
|
||||
hamcore_io = FileOpenW(tmp, false);
|
||||
if (hamcore_io == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Read the file header
|
||||
Zero(header, sizeof(header));
|
||||
FileRead(hamcore_io, header, HAMCORE_HEADER_SIZE);
|
||||
|
||||
if (Cmp(header, HAMCORE_HEADER_DATA, HAMCORE_HEADER_SIZE) != 0)
|
||||
{
|
||||
// Invalid header
|
||||
FileClose(hamcore_io);
|
||||
hamcore_io = NULL;
|
||||
Debug("InitHamcore(): Loaded from \"%s\".\n", HAMCORE_FILE_PATH);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
char path[MAX_PATH];
|
||||
GetExeDir(path, sizeof(path));
|
||||
Format(path, sizeof(path), "%s/%s", path, HAMCORE_FILE_NAME);
|
||||
|
||||
// The number of the File
|
||||
num = 0;
|
||||
FileRead(hamcore_io, &num, sizeof(num));
|
||||
num = Endian32(num);
|
||||
for (i = 0;i < num;i++)
|
||||
hamcore_io = HamcoreOpen(path);
|
||||
if (hamcore_io != NULL)
|
||||
{
|
||||
// File name
|
||||
char tmp[MAX_SIZE];
|
||||
UINT str_size = 0;
|
||||
HC *c;
|
||||
|
||||
FileRead(hamcore_io, &str_size, sizeof(str_size));
|
||||
str_size = Endian32(str_size);
|
||||
if (str_size >= 1)
|
||||
{
|
||||
str_size--;
|
||||
}
|
||||
|
||||
Zero(tmp, sizeof(tmp));
|
||||
FileRead(hamcore_io, tmp, str_size);
|
||||
|
||||
c = ZeroMalloc(sizeof(HC));
|
||||
c->FileName = CopyStr(tmp);
|
||||
|
||||
FileRead(hamcore_io, &c->Size, sizeof(UINT));
|
||||
c->Size = Endian32(c->Size);
|
||||
|
||||
FileRead(hamcore_io, &c->SizeCompressed, sizeof(UINT));
|
||||
c->SizeCompressed = Endian32(c->SizeCompressed);
|
||||
|
||||
FileRead(hamcore_io, &c->Offset, sizeof(UINT));
|
||||
c->Offset = Endian32(c->Offset);
|
||||
|
||||
Insert(hamcore, c);
|
||||
Debug("InitHamcore(): Loaded from \"%s\".\n", path);
|
||||
}
|
||||
}
|
||||
|
||||
// Release of HamCore file system
|
||||
void FreeHamcore()
|
||||
{
|
||||
UINT i;
|
||||
for (i = 0;i < LIST_NUM(hamcore);i++)
|
||||
for (UINT i = 0; i < LIST_NUM(hamcore); ++i)
|
||||
{
|
||||
HC *c = LIST_DATA(hamcore, i);
|
||||
Free(c->FileName);
|
||||
if (c->Buffer != NULL)
|
||||
{
|
||||
Free(c->Buffer);
|
||||
}
|
||||
|
||||
Free(c->Buffer);
|
||||
Free(c->Path);
|
||||
Free(c);
|
||||
}
|
||||
ReleaseList(hamcore);
|
||||
|
||||
FileClose(hamcore_io);
|
||||
HamcoreClose(hamcore_io);
|
||||
hamcore_io = NULL;
|
||||
hamcore = NULL;
|
||||
}
|
||||
@ -991,7 +865,7 @@ int CompareHamcore(void *p1, void *p2)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return StrCmpi(c1->FileName, c2->FileName);
|
||||
return StrCmpi(c1->Path, c2->Path);
|
||||
}
|
||||
|
||||
// Getting the name of the directory where the EXE file is in
|
||||
|
@ -10,11 +10,8 @@
|
||||
|
||||
#include "Mayaqua.h"
|
||||
|
||||
// Constant
|
||||
#define HAMCORE_DIR_NAME "hamcore"
|
||||
#define HAMCORE_FILE_NAME "hamcore.se2"
|
||||
#define HAMCORE_FILE_NAME_2 "_hamcore.se2"
|
||||
#define HAMCORE_TEXT_NAME "hamcore.txt"
|
||||
#define HAMCORE_CACHE_EXPIRES (5 * 60 * 1000)
|
||||
|
||||
// IO structure
|
||||
@ -33,12 +30,10 @@ struct IO
|
||||
// HC structure
|
||||
typedef struct HC
|
||||
{
|
||||
char *FileName; // File name
|
||||
UINT Size; // File size
|
||||
UINT SizeCompressed; // Compressed file size
|
||||
UINT Offset; // Offset
|
||||
void *Buffer; // Buffer
|
||||
UINT64 LastAccess; // Access Date
|
||||
char *Path;
|
||||
void *Buffer;
|
||||
size_t Size;
|
||||
UINT64 LastAccess;
|
||||
} HC;
|
||||
|
||||
// DIRENT structure
|
||||
@ -242,7 +237,6 @@ void FreeDir(DIRLIST *d);
|
||||
int CompareDirListByName(void *p1, void *p2);
|
||||
bool GetDiskFree(char *path, UINT64 *free_size, UINT64 *used_size, UINT64 *total_size);
|
||||
void ConvertSafeFileName(char *dst, UINT size, char *src);
|
||||
bool FileReplaceRenameW(wchar_t *old_name, wchar_t *new_name);
|
||||
bool IsFile(char *name);
|
||||
bool IsFileW(wchar_t *name);
|
||||
bool SaveFileW(wchar_t *name, void *data, UINT size);
|
||||
|
@ -1807,12 +1807,12 @@ LP_SESSION_DELETED Session deleted.
|
||||
|
||||
# (WireGuard ログ)
|
||||
LW_PREFIX_SESSION [WireGuard] %r:%u -> %r:%u:
|
||||
LW_KEYPAIR_EXPIRED Current keypair (%x -> %x) is expired!
|
||||
LW_KEYPAIR_UNKNOWN The packet was encrypted with an unknown keypair!
|
||||
LW_DECRYPT_FAIL Decryption failure!
|
||||
LW_REPLAY_ATTACK Replay attack detected!
|
||||
LW_FLOOD_ATTACK Flood attack detected!
|
||||
LW_HUB_DISCONNECT The administrator of the Virtual Hub has disconnected this session.
|
||||
LW_KEYPAIR_EXPIRED 現在の鍵ペア (%x -> %x) の有効期限が切れています。
|
||||
LW_KEYPAIR_UNKNOWN パケットが未知の鍵ペアによって暗号化されていました。
|
||||
LW_DECRYPT_FAIL 復号に失敗しました。
|
||||
LW_REPLAY_ATTACK リプレイ攻撃を検出しました。
|
||||
LW_FLOOD_ATTACK フラッド攻撃を検出しました。
|
||||
LW_HUB_DISCONNECT 仮想 HUB の管理者によって VPN セッションが切断されました。
|
||||
|
||||
|
||||
# (OpenVPN ログ)
|
||||
@ -1917,7 +1917,7 @@ LH_AUTH_PASSWORD パスワード認証
|
||||
LH_AUTH_PLAIN_PASSWORD 外部サーバー認証
|
||||
LH_AUTH_CERT 証明書認証
|
||||
LH_AUTH_TICKET チケット認証
|
||||
LH_AUTH_WIREGUARD_KEY WireGuard public key authentication
|
||||
LH_AUTH_WIREGUARD_KEY WireGuard 公開鍵認証
|
||||
LH_AUTH_OPENVPN_CERT OpenVPN 証明書認証
|
||||
LH_AUTH_RADIUS_NOT_SUPPORT コネクション "%S": ユーザー "%S" の認証方法として RADIUS 認証または Active Directory 認証 (NT ドメイン認証) が指定されましたが、現在の VPN Server のエディションは "%S" であるため、RADIUS 認証または Active Directory 認証 (NT ドメイン認証) を使用することができません。接続は拒否されます。
|
||||
LH_AUTH_RADIUS_NOT_SUPPORT_ON_OPEN_SOURCE コネクション "%S": ユーザー "%S" の認証方法として RADIUS 認証または Active Directory 認証 (NT ドメイン認証) が指定されましたが、RADIUS 認証または Active Directory 認証 (NT ドメイン認証) を使用することができません。この機能はオープンソース版 SoftEther VPN にはまだ実装されていません。接続は拒否されます。
|
||||
@ -4612,9 +4612,9 @@ CMD_ProtoOptionsGet_Column_Description 説明
|
||||
CMD_ProtoOptions_Description_OpenVPN_DefaultClientOption OpenVPN の OCC codeRT 版以外の場合は、OpenVPN はサーバーに対してオプション文字列を送信しません。OpenVPN サーバーのオリジナル版は、オプションを固定で指定する仕組みになっているため、その場合でも動作します。一方、SoftEther VPN は、様々なオプションを動的に設定することができる機能を有しております。そこで、このオプションを使用することにより、OCC code なしでビルドされた OpenVPN に対してデフォルトの静的オプション文字列を送付することができるようになります。これにより、OCC code なしでビルドされた OpenVPN からの接続が成功するようになります。
|
||||
CMD_ProtoOptions_Description_OpenVPN_Obfuscation OpenVPN クライアントが検閲用ファイアウォールを回避するための難読化コードを設定します。クライアント側とサーバー側では、同一の XOR マスクを設定する必要があります。コードが異なると、接続ができません。
|
||||
CMD_ProtoOptions_Description_OpenVPN_ObfuscationMask パケットで使用される XOR マスクを指定します。OpenVPN クライアントが検閲用ファイアウォールを回避するための難読化コードとして使用されます。
|
||||
CMD_ProtoOptions_Description_OpenVPN_PingSendInterval Interval in milliseconds between each ping packet transmission.
|
||||
CMD_ProtoOptions_Description_OpenVPN_PingSendInterval ping パケットを送信する間隔をミリ秒単位で指定します。
|
||||
CMD_ProtoOptions_Description_OpenVPN_PushDummyIPv4AddressOnL2Mode Linux における特定の状況下では manifests に不具合があります。この不具合により、OpenVPN クライアントは TAP デバイスが UP 状態であるにもかかわらず、切断状態となります。このオプションを使用することにより、VPN サーバーは、ダミーの IPv4 アドレス (RFC7600 で規定) をクライアントに対してプッシュ送信することができるようになります。これにより、TAP アダプタが常に UP 状態になります。
|
||||
CMD_ProtoOptions_Description_OpenVPN_Timeout Time in milliseconds after which the session is forcifully interrupted if no packets are received from the client in the meantime.
|
||||
CMD_ProtoOptions_Description_OpenVPN_Timeout クライアントからパケットを受信しなかった場合に強制的にセッションを切断するまでの時間をミリ秒単位で指定します。
|
||||
|
||||
|
||||
# ServerPasswordSet コマンド
|
||||
@ -5026,32 +5026,32 @@ CMD_LogFileGet_FILESIZE ログファイルのファイルサイズ: %u
|
||||
|
||||
|
||||
# WgkAdd コマンド
|
||||
CMD_WgkAdd Add a WireGuard key
|
||||
CMD_WgkAdd_Help This command can be used to add a WireGuard key to the allowed key list. \nTo execute this command, you must have VPN Server administrator privileges.
|
||||
CMD_WgkAdd WireGuard 公開鍵の追加
|
||||
CMD_WgkAdd_Help 新しい WireGuard 公開鍵をサーバーに追加します。\n公開鍵を追加すると、関連付けたユーザーとして仮想 HUB に WireGuard クライアントが接続できるようになります。\nこのコマンドを実行するには、VPN Server の管理者権限が必要です。
|
||||
CMD_WgkAdd_Args WgkAdd [key] [/HUB:hub] [/USER:user]
|
||||
CMD_WgkAdd_[key] WireGuard key. Make sure it is the public one!
|
||||
CMD_WgkAdd_HUB Hub the key will be associated to.
|
||||
CMD_WgkAdd_USER User the key will be associated to, in the specified hub.
|
||||
CMD_WgkAdd_Prompt_[key] Key:
|
||||
CMD_WgkAdd_Prompt_HUB Hub:
|
||||
CMD_WgkAdd_Prompt_USER User:
|
||||
CMD_WgkAdd_[key] 新しく追加する WireGuard 公開鍵を指定します。追加しようとしている鍵が公開鍵であることを確認してください。
|
||||
CMD_WgkAdd_HUB 公開鍵に関連付ける仮想ハブを指定します。
|
||||
CMD_WgkAdd_USER 指定された仮想 HUB 内で公開鍵に関連付けるユーザー名を指定します。
|
||||
CMD_WgkAdd_Prompt_[key] 公開鍵:
|
||||
CMD_WgkAdd_Prompt_HUB 関連付ける仮想 HUB の名前:
|
||||
CMD_WgkAdd_Prompt_USER ユーザー名:
|
||||
|
||||
|
||||
# WgkDelete コマンド
|
||||
CMD_WgkDelete Delete a WireGuard key
|
||||
CMD_WgkDelete_Help This command can be used to delete a WireGuard key from the allowed key list. \nTo execute this command, you must have VPN Server administrator privileges.
|
||||
CMD_WgkDelete WireGuard 公開鍵の削除
|
||||
CMD_WgkDelete_Help サーバーに登録された WireGuard 公開鍵を削除します。\n公開鍵を削除すると WireGuard クライアントは仮想 HUB に接続できなくなります。 \nこのコマンドを実行するには、VPN Server の管理者権限が必要です。
|
||||
CMD_WgkDelete_Args WgkDelete [key]
|
||||
CMD_WgkDelete_[key] WireGuard key.
|
||||
CMD_WgkDelete_Prompt_[key] Key:
|
||||
CMD_WgkDelete_[key] 削除する WireGuard 公開鍵を指定します。
|
||||
CMD_WgkDelete_Prompt_[key] 公開鍵:
|
||||
|
||||
|
||||
# WgkEnum コマンド
|
||||
CMD_WgkEnum List the WireGuard keys
|
||||
CMD_WgkEnum_Help This command retrieves the WireGuard keys that are allowed to connect to the server, along with the associated Virtual Hub and user. \nYou can add a key with the WgkAdd command. \nYou can delete a key with the WgkDelete command. \nTo execute this command, you must have VPN Server administrator privileges.
|
||||
CMD_WgkEnum Wireguard 公開鍵一覧の取得
|
||||
CMD_WgkEnum_Help 現在サーバーに登録されている WireGuard 公開鍵の一覧を取得します。\nWgkAdd コマンドで公開鍵の追加を、WgkDelete コマンドで公開鍵の削除を行うことができます。\nこのコマンドを実行するには、VPN Server の管理者権限が必要です。
|
||||
CMD_WgkEnum_Args WgkEnum
|
||||
CMD_WgkEnum_Column_Key Key
|
||||
CMD_WgkEnum_Column_Hub Hub
|
||||
CMD_WgkEnum_Column_User User
|
||||
CMD_WgkEnum_Column_Key 公開鍵
|
||||
CMD_WgkEnum_Column_Hub 仮想 HUB 名
|
||||
CMD_WgkEnum_Column_User ユーザー名
|
||||
|
||||
|
||||
# HubCreate コマンド
|
||||
@ -5131,14 +5131,15 @@ CMD_Offline_Help 現在管理している仮想 HUB がオンラインになっ
|
||||
CMD_Offline_Args Offline
|
||||
|
||||
|
||||
# SetStaticNetwork command
|
||||
CMD_SetStaticNetwork Set Virtual Hub static IPv4 network parameters
|
||||
CMD_SetStaticNetwork_Help Set the static IPv4 network parameters for the Virtual Hub. They are used when DHCP is not available (e.g. WireGuard sessions). \nYou can get the current settings by using the OptionsGet command.
|
||||
# SetStaticNetwork コマンド
|
||||
CMD_SetStaticNetwork 仮想 HUB のスタティック IPv4 ネットワークパラメータを設定する
|
||||
|
||||
CMD_SetStaticNetwork_Help 現在管理している仮想 HUB の、スタティック IPv4 パラメータを設定します。これらの設定は DHCP が利用できない場合に使用されます(例: WireGuard セッション)。\n 現在の設定は OptionsGet コマンドで取得することができます。
|
||||
CMD_SetStaticNetwork_Args SetStaticNetwork [/GATEWAY:gateway] [/SUBNET:subnet]
|
||||
CMD_SetStaticNetwork_GATEWAY Specify the IP address of the gateway that will be used for internet communication.
|
||||
CMD_SetStaticNetwork_SUBNET Specify the subnet mask, required to determine the size of the local VPN network.
|
||||
CMD_SetStaticNetwork_Prompt_GATEWAY Gateway:
|
||||
CMD_SetStaticNetwork_Prompt_SUBNET Subnet mask:
|
||||
CMD_SetStaticNetwork_GATEWAY ゲートウェイの IP アドレスを設定します
|
||||
CMD_SetStaticNetwork_SUBNET ローカル VPN ネットワークの大きさを決定するために必要なサブネットマスクを指定します。
|
||||
CMD_SetStaticNetwork_Prompt_GATEWAY ゲートウェイ:
|
||||
CMD_SetStaticNetwork_Prompt_SUBNET サブネットマスク:
|
||||
|
||||
|
||||
# SetMaxSession コマンド
|
||||
@ -5177,8 +5178,8 @@ CMD_OptionsGet_ENUM 匿名ユーザーに対する仮想 HUB の列挙
|
||||
CMD_OptionsGet_MAXSESSIONS 最大同時接続セッション数
|
||||
CMD_OptionsGet_STATUS 状態
|
||||
CMD_OptionsGet_TYPE 仮想 HUB の種類
|
||||
CMD_OptionsGet_GATEWAY Default gateway
|
||||
CMD_OptionsGet_SUBNET Default subnet
|
||||
CMD_OptionsGet_GATEWAY デフォルトゲートウェイ
|
||||
CMD_OptionsGet_SUBNET サブネットマスク
|
||||
|
||||
|
||||
# RadiusServerSet コマンド
|
||||
|
Submodule src/libhamcore updated: b7f5d8d735...2951ae5b61
Reference in New Issue
Block a user