/***************************************************************************
                          smbpasswdfile.cpp  -  description
                             -------------------
    begin                : Tue June 6 2002
    copyright            : (C) 2002 by Jan Schäfer
    email                : janschaefer@users.sourceforge.net
 ***************************************************************************/

/******************************************************************************
 *                                                                            *
 *  This file is part of KSambaPlugin.                                        *
 *                                                                            *
 *  KSambaPlugin 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.                                       *
 *                                                                            *
 *  KSambaPlugin 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 KSambaPlugin; if not, write to the Free Software               *
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA  *
 *                                                                            *
 ******************************************************************************/

#include <tqstring.h>
#include <tqfile.h>
#include <tqtextstream.h>
#include <tqstringlist.h>

#include <kurl.h>
#include <kdebug.h>
#include <kpassdlg.h>
#include <tdelocale.h>
#include <kprocess.h>

#include "sambafile.h"
#include "smbpasswdfile.h"
#include "passwd.h"


TQStringList SambaUserList::getUserNames()
{
  TQStringList list;

  SambaUser *user;
  for ( user = first(); user; user = next() )
  {
     list.append(user->name);
  }

  return list;
}


SmbPasswdFile::SmbPasswdFile() {
}


SmbPasswdFile::SmbPasswdFile(const KURL & url)
{
  setUrl(url);
}

SmbPasswdFile::~SmbPasswdFile()
{
}

void SmbPasswdFile::setUrl(const KURL & url) {
  _url = url;
}

/**
 * Returns a list of all users stored in
 * the smbpasswd file
 **/
SambaUserList SmbPasswdFile::getSambaUserList()
{
  TQFile f(_url.path());

  SambaUserList list;

  if ( f.exists() && f.open(IO_ReadOnly) )
  {
    TQTextStream t( &f );
    TQString s;
    while ( !t.eof() )
    {
      s = t.readLine().stripWhiteSpace();

      // Ignore comments
      if (s.left(1)=="#")
         continue;

      TQStringList l = TQStringList::split(":",s);

      SambaUser* user = new SambaUser(l[0],l[1].toInt());
      user->gid = getUserGID(l[0]);
      user->isUserAccount = l[4].contains('U');
      user->hasNoPassword = l[4].contains('N');;
      user->isDisabled = l[4].contains('D');;
      user->isWorkstationTrustAccount = l[4].contains('W');;
      list.append(user);
    }
    f.close();
  }

  return list;
}

bool SmbPasswdFile::executeSmbpasswd(const TQStringList & args) {
  TDEProcess p;
  p << "smbpasswd" << args;

  connect( &p, TQ_SIGNAL(receivedStdout(TDEProcess*,char*,int)),
           this, TQ_SLOT(smbpasswdStdOutReceived(TDEProcess*,char*,int)));

  _smbpasswdOutput = "";

  bool result = p.start(TDEProcess::Block,TDEProcess::Stdout);

  if (result)
  {
    kdDebug(5009) << _smbpasswdOutput << endl;
  }

  return result;
}

/**
 * Tries to add the passed user to the smbpasswd file
 * returns true if successful otherwise false
 **/
bool SmbPasswdFile::addUser(const SambaUser & user,const TQString & password)
{
  TDEProcess p;
  p << "smbpasswd" << "-a" << user.name;

  p << password;

  connect( &p, TQ_SIGNAL(receivedStdout(TDEProcess*,char*,int)),
           this, TQ_SLOT(smbpasswdStdOutReceived(TDEProcess*,char*,int)));

  _smbpasswdOutput = "";

  bool result = p.start(TDEProcess::Block,TDEProcess::Stdout);

  if (result)
  {
    kdDebug(5009) << _smbpasswdOutput << endl;
  }

  return result;
}

/**
 * Tries to remove the passed user from the smbpasswd file
 * returns true if successful otherwise false
 **/
bool SmbPasswdFile::removeUser(const SambaUser & user)
{
  TQStringList l;
  l << "-x" << user.name;
  return executeSmbpasswd(l);
}

bool SmbPasswdFile::changePassword(const SambaUser & user, const TQString & newPassword)
{
  return addUser(user,newPassword);
}


void SmbPasswdFile::smbpasswdStdOutReceived(TDEProcess *, char *buffer, int buflen)
{
  _smbpasswdOutput+=TQString::fromLatin1(buffer,buflen);
}


/**
 * Returns the Url of the smbpasswd file
 * specified in the [global] section of
 * the smb.conf file.
 * If there is no entry in the [global] section
 * it tries to guess the location.
 **/
KURL SmbPasswdFile::getUrlFromSambaFile(const SambaFile * /*file*/)
{
  kdWarning() << "SmbPasswdFile::getUrlFromSambaFile unimplemeneted!" << endl;
  return KURL("");
}

bool SmbPasswdFile::enableUser(const SambaUser & user) {
  TQStringList l;
  l << "-e" << user.name;
  return executeSmbpasswd(l);
}

bool SmbPasswdFile::disableUser(const SambaUser & user) {
  TQStringList l;
  l << "-d" << user.name;
  return executeSmbpasswd(l);
}

bool SmbPasswdFile::setNoPassword(const SambaUser & user) {
  TQStringList l;
  l << "-n" << user.name;
  return executeSmbpasswd(l);
}

bool SmbPasswdFile::setMachineTrustAccount(const SambaUser & user) {
  TQStringList l;
  l << "-m" << user.name;
  return executeSmbpasswd(l);
}

bool SmbPasswdFile::joinADomain(const TQString & domain, const TQString & server,
      const TQString & user, const TQString & password) {
  TQStringList l;
  l << "-j" << domain;
  l << "-r" << server;
  l << "-U" << user << "%" << password;
  return executeSmbpasswd(l);
}


#include "smbpasswdfile.moc"
