#!/usr/bin/env python
#coding=utf-8import getpass
import re
'''Day1作业,V1.0,这是一个验证用户名、密码的程序,如果输入密码连续3次错误,则帐号被锁定。
被锁定的帐号是永久锁定,重启程序无法解锁'''
#假设预先创建了用于用户验证的存贮用户名,密码文件。文件格式为: username,password,x (其中x为0-3,表示用户状态,
#每输入一次密码错误,x+1,3表未帐号已锁定)
#要求指定用户验证文件的路径
user_db = raw_input('''Please specify the user DB, for example: /tmp/passwd
User DB: ''')
file = open(user_db,'r+')
auth_str = file.readlines()
#获取文件总长
total_size = file.tell()
file.seek(0)
current_size = file.tell()
user_list = []
#获得一个用户列表
while current_size < total_size:
user_str = file.readline()
user_list.append(user_str.split(',')[0])
current_size = file.tell()
#print user_list
while True:
#预留手动退出机制
Exit = raw_input('Proceed with authentication? y/n :')
if not Exit == 'y':
break
#开始认证操作流程
username = raw_input('Username: ')
if not username in user_list:
print "invalid username."
break
elif username in user_list:
for i in auth_str:
#找出该用户名打头的行
if re.match(username,i):
user_line = i
#找到该用户信息在列表中的索引号
list_num = auth_str.index(user_line)
#检查该用户帐号是否已被锁定
if int(auth_str[list_num][-2]) == 3:
print 'Your account has been disabled'
break
elif int(auth_str[list_num][-2]) < 3:
password = getpass.getpass('Password: ')
#将用户名密码合成可iter的元组,以便逗号连接成字串
credential = ','.join((username, password))
if credential == auth_str[list_num][0:-3]:
#认证成功后,刷新字串中的用户状态信息到零
auth_str[list_num] = auth_str[list_num][0:-3] + ',' + str(0) + '\n'
print '''Congratulations!
Your username and password are correct!'''
break
else:
#将用户状态信息转成int,并+1
lock = int(auth_str[list_num][-2]) + 1
#更新字串中的用户状态信息
auth_str[list_num] = auth_str[list_num][0:-3] + ',' + str(lock) + '\n'
print 'Your password is wrong.'
print 'You can try %d time(s), typing wrong password constantly will cause your account be disabled.' %(3 - int(lock))
#重新以写方式打开,准备覆盖原文件,否则是追加模式
file = open(user_db,'w+')
#覆盖原文件,以更新用户状态信息,其它信息保持不变
file.writelines(auth_str)
#关闭文件,程序终止
file.close()