36 L
"management-forget-disconnect",
38 L
"management-query-passwords",
39 L
"management-query-proxy",
41 L
"management-up-down",
52static BOOL
IsUserInGroup(PSID sid,
const PTOKEN_GROUPS groups,
const WCHAR *group_name);
64 WCHAR config_path[MAX_PATH];
65 const size_t config_dir_len = wcslen(s->
config_dir);
68 if (config_dir_len == 0 || s->
config_dir[config_dir_len - 1] != L
'\\')
73 if (wcscmp(fname, L
"stdin") == 0)
78 if (wcschr(workdir, L
'/') || wcschr(fname, L
'/'))
83 if (PathIsRelativeW(fname))
85 res = PathCchCombine(config_path, _countof(config_path), workdir, fname);
89 res = PathCchCanonicalize(config_path, _countof(config_path), fname);
92 return res == S_OK && wcsnicmp(config_path, s->
config_dir, config_dir_len) == 0;
124 PSID admin_sid = NULL;
125 DWORD sid_size = SECURITY_MAX_SID_SIZE;
129 DWORD dlen = _countof(domain);
131 admin_sid = malloc(sid_size);
137 b = CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
140 b = LookupAccountSidW(NULL, admin_sid, name, &nlen, domain, &dlen, &snu);
150 const WCHAR *ovpn_service_user)
152 const WCHAR *admin_group[2];
158 SID_NAME_USE sid_type;
161 if (!LookupAccountSidW(NULL, sid, username, &len, domain, &len, &sid_type))
170 if ((wcscmp(username, ovpn_service_user) == 0) && (wcscmp(domain, L
"NT SERVICE") == 0))
177 admin_group[0] = sysadmin_group;
182 L
"Failed to get the name of Administrators group. Using the default.");
186 admin_group[1] = ovpn_admin_group;
189 for (
int i = 0; i < 2; ++i)
195 L
"Authorizing user '%ls@%ls' by virtue of membership in group '%ls'",
196 username, domain, admin_group[i]);
214 PTOKEN_GROUPS groups = NULL;
217 if (!GetTokenInformation(token, TokenGroups, groups, buf_size, &buf_size)
218 && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
220 groups = malloc(buf_size);
226 else if (!GetTokenInformation(token, TokenGroups, groups, buf_size, &buf_size))
246 DWORD dlen = _countof(domain);
248 if (!LookupAccountName(NULL, name, sid, &sid_size, domain, &dlen, &su))
268IsUserInGroup(PSID sid,
const PTOKEN_GROUPS token_groups,
const WCHAR *group_name)
271 DWORD_PTR resume = 0;
273 BYTE grp_sid[SECURITY_MAX_SID_SIZE];
277 if (token_groups &&
LookupSID(group_name, (PSID)grp_sid, _countof(grp_sid)))
279 for (DWORD i = 0; i < token_groups->GroupCount; ++i)
281 if (EqualSid((PSID)grp_sid, token_groups->Groups[i].Sid))
296 LOCALGROUP_MEMBERS_INFO_0 *members = NULL;
297 err = NetLocalGroupGetMembers(NULL, group_name, 0, (LPBYTE *)&members, MAX_PREFERRED_LENGTH,
298 &nread, &nmax, &resume);
299 if ((err != NERR_Success && err != ERROR_MORE_DATA))
304 for (DWORD i = 0; i < nread && !ret; ++i)
306 ret = EqualSid(members[i].lgrmi0_sid, sid);
308 NetApiBufferFree(members);
310 }
while (err == ERROR_MORE_DATA && nloop++ < 100);
312 if (err != NERR_Success && err != NERR_GroupNotFound)
344 if (wcscmp(
argv[0], L
"--setenv") == 0 && argc > 1 && wcscmp(
argv[1], L
"opt") == 0)
DWORD MsgToEventLog(DWORD flags, LPCWSTR format,...)
WCHAR config_dir[MAX_PATH]
static BOOL CheckConfigPath(const WCHAR *workdir, const WCHAR *fname, const settings_t *s)
static const WCHAR * white_list[]
static int OptionLookup(const WCHAR *name, const WCHAR *white_list[])
BOOL IsAuthorizedUser(PSID sid, const HANDLE token, const WCHAR *ovpn_admin_group, const WCHAR *ovpn_service_user)
static BOOL IsUserInGroup(PSID sid, const PTOKEN_GROUPS groups, const WCHAR *group_name)
User is in group if the token groups contain the SID of the group of if the user is a direct member o...
static BOOL LookupSID(const WCHAR *name, PSID sid, DWORD sid_size)
BOOL CheckOption(const WCHAR *workdir, int argc, WCHAR *argv[], const settings_t *s)
static BOOL GetBuiltinAdminGroupName(WCHAR *name, DWORD nlen)
static PTOKEN_GROUPS GetTokenGroups(const HANDLE token)
Get a list of groups in token.
#define SYSTEM_ADMIN_GROUP