VncServerClient::AuthState ServerAuthenticationManager::performLogonAuthentication( VncServerClient* client, VariantArrayMessage& message ) { switch( client->authState() ) { case VncServerClient::AuthInit: { CryptoCore::PrivateKey privateKey = CryptoCore::KeyGenerator().createRSA( CryptoCore::RsaKeySize ); client->setPrivateKey( privateKey.toPEM() ); CryptoCore::PublicKey publicKey = privateKey.toPublicKey(); if( VariantArrayMessage( message.ioDevice() ).write( publicKey.toPEM() ).send() ) { return VncServerClient::AuthPassword; } else { qDebug( "ServerAuthenticationManager::performLogonAuthentication(): failed to send public key" ); return VncServerClient::AuthFinishedFail; } } case VncServerClient::AuthPassword: { CryptoCore::PrivateKey privateKey = CryptoCore::PrivateKey::fromPEM( client->privateKey() ); CryptoCore::SecureArray encryptedPassword( message.read().toByteArray() ); CryptoCore::SecureArray decryptedPassword; if( privateKey.decrypt( encryptedPassword, &decryptedPassword, CryptoCore::DefaultEncryptionAlgorithm ) == false ) { qWarning( "ServerAuthenticationManager::performLogonAuthentication(): failed to decrypt password" ); return VncServerClient::AuthFinishedFail; } AuthenticationCredentials credentials; credentials.setLogonUsername( client->username() ); credentials.setLogonPassword( QString::fromUtf8( decryptedPassword.toByteArray() ) ); if( LogonAuthentication::authenticateUser( credentials ) ) { qDebug( "ServerAuthenticationManager::performLogonAuthentication(): SUCCESS" ); return VncServerClient::AuthFinishedSuccess; } qDebug( "ServerAuthenticationManager::performLogonAuthentication(): FAIL" ); return VncServerClient::AuthFinishedFail; } default: break; } return VncServerClient::AuthFinishedFail; }
AuthenticationCredentials PasswordDialog::credentials() const { AuthenticationCredentials cred; cred.setLogonUsername( username() ); cred.setLogonPassword( password() ); return cred; }
bool LogonAuthentication::authenticateUser( const AuthenticationCredentials &cred ) { qDebug() << "Authenticating user" << cred.logonUsername(); bool result = false; #ifdef ITALC_BUILD_WIN32 #ifdef UNICODE return CUPSD2( (const char *) cred.logonUsername().unicode(), (const char *) cred.logonPassword().unicode() ); #else return CUPSD2( cred.logonUsername().toLocal8Bit().constData(), cred.logonPassword().toLocal8Bit().constData() ); #endif #endif #ifdef ITALC_BUILD_LINUX QProcess p; p.start( "italc-auth-helper" ); p.waitForStarted(); QDataStream ds( &p ); ds << cred.logonUsername(); ds << cred.logonPassword(); p.closeWriteChannel(); p.waitForFinished(); if( p.exitCode() == 0 ) { result = true; qDebug() << "User authenticated successfully"; } else { qCritical() << "ItalcAuthHelper failed:" << p.readAll().trimmed(); } #endif return result; }