summaryrefslogtreecommitdiff
path: root/lib/common/UnixUser.cpp
diff options
context:
space:
mode:
authorBen Summers <ben@fluffy.co.uk>2005-10-14 08:50:54 +0000
committerBen Summers <ben@fluffy.co.uk>2005-10-14 08:50:54 +0000
commit99f8ce096bc5569adbfea1911dbcda24c28d8d8b (patch)
tree049c302161fea1f2f6223e1e8f3c40d9e8aadc8b /lib/common/UnixUser.cpp
Box Backup 0.09 with a few tweeks
Diffstat (limited to 'lib/common/UnixUser.cpp')
-rwxr-xr-xlib/common/UnixUser.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/lib/common/UnixUser.cpp b/lib/common/UnixUser.cpp
new file mode 100755
index 00000000..7a60b263
--- /dev/null
+++ b/lib/common/UnixUser.cpp
@@ -0,0 +1,121 @@
+// --------------------------------------------------------------------------
+//
+// File
+// Name: UnixUser.cpp
+// Purpose: Interface for managing the UNIX user of the current process
+// Created: 21/1/04
+//
+// --------------------------------------------------------------------------
+
+#include "Box.h"
+
+#include <pwd.h>
+#include <unistd.h>
+
+#include "UnixUser.h"
+#include "CommonException.h"
+
+#include "MemLeakFindOn.h"
+
+
+// --------------------------------------------------------------------------
+//
+// Function
+// Name: UnixUser::UnixUser(const char *)
+// Purpose: Constructor, initialises to info of given username
+// Created: 21/1/04
+//
+// --------------------------------------------------------------------------
+UnixUser::UnixUser(const char *Username)
+ : mUID(0),
+ mGID(0),
+ mRevertOnDestruction(false)
+{
+ // Get password info
+ struct passwd *pwd = ::getpwnam(Username);
+ if(pwd == 0)
+ {
+ THROW_EXCEPTION(CommonException, CouldNotLookUpUsername)
+ }
+
+ // Store UID and GID
+ mUID = pwd->pw_uid;
+ mGID = pwd->pw_gid;
+}
+
+
+// --------------------------------------------------------------------------
+//
+// Function
+// Name: UnixUser::UnixUser(uid_t, gid_t)
+// Purpose: Construct from given UNIX user ID and group ID
+// Created: 15/3/04
+//
+// --------------------------------------------------------------------------
+UnixUser::UnixUser(uid_t UID, gid_t GID)
+ : mUID(UID),
+ mGID(GID),
+ mRevertOnDestruction(false)
+{
+}
+
+
+// --------------------------------------------------------------------------
+//
+// Function
+// Name: UnixUser::~UnixUser()
+// Purpose: Destructor -- reverts to previous user if the change wasn't perminant
+// Created: 21/1/04
+//
+// --------------------------------------------------------------------------
+UnixUser::~UnixUser()
+{
+ if(mRevertOnDestruction)
+ {
+ // Revert to "real" user and group id of the process
+ if(::setegid(::getgid()) != 0
+ || ::seteuid(::getuid()) != 0)
+ {
+ THROW_EXCEPTION(CommonException, CouldNotRestoreProcessUser)
+ }
+ }
+}
+
+
+// --------------------------------------------------------------------------
+//
+// Function
+// Name: UnixUser::ChangeProcessUser(bool)
+// Purpose: Change the process user and group ID to the user. If Temporary == true
+// the process username will be changed back when the object is destructed.
+// Created: 21/1/04
+//
+// --------------------------------------------------------------------------
+void UnixUser::ChangeProcessUser(bool Temporary)
+{
+ if(Temporary)
+ {
+ // Change temporarily (change effective only)
+ if(::setegid(mGID) != 0
+ || ::seteuid(mUID) != 0)
+ {
+ THROW_EXCEPTION(CommonException, CouldNotChangeProcessUser)
+ }
+
+ // Mark for change on destruction
+ mRevertOnDestruction = true;
+ }
+ else
+ {
+ // Change perminantely (change all UIDs and GIDs)
+ if(::setgid(mGID) != 0
+ || ::setuid(mUID) != 0)
+ {
+ THROW_EXCEPTION(CommonException, CouldNotChangeProcessUser)
+ }
+ }
+}
+
+
+
+