Diffstat (limited to 'core/opie-login/loginapplication.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | core/opie-login/loginapplication.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/core/opie-login/loginapplication.cpp b/core/opie-login/loginapplication.cpp index 1facf2d..764b24b 100644 --- a/core/opie-login/loginapplication.cpp +++ b/core/opie-login/loginapplication.cpp @@ -4,66 +4,73 @@ .>+-= _;:, .> :=|. This file is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. .%`+i> _;_. .i_,=:_. -<s. This file 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 file; -_. . . )=. = see the file COPYING. If not, write to the -- :-=` Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "loginapplication.h" + +/* OPIE */ +#include <opie2/odebug.h> + +/* QT */ + +/* STD */ #include <pwd.h> #include <grp.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <sys/stat.h> #include <sys/wait.h> #ifdef USEPAM extern "C" { #include <security/pam_appl.h> } #else #include <crypt.h> #include <shadow.h> #endif -#include "loginapplication.h" LoginApplication *lApp; LoginApplication::LoginApplication ( int &argc, char **argv, pid_t parentpid ) : QPEApplication ( argc, argv, GuiServer ) { lApp = this; m_parentpid = parentpid; } const char *LoginApplication::s_username = 0; #ifdef USEPAM const char *LoginApplication::s_pam_password = 0; int LoginApplication::pam_helper ( int num_msg, const struct pam_message **msg, struct pam_response **resp, void * ) { int replies = 0; struct pam_response *reply = 0; int size = sizeof( struct pam_response ); for ( int i = 0; i < num_msg; i++ ) { switch ( msg [i]-> msg_style ) { @@ -141,82 +148,82 @@ bool LoginApplication::checkPassword ( const char *user, const char *pass ) correct = pw-> pw_passwd; if ( correct == 0 || correct[0] == '\0' ) return true; encrypted = ::crypt ( pass, correct ); return ( ::strcmp ( encrypted, correct ) == 0 ); } #endif bool LoginApplication::changeIdentity ( ) { const char *DEFAULT_LOGIN_PATH = "/bin:/usr/bin"; const char *DEFAULT_ROOT_LOGIN_PATH = "/usr/sbin:/bin:/usr/bin:/sbin"; if ( !s_username ) return false; struct passwd *pw = ::getpwnam ( s_username ); if ( !pw ) return false; // we are still root at this point - try to run the pre-session script if ( !runRootScript ( "OPIEDIR", "share/opie-login/pre-session", s_username )) - qWarning ( "failed to run $OPIEDIR/share/opie-login/pre-session" ); + owarn << "failed to run $OPIEDIR/share/opie-login/pre-session" << oendl; bool fail = false; fail |= ( ::initgroups ( pw-> pw_name, pw-> pw_gid )); ::endgrent ( ); fail |= ( ::setgid ( pw-> pw_gid )); fail |= ( ::setuid ( pw-> pw_uid )); fail |= ( ::chdir ( pw-> pw_dir ) && ::chdir ( "/" )); fail |= ( ::setenv ( "HOME", pw-> pw_dir, 1 )); fail |= ( ::setenv ( "SHELL", pw-> pw_shell, 1 )); fail |= ( ::setenv ( "USER", pw-> pw_name, 1 )); fail |= ( ::setenv ( "LOGNAME", pw-> pw_name, 1 )); fail |= ( ::setenv ( "PATH", ( pw-> pw_uid ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH ), 1 )); return !fail; } bool LoginApplication::login ( ) { execUserScript ( "HOME", ".opie-session" ); execUserScript ( "OPIEDIR", "share/opie-login/opie-session" ); execUserScript ( "OPIEDIR", "bin/qpe" ); - qWarning ( "failed to start an Opie session" ); + owarn << "failed to start an Opie session" << oendl; return false; } void LoginApplication::logout ( ) { // we are now root again - try to run the post-session script if ( !runRootScript ( "OPIEDIR", "share/opie-login/post-session" )) - qWarning ( "failed to run $OPIEDIR/scripts/post-session" ); + owarn << "failed to run $OPIEDIR/scripts/post-session" << oendl; } static char *buildarg ( const char *base, const char *script ) { const char *dir = base ? ::getenv ( base ) : "/"; char *arg = new char [::strlen ( dir ) + ::strlen ( script ) + 2]; ::strcpy ( arg, dir ); ::strcat ( arg, "/" ); ::strcat ( arg, script ); return arg; } bool LoginApplication::runRootScript ( const char *base, const char *script, const char *param ) { bool res = false; char *arg = buildarg ( base, script ); struct stat st; if (( ::stat ( arg, &st ) == 0 ) && ( st. st_uid == 0 )) { pid_t child = ::fork ( ); |