summaryrefslogtreecommitdiff
path: root/core/opie-login
Side-by-side diff
Diffstat (limited to 'core/opie-login') (more/less context) (show whitespace changes)
-rw-r--r--core/opie-login/loginapplication.cpp15
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 ( );