//--------------------------------------------------------------------------- // // Starts the kcheckpass process to check the user's password. // void Greeter::gplugStart() { int sfd[2]; char fdbuf[16]; if (m_notifier) return; if (::socketpair(AF_LOCAL, SOCK_STREAM, 0, sfd)) { cantCheck(); return; } if ((m_pid = ::fork()) < 0) { ::close(sfd[0]); ::close(sfd[1]); cantCheck(); return; } if (!m_pid) { ::close(sfd[0]); sprintf(fdbuf, "%d", sfd[1]); execlp(QFile::encodeName(KStandardDirs::findExe(QLatin1String( "kcheckpass" ))).data(), "kcheckpass", "-m", m_pluginHandle.info->method, "-S", fdbuf, (char *)0); _exit(20); } ::close(sfd[1]); m_fd = sfd[0]; m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); connect(m_notifier, SIGNAL(activated(int)), SLOT(handleVerify())); }
void Greeter::reapVerify() { m_notifier->setEnabled( false ); m_notifier->deleteLater(); m_notifier = 0; ::close( m_fd ); int status; while (::waitpid( m_pid, &status, 0 ) < 0) if (errno != EINTR) { // This should not happen ... cantCheck(); return; } if (WIFEXITED(status)) switch (WEXITSTATUS(status)) { case AuthOk: m_greet->succeeded(); emit greeterAccepted(); return; case AuthBad: m_greet->failed(); emit greeterFailed(); m_failedLock = true; QTimer::singleShot(1500, this, SLOT(failedTimer())); //KNotification::event( QLatin1String( "unlockfailed" ) );*/ return; case AuthAbort: return; } cantCheck(); }
void KCheckPass::reapVerify() { m_notifier->setEnabled( false ); m_notifier->deleteLater(); m_notifier = nullptr; ::close( m_fd ); int status; while (::waitpid( m_pid, &status, 0 ) < 0) if (errno != EINTR) { // This should not happen ... cantCheck(); return; } if (WIFEXITED(status)) switch (WEXITSTATUS(status)) { case AuthOk: emit succeeded(); return; case AuthBad: emit failed(); return; case AuthAbort: return; } cantCheck(); }
void KCheckPass::start() { int sfd[2]; char fdbuf[16]; if (m_notifier) return; if (::socketpair(AF_LOCAL, SOCK_STREAM, 0, sfd)) { cantCheck(); return; } if ((m_pid = ::fork()) < 0) { ::close(sfd[0]); ::close(sfd[1]); cantCheck(); return; } if (!m_pid) { ::close(sfd[0]); sprintf(fdbuf, "%d", sfd[1]); execlp(QFile::encodeName(QStringLiteral(KCHECKPASS_BIN)).data(), "kcheckpass", "-m", "classic", "-S", fdbuf, (char *)0); _exit(20); } ::close(sfd[1]); m_fd = sfd[0]; m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); connect(m_notifier, &QSocketNotifier::activated, this, &KCheckPass::handleVerify); }
void KCheckPass::handleVerify() { int ret; char *arr; if (GRecvInt( &ret )) { switch (ret) { case ConvGetBinary: if (!GRecvArr( &arr )) break; // FIXME: not supported cantCheck(); if (arr) ::free( arr ); return; case ConvGetNormal: if (!GRecvArr( &arr )) break; GSendStr(m_password.toUtf8().constData()); if (!m_password.isEmpty()) { // IsSecret GSendInt(1); } if (arr) ::free( arr ); return; case ConvGetHidden: if (!GRecvArr( &arr )) break; GSendStr(m_password.toUtf8().constData()); if (!m_password.isEmpty()) { // IsSecret GSendInt(1); } if (arr) ::free( arr ); return; case ConvPutInfo: if (!GRecvArr( &arr )) break; emit message(QString::fromLocal8Bit(arr)); ::free( arr ); return; case ConvPutError: if (!GRecvArr( &arr )) break; emit error(QString::fromLocal8Bit(arr)); ::free( arr ); return; } } reapVerify(); }