1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- /* SLiM - Simple Login Manager
- Copyright (C) 1997, 1998 Per Liden
- Copyright (C) 2004-06 Simone Rota <sip@varlock.com>
- Copyright (C) 2004-06 Johannes Winkelmann <jw@tks6.net>
- 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.
- */
- #include "switchuser.h"
- using namespace std;
- SwitchUser::SwitchUser(struct passwd *pw, Cfg *c, const string& display,
- char** _env)
- : cfg(c),
- Pw(pw),
- displayName(display),
- env(_env)
- {
- }
- SwitchUser::~SwitchUser() {
- // Never called
- }
- void SwitchUser::Login(const char* cmd, const char* mcookie) {
- SetUserId();
- SetClientAuth(mcookie);
- Execute(cmd);
- }
- void SwitchUser::SetUserId() {
- if( (Pw == 0) ||
- (initgroups(Pw->pw_name, Pw->pw_gid) != 0) ||
- (setgid(Pw->pw_gid) != 0) ||
- (setuid(Pw->pw_uid) != 0) ) {
- cerr << APPNAME << ": could not switch user id" << endl;
- exit(ERR_EXIT);
- }
- }
- void SwitchUser::Execute(const char* cmd) {
- chdir(Pw->pw_dir);
- execle(Pw->pw_shell, Pw->pw_shell, "-c", cmd, NULL, env);
- cerr << APPNAME << ": could not execute login command" << endl;
- }
- void SwitchUser::SetClientAuth(const char* mcookie) {
- int r;
- string home = string(Pw->pw_dir);
- string authfile = home + "/.Xauthority";
- remove(authfile.c_str());
- string cmd = cfg->getOption("xauth_path") + " -q -f " + authfile + " add :0 . " + mcookie;
- r = system(cmd.c_str());
- }
|