1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2025-07-07 00:04:57 +03:00

25 Commits

Author SHA1 Message Date
56bb573b17 Merge PR #1395: Add warning about build number, initialize to 5180 2021-06-24 10:28:36 +02:00
e3f0837bd1 Set default build number to 5180 2021-06-24 17:12:50 +09:00
c1370987bf Add missing parenthesis close and adjust line break 2021-06-24 17:06:48 +09:00
79d1ade09d Revise warning message
Co-authored-by: Davide Beatrici <github@davidebeatrici.dev>
2021-06-24 16:58:12 +09:00
a3f984e521 Add warning about build number and 4.x clients compatibilty
See also: https://github.com/SoftEtherVPN/SoftEtherVPN/issues/1392#issuecomment-867348281
2021-06-24 16:46:18 +09:00
43a80702a9 Merge PR #1376: Cedar/Proto_PPP: Fix EAP-TLS fragmentation 2021-06-19 02:00:24 +02:00
682052e0dc Cedar/Proto_PPP: Fix EAP-TLS fragmentation 2021-06-17 11:34:09 +00:00
ad139a7cbb Merge PR #1374: add missing libsodium dependency to coverity pipeline 2021-06-16 21:44:44 +02:00
64f1e349f8 add missing libsodium dependency to coverity pipeline
thanks Paul Menzel for reporting this.
fixes #1372
2021-06-16 23:19:11 +05:00
214992c232 Merge PR #1371: add github workflow to create release tarball with submodules 2021-06-14 05:49:30 +02:00
82b4b083b3 add github workflow to create release tarball with submodules 2021-06-14 02:36:09 +01:00
f18837b491 Merge PR #1367: hamcore(ja): just adding a missing ":" 2021-06-11 06:05:46 +02:00
28c90b190c hamcore(ja): just adding a missing ":" 2021-06-11 12:51:06 +09:00
5f76dbcfa2 Merge PR #1362: Japanese translation: WireGuard and some new messages 2021-06-06 22:16:58 +02:00
b4817fd27a hamdore(ja): translate OpenVPN timeout and ping transmission interval 2021-06-06 23:35:46 +09:00
89ca29f259 hamcore(ja): translate WireGuard log messages 2021-06-06 23:35:46 +09:00
7a208d6114 hamcore(ja): translate SetStaticNetwork command 2021-06-06 23:35:45 +09:00
5b910322a7 hamcore(ja): translate Wgk* commands 2021-06-06 23:35:45 +09:00
2262b8a160 Merge PR #1354: Mayaqua/FileIO: Fix typo causing segmentation fault on Hamcore cache expiration 2021-05-26 21:14:59 +02:00
2923b5500a Mayaqua/FileIO: Fix typo causing segmentation fault on Hamcore cache expiration 2021-05-26 20:46:21 +02:00
7acd52d724 Merge PR #1352: Cedar/Proto_PPP: Fix EAP identifier duplication 2021-05-26 20:29:55 +02:00
8c12e79448 Cedar/Proto_PPP: Fix EAP identifier duplication 2021-05-26 09:26:22 +00:00
dc8d705854 Merge PR #1351: Read hamcore.se2 using libhamcore, set arbitrary path through HAMCORE_FILE_PATH 2021-05-26 08:42:52 +02:00
81c71d309a Read hamcore.se2 using libhamcore, set arbitrary path through HAMCORE_FILE_PATH 2021-05-26 07:44:45 +02:00
e0182ca3d9 src: Update "libhamcore" submodule 2021-05-26 04:18:08 +02:00
11 changed files with 192 additions and 267 deletions

View 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

View File

@ -22,7 +22,7 @@ jobs:
- name: Install apt dependencies - name: Install apt dependencies
run: | run: |
sudo apt-get update 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 - name: Run Coverity Scan
env: env:
COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }} COVERITY_SCAN_TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}

View File

