/* * Copyright (c) 2003 Christian Loose * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program 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 program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #include "sshagent.h" #include "kdesvn-config.h" #include #include #include #include #include #include // initialize static member variables bool SshAgent::m_isRunning = false; bool SshAgent::m_isOurAgent = false; bool SshAgent::m_addIdentitiesDone = false; QString SshAgent::m_authSock = QString::null; QString SshAgent::m_pid = QString::null; SshAgent::SshAgent(QObject* parent, const char* name) : QObject(parent, name) { } SshAgent::~SshAgent() { } bool SshAgent::querySshAgent() { if( m_isRunning ) return true; // Did the user already start a ssh-agent process? char* pid; if( (pid = ::getenv("SSH_AGENT_PID")) != 0 ) { m_pid = QString::fromLocal8Bit(pid); char* sock = ::getenv("SSH_AUTH_SOCK"); if( sock ) m_authSock = QString::fromLocal8Bit(sock); /* make sure that we have a askpass program. * on some systems something like that isn't installed.*/ #ifdef FORCE_ASKPASS kdDebug()<<"Using test askpass"< -1 ) { m_pid = cshPidRx.cap(1); continue; } pos = bashPidRx.search(*it); if( pos > -1 ) { m_pid = bashPidRx.cap(1); continue; } } if( m_authSock.isEmpty() ) { int pos = cshSockRx.search(*it); if( pos > -1 ) { m_authSock = cshSockRx.cap(1); continue; } pos = bashSockRx.search(*it); if( pos > -1 ) { m_authSock = bashSockRx.cap(1); continue; } } } } void SshAgent::slotReceivedStdout(KProcess* proc, char* buffer, int buflen) { Q_UNUSED(proc); QString output = QString::fromLocal8Bit(buffer, buflen); m_Output+=output; } void SshAgent::slotReceivedStderr(KProcess* proc, char* buffer, int buflen) { Q_UNUSED(proc); QString output = QString::fromLocal8Bit(buffer, buflen); m_Output+=output; } bool SshAgent::startSshAgent() { KProcess proc; proc << "ssh-agent"; connect(&proc, SIGNAL(processExited(KProcess*)), SLOT(slotProcessExited(KProcess*))); connect(&proc, SIGNAL(receivedStdout(KProcess*, char*, int)), SLOT(slotReceivedStdout(KProcess*, char*, int))); connect(&proc, SIGNAL(receivedStderr(KProcess*, char*, int)), SLOT(slotReceivedStderr(KProcess*, char*, int)) ); proc.start(KProcess::NotifyOnExit, KProcess::All); // wait for process to finish // TODO CL use timeout? proc.wait(); return (proc.normalExit() && proc.exitStatus() == 0); } #include "sshagent.moc"