/* * Copyright (c) 1998 Denis Perchine * Copyright (c) 2004 Szombathelyi György * Former maintainer: Adriaan de Groot * * 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 library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. **/ #include "globals.h" #include #include #ifdef HAVE_SHADOW_H #include #endif #include #include "ku_misc.h" #include "ku_usersystem.h" KU_UserSystem::KU_UserSystem(KU_PrefsBase *cfg) : KU_Users( cfg ) { caps = Cap_ReadOnly | Cap_Passwd; #ifdef HAVE_SHADOW_H if ( !mCfg->shadowsrc().isEmpty() ) caps |= Cap_Shadow; #endif } KU_UserSystem::~KU_UserSystem() { } bool KU_UserSystem::reload() { mErrorString = mErrorDetails = QString(); if (!loadpwd()) return false; if (!loadsdw()) return false; return true; } // Load passwd file bool KU_UserSystem::loadpwd() { passwd *p; KU_User user; QString tmp; setpwent(); //This should be enough for BSDs while ((p = getpwent()) != NULL) { user = KU_User(); user.setCaps( KU_User::Cap_POSIX ); user.setUID(p->pw_uid); user.setGID(p->pw_gid); user.setName(QString::fromLocal8Bit(p->pw_name)); tmp = QString::fromLocal8Bit( p->pw_passwd ); if ( tmp != QLatin1String( "x" ) && tmp != QLatin1String( "*" ) && !tmp.startsWith(QLatin1Char( '!' )) ) user.setDisabled( false ); else user.setDisabled( true ); if ( tmp.startsWith(QLatin1Char( '!' )) ) tmp.remove(0, 1); user.setPwd( tmp ); user.setHomeDir(QString::fromLocal8Bit(p->pw_dir)); user.setShell(QString::fromLocal8Bit(p->pw_shell)); if ((p->pw_gecos != 0) && (p->pw_gecos[0] != 0)) fillGecos(user, p->pw_gecos); append(user); } endpwent(); return true; } // Load shadow passwords bool KU_UserSystem::loadsdw() { #ifdef HAVE_SHADOW_H struct spwd *spw; KU_User user; QString tmp; int index; setspent(); while ((spw = getspent())) { // read a shadow password structure if ((index = lookup(QString::fromLocal8Bit(spw->sp_namp))) == -1) { continue; } user = at( index ); tmp = QString::fromLocal8Bit( spw->sp_pwdp ); if ( tmp.startsWith(QLatin1String( "!!" )) || tmp == QLatin1String( "*" ) ) { user.setDisabled( true ); tmp.remove( 0, 2 ); } else user.setDisabled( false ); user.setSPwd( tmp ); // cp the encrypted pwd user.setLastChange( daysToTime( spw->sp_lstchg ) ); user.setMin(spw->sp_min); user.setMax(spw->sp_max); #ifndef _SCO_DS user.setWarn(spw->sp_warn); user.setInactive(spw->sp_inact); user.setExpire( daysToTime( spw->sp_expire ) ); user.setFlag(spw->sp_flag); #endif replace( index, user ); } endspent(); #endif //HAVE_SHADOW_H return true; }