From: Kern Sibbald Date: Sun, 8 Jun 2003 09:35:50 +0000 (+0000) Subject: Change get_priv to enable_priv X-Git-Tag: Release-1.31~86 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=83ac6ce8e8afd78d57cfb694a66c2559a1dec1be;p=bacula%2Fbacula Change get_priv to enable_priv git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@570 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/src/findlib/Makefile.in b/bacula/src/findlib/Makefile.in index 3fb3888f02..9ce34a16a2 100644 --- a/bacula/src/findlib/Makefile.in +++ b/bacula/src/findlib/Makefile.in @@ -21,7 +21,7 @@ dummy: # LIBSRCS = find.c match.c find_one.c attibs.c create_file.c \ - bfile.c get_priv.c makepath.c save-cwd.c winapi.c + bfile.c enable_priv.c makepath.c save-cwd.c winapi.c LIBOBJS = find.o match.o find_one.o attribs.o create_file.o \ bfile.o get_priv.o makepath.o save-cwd.o winapi.o diff --git a/bacula/src/findlib/enable_priv.c b/bacula/src/findlib/enable_priv.c new file mode 100755 index 0000000000..f85802a508 --- /dev/null +++ b/bacula/src/findlib/enable_priv.c @@ -0,0 +1,156 @@ +/* + * Enable backup privileges for Win32 systems. + * + * Kern Sibbald, May MMIII + * + * Version $Id$ + * + */ +/* + Copyright (C) 2000-2003 Kern Sibbald and John Walker + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. + + */ + +#include "bacula.h" +#include "find.h" +#include "jcr.h" + + +/*=============================================================*/ +/* */ +/* * * * U n i x * * * * */ +/* */ +/*=============================================================*/ + +#ifndef HAVE_CYGWIN + +int enable_backup_privileges(JCR *jcr, int ignore_errors) + { return 0; } + + +#endif + + + +/*=============================================================*/ +/* */ +/* * * * W i n 3 2 * * * * */ +/* */ +/*=============================================================*/ + +#ifdef HAVE_CYGWIN + +void win_error(JCR *jcr, char *prefix, DWORD lerror); + +static int +enable_priv(JCR *jcr, HANDLE hToken, char *name, int ignore_errors) +{ + TOKEN_PRIVILEGES tkp; + DWORD lerror; + + if (!(p_LookupPrivilegeValue && p_AdjustTokenPrivileges)) { + return 0; /* not avail on this OS */ + } + + // Get the LUID for the security privilege. + if (!p_LookupPrivilegeValue(NULL, name, &tkp.Privileges[0].Luid)) { + if (!ignore_errors) { + win_error(jcr, "LookupPrivilegeValue", GetLastError()); + } + } + + /* Set the security privilege for this process. */ + tkp.PrivilegeCount = 1; + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + p_AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL); + lerror = GetLastError(); + if (lerror != ERROR_SUCCESS) { + if (!ignore_errors) { + char buf[200]; + strcpy(buf, "AdjustTokenPrivileges set "); + bstrncat(buf, name, sizeof(buf)); + win_error(jcr, buf, lerror); + } + return 0; + } + return 1; +} + +/* + * Setup privileges we think we will need. We probably do not need + * the SE_SECURITY_NAME, but since nothing seems to be working, + * we get it hoping to fix the problems. + */ +int enable_backup_privileges(JCR *jcr, int ignore_errors) +{ + HANDLE hToken, hProcess; + int stat = 0; + + if (!p_OpenProcessToken) { + return 0; /* No avail on this OS */ + } + + hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()); + + // Get a token for this process. + if (!p_OpenProcessToken(hProcess, + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { + if (!ignore_errors) { + win_error(jcr, "OpenProcessToken", GetLastError()); + } + /* Forge on anyway */ + } + + /* Return a bit map of permissions set. */ + if (enable_priv(jcr, hToken, SE_SECURITY_NAME, ignore_errors)) { + stat |= 1<<0; + } + if (enable_priv(jcr, hToken, SE_BACKUP_NAME, ignore_errors)) { + stat |= 1<<1; + } + if (enable_priv(jcr, hToken, SE_RESTORE_NAME, ignore_errors)) { + stat |= 1<<2; + } + if (enable_priv(jcr, hToken, SE_TAKE_OWNERSHIP_NAME, ignore_errors)) { + stat |= 1<<3; + } + if (enable_priv(jcr, hToken, SE_ASSIGNPRIMARYTOKEN_NAME, ignore_errors)) { + stat |= 1<<4; + } + if (enable_priv(jcr, hToken, SE_SYSTEM_ENVIRONMENT_NAME, ignore_errors)) { + stat |= 1<<5; + } + if (enable_priv(jcr, hToken, SE_CREATE_TOKEN_NAME, ignore_errors)) { + stat |= 1<<6; + } + if (enable_priv(jcr, hToken, SE_MACHINE_ACCOUNT_NAME, ignore_errors)) { + stat |= 1<<7; + } + if (enable_priv(jcr, hToken, SE_TCB_NAME, ignore_errors)) { + stat |= 1<<8; + } + if (stat) { + stat |= 1<<9; + } + + CloseHandle(hToken); + CloseHandle(hProcess); + return stat; +} + +#endif /* HAVE_CYGWIN */