7.12 练习
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 7–5. userpw2.py. 下面的问题和例题7.1 中管理名字-密码的键值对数据的程序有关。
# (a) 修改那个脚本,使它能记录用户上次的登录日期和时间(用time 模块),
# 并与用户密码一起保存起来。程序的界面有要求用户输入用户名和密码的提示。
# 无论户名是否成功登录,都应有提示,在户名成功登录后,应更新相应用户的上次
# 登录时间戳。如果本次登录与上次登录在时间上相差不超过4 个小时,则通知该用户:
# “You already logged in at: <last_ login_timestamp>.”
# (b) 添加一个“管理”菜单,其中有以下两项:(1)删除一个用户 (2)显示系统中所有用户
# 的名字和他们的密码的清单。
# (c) 口令目前没有加密。请添加一段对口令加密的代码(请参考crypt, rotor, 或其它加密模块)
# (d) 为程序添加图形界面,例如,用Tkinter 写。
# (e) 要求用户名不区分大小写。
# (f) 加强对用户名的限制,不允许符号和空白符。
# (g) 合并“新用户”和“老用户”两个选项。如果一个新用户试图用一个不存在的用户名登录,
# 询问该用户是否是新用户,如果回答是肯定的,就创建该帐户。否则,按照老用户的方式登录。
# (a)
import time
import crypto
dbuserinfo = {}
def newuser():
prompt = 'login desired: '
while True:
name = raw_input(prompt)
if dbuserinfo.has_key(name):
prompt = 'name taken, try another: '
continue
else:
break
pwd = raw_input('passwd: ')
crypt_pwd = crypto.crypt(pwd)
dbuserinfo[name] = []
dbuserinfo[name].append(pwd)
dbuserinfo[name].append(time.time())
dbuserinfo[name].append(time.ctime())
def olduser():
name = raw_input('login: ')
pwd = raw_input('passwd: ')
if dbuserinfo.has_key(name):
passwd = dbuserinfo.get(name)[0]
if passwd == pwd:
print '*' * 10
print 'welcome back', name
print '*' * 10
current_time = time.time()
current_ctime = time.ctime()
if (current_time - dbuserinfo[name][1]) < 60*60*4:
print "You already logged in at: <%s>." % dbuserinfo[name][2]
dbuserinfo[name][1] = current_time
dbuserinfo[name][2] = current_ctime
else:
print '*' * 10
print 'login incorrect'
print '*' * 10
else:
print '*' * 10
print 'login incorrect'
print '*' * 10
# (b)
def deluser():
prompt = 'delete user name: '
delname = raw_input(prompt)
if dbuserinfo.has_key(delname):
del dbuserinfo[delname]
print '*' * 10
print "Delete success"
print '*' * 10
else:
print '*' * 10
print "User %s not exit." % delname
print '*' * 10
def showusers():
print '*' * 4, ' User list ', '*' * 4
for user in dbuserinfo.keys():
print user
def showmenu():
prompt = """
Please choice:
(N)ew User Login
(E)xisting User Login
(D)elete User
(S)how All User
(Q)uit
Enter choice: """
done = False
while not done:
chosen = False
while not chosen:
try:
choice = raw_input(prompt).strip()[0].lower()
except (EOFError, IndexError) as e:
choice = 'q'
print '\nYou picked: [%s]' % choice
if choice not in 'nedsq':
print 'invalid option, try again'
else:
chosen = True
if choice == 'q':
done = True
elif choice == 'n':
newuser()
elif choice == 'e':
olduser()
elif choice == 'd':
deluser()
elif choice == 's':
showusers()
showmenu()