如何多次尝试输入密码,终端处于RAW模式?

时间:2011-10-22 20:18:55

标签: c++ passwords mode

我正在用C ++创建一个登录菜单

我希望在程序终止之前让用户尝试输入密码。

如果用户第一次获得正确的密码,我的代码运行正常。然后它将进入主菜单等。但是,如果用户输入密码错误。终端可以运行:

Login: Fred
Password: ***
Wrong password
Please re-enter password: 

在此之后,无论用户输入什么,都不会显示任何内容。甚至ctrl-C都不能退出程序。我想知道是否有人知道发生了什么,并且可以指出我正确的方向。

以下是名为“HomePage”的类中“login”方法的部分代码:

            cout<<"Password: ";

            while (loginAttempt < 3){                                       //The user gets to attempt to type
                                                                            //the password 3 times
                    password = receivePassword();                           //Receives password from user


                    if (flatMemberList[match].getPassword()==password){     //Check if the password is correct
                        cout<<endl<<"Welcome back "<<loginName<< endl;      //If correct, display welcome message
                        return;
                    }

                    else{
                       loginAttempt++;                                      //Record down one failed attempt
                       cout<<endl<<"Wrong password"<<endl;                  //If incorrect, display error
                       cout<<"Please re-enter password: ";
                    }
            }
            cout<<"you have exceeded the legal login attempts"<<endl;
            exit(1);

其中receivePassword()是一种自定义方法,如下所示:

//This method is called when the user types in a password
//The terminal's setting is first changed to 'raw' configuration
//The password are taken in one letter at a time
//It outputs to terminal "*" instead of echoing the input
string HomePage::receivePassword(){

        termios oldt, newt;                                     //The structs for manipulation
        char password[PaswordLength];                           //Password held here
        int j = 0;                                              //Password index

        tcgetattr(STDIN_FILENO, &oldt);                         //Get configuration details
        newt = oldt;
        cfmakeraw(&newt);                                       //Set up new 'raw' configuration structure

    //Set up new terminal configuration

        tcsetattr(STDIN_FILENO, TCSANOW, &newt);

        cin.ignore(1000, '\n');                                 //flush all the buffers

        while(true){
            password[j] = cin.get();            
            if( password[j] == '\r' ) {                         //check if 'enter' key is entered
                password[j] = '\0';                             //replace cr with null to make C string
                break;
            }
            cout.put('*'); //echo the asterisk

            j++;
        } ;

    //Reset terminal to old configuration

        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

        return password;
    }

提前致谢

如果您认为问题可能在其他地方,请告诉我,我会发布代码。

2 个答案:

答案 0 :(得分:0)

我不知道你的具体问题是什么。但是,您可以应用标准调试技术来找出导致问题的部分。

首先,您正在使用终端(cfmakerawtcsetattr等)进行奇怪的事情。听起来这可能与问题有关。因此,删除隐藏用户输入的代码,并确保在密码正常回显到屏幕时您的程序正常工作。你应该能够轻松地做到这一点。

完成此操作后,您可以决定您的问题是否与以下内容相关:

  • 您删除的终端属性代码,或
  • 保留的密码循环。

这通常被称为“分而治之”的调试技术。如果您删除了认为的代码,那么问题是否仍然存在可以帮助您确定它是否与您删除的代码相关。

答案 1 :(得分:0)

在我新生一年级的最后一个项目中,我只是在为最终项目使用类似的代码集。事实证明,问题出在密码屏蔽本身。 现在,我已经删除了那些零件,该程序现在可以正常工作了,而不是裸露的针脚。