diff --git a/src/Core/Unix/CoreUnix.cpp b/src/Core/Unix/CoreUnix.cpp index e4167806..c23df499 100644 --- a/src/Core/Unix/CoreUnix.cpp +++ b/src/Core/Unix/CoreUnix.cpp @@ -21,6 +21,9 @@ #ifdef TC_LINUX #include #endif +#ifdef TC_OPENBSD +#include +#endif #include #include #include "Platform/FileStream.h" @@ -40,6 +43,26 @@ namespace VeraCrypt static bool SamePath (const string& path1, const string& path2); #endif +#ifdef TC_OPENBSD + static bool GetDoasUserIds (uid_t *uid, gid_t *gid) + { + const char *env = getenv ("DOAS_USER"); + if (!env || !env[0]) + return false; + + struct passwd *pw = getpwnam (env); + if (!pw) + return false; + + if (uid) + *uid = pw->pw_uid; + if (gid) + *gid = pw->pw_gid; + + return true; + } +#endif + // Struct to hold terminal emulator information struct TerminalInfo { const char* name; @@ -634,6 +657,12 @@ namespace VeraCrypt catch (...) { } } +#ifdef TC_OPENBSD + gid_t doasGid; + if (GetDoasUserIds (nullptr, &doasGid)) + return doasGid; +#endif + return getgid(); } @@ -650,6 +679,12 @@ namespace VeraCrypt catch (...) { } } +#ifdef TC_OPENBSD + uid_t doasUid; + if (GetDoasUserIds (&doasUid, nullptr)) + return doasUid; +#endif + return getuid(); } diff --git a/src/Driver/Fuse/FuseService.cpp b/src/Driver/Fuse/FuseService.cpp index c0962211..98b3d8fa 100644 --- a/src/Driver/Fuse/FuseService.cpp +++ b/src/Driver/Fuse/FuseService.cpp @@ -40,6 +40,9 @@ #include #include #include +#ifdef TC_OPENBSD +#include +#endif #include #include #include @@ -65,6 +68,26 @@ namespace VeraCrypt static const uint64 VC_FUSE_METADATA_SIZE = 64 * 1024; static const uint64 VC_FUSE_STAT_BLOCK_SIZE = 512; +#ifdef TC_OPENBSD + static bool fuse_service_get_doas_user_ids (uid_t *uid, gid_t *gid) + { + const char *env = getenv ("DOAS_USER"); + if (!env || !env[0]) + return false; + + struct passwd *pw = getpwnam (env); + if (!pw) + return false; + + if (uid) + *uid = pw->pw_uid; + if (gid) + *gid = pw->pw_gid; + + return true; + } +#endif + static uint64 fuse_service_ceil_div (uint64 value, uint64 divisor) { return (value / divisor) + ((value % divisor) ? 1 : 0); @@ -790,6 +813,18 @@ namespace VeraCrypt } catch (...) { } } +#ifdef TC_OPENBSD + else + { + uid_t doasUid; + gid_t doasGid; + if (fuse_service_get_doas_user_ids (&doasUid, &doasGid)) + { + FuseService::UserId = doasUid; + FuseService::GroupId = doasGid; + } + } +#endif static fuse_operations fuse_service_oper;