@ -3,7 +3,14 @@ cmake_minimum_required(VERSION 3.10)
set(BUILD_NUMBER CACHE STRING "The number of the current build.") set(BUILD_NUMBER CACHE STRING "The number of the current build.")
if ("${BUILD_NUMBER}" STREQUAL "") 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() endif()
project("SoftEther VPN" project("SoftEther VPN"

View File

@ -257,7 +257,8 @@ void PPPThread(THREAD *thread, void *param)
case PPP_EAP_TYPE_TLS: case PPP_EAP_TYPE_TLS:
// Sending TLS Start... // Sending TLS Start...
flags |= PPP_EAP_TLS_FLAG_SSLSTARTED; 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); PPPSetStatus(p, PPP_STATUS_AUTHENTICATING);
if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcpEap)) if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcpEap))
{ {
@ -269,7 +270,8 @@ void PPPThread(THREAD *thread, void *param)
case PPP_EAP_TYPE_IDENTITY: case PPP_EAP_TYPE_IDENTITY:
default: // We treat the unspecified protocol as the IDENTITY protocol default: // We treat the unspecified protocol as the IDENTITY protocol
p->Eap_Protocol = PPP_EAP_TYPE_IDENTITY; 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; eapPacket = lcpEap->Data;
Copy(eapPacket->Data, welcomeMessage, StrLen(welcomeMessage)); Copy(eapPacket->Data, welcomeMessage, StrLen(welcomeMessage));
PPPSetStatus(p, PPP_STATUS_AUTHENTICATING); PPPSetStatus(p, PPP_STATUS_AUTHENTICATING);
@ -1251,7 +1253,8 @@ bool PPPProcessEAPResponsePacket(PPP_SESSION *p, PPP_PACKET *pp, PPP_PACKET *req
eap = req->Lcp->Data; eap = req->Lcp->Data;
if (eap->Type == PPP_EAP_TYPE_TLS) 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)) if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp))
{ {
PPPSetStatus(p, PPP_STATUS_FAIL); PPPSetStatus(p, PPP_STATUS_FAIL);
@ -3218,7 +3221,8 @@ bool PPPProcessEAPTlsResponse(PPP_SESSION *p, PPP_EAP *eap_packet, UINT eapTlsSi
dataSize = sizeLeft; dataSize = sizeLeft;
flags = PPP_EAP_TLS_FLAG_NONE; // Clearing the M flag because it is the last packet 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; eap = lcp->Data;
Copy(eap->Tls.TlsDataWithoutLength, p->Eap_TlsCtx.CachedBufferSendPntr, dataSize); Copy(eap->Tls.TlsDataWithoutLength, p->Eap_TlsCtx.CachedBufferSendPntr, dataSize);
p->Eap_TlsCtx.CachedBufferSendPntr += (UINT64)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) /*if (!p->Eap_TlsCtx.SslPipe->IsDisconnected)
{ {
dataSize = FifoSize(p->Eap_TlsCtx.SslPipe->RawOut->RecvFifo); 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; eap = lcp->Data;
ReadFifo(p->Eap_TlsCtx.SslPipe->RawOut->RecvFifo, &(eap->Tls.TlsDataWithoutLength), dataSize); ReadFifo(p->Eap_TlsCtx.SslPipe->RawOut->RecvFifo, &(eap->Tls.TlsDataWithoutLength), dataSize);
if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp)) 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) if (ipc != NULL)
{ {
PPP_PACKET *pack; 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; p->Ipc = ipc;
PPPSetStatus(p, PPP_STATUS_AUTH_SUCCESS); PPPSetStatus(p, PPP_STATUS_AUTH_SUCCESS);
@ -3298,7 +3303,7 @@ bool PPPProcessEAPTlsResponse(PPP_SESSION *p, PPP_EAP *eap_packet, UINT eapTlsSi
else else
{ {
PPP_PACKET *pack; 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); 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 // Some clients needs a little help it seems - namely VPN Client Pro on Android
flags |= PPP_EAP_TLS_FLAG_SSLSTARTED; 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); PPPSetStatus(p, PPP_STATUS_AUTHENTICATING);
if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp)) 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 // Just acknoweldge that we buffered the fragmented data
if (isFragmented) 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)) if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp))
{ {
PPPSetStatus(p, PPP_STATUS_FAIL); 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) 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_TLS_LENGTH; // L flag
flags |= PPP_EAP_TLS_FLAG_FRAGMENTED; // M 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 = lcp->Data;
eap->Tls.TlsDataWithLength.TlsLength = Endian32(tlsLength); eap->Tls.TlsDataWithLength.TlsLength = Endian32(tlsLength);
Copy(eap->Tls.TlsDataWithLength.Data, p->Eap_TlsCtx.CachedBufferSend, dataSize); 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 else
{ {
lcp = BuildEAPTlsRequest(p->Eap_PacketId++, dataSize, 0); p->Eap_PacketId = p->NextId++;
lcp = BuildEAPTlsRequest(p->Eap_PacketId, dataSize, 0);
eap = lcp->Data; eap = lcp->Data;
ReadFifo(p->Eap_TlsCtx.SslPipe->RawOut->RecvFifo, &(eap->Tls.TlsDataWithoutLength), dataSize); ReadFifo(p->Eap_TlsCtx.SslPipe->RawOut->RecvFifo, &(eap->Tls.TlsDataWithoutLength), dataSize);
if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp)) if (!PPPSendAndRetransmitRequest(p, PPP_PROTOCOL_EAP, lcp))

View File

@ -6011,7 +6011,7 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
if (server->DisableJsonRpcWebApi == false) if (server->DisableJsonRpcWebApi == false)
{ {
b = ReadDump("|wwwroot\\index.html"); b = ReadDump("|wwwroot/index.html");
} }
if (b != NULL) if (b != NULL)

View File

@ -64,9 +64,4 @@
#define GC_UI_APPID_CM L"SoftEther.SoftEther VPN Client Developer Edition" #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 #endif // GLOBAL_CONST_H

View File

@ -22,7 +22,13 @@ find_package(ZLIB REQUIRED)
# Required because we include <openssl/opensslv.h> in Encrypt.h. # Required because we include <openssl/opensslv.h> in Encrypt.h.
target_include_directories(mayaqua PUBLIC ${OPENSSL_INCLUDE_DIR}) 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) if(WIN32)
set_target_properties(mayaqua set_target_properties(mayaqua

View File

@ -18,10 +18,12 @@
#include "Unix.h" #include "Unix.h"
#include "Win32.h" #include "Win32.h"
#include <Hamcore.h>
static char exe_file_name[MAX_SIZE] = "/tmp/a.out"; static char exe_file_name[MAX_SIZE] = "/tmp/a.out";
static wchar_t exe_file_name_w[MAX_SIZE] = L"/tmp/a.out"; static wchar_t exe_file_name_w[MAX_SIZE] = L"/tmp/a.out";
static LIST *hamcore = NULL; static LIST *hamcore = NULL;
static IO *hamcore_io = NULL; static HAMCORE *hamcore_io = NULL;
#define NUM_CRC32_TABLE 256 #define NUM_CRC32_TABLE 256
static UINT crc32_table[NUM_CRC32_TABLE]; static UINT crc32_table[NUM_CRC32_TABLE];
@ -554,25 +556,6 @@ bool IsFileW(wchar_t *name)
return true; 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 // Make the file name safe
void ConvertSafeFileName(char *dst, UINT size, char *src) void ConvertSafeFileName(char *dst, UINT size, char *src)
{ {
@ -735,244 +718,135 @@ BUF *ReadHamcoreW(wchar_t *filename)
} }
BUF *ReadHamcore(char *name) BUF *ReadHamcore(char *name)
{ {
wchar_t tmp[MAX_SIZE]; if (name == NULL || MayaquaIsMinimalMode())
wchar_t exe_dir[MAX_SIZE];
BUF *b;
char filename[MAX_PATH];
// Validate arguments
if (name == NULL)
{ {
return NULL; 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); LockList(hamcore);
{ {
HC t, *c; HC t = {0};
UINT i; t.Path = name;
HC *c = Search(hamcore, &t);
Zero(&t, sizeof(t));
t.FileName = filename;
c = Search(hamcore, &t);
if (c == NULL) if (c == NULL)
{ {
// File does not exist const HAMCORE_FILE *file = HamcoreFind(hamcore_io, name);
b = NULL; if (file)
}
else
{
// File exists
if (c->Buffer != NULL)
{ {
// It is already loaded c = Malloc(sizeof(HC));
b = NewBuf(); c->Size = file->OriginalSize;
WriteBuf(b, c->Buffer, c->Size); c->Path = CopyStr(name);
SeekBuf(b, 0, 0); c->Buffer = Malloc(c->Size);
c->LastAccess = Tick64();
} if (HamcoreRead(hamcore_io, c->Buffer, file))
else
{
// Read from a file is if it is not read
if (FileSeek(hamcore_io, 0, c->Offset) == false)
{ {
// Failed to seek Add(hamcore, c);
b = NULL;
} }
else else
{ {
// Read the compressed data Free(c->Buffer);
void *data = Malloc(c->SizeCompressed); Free(c->Path);
if (FileRead(hamcore_io, data, c->SizeCompressed) == false) Free(c);
{
// Failed to read c = NULL;
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();
}
}
} }
} }
} }
// Delete the expired cache if (c != NULL)
for (i = 0;i < LIST_NUM(hamcore);i++) {
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); HC *c = LIST_DATA(hamcore, i);
if (c->LastAccess + HAMCORE_CACHE_EXPIRES <= Tick64())
if (c->Buffer != NULL)
{ {
if (((c->LastAccess + HAMCORE_CACHE_EXPIRES) <= Tick64()) || Add(to_delete, c);
(StartWith(c->FileName, "Li")))
{
Free(c->Buffer);
c->Buffer = NULL;
}
} }
} }
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); UnlockList(hamcore);
return b; return buf;
} }
// Initialization of HamCore file system // Initialization of HamCore file system
void InitHamcore() 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()) if (MayaquaIsMinimalMode())
{ {
return; return;
} }
GetExeDirW(exe_dir, sizeof(exe_dir)); hamcore = NewList(CompareHamcore);
UniFormat(tmp, sizeof(tmp), L"%s/%S", exe_dir, HAMCORE_FILE_NAME); #ifdef HAMCORE_FILE_PATH
hamcore_io = HamcoreOpen(HAMCORE_FILE_PATH);
UniFormat(tmp2, sizeof(tmp2), L"%s/%S", exe_dir, HAMCORE_FILE_NAME_2); if (hamcore_io != NULL)
// 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)
{ {
// Look in other locations if it isn't found Debug("InitHamcore(): Loaded from \"%s\".\n", HAMCORE_FILE_PATH);
#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;
return; 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 hamcore_io = HamcoreOpen(path);
num = 0; if (hamcore_io != NULL)
FileRead(hamcore_io, &num, sizeof(num));
num = Endian32(num);
for (i = 0;i < num;i++)
{ {
// File name Debug("InitHamcore(): Loaded from \"%s\".\n", path);
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);
} }
} }
// Release of HamCore file system // Release of HamCore file system
void FreeHamcore() void FreeHamcore()
{ {
UINT i; for (UINT i = 0; i < LIST_NUM(hamcore); ++i)
for (i = 0;i < LIST_NUM(hamcore);i++)
{ {
HC *c = LIST_DATA(hamcore, i); HC *c = LIST_DATA(hamcore, i);
Free(c->FileName);
if (c->Buffer != NULL) Free(c->Buffer);
{ Free(c->Path);
Free(c->Buffer);
}
Free(c); Free(c);
} }
ReleaseList(hamcore); ReleaseList(hamcore);
FileClose(hamcore_io); HamcoreClose(hamcore_io);
hamcore_io = NULL; hamcore_io = NULL;
hamcore = NULL; hamcore = NULL;
} }
@ -991,7 +865,7 @@ int CompareHamcore(void *p1, void *p2)
{ {
return 0; 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 // Getting the name of the directory where the EXE file is in

View File

@ -10,11 +10,8 @@
#include "Mayaqua.h" #include "Mayaqua.h"
// Constant
#define HAMCORE_DIR_NAME "hamcore" #define HAMCORE_DIR_NAME "hamcore"
#define HAMCORE_FILE_NAME "hamcore.se2" #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) #define HAMCORE_CACHE_EXPIRES (5 * 60 * 1000)
// IO structure // IO structure
@ -33,12 +30,10 @@ struct IO
// HC structure // HC structure
typedef struct HC typedef struct HC
{ {
char *FileName; // File name char *Path;
UINT Size; // File size void *Buffer;
UINT SizeCompressed; // Compressed file size size_t Size;
UINT Offset; // Offset UINT64 LastAccess;
void *Buffer; // Buffer
UINT64 LastAccess; // Access Date
} HC; } HC;
// DIRENT structure // DIRENT structure
@ -242,7 +237,6 @@ void FreeDir(DIRLIST *d);
int CompareDirListByName(void *p1, void *p2); int CompareDirListByName(void *p1, void *p2);
bool GetDiskFree(char *path, UINT64 *free_size, UINT64 *used_size, UINT64 *total_size); bool GetDiskFree(char *path, UINT64 *free_size, UINT64 *used_size, UINT64 *total_size);
void ConvertSafeFileName(char *dst, UINT size, char *src); void ConvertSafeFileName(char *dst, UINT size, char *src);
bool FileReplaceRenameW(wchar_t *old_name, wchar_t *new_name);
bool IsFile(char *name); bool IsFile(char *name);
bool IsFileW(wchar_t *name); bool IsFileW(wchar_t *name);
bool SaveFileW(wchar_t *name, void *data, UINT size); bool SaveFileW(wchar_t *name, void *data, UINT size);

View File

@ -1807,12 +1807,12 @@ LP_SESSION_DELETED Session deleted.
# (WireGuard ログ) # (WireGuard ログ)
LW_PREFIX_SESSION [WireGuard] %r:%u -> %r:%u: LW_PREFIX_SESSION [WireGuard] %r:%u -> %r:%u:
LW_KEYPAIR_EXPIRED Current keypair (%x -> %x) is expired! LW_KEYPAIR_EXPIRED 現在の鍵ペア (%x -> %x) の有効期限が切れています。
LW_KEYPAIR_UNKNOWN The packet was encrypted with an unknown keypair! LW_KEYPAIR_UNKNOWN パケットが未知の鍵ペアによって暗号化されていました。
LW_DECRYPT_FAIL Decryption failure! LW_DECRYPT_FAIL 復号に失敗しました。
LW_REPLAY_ATTACK Replay attack detected! LW_REPLAY_ATTACK リプレイ攻撃を検出しました。
LW_FLOOD_ATTACK Flood attack detected! LW_FLOOD_ATTACK フラッド攻撃を検出しました。
LW_HUB_DISCONNECT The administrator of the Virtual Hub has disconnected this session. LW_HUB_DISCONNECT 仮想 HUB の管理者によって VPN セッションが切断されました。
# (OpenVPN ログ) # (OpenVPN ログ)
@ -1917,7 +1917,7 @@ LH_AUTH_PASSWORD パスワード認証
LH_AUTH_PLAIN_PASSWORD 外部サーバー認証 LH_AUTH_PLAIN_PASSWORD 外部サーバー認証
LH_AUTH_CERT 証明書認証 LH_AUTH_CERT 証明書認証
LH_AUTH_TICKET チケット認証 LH_AUTH_TICKET チケット認証
LH_AUTH_WIREGUARD_KEY WireGuard public key authentication LH_AUTH_WIREGUARD_KEY WireGuard 公開鍵認証
LH_AUTH_OPENVPN_CERT OpenVPN 証明書認証 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 コネクション "%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 にはまだ実装されていません。接続は拒否されます。 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_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_Obfuscation OpenVPN クライアントが検閲用ファイアウォールを回避するための難読化コードを設定します。クライアント側とサーバー側では、同一の XOR マスクを設定する必要があります。コードが異なると、接続ができません。
CMD_ProtoOptions_Description_OpenVPN_ObfuscationMask パケットで使用される XOR マスクを指定します。OpenVPN クライアントが検閲用ファイアウォールを回避するための難読化コードとして使用されます。 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_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 コマンド # ServerPasswordSet コマンド
@ -5026,32 +5026,32 @@ CMD_LogFileGet_FILESIZE ログファイルのファイルサイズ: %u
# WgkAdd コマンド # WgkAdd コマンド
CMD_WgkAdd Add a WireGuard key CMD_WgkAdd WireGuard 公開鍵の追加
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_Help 新しい WireGuard 公開鍵をサーバーに追加します。\n公開鍵を追加すると、関連付けたユーザーとして仮想 HUB に WireGuard クライアントが接続できるようになります。\nこのコマンドを実行するには、VPN Server の管理者権限が必要です。
CMD_WgkAdd_Args WgkAdd [key] [/HUB:hub] [/USER:user] CMD_WgkAdd_Args WgkAdd [key] [/HUB:hub] [/USER:user]
CMD_WgkAdd_[key] WireGuard key. Make sure it is the public one! CMD_WgkAdd_[key] 新しく追加する WireGuard 公開鍵を指定します。追加しようとしている鍵が公開鍵であることを確認してください。
CMD_WgkAdd_HUB Hub the key will be associated to. CMD_WgkAdd_HUB 公開鍵に関連付ける仮想ハブを指定します。
CMD_WgkAdd_USER User the key will be associated to, in the specified hub. CMD_WgkAdd_USER 指定された仮想 HUB 内で公開鍵に関連付けるユーザー名を指定します。
CMD_WgkAdd_Prompt_[key] Key: CMD_WgkAdd_Prompt_[key] 公開鍵:
CMD_WgkAdd_Prompt_HUB Hub: CMD_WgkAdd_Prompt_HUB 関連付ける仮想 HUB の名前:
CMD_WgkAdd_Prompt_USER User: CMD_WgkAdd_Prompt_USER ユーザー名:
# WgkDelete コマンド # WgkDelete コマンド
CMD_WgkDelete Delete a WireGuard key CMD_WgkDelete WireGuard 公開鍵の削除
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_Help サーバーに登録された WireGuard 公開鍵を削除します。\n公開鍵を削除すると WireGuard クライアントは仮想 HUB に接続できなくなります。 \nこのコマンドを実行するには、VPN Server の管理者権限が必要です。
CMD_WgkDelete_Args WgkDelete [key] CMD_WgkDelete_Args WgkDelete [key]
CMD_WgkDelete_[key] WireGuard key. CMD_WgkDelete_[key] 削除する WireGuard 公開鍵を指定します。
CMD_WgkDelete_Prompt_[key] Key: CMD_WgkDelete_Prompt_[key] 公開鍵:
# WgkEnum コマンド # WgkEnum コマンド
CMD_WgkEnum List the WireGuard keys CMD_WgkEnum Wireguard 公開鍵一覧の取得
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_Help 現在サーバーに登録されている WireGuard 公開鍵の一覧を取得します。\nWgkAdd コマンドで公開鍵の追加を、WgkDelete コマンドで公開鍵の削除を行うことができます。\nこのコマンドを実行するには、VPN Server の管理者権限が必要です。
CMD_WgkEnum_Args WgkEnum CMD_WgkEnum_Args WgkEnum
CMD_WgkEnum_Column_Key Key CMD_WgkEnum_Column_Key 公開鍵
CMD_WgkEnum_Column_Hub Hub CMD_WgkEnum_Column_Hub 仮想 HUB 名
CMD_WgkEnum_Column_User User CMD_WgkEnum_Column_User ユーザー名
# HubCreate コマンド # HubCreate コマンド
@ -5131,14 +5131,15 @@ CMD_Offline_Help 現在管理している仮想 HUB がオンラインになっ
CMD_Offline_Args Offline CMD_Offline_Args Offline
# SetStaticNetwork command # SetStaticNetwork コマンド
CMD_SetStaticNetwork Set Virtual Hub static IPv4 network parameters CMD_SetStaticNetwork 仮想 HUB のスタティック IPv4 ネットワークパラメータを設定する
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.
CMD_SetStaticNetwork_Help 現在管理している仮想 HUB の、スタティック IPv4 パラメータを設定します。これらの設定は DHCP が利用できない場合に使用されます(例: WireGuard セッション)。\n 現在の設定は OptionsGet コマンドで取得することができます。
CMD_SetStaticNetwork_Args SetStaticNetwork [/GATEWAY:gateway] [/SUBNET:subnet] 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_GATEWAY ゲートウェイの IP アドレスを設定します
CMD_SetStaticNetwork_SUBNET Specify the subnet mask, required to determine the size of the local VPN network. CMD_SetStaticNetwork_SUBNET ローカル VPN ネットワークの大きさを決定するために必要なサブネットマスクを指定します。
CMD_SetStaticNetwork_Prompt_GATEWAY Gateway: CMD_SetStaticNetwork_Prompt_GATEWAY ゲートウェイ:
CMD_SetStaticNetwork_Prompt_SUBNET Subnet mask: CMD_SetStaticNetwork_Prompt_SUBNET サブネットマスク:
# SetMaxSession コマンド # SetMaxSession コマンド
@ -5177,8 +5178,8 @@ CMD_OptionsGet_ENUM 匿名ユーザーに対する仮想 HUB の列挙
CMD_OptionsGet_MAXSESSIONS 最大同時接続セッション数 CMD_OptionsGet_MAXSESSIONS 最大同時接続セッション数
CMD_OptionsGet_STATUS 状態 CMD_OptionsGet_STATUS 状態
CMD_OptionsGet_TYPE 仮想 HUB の種類 CMD_OptionsGet_TYPE 仮想 HUB の種類
CMD_OptionsGet_GATEWAY Default gateway CMD_OptionsGet_GATEWAY デフォルトゲートウェイ
CMD_OptionsGet_SUBNET Default subnet CMD_OptionsGet_SUBNET サブネットマスク
# RadiusServerSet コマンド # RadiusServerSet コマンド