1// OpenLDAP: pkg/ldap/contrib/ldapc++/src/SaslInteractionHandler.cpp,v 1.3.2.3 2009/07/22 19:50:57 quanah Exp 2/* 3 * Copyright 2007, OpenLDAP Foundation, All Rights Reserved. 4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file 5 */ 6 7#include <iostream> 8#include <iomanip> 9#include <limits> 10#include "config.h" 11 12#ifdef HAVE_TERMIOS_H 13#include <termios.h> 14#include <cstdio> 15#endif 16 17#include <string.h> 18#include "SaslInteractionHandler.h" 19#include "SaslInteraction.h" 20#include "debug.h" 21 22void DefaultSaslInteractionHandler::handleInteractions( 23 const std::list<SaslInteraction*> &cb ) 24{ 25 DEBUG(LDAP_DEBUG_TRACE, "DefaultSaslInteractionHandler::handleCallbacks()" 26 << std::endl ); 27 std::list<SaslInteraction*>::const_iterator i; 28 29 for (i = cb.begin(); i != cb.end(); i++ ) { 30 bool noecho; 31 32 cleanupList.push_back(*i); 33 34 std::cout << (*i)->getPrompt(); 35 if (! (*i)->getDefaultResult().empty() ) { 36 std::cout << "(" << (*i)->getDefaultResult() << ")" ; 37 } 38 std:: cout << ": "; 39 40 switch ( (*i)->getId() ) { 41 case SASL_CB_PASS: 42 case SASL_CB_ECHOPROMPT: 43 noecho = true; 44 noecho = true; 45 break; 46 default: 47 noecho = false; 48 break; 49 } 50#ifdef HAVE_TERMIOS_H 51 /* turn off terminal echo if needed */ 52 struct termios old_attr; 53 if ( noecho ) { 54 struct termios attr; 55 if (tcgetattr(STDIN_FILENO, &attr) < 0) { 56 perror("tcgetattr"); 57 } 58 59 /* save terminal attributes */ 60 memcpy(&old_attr, &attr, sizeof(attr)); 61 62 /* disable echo */ 63 attr.c_lflag &= ~(ECHO); 64 65 /* write attributes to terminal */ 66 if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &attr) < 0) { 67 perror("tcsetattr"); 68 } 69 } 70#endif /* HAVE_TERMIOS_H */ 71 std::string input; 72 std::cin >> std::noskipws >> input; 73 std::cin >> std::skipws; 74 (*i)->setResult(input); 75 if( std::cin.fail() ) { 76 std::cin.clear(); 77 } 78 /* ignore the rest of the input line */ 79 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 80 81#ifdef HAVE_TERMIOS_H 82 /* restore terminal settings */ 83 if ( noecho ) { 84 tcsetattr(STDIN_FILENO, TCSANOW, &old_attr); 85 std::cout << std::endl; 86 } 87#endif /* HAVE_TERMIOS_H */ 88 } 89} 90 91DefaultSaslInteractionHandler::~DefaultSaslInteractionHandler() 92{ 93 DEBUG(LDAP_DEBUG_TRACE, "DefaultSaslInteractionHandler::~DefaultSaslInteractionHandler()" 94 << std::endl ); 95 96 std::list<SaslInteraction*>::const_iterator i; 97 for (i = cleanupList.begin(); i != cleanupList.end(); i++ ) { 98 delete(*i); 99 } 100} 